more verbose reports and demo VamsasDocument testing
[vamsas.git] / src / org / vamsas / test / simpleclient / ArchiveReports.java
1 package org.vamsas.test.simpleclient;
2
3 import java.io.InputStream;
4
5 import org.vamsas.client.simpleclient.VamsasArchiveReader;
6 import org.vamsas.objects.core.Alignment;
7 import org.vamsas.objects.core.ApplicationData;
8 import org.vamsas.objects.core.DataSet;
9 import org.vamsas.objects.core.Entry;
10 import org.vamsas.objects.core.Provenance;
11 import org.vamsas.objects.core.Tree;
12 import org.vamsas.objects.core.VAMSAS;
13 import org.vamsas.objects.core.VamsasDocument;
14 /**
15  * this class contains static methods for writing info to stdout about a vamsas document
16  * Methods have a 'cascade' switch to indicate if sub-objects should have info printed on them.
17  * Methods return true or false - indicating if the object was valid or not
18  * TODO: LATER: propagate true/false return so that an invalid vamsas object invalidates the whole document
19  * @author jimp
20  *
21  */
22 public class ArchiveReports {
23     /**
24      * print an informative summary on a VamsasDocument
25      * @param document - the document itself
26      * @param archive - document source archive for resolving any appData refs
27      * @return
28      */
29   public static boolean reportProvenance(Provenance p) {
30     if (p==null) {
31       System.out.println("No Provenance");
32       return false;
33     }
34     Entry[] pe = p.getEntry();
35     for (int i=0; i<pe.length; i++)
36       System.out.println(pe[i].getDate()+"\t'"+pe[i].getUser()+"'\t"+pe[i].getAction());
37     return true;
38   }
39   public static boolean reportDocument(VamsasDocument document, VamsasArchiveReader archive, boolean cascade) {
40     if (document!=null) {
41       System.out.println("Vamsas Document version '"+document.getVersion()+"'");
42       reportProvenance(document.getProvenance());
43       System.out.print("Document contains "+document.getVAMSASCount()+" VAMSAS Elements and "+document.getApplicationDataCount()+" elements.\n");
44       if (document.getVAMSASCount()>0 && cascade)
45         rootReport(document.getVAMSAS(), true);
46       if (document.getApplicationDataCount()>0) {
47         System.out.print("There are "+document.getApplicationDataCount()+" ApplicationData references.\n");
48         ApplicationData appd[] = document.getApplicationData();
49         for (int i=0,j=appd.length; i<j; i++) {
50           System.out.print("Application "+i+": '"+appd[i].getName()+"'\nVersion '"+appd[i].getVersion()+"'\nURN: '"+appd[i].getUrn()+"'\n");
51           System.out.print("AppData is ");
52           if (appd[i].getAppDataChoice().getDataReference()!=null) {
53             String appData=appd[i].getAppDataChoice().getDataReference();
54             if (appData.length()>1) {
55               System.out.print("a reference ("+appData+")");
56               InputStream jstrm;
57               if ((jstrm=archive.getAppdataStream(appData))!=null)
58                 System.out.println(" which resolves to a JarEntry.");
59               else {
60                 System.out.println(" which does not resolve to a JarEntry.");
61                 System.err.println("Unresolved appdata reference '"+appData+"'");
62               }
63             } else {
64               System.out.println("an empty reference.");
65             }
66           } else {
67             System.out.println("an embedded chunk of "+appd[i].getAppDataChoice().getData().length+" bytes.");
68           }
69         }
70           
71       }
72       return true;
73     } else {
74       System.out.print("Document Object is null");
75     }
76     return false;
77   }
78
79   /**
80    * summarises all the datasets in a vamsas document.
81    * @param roots
82    * @param cascade TODO
83    * @return
84    */
85   public static boolean rootReport(VAMSAS[] roots, boolean cascade) {
86     if (roots!=null) {
87       for (int i=0; i<roots.length; i++) {
88         VAMSAS r = roots[i];
89         int ds, tr;
90         System.out.print("Vamsas Root "+i+" (id="
91             +((r.getId()!=null) ? r.getId():"<none>")
92             +") contains "+(ds=r.getDataSetCount())+" DataSets, "
93             + (tr=r.getTreeCount())+" Global trees\n");
94         if (cascade) {
95           for (int j=0; j<ds; j++) {
96             System.out.println("Dataset "+j);
97             cascade = datasetReport(r.getDataSet(j), true) && cascade ;
98           }
99           for (int j=0; j<tr; j++) {
100             System.out.println("Global tree "+j);
101             cascade = treeReport(r.getTree(j), true) && cascade;
102           }
103         }
104       }
105       return true;
106     }
107     return false;
108   }
109   public static boolean datasetReport(DataSet ds, boolean cascade) {
110     if (cascade)
111       reportProvenance(ds.getProvenance());
112     System.out.println("Dataset contains : "+ds.getSequenceCount()
113         +" sequences, "+ds.getAlignmentCount()+" alignments and "+ds.getTreeCount()+" trees.");
114     if (cascade)
115       alignmentReport(ds.getAlignment(), true);
116     return true;
117   }
118   public static boolean alignmentReport(Alignment[] al, boolean cascade) {
119     boolean val=true;
120     if (al!=null && al.length>0) {
121       for (int i=0; i<al.length; i++) {
122         System.out.println("Alignment "+i);
123         if (cascade)
124           reportProvenance(al[i].getProvenance());
125         System.out.println("Involves "+al[i].getAlignmentSequenceCount()+" sequences, has "
126             +al[i].getAlignmentAnnotationsCount()+" annotations and "+al[i].getTreeCount()+" trees.");
127         if (cascade) {
128           for (int t=0; t<al[i].getTreeCount(); t++)
129             treeReport(al[i].getTree(t), true);
130         }
131       }
132     }
133     return val;
134   }
135   public static boolean treeReport(Tree t, boolean cascade) {
136     System.out.println("Tree: '"+t.getTitle()+"'");
137     return !cascade || reportProvenance(t.getProvenance());
138   }
139
140 }