refactoring org to uk
[vamsas.git] / src / uk / ac / vamsas / test / simpleclient / ArchiveReports.java
diff --git a/src/uk/ac/vamsas/test/simpleclient/ArchiveReports.java b/src/uk/ac/vamsas/test/simpleclient/ArchiveReports.java
new file mode 100644 (file)
index 0000000..94d06bf
--- /dev/null
@@ -0,0 +1,187 @@
+package uk.ac.vamsas.test.simpleclient;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+
+import uk.ac.vamsas.client.ClientDocument;
+import uk.ac.vamsas.client.Vobject;
+import uk.ac.vamsas.client.simpleclient.VamsasArchiveReader;
+import uk.ac.vamsas.objects.core.Alignment;
+import uk.ac.vamsas.objects.core.AppData;
+import uk.ac.vamsas.objects.core.ApplicationData;
+import uk.ac.vamsas.objects.core.DataSet;
+import uk.ac.vamsas.objects.core.Entry;
+import uk.ac.vamsas.objects.core.Instance;
+import uk.ac.vamsas.objects.core.Provenance;
+import uk.ac.vamsas.objects.core.Tree;
+import uk.ac.vamsas.objects.core.User;
+import uk.ac.vamsas.objects.core.VAMSAS;
+import uk.ac.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 Vobject was valid or not
+ * TODO: LATER: propagate true/false return so that an invalid vamsas Vobject invalidates the whole document
+ * @author jimp
+ *
+ */
+public class ArchiveReports {
+    /**
+     * print an informative summary on a VamsasDocument
+     * @param outstr TODO
+     * @param document - the document itself
+     * @param archive - document source archive for resolving any appData refs
+     * @return
+     */
+  public static boolean reportProvenance(Provenance p, PrintStream outstr) {
+    if (p==null) {
+      outstr.println("No Provenance");
+      return false;
+    }
+    Entry[] pe = p.getEntry();
+    for (int i=0; i<pe.length; i++)
+      outstr.println(pe[i].getDate()+"\t'"+pe[i].getUser()+"'\t"+pe[i].getApp()+"\t'"+pe[i].getAction()+"'");
+    return true;
+  }
+  public static boolean appDataEntryReport(AppData appD, VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {
+    if (appD!=null) {
+      boolean nulldata=false;
+      if (appD.getDataReference()!=null) {
+        String appData=appD.getDataReference();
+        if (appData==null) { outstr.println("Empty DataReference - not valid ?"); } 
+        else 
+          if (appData.length()>1) {
+          outstr.print("a reference ("+appData+")");
+          InputStream jstrm;
+          if ((jstrm=archive.getAppdataStream(appData))!=null)
+            outstr.println(" which resolves to a JarEntry.");
+          else {
+            outstr.println(" which does not resolve to a JarEntry.");
+            outstr.println("Unresolved appdata reference '"+appData+"'");
+          }
+        } else {
+          nulldata=true;
+        }
+      } else {
+        if (appD.getData()==null)
+          nulldata &= true;
+          else
+          outstr.println("an embedded chunk of "+appD.getData().length+" bytes.");
+      }
+      if (nulldata)
+        outstr.println("Null AppData reference/data chunk.");
+    }
+    return true;
+  }
+  
+  public static boolean appDataReport(ApplicationData appD, VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {
+    if (appD!=null) {
+      // Report on root appData
+      appDataEntryReport(appD, archive, cascade, outstr);
+      if (appD.getInstanceCount()>0) {
+        Instance inst[] = appD.getInstance();
+        for (int i=0,j=inst.hashCode(); i<j; i++) {
+          outstr.println("Data for App Instance URN: '"+inst[i].getUrn());
+          appDataEntryReport(inst[i],archive,cascade,outstr);
+        }
+      }
+      if (appD.getUserCount()>0) {
+        User users[] = appD.getUser();
+        for (int i=0,j=users.length; i<j; i++) {
+          outstr.println("Data for User '"+users[i].getFullname()+"' of '"+users[i].getOrganization()+"'");
+          appDataEntryReport(users[i], archive, cascade, outstr);
+        }
+      }
+    }
+
+    return true;
+  }
+  public static boolean reportDocument(VamsasDocument document, VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {
+    if (document!=null) {
+      outstr.println("Vamsas Document version '"+document.getVersion()+"'");
+      reportProvenance(document.getProvenance(), outstr);
+      outstr.print("Document contains "+document.getVAMSASCount()+" VAMSAS Elements and "+document.getApplicationDataCount()+" Application data elements.\n");
+      if (document.getVAMSASCount()>0 && cascade)
+        rootReport(document.getVAMSAS(), true, outstr);
+      if (document.getApplicationDataCount()>0) {
+        outstr.print("There are "+document.getApplicationDataCount()+" ApplicationData references.\n");
+        ApplicationData appd[] = document.getApplicationData();
+        for (int i=0,j=appd.length; i<j; i++) {
+          outstr.print("Application "+i+": '"+appd[i].getName()+"'\nVersion '"+appd[i].getVersion()+"'\n");
+          outstr.print("AppData is :");
+          appDataReport(appd[i], archive, cascade, outstr);
+        }
+          
+      }
+      return true;
+    } else {
+      outstr.println("Document Object is null");
+    }
+    return false;
+  }
+
+  /**
+   * summarises all the datasets in a vamsas document.
+   * @param roots
+   * @param cascade TODO
+   * @param outstr TODO
+   * @return
+   */
+  public static boolean rootReport(VAMSAS[] roots, boolean cascade, PrintStream outstr) {
+    if (roots!=null) {
+      for (int i=0; i<roots.length; i++) {
+        VAMSAS r = roots[i];
+        int ds, tr;
+        outstr.print("Vamsas Root "+i+" (id="
+            +((r.getId()!=null) ? r.getId():"<none>")
+            +") contains "+(ds=r.getDataSetCount())+" DataSets, "
+            + (tr=r.getTreeCount())+" Global trees\n");
+        if (cascade) {
+          for (int j=0; j<ds; j++) {
+            outstr.println("Dataset "+j);
+            cascade = datasetReport(r.getDataSet(j), true, outstr) && cascade ;
+          }
+          for (int j=0; j<tr; j++) {
+            outstr.println("Global tree "+j);
+            cascade = treeReport(r.getTree(j), true, outstr) && cascade;
+          }
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+  public static boolean datasetReport(DataSet ds, boolean cascade, PrintStream outstr) {
+    if (cascade)
+      reportProvenance(ds.getProvenance(), outstr);
+    outstr.println("Dataset contains : "+ds.getSequenceCount()
+        +" sequences, "+ds.getAlignmentCount()+" alignments and "+ds.getTreeCount()+" trees.");
+    if (cascade)
+      alignmentReport(ds.getAlignment(), true, outstr);
+    return true;
+  }
+  public static boolean alignmentReport(Alignment[] al, boolean cascade, PrintStream outstr) {
+    boolean val=true;
+    if (al!=null && al.length>0) {
+      for (int i=0; i<al.length; i++) {
+        outstr.println("Alignment "+i+(al[i].isRegistered() ? " ("+al[i].getVorbaId()+")" : " (unregistered)"));
+        if (cascade)
+          reportProvenance(al[i].getProvenance(), outstr);
+        outstr.println("Involves "+al[i].getAlignmentSequenceCount()+" sequences, has "
+            +al[i].getAlignmentAnnotationCount()+" annotations and "+al[i].getTreeCount()+" trees.");
+        if (cascade) {
+          for (int t=0; t<al[i].getTreeCount(); t++)
+            treeReport(al[i].getTree(t), true, outstr);
+        }
+      }
+    }
+    return val;
+  }
+  public static boolean treeReport(Tree t, boolean cascade, PrintStream outstr) {
+    outstr.println("Tree: '"+t.getTitle()+"'");
+    return !cascade || reportProvenance(t.getProvenance(), outstr);
+  }
+
+}