4a3a284004886962656acff8f9f4a46354ace324
[vamsas.git] / src / org / vamsas / test / simpleclient / ArchiveReports.java
1 package org.vamsas.test.simpleclient;
2
3 import java.io.InputStream;
4 import java.io.PrintStream;
5 import java.io.PrintWriter;
6
7 import org.vamsas.client.ClientDocument;
8 import org.vamsas.client.Vobject;
9 import org.vamsas.client.simpleclient.VamsasArchiveReader;
10 import org.vamsas.objects.core.Alignment;
11 import org.vamsas.objects.core.AppData;
12 import org.vamsas.objects.core.ApplicationData;
13 import org.vamsas.objects.core.DataSet;
14 import org.vamsas.objects.core.Entry;
15 import org.vamsas.objects.core.Instance;
16 import org.vamsas.objects.core.Provenance;
17 import org.vamsas.objects.core.Tree;
18 import org.vamsas.objects.core.User;
19 import org.vamsas.objects.core.VAMSAS;
20 import org.vamsas.objects.core.VamsasDocument;
21 /**
22  * this class contains static methods for writing info to stdout about a vamsas document
23  * Methods have a 'cascade' switch to indicate if sub-objects should have info printed on them.
24  * Methods return true or false - indicating if the Vobject was valid or not
25  * TODO: LATER: propagate true/false return so that an invalid vamsas Vobject invalidates the whole document
26  * @author jimp
27  *
28  */
29 public class ArchiveReports {
30     /**
31      * print an informative summary on a VamsasDocument
32      * @param outstr TODO
33      * @param document - the document itself
34      * @param archive - document source archive for resolving any appData refs
35      * @return
36      */
37   public static boolean reportProvenance(Provenance p, PrintStream outstr) {
38     if (p==null) {
39       outstr.println("No Provenance");
40       return false;
41     }
42     Entry[] pe = p.getEntry();
43     for (int i=0; i<pe.length; i++)
44       outstr.println(pe[i].getDate()+"\t'"+pe[i].getUser()+"'\t"+pe[i].getApp()+"\t'"+pe[i].getAction()+"'");
45     return true;
46   }
47   public static boolean appDataEntryReport(AppData appD, VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {
48     if (appD!=null) {
49       boolean nulldata=false;
50       if (appD.getDataReference()!=null) {
51         String appData=appD.getDataReference();
52         if (appData==null) { outstr.println("Empty DataReference - not valid ?"); } 
53         else 
54           if (appData.length()>1) {
55           outstr.print("a reference ("+appData+")");
56           InputStream jstrm;
57           if ((jstrm=archive.getAppdataStream(appData))!=null)
58             outstr.println(" which resolves to a JarEntry.");
59           else {
60             outstr.println(" which does not resolve to a JarEntry.");
61             outstr.println("Unresolved appdata reference '"+appData+"'");
62           }
63         } else {
64           nulldata=true;
65         }
66       } else {
67         if (appD.getData()==null)
68           nulldata &= true;
69           else
70           outstr.println("an embedded chunk of "+appD.getData().length+" bytes.");
71       }
72       if (nulldata)
73         outstr.println("Null AppData reference/data chunk.");
74     }
75     return true;
76   }
77   
78   public static boolean appDataReport(ApplicationData appD, VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {
79     if (appD!=null) {
80       // Report on root appData
81       appDataEntryReport(appD, archive, cascade, outstr);
82       if (appD.getInstanceCount()>0) {
83         Instance inst[] = appD.getInstance();
84         for (int i=0,j=inst.hashCode(); i<j; i++) {
85           outstr.println("Data for App Instance URN: '"+inst[i].getUrn());
86           appDataEntryReport(inst[i],archive,cascade,outstr);
87         }
88       }
89       if (appD.getUserCount()>0) {
90         User users[] = appD.getUser();
91         for (int i=0,j=users.length; i<j; i++) {
92           outstr.println("Data for User '"+users[i].getFullname()+"' of '"+users[i].getOrganization()+"'");
93           appDataEntryReport(users[i], archive, cascade, outstr);
94         }
95       }
96     }
97
98     return true;
99   }
100   public static boolean reportDocument(VamsasDocument document, VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {
101     if (document!=null) {
102       outstr.println("Vamsas Document version '"+document.getVersion()+"'");
103       reportProvenance(document.getProvenance(), outstr);
104       outstr.print("Document contains "+document.getVAMSASCount()+" VAMSAS Elements and "+document.getApplicationDataCount()+" Application data elements.\n");
105       if (document.getVAMSASCount()>0 && cascade)
106         rootReport(document.getVAMSAS(), true, outstr);
107       if (document.getApplicationDataCount()>0) {
108         outstr.print("There are "+document.getApplicationDataCount()+" ApplicationData references.\n");
109         ApplicationData appd[] = document.getApplicationData();
110         for (int i=0,j=appd.length; i<j; i++) {
111           outstr.print("Application "+i+": '"+appd[i].getName()+"'\nVersion '"+appd[i].getVersion()+"'\n");
112           outstr.print("AppData is :");
113           appDataReport(appd[i], archive, cascade, outstr);
114         }
115           
116       }
117       return true;
118     } else {
119       outstr.println("Document Object is null");
120     }
121     return false;
122   }
123
124   /**
125    * summarises all the datasets in a vamsas document.
126    * @param roots
127    * @param cascade TODO
128    * @param outstr TODO
129    * @return
130    */
131   public static boolean rootReport(VAMSAS[] roots, boolean cascade, PrintStream outstr) {
132     if (roots!=null) {
133       for (int i=0; i<roots.length; i++) {
134         VAMSAS r = roots[i];
135         int ds, tr;
136         outstr.print("Vamsas Root "+i+" (id="
137             +((r.getId()!=null) ? r.getId():"<none>")
138             +") contains "+(ds=r.getDataSetCount())+" DataSets, "
139             + (tr=r.getTreeCount())+" Global trees\n");
140         if (cascade) {
141           for (int j=0; j<ds; j++) {
142             outstr.println("Dataset "+j);
143             cascade = datasetReport(r.getDataSet(j), true, outstr) && cascade ;
144           }
145           for (int j=0; j<tr; j++) {
146             outstr.println("Global tree "+j);
147             cascade = treeReport(r.getTree(j), true, outstr) && cascade;
148           }
149         }
150       }
151       return true;
152     }
153     return false;
154   }
155   public static boolean datasetReport(DataSet ds, boolean cascade, PrintStream outstr) {
156     if (cascade)
157       reportProvenance(ds.getProvenance(), outstr);
158     outstr.println("Dataset contains : "+ds.getSequenceCount()
159         +" sequences, "+ds.getAlignmentCount()+" alignments and "+ds.getTreeCount()+" trees.");
160     if (cascade)
161       alignmentReport(ds.getAlignment(), true, outstr);
162     return true;
163   }
164   public static boolean alignmentReport(Alignment[] al, boolean cascade, PrintStream outstr) {
165     boolean val=true;
166     if (al!=null && al.length>0) {
167       for (int i=0; i<al.length; i++) {
168         outstr.println("Alignment "+i+(al[i].isRegistered() ? " ("+al[i].getVorbaId()+")" : " (unregistered)"));
169         if (cascade)
170           reportProvenance(al[i].getProvenance(), outstr);
171         outstr.println("Involves "+al[i].getAlignmentSequenceCount()+" sequences, has "
172             +al[i].getAlignmentAnnotationCount()+" annotations and "+al[i].getTreeCount()+" trees.");
173         if (cascade) {
174           for (int t=0; t<al[i].getTreeCount(); t++)
175             treeReport(al[i].getTree(t), true, outstr);
176         }
177       }
178     }
179     return val;
180   }
181   public static boolean treeReport(Tree t, boolean cascade, PrintStream outstr) {
182     outstr.println("Tree: '"+t.getTitle()+"'");
183     return !cascade || reportProvenance(t.getProvenance(), outstr);
184   }
185
186 }