/* * This file is part of the Vamsas Client version 0.1. * Copyright 2009 by Jim Procter, Iain Milne, Pierre Marguerite, * Andrew Waterhouse and Dominik Lindner. * * Earlier versions have also been incorporated into Jalview version 2.4 * since 2008, and TOPALi version 2 since 2007. * * The Vamsas Client is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Vamsas Client is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Vamsas Client. If not, see . */ 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.print(pe[i].getDate() + "\t'" + pe[i].getUser() + "'\t" + pe[i].getApp() + "\t'" + pe[i].getAction() + "' "); outputVobjectState(pe[i], outstr); } 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() : "") + ") contains " + (ds = r.getDataSetCount()) + " DataSets, " + (tr = r.getTreeCount()) + " Global trees\n"); outputVobjectState(r, outstr); 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 void outputVobjectState(Vobject v, PrintStream outstr) { outstr.print(" (Object is: "); boolean comma = false; if (v.is__stored_in_document()) { outstr.print(" stored"); comma = true; } if (v.isNewInDocument()) { if (comma) outstr.print(","); comma = true; outstr.print(" new in document"); } if (v.isUpdated()) { if (comma) outstr.print(","); comma = true; outstr.print(" updated since last read"); } outstr.println(")"); } public static boolean datasetReport(DataSet ds, boolean cascade, PrintStream outstr) { if (cascade) reportProvenance(ds.getProvenance(), outstr); outputVobjectState(ds, 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)")); outputVobjectState(al[i], outstr); 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.print("Tree: '" + t.getTitle() + "' "); outputVobjectState(t, outstr); return !cascade || reportProvenance(t.getProvenance(), outstr); } }