applied LGPLv3 and source code formatting.
[vamsas.git] / src / uk / ac / vamsas / test / simpleclient / ArchiveReports.java
1 /*\r
2  * This file is part of the Vamsas Client version 0.1. \r
3  * Copyright 2009 by Jim Procter, Iain Milne, Pierre Marguerite, \r
4  *  Andrew Waterhouse and Dominik Lindner.\r
5  * \r
6  * Earlier versions have also been incorporated into Jalview version 2.4 \r
7  * since 2008, and TOPALi version 2 since 2007.\r
8  * \r
9  * The Vamsas Client is free software: you can redistribute it and/or modify\r
10  * it under the terms of the GNU Lesser General Public License as published by\r
11  * the Free Software Foundation, either version 3 of the License, or\r
12  * (at your option) any later version.\r
13  *  \r
14  * The Vamsas Client is distributed in the hope that it will be useful,\r
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
17  * GNU Lesser General Public License for more details.\r
18  * \r
19  * You should have received a copy of the GNU Lesser General Public License\r
20  * along with the Vamsas Client.  If not, see <http://www.gnu.org/licenses/>.\r
21  */\r
22 package uk.ac.vamsas.test.simpleclient;\r
23 \r
24 import java.io.InputStream;\r
25 import java.io.PrintStream;\r
26 import java.io.PrintWriter;\r
27 \r
28 import uk.ac.vamsas.client.ClientDocument;\r
29 import uk.ac.vamsas.client.Vobject;\r
30 import uk.ac.vamsas.client.simpleclient.VamsasArchiveReader;\r
31 import uk.ac.vamsas.objects.core.Alignment;\r
32 import uk.ac.vamsas.objects.core.AppData;\r
33 import uk.ac.vamsas.objects.core.ApplicationData;\r
34 import uk.ac.vamsas.objects.core.DataSet;\r
35 import uk.ac.vamsas.objects.core.Entry;\r
36 import uk.ac.vamsas.objects.core.Instance;\r
37 import uk.ac.vamsas.objects.core.Provenance;\r
38 import uk.ac.vamsas.objects.core.Tree;\r
39 import uk.ac.vamsas.objects.core.User;\r
40 import uk.ac.vamsas.objects.core.VAMSAS;\r
41 import uk.ac.vamsas.objects.core.VamsasDocument;\r
42 \r
43 /**\r
44  * this class contains static methods for writing info to stdout about a vamsas\r
45  * document Methods have a 'cascade' switch to indicate if sub-objects should\r
46  * have info printed on them. Methods return true or false - indicating if the\r
47  * Vobject was valid or not TODO: LATER: propagate true/false return so that an\r
48  * invalid vamsas Vobject invalidates the whole document\r
49  * \r
50  * @author jimp\r
51  * \r
52  */\r
53 public class ArchiveReports {\r
54   /**\r
55    * print an informative summary on a VamsasDocument\r
56    * \r
57    * @param outstr\r
58    *          TODO\r
59    * @param document\r
60    *          - the document itself\r
61    * @param archive\r
62    *          - document source archive for resolving any appData refs\r
63    * @return\r
64    */\r
65   public static boolean reportProvenance(Provenance p, PrintStream outstr) {\r
66     if (p == null) {\r
67       outstr.println("No Provenance");\r
68       return false;\r
69     }\r
70     Entry[] pe = p.getEntry();\r
71     for (int i = 0; i < pe.length; i++) {\r
72       outstr.print(pe[i].getDate() + "\t'" + pe[i].getUser() + "'\t"\r
73           + pe[i].getApp() + "\t'" + pe[i].getAction() + "' ");\r
74       outputVobjectState(pe[i], outstr);\r
75     }\r
76     return true;\r
77   }\r
78 \r
79   public static boolean appDataEntryReport(AppData appD,\r
80       VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {\r
81     if (appD != null) {\r
82       boolean nulldata = false;\r
83       if (appD.getDataReference() != null) {\r
84         String appData = appD.getDataReference();\r
85         if (appData == null) {\r
86           outstr.println("Empty DataReference - not valid ?");\r
87         } else if (appData.length() > 1) {\r
88           outstr.print("a reference (" + appData + ")");\r
89           InputStream jstrm;\r
90           if ((jstrm = archive.getAppdataStream(appData)) != null)\r
91             outstr.println(" which resolves to a JarEntry.");\r
92           else {\r
93             outstr.println(" which does not resolve to a JarEntry.");\r
94             outstr.println("Unresolved appdata reference '" + appData + "'");\r
95           }\r
96         } else {\r
97           nulldata = true;\r
98         }\r
99       } else {\r
100         if (appD.getData() == null)\r
101           nulldata &= true;\r
102         else\r
103           outstr.println("an embedded chunk of " + appD.getData().length\r
104               + " bytes.");\r
105       }\r
106       if (nulldata)\r
107         outstr.println("Null AppData reference/data chunk.");\r
108     }\r
109     return true;\r
110   }\r
111 \r
112   public static boolean appDataReport(ApplicationData appD,\r
113       VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {\r
114     if (appD != null) {\r
115       // Report on root appData\r
116       appDataEntryReport(appD, archive, cascade, outstr);\r
117       if (appD.getInstanceCount() > 0) {\r
118         Instance inst[] = appD.getInstance();\r
119         for (int i = 0, j = inst.hashCode(); i < j; i++) {\r
120           outstr.println("Data for App Instance URN: '" + inst[i].getUrn());\r
121           appDataEntryReport(inst[i], archive, cascade, outstr);\r
122         }\r
123       }\r
124       if (appD.getUserCount() > 0) {\r
125         User users[] = appD.getUser();\r
126         for (int i = 0, j = users.length; i < j; i++) {\r
127           outstr.println("Data for User '" + users[i].getFullname() + "' of '"\r
128               + users[i].getOrganization() + "'");\r
129           appDataEntryReport(users[i], archive, cascade, outstr);\r
130         }\r
131       }\r
132     }\r
133 \r
134     return true;\r
135   }\r
136 \r
137   public static boolean reportDocument(VamsasDocument document,\r
138       VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {\r
139     if (document != null) {\r
140       outstr.println("Vamsas Document version '" + document.getVersion() + "'");\r
141       reportProvenance(document.getProvenance(), outstr);\r
142       outstr.print("Document contains " + document.getVAMSASCount()\r
143           + " VAMSAS Elements and " + document.getApplicationDataCount()\r
144           + " Application data elements.\n");\r
145       if (document.getVAMSASCount() > 0 && cascade)\r
146         rootReport(document.getVAMSAS(), true, outstr);\r
147       if (document.getApplicationDataCount() > 0) {\r
148         outstr.print("There are " + document.getApplicationDataCount()\r
149             + " ApplicationData references.\n");\r
150         ApplicationData appd[] = document.getApplicationData();\r
151         for (int i = 0, j = appd.length; i < j; i++) {\r
152           outstr.print("Application " + i + ": '" + appd[i].getName()\r
153               + "'\nVersion '" + appd[i].getVersion() + "'\n");\r
154           outstr.print("AppData is :");\r
155           appDataReport(appd[i], archive, cascade, outstr);\r
156         }\r
157 \r
158       }\r
159       return true;\r
160     } else {\r
161       outstr.println("Document Object is null");\r
162     }\r
163     return false;\r
164   }\r
165 \r
166   /**\r
167    * summarises all the datasets in a vamsas document.\r
168    * \r
169    * @param roots\r
170    * @param cascade\r
171    *          TODO\r
172    * @param outstr\r
173    *          TODO\r
174    * @return\r
175    */\r
176   public static boolean rootReport(VAMSAS[] roots, boolean cascade,\r
177       PrintStream outstr) {\r
178     if (roots != null) {\r
179       for (int i = 0; i < roots.length; i++) {\r
180         VAMSAS r = roots[i];\r
181         int ds, tr;\r
182         outstr.print("Vamsas Root " + i + " (id="\r
183             + ((r.getId() != null) ? r.getId() : "<none>") + ") contains "\r
184             + (ds = r.getDataSetCount()) + " DataSets, "\r
185             + (tr = r.getTreeCount()) + " Global trees\n");\r
186         outputVobjectState(r, outstr);\r
187         if (cascade) {\r
188           for (int j = 0; j < ds; j++) {\r
189             outstr.println("Dataset " + j);\r
190             cascade = datasetReport(r.getDataSet(j), true, outstr) && cascade;\r
191           }\r
192           for (int j = 0; j < tr; j++) {\r
193             outstr.println("Global tree " + j);\r
194             cascade = treeReport(r.getTree(j), true, outstr) && cascade;\r
195           }\r
196         }\r
197       }\r
198       return true;\r
199     }\r
200     return false;\r
201   }\r
202 \r
203   public static void outputVobjectState(Vobject v, PrintStream outstr) {\r
204     outstr.print(" (Object is: ");\r
205     boolean comma = false;\r
206     if (v.is__stored_in_document()) {\r
207       outstr.print(" stored");\r
208       comma = true;\r
209     }\r
210     if (v.isNewInDocument()) {\r
211       if (comma)\r
212         outstr.print(",");\r
213       comma = true;\r
214       outstr.print(" new in document");\r
215     }\r
216     if (v.isUpdated()) {\r
217       if (comma)\r
218         outstr.print(",");\r
219       comma = true;\r
220       outstr.print(" updated since last read");\r
221     }\r
222     outstr.println(")");\r
223   }\r
224 \r
225   public static boolean datasetReport(DataSet ds, boolean cascade,\r
226       PrintStream outstr) {\r
227     if (cascade)\r
228       reportProvenance(ds.getProvenance(), outstr);\r
229     outputVobjectState(ds, outstr);\r
230     outstr.println("Dataset contains : " + ds.getSequenceCount()\r
231         + " sequences, " + ds.getAlignmentCount() + " alignments and "\r
232         + ds.getTreeCount() + " trees.");\r
233     if (cascade)\r
234       alignmentReport(ds.getAlignment(), true, outstr);\r
235     return true;\r
236   }\r
237 \r
238   public static boolean alignmentReport(Alignment[] al, boolean cascade,\r
239       PrintStream outstr) {\r
240     boolean val = true;\r
241     if (al != null && al.length > 0) {\r
242       for (int i = 0; i < al.length; i++) {\r
243         outstr.println("Alignment "\r
244             + i\r
245             + (al[i].isRegistered() ? " (" + al[i].getVorbaId() + ")"\r
246                 : " (unregistered)"));\r
247         outputVobjectState(al[i], outstr);\r
248         if (cascade)\r
249           reportProvenance(al[i].getProvenance(), outstr);\r
250         outstr.println("Involves " + al[i].getAlignmentSequenceCount()\r
251             + " sequences, has " + al[i].getAlignmentAnnotationCount()\r
252             + " annotations and " + al[i].getTreeCount() + " trees.");\r
253         if (cascade) {\r
254           for (int t = 0; t < al[i].getTreeCount(); t++)\r
255             treeReport(al[i].getTree(t), true, outstr);\r
256         }\r
257       }\r
258     }\r
259     return val;\r
260   }\r
261 \r
262   public static boolean treeReport(Tree t, boolean cascade, PrintStream outstr) {\r
263     outstr.print("Tree: '" + t.getTitle() + "' ");\r
264     outputVobjectState(t, outstr);\r
265     return !cascade || reportProvenance(t.getProvenance(), outstr);\r
266   }\r
267 \r
268 }\r