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