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