import java.io.InputStream;
+import org.vamsas.client.object;
import org.vamsas.client.simpleclient.VamsasArchiveReader;
+import org.vamsas.objects.core.Alignment;
+import org.vamsas.objects.core.AppData;
import org.vamsas.objects.core.ApplicationData;
+import org.vamsas.objects.core.DataSet;
+import org.vamsas.objects.core.Entry;
+import org.vamsas.objects.core.Provenance;
+import org.vamsas.objects.core.Tree;
+import org.vamsas.objects.core.User;
import org.vamsas.objects.core.VAMSAS;
import org.vamsas.objects.core.VamsasDocument;
-
+/**
+ * this class contains static methods for writing info to stdout about a vamsas document
+ * Methods have a 'cascade' switch to indicate if sub-objects should have info printed on them.
+ * Methods return true or false - indicating if the object was valid or not
+ * TODO: LATER: propagate true/false return so that an invalid vamsas object invalidates the whole document
+ * @author jimp
+ *
+ */
public class ArchiveReports {
+ /**
+ * print an informative summary on a VamsasDocument
+ * @param document - the document itself
+ * @param archive - document source archive for resolving any appData refs
+ * @return
+ */
+ public static boolean reportProvenance(Provenance p) {
+ if (p==null) {
+ System.out.println("No Provenance");
+ return false;
+ }
+ Entry[] pe = p.getEntry();
+ for (int i=0; i<pe.length; i++)
+ System.out.println(pe[i].getDate()+"\t'"+pe[i].getUser()+"'\t"+pe[i].getAction());
+ return true;
+ }
+ public static boolean appDataEntryReport(AppData appD, VamsasArchiveReader archive, boolean cascade) {
+ if (appD!=null) {
+ boolean nulldata=false;
+ if (appD.getDataReference()!=null) {
+ String appData=appD.getDataReference();
+ if (appData==null) { System.out.println("Empty DataReference - not valid ?"); }
+ else
+ if (appData.length()>1) {
+ System.out.print("a reference ("+appData+")");
+ InputStream jstrm;
+ if ((jstrm=archive.getAppdataStream(appData))!=null)
+ System.out.println(" which resolves to a JarEntry.");
+ else {
+ System.out.println(" which does not resolve to a JarEntry.");
+ System.err.println("Unresolved appdata reference '"+appData+"'");
+ }
+ } else {
+ nulldata=true;
+ }
+ } else {
+ if (appD.getData()==null)
+ nulldata &= true;
+ else
+ System.out.println("an embedded chunk of "+appD.getData().length+" bytes.");
+ }
+ if (nulldata)
+ System.out.println("Null AppData reference/data chunk.");
+ }
+ return true;
+ }
+
+ public static boolean appDataReport(ApplicationData appD, VamsasArchiveReader archive, boolean cascade) {
+ if (appD!=null) {
+ // Report on root appData
+ appDataEntryReport(appD, archive, cascade);
+ if (appD.getUserCount()>0) {
+ User users[] = appD.getUser();
+ for (int i=0,j=users.length; i<j; i++) {
+ System.out.println("Data for User '"+users[i].getFullname()+"' of '"+users[i].getOrganization()+"'");
+ appDataEntryReport(users[i], archive, cascade);
+ }
+ }
+ }
- public static boolean reportDocument(VamsasDocument document, VamsasArchiveReader archive) {
+ return true;
+ }
+ public static boolean reportDocument(VamsasDocument document, VamsasArchiveReader archive, boolean cascade) {
if (document!=null) {
- System.out.print("Vamsas Document version '"+document.getVersion()+"'");
- System.out.print("Document contains "+document.getVAMSASCount()+" VAMSAS Elements and "+document.getApplicationDataCount()+" elements.\n");
+ System.out.println("Vamsas Document version '"+document.getVersion()+"'");
+ reportProvenance(document.getProvenance());
+ System.out.print("Document contains "+document.getVAMSASCount()+" VAMSAS Elements and "+document.getApplicationDataCount()+" Application data elements.\n");
+ if (document.getVAMSASCount()>0 && cascade)
+ rootReport(document.getVAMSAS(), true);
if (document.getApplicationDataCount()>0) {
System.out.print("There are "+document.getApplicationDataCount()+" ApplicationData references.\n");
ApplicationData appd[] = document.getApplicationData();
for (int i=0,j=appd.length; i<j; i++) {
System.out.print("Application "+i+": '"+appd[i].getName()+"'\nVersion '"+appd[i].getVersion()+"'\nURN: '"+appd[i].getUrn()+"'\n");
- System.out.print("AppData is ");
- if (appd[i].getAppDataChoice().getDataReference()!=null) {
- String appData=appd[i].getAppDataChoice().getDataReference();
- if (appData.length()>1) {
- System.out.print("a reference ("+appData+")");
- InputStream jstrm;
- if ((jstrm=archive.getAppdataStream(appData))!=null)
- System.out.println(" which resolves to a JarEntry.");
- else {
- System.out.println(" which does not resolve to a JarEntry.");
- System.err.println("Unresolved appdata reference '"+appData+"'");
- }
- } else {
- System.out.println("an empty reference.");
- }
- } else {
- System.out.println("an embedded chunk of "+appd[i].getAppDataChoice().getData().length+" bytes.");
- }
+ System.out.print("AppData is :");
+ appDataReport(appd[i], archive, cascade);
}
}
return false;
}
- public static boolean rootReport(VAMSAS[] roots) {
+ /**
+ * summarises all the datasets in a vamsas document.
+ * @param roots
+ * @param cascade TODO
+ * @return
+ */
+ public static boolean rootReport(VAMSAS[] roots, boolean cascade) {
if (roots!=null) {
for (int i=0; i<roots.length; i++) {
VAMSAS r = roots[i];
+ int ds, tr;
System.out.print("Vamsas Root "+i+" (id="
+((r.getId()!=null) ? r.getId():"<none>")
- +") contains "+r.getDataSetCount()+" DataSets, "
- + r.getTreeCount()+" Global trees");
+ +") contains "+(ds=r.getDataSetCount())+" DataSets, "
+ + (tr=r.getTreeCount())+" Global trees\n");
+ if (cascade) {
+ for (int j=0; j<ds; j++) {
+ System.out.println("Dataset "+j);
+ cascade = datasetReport(r.getDataSet(j), true) && cascade ;
+ }
+ for (int j=0; j<tr; j++) {
+ System.out.println("Global tree "+j);
+ cascade = treeReport(r.getTree(j), true) && cascade;
+ }
+ }
}
return true;
}
return false;
}
+ public static boolean datasetReport(DataSet ds, boolean cascade) {
+ if (cascade)
+ reportProvenance(ds.getProvenance());
+ System.out.println("Dataset contains : "+ds.getSequenceCount()
+ +" sequences, "+ds.getAlignmentCount()+" alignments and "+ds.getTreeCount()+" trees.");
+ if (cascade)
+ alignmentReport(ds.getAlignment(), true);
+ return true;
+ }
+ public static boolean alignmentReport(Alignment[] al, boolean cascade) {
+ boolean val=true;
+ if (al!=null && al.length>0) {
+ for (int i=0; i<al.length; i++) {
+ System.out.println("Alignment "+i);
+ if (cascade)
+ reportProvenance(al[i].getProvenance());
+ System.out.println("Involves "+al[i].getAlignmentSequenceCount()+" sequences, has "
+ +al[i].getAlignmentAnnotationsCount()+" annotations and "+al[i].getTreeCount()+" trees.");
+ if (cascade) {
+ for (int t=0; t<al[i].getTreeCount(); t++)
+ treeReport(al[i].getTree(t), true);
+ }
+ }
+ }
+ return val;
+ }
+ public static boolean treeReport(Tree t, boolean cascade) {
+ System.out.println("Tree: '"+t.getTitle()+"'");
+ return !cascade || reportProvenance(t.getProvenance());
+ }
}