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