From 3b92275c26c14a678519f1d7d2ffaa477eb76cdb Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 14 Dec 2006 18:41:20 +0000 Subject: [PATCH] refactoring org to uk git-svn-id: https://svn.lifesci.dundee.ac.uk/svn/repository/trunk@286 be28352e-c001-0410-b1a7-c7978e42abec --- .../ac/vamsas/test/simpleclient/ArchiveClient.java | 293 ++++++++++++++++ .../ac/vamsas/test/simpleclient/ArchiveReader.java | 51 +++ .../vamsas/test/simpleclient/ArchiveReports.java | 187 ++++++++++ .../test/simpleclient/ArchiveStreamReader.java | 53 +++ .../vamsas/test/simpleclient/ArchiveWatcher.java | 106 ++++++ .../ac/vamsas/test/simpleclient/ArchiveWriter.java | 182 ++++++++++ src/uk/ac/vamsas/test/simpleclient/ClientDoc.java | 356 ++++++++++++++++++++ .../vamsas/test/simpleclient/ClientsFileTest.java | 311 +++++++++++++++++ .../vamsas/test/simpleclient/CommandProcessor.java | 65 ++++ .../ac/vamsas/test/simpleclient/VamsasArchive.java | 206 +++++++++++ .../test/simpleclient/simpleapp/VamsasClient.java | 4 +- .../simpleclient/simpleapp/VamsasDatastore.java | 2 +- 12 files changed, 1813 insertions(+), 3 deletions(-) create mode 100644 src/uk/ac/vamsas/test/simpleclient/ArchiveClient.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/ArchiveReader.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/ArchiveReports.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/ArchiveStreamReader.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/ArchiveWatcher.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/ArchiveWriter.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/ClientDoc.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/ClientsFileTest.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/CommandProcessor.java create mode 100644 src/uk/ac/vamsas/test/simpleclient/VamsasArchive.java diff --git a/src/uk/ac/vamsas/test/simpleclient/ArchiveClient.java b/src/uk/ac/vamsas/test/simpleclient/ArchiveClient.java new file mode 100644 index 0000000..4e0e68b --- /dev/null +++ b/src/uk/ac/vamsas/test/simpleclient/ArchiveClient.java @@ -0,0 +1,293 @@ +/** + * + */ +package uk.ac.vamsas.test.simpleclient; + +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.Hashtable; +import java.util.Vector; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.exolab.castor.xml.MarshalException; +import org.exolab.castor.xml.ValidationException; +import org.vamsas.test.objects.Core; + +import uk.ac.vamsas.client.ClientHandle; +import uk.ac.vamsas.client.IVorbaIdFactory; +import uk.ac.vamsas.client.SessionHandle; +import uk.ac.vamsas.client.UserHandle; +import uk.ac.vamsas.client.Vobject; +import uk.ac.vamsas.client.VorbaId; +import uk.ac.vamsas.client.simpleclient.AppDataOutputStream; +import uk.ac.vamsas.client.simpleclient.FileWatcher; +import uk.ac.vamsas.client.simpleclient.IdFactory; +import uk.ac.vamsas.client.simpleclient.SessionFile; +import uk.ac.vamsas.client.simpleclient.SimpleDocBinding; +import uk.ac.vamsas.client.simpleclient.SimpleDocument; +import uk.ac.vamsas.client.simpleclient.VamsasArchive; +import uk.ac.vamsas.client.simpleclient.VamsasArchiveReader; +import uk.ac.vamsas.client.simpleclient.VamsasFile; +import uk.ac.vamsas.objects.core.AppData; +import uk.ac.vamsas.objects.core.ApplicationData; +import uk.ac.vamsas.objects.core.User; +import uk.ac.vamsas.objects.core.VamsasDocument; +import uk.ac.vamsas.objects.utils.AppDataReference; +import uk.ac.vamsas.objects.utils.DocumentStuff; +import uk.ac.vamsas.objects.utils.ProvenanceStuff; +import uk.ac.vamsas.objects.utils.SeqSet; +import uk.ac.vamsas.objects.utils.document.VersionEntries; + +/** + * @author jimp + * test the VamsasFile routines for watching, reading and updating a vamsas document jar file. + * simple document access base class. + */ +public class ArchiveClient extends IdFactory { + + private Log log = LogFactory.getLog(ArchiveClient.class); + // protected UserHandle user=null; + // protected ClientHandle me = new ClientHandle("ArchiveClient","0.01"); + VamsasFile vsess; + + /** + * @param user + * @param vsess + */ + public ArchiveClient(UserHandle user, VamsasFile vsess) { + super(new SessionHandle("vamsasfile://"+vsess.getVamsasFile()), new ClientHandle("ArchiveClient","0.01"), user); + this.vsess = vsess; + valid(); + } + private void _openVsess(File vsess) { + try { + this.vsess = new VamsasFile(vsess); + } + catch (Exception e) { + log.error("Couldn't open session for file "+vsess,e); + this.vsess = null; + } + } + public ArchiveClient(String username, String organization, File vsess) { + super(new SessionHandle("vamsasfile://"+vsess), new ClientHandle("ArchiveClient","0.01"), new UserHandle(username, organization)); + _openVsess(vsess); + valid(); + } + public ArchiveClient(String username, String organization, String clientName, String clientVersion, File vsess) { + super(new SessionHandle("vamsasfile://"+vsess), new ClientHandle(clientName, clientVersion), new UserHandle(username, organization)); + _openVsess(vsess); + valid(); + } + public void valid() { + if (vsess==null) + throw new Error("ArchiveClient instance is invalid!."); + } + /** + * set this to false if watch loop should end immediately + */ + protected boolean watchForChange=true; + public static int WATCH_SLEEP=300; + /** + * watch the document file for updates. + * @param time - length of time to watch for. + * @return read only IO interface for session document. + */ + public ClientDoc watch(long time) { + valid(); + vsess.unLock(); // doh. + FileWatcher watcher = new FileWatcher(vsess.getVamsasFile()); + // watcher.setState(); + watchForChange=true; + long endtime=System.currentTimeMillis()+time; + try { + uk.ac.vamsas.client.simpleclient.Lock doclock; + do { + doclock=watcher.getChangedState(); + if (doclock==null) + Thread.sleep(WATCH_SLEEP); + } while (watchForChange && doclock==null && (time==0 || endtime>System.currentTimeMillis())); // tuning. + if (doclock==null) + return null; + else { + return getUpdateable(vsess.getLock(doclock)); + /*VamsasArchiveReader varc = new VamsasArchiveReader(vsess.getVamsasFile()); + return _getReadonly(varc);*/ + } + } catch (Exception e) { + log.error("Whilst watching file "+vsess.getVamsasFile(), e); + } + return null; + } + + // from ClientDocument.getClientAppdata + private AppData[] getAppData(VamsasDocument doc) { + if (doc==null) { + log.debug("extractAppData called for null document object"); + return null; + } + AppData appsGlobal=null, usersData=null; + Vector apldataset = AppDataReference.getUserandApplicationsData( + doc, this.getUserHandle(), this.getClientHandle()); + if (apldataset!=null) { + if (apldataset.size()>0) { + AppData clientdat = (AppData) apldataset.get(0); + if (clientdat instanceof ApplicationData) { + appsGlobal = (ApplicationData) clientdat; + if (apldataset.size()>1) { + clientdat = (AppData) apldataset.get(1); + if (clientdat instanceof User) { + usersData = (User) clientdat; + } + if (apldataset.size()>2) + log.info("Ignoring additional ("+(apldataset.size()-2)+") AppDatas returned by document appdata query."); + } + } else { + log.warn("Unexpected entry in AppDataReference query: id="+clientdat.getVorbaId()+" type="+clientdat.getClass().getName()); + } + apldataset.removeAllElements(); // destroy references. + } + } + return new AppData[] { appsGlobal, usersData}; + } + + protected ClientDoc _getReadonly(VamsasArchiveReader vreader) throws IOException, ValidationException, MarshalException { + valid(); + if (vreader!=null) { + SimpleDocBinding docb = new SimpleDocBinding(); + docb.setVorba(this); + VamsasDocument d; + d = docb.getVamsasDocument(vreader); + + if (d!=null) { + ClientDoc creader = new ClientDoc(d, null, vreader, getClientHandle().getClientUrn(), getProvenanceUser(), getVorbaIdHash()); + return creader; + } + } + return null; + } + /** + * from SimpleClient + * @return user field for a provenance entry + */ + protected String getProvenanceUser() { + return new String(getUserHandle().getFullName()+" ["+getClientHandle().getClientUrn()+"]"); + } + + public ClientDoc getUpdateable() { + return getUpdateable(null); + } + public ClientDoc getUpdateable(uk.ac.vamsas.client.simpleclient.Lock lock) { + getVorbaIdHash().clear(); + valid(); + try { + // patiently wait for a lock on the document. + long tries=5000; + while (lock==null && ((lock=vsess.getLock())==null || !lock.isLocked()) && --tries>0) { +// Thread.sleep(1); + log.debug("Trying to get a document lock for the "+tries+"'th time."); + } + VamsasArchive varc = new VamsasArchive(vsess, true, false); // read archive, write as vamsasDocument, don't erase original contents. + varc.setVorba(this); + VamsasDocument d = varc.getVamsasDocument(getProvenanceUser(), "Created new document.", VersionEntries.latestVersion()); // VAMSAS: provenance user and client combined + + if (d==null) { + log.warn("Backing out from opening a VamsasArchive writable IO session"); + varc.cancelArchive(); + return null; + } + ClientDoc cdoc = new ClientDoc(d, varc, varc.getOriginalArchiveReader(), getClientHandle().getClientUrn(), getProvenanceUser(), getVorbaIdHash()); + return cdoc; + // do appHandle? + } catch (Exception e) { + log.error("Failed to get Updateable version of "+vsess.getVamsasFile(), e); + } + return null; + } + /** + * trust client to not do anything stupid to the document roots which will now be written to the archive. + * @param cdoc + * @return true if write was a success. + */ + public boolean doUpdate(ClientDoc cdoc) { + valid(); + if (cdoc==null) { + log.warn("Invalid ClientDoc passed to uk.ac.vamsas.test.simpleclient.doUpdate()"); + return false; + } + if (cdoc.iohandler==null) { + log.warn("Read only ClientDoc object passed to uk.ac.vamsas.test.simpleclient.doUpdate()"); + return false; + } + if (cdoc.iohandler.getVorba()!=this) { + log.error("Mismatch between ClientDoc instances and ArchiveClient instances!"); + return false; + } + try { + // do any appDatas first. + if (cdoc.iohandler.transferRemainingAppDatas()) + log.debug("Remaining appdatas were transfered."); + cdoc.updateDocumentRoots(); + cdoc.iohandler.putVamsasDocument(cdoc.doc); + cdoc.iohandler.closeArchive(); + this.extantids.clear();// we forget our ids after we close the document. + cdoc.iohandler=null; + cdoc = null; + vsess.unLock(); + } catch (Exception e) { + log.warn("While updating archive in "+vsess.getVamsasFile(),e); + return false; + } + return true; + } + /** + * @param args + */ + public static void usage() { + throw new Error("Usage: Username Organization VamsasFile [command,args]*"); + } + public static void main(String[] args) { + // really simple. + if (args.length<3) + usage(); + + ArchiveClient client = new ArchiveClient(args[0],args[1], new File(args[2])); + ClientDoc cdoc=null; + // sanity test. + try { + cdoc = client.getUpdateable(); + // ArchiveReports.reportDocument(cdoc.doc, cdoc.getReader(), true, System.out); + System.out.println("Report Roots :"); + ArchiveReports.rootReport(cdoc.getVamsasRoots(), true, System.out); + cdoc.addVamsasRoot(Core.getDemoVamsas()); + System.out.println("Doing update."); + client.doUpdate(cdoc); + cdoc.closeDoc(); + cdoc = null; + int u=5; + while (--u>0) { + System.out.println("Watch for more... ("+u+" left)"); + ClientDoc ucdoc = client.watch(0000); + if (ucdoc!=null) { + System.out.println("****\nUpdate detected at "+new Date()); + ArchiveReports.reportDocument(ucdoc.doc, ucdoc.getReader(), true, System.out); + ucdoc.closeDoc(); + ucdoc=null; + } else { + System.out.println("!!!! Null document update detected at "+new Date()); + } + } + } + catch (Exception e) { + client.log.error("Broken!", e); + } + System.out.println("Finished at "+new Date()); + } + public uk.ac.vamsas.client.Vobject getObject(VorbaId id) { + Hashtable idhash = this.getVorbaIdHash(); + if (idhash!=null && idhash.containsKey(id)) + return (Vobject) idhash.get(id); + return null; + } +} diff --git a/src/uk/ac/vamsas/test/simpleclient/ArchiveReader.java b/src/uk/ac/vamsas/test/simpleclient/ArchiveReader.java new file mode 100644 index 0000000..68e6ff4 --- /dev/null +++ b/src/uk/ac/vamsas/test/simpleclient/ArchiveReader.java @@ -0,0 +1,51 @@ +package uk.ac.vamsas.test.simpleclient; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; + + +import uk.ac.vamsas.client.simpleclient.VamsasArchiveReader; +import uk.ac.vamsas.objects.core.VAMSAS; +import uk.ac.vamsas.objects.core.VamsasDocument; + +public class ArchiveReader { + /** + * tests VamsasArchiveReader archive reader on a vamsas jar file + * @param args + */ + public static void main(String args[]) { + + try { + File av = new File(args[0]); + VamsasArchiveReader var = new VamsasArchiveReader(av); + VAMSAS roots[]=null; + if (var.isValid()) { + InputStreamReader vdoc = new InputStreamReader(var.getVamsasDocumentStream()); + VamsasDocument doc = VamsasDocument.unmarshal(vdoc); + if (ArchiveReports.reportDocument(doc, var, true, System.out)) { + roots = doc.getVAMSAS(); + } + } else { + InputStream vxmlis = var.getVamsasXmlStream(); + + if (vxmlis!=null) { // Might be an old vamsas file. + BufferedInputStream ixml = new BufferedInputStream(var.getVamsasXmlStream()); + InputStreamReader vxml = new InputStreamReader(ixml); + VAMSAS root; + // unmarshal seems to always close the stream (should check this) + if ((root = VAMSAS.unmarshal(vxml))!=null) { + System.out.println("Read a root."); + roots = new VAMSAS[1]; + roots[0] = root; + } + } + } + if (!ArchiveReports.rootReport(roots, true, System.out)) + System.err.print(args[0]+" is not a valid vamsas archive."); + } catch (Exception e) { + e.printStackTrace(System.err); + } + } +} diff --git a/src/uk/ac/vamsas/test/simpleclient/ArchiveReports.java b/src/uk/ac/vamsas/test/simpleclient/ArchiveReports.java new file mode 100644 index 0000000..94d06bf --- /dev/null +++ b/src/uk/ac/vamsas/test/simpleclient/ArchiveReports.java @@ -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; i1) { + 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(); i0) { + User users[] = appD.getUser(); + for (int i=0,j=users.length; i0 && 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") + +") contains "+(ds=r.getDataSetCount())+" DataSets, " + + (tr=r.getTreeCount())+" Global trees\n"); + if (cascade) { + for (int j=0; j0) { + for (int i=0; i0) { + File archive = new File(args[0]); + log.info("Watching file "+args[0]); + int argc=1; + while (argc < args.length) { + // vars needed for operations + ClientHandle ch; + int com = cproc.getCommand(args, argc); + argc++; + switch (com) { + case 0: + // new + log.info("Doing locked deletion and new-file creation."); + { + if (!archive.exists()) + archive.createNewFile(); + VamsasFile sf = new VamsasFile(archive); + Lock l = sf.getLock(); + archive.delete(); + archive.createNewFile(); + sf.unLock(); + } + break; + case 1: + // delete + log.info("Deleting "+archive+" without locking it first."); + archive.delete(); + break; + case 2: + // watch + log.info("Endlessly Watching file "+archive); + /* if (!archive.exists()) + archive.createNewFile(); + */ // watch the new file... - taken straight from ClientsFileTest + FileWatcher w = new FileWatcher(archive); + while (true) { + // get watcher's lock to ensure state change is fixed for retrieval + Lock chlock = w.getChangedState(); + if (chlock != null) { + log.info("Got lock on "+archive+(archive.exists() ? " exists l="+archive.length() : "(non existant)")); + if (archive.length()>0) { + VamsasArchiveReader vreader = new VamsasArchiveReader(archive); + SimpleDocument sdoc = new SimpleDocument("testing vamsas watcher"); + try { + VamsasDocument d = sdoc.getVamsasDocument(vreader); + if (d!=null) { + ArchiveReports.reportDocument(d, vreader, false, System.out); + } + System.out.println("Update at "+System.currentTimeMillis()+"\n\n********************************************************\n"); + } catch (Exception e) { + log.error("Unmarshalling failed.",e); + } + vreader.close(); + w.setState(); + } + } + } + // break; + case 3: // set file + archive = new File(args[argc++]); + break; + case 4: + break; + default: + log.warn("Unknown command + "+args[argc++]); + } + } + } + } catch (Exception e) { + log.error(e); + } + + } +} diff --git a/src/uk/ac/vamsas/test/simpleclient/ArchiveWriter.java b/src/uk/ac/vamsas/test/simpleclient/ArchiveWriter.java new file mode 100644 index 0000000..528ae46 --- /dev/null +++ b/src/uk/ac/vamsas/test/simpleclient/ArchiveWriter.java @@ -0,0 +1,182 @@ +package uk.ac.vamsas.test.simpleclient; + +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.text.DateFormat; +import java.util.Date; +import java.util.Hashtable; +import java.util.Vector; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +der; +import uk.ac.vamsas.objects.core.Alignment; +import uk.ac.vamsas.objects.core.ApplicationData; +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.VAMSAS; +import uk.ac.vamsas.objects.core.VamsasDocument; +import uk.ac.vamsas.objects.ut +import uk.ac.vamsas.client.simpleclient.VamsasArchive; +import uk.ac.vamsas.client.simpleclient.VamsasArchiveReader; +ils.ProvenanceStuff; + +public class ArchiveWriter { + + /** + * Test program for writing archive files. + * form is ArchiveWriter new/modified argive command list + */ + + static Log log = LogFactory.getLog(ArchiveWriter.class); + + private static void mergeVecs(Object[] destvec, Object[] svec1, Object[] svec2) { + int i; + for (i=0; i0) { + ApplicationData[] newdat = new ApplicationData[source.getApplicationDataCount()+dest.getApplicationDataCount()]; + ApplicationData[] sappd = source.getApplicationData(); + // check refs and update/modify if necessary + for (int i=0; i [(commands)]"); + return; + } + File newarch = new File(argv[0]); + int argpos = 0; + try { + // test fully fledged doc construction + VamsasArchive varc = new VamsasArchive(newarch, true); + VamsasDocument docroot; + docroot = new VamsasDocument(); + docroot.setProvenance(ProvenanceStuff.newProvenance("ArchiveWriter", "user", "Created new Vamsas Document")); + while (++argpos-1) { + if (isValidUpdate(newr[k], original[i])) { + modified=true; + rts.add(newr[k]); + newr[k]=null; + } else { + // LATER: try harder to merge ducument roots. + log.warn("Couldn't merge new VAMSAS root "+newr[k].getId()); + newr[k] = null; // LATER: this means we ignore mangled roots. NOT GOOD + } + } else { + // add in order. + rts.add(original[i]); + } + } + // add remaining (new) roots + for (int i=0,j=newr.length; i2) + complainArgs(args.length, argc+1, comnext); + return com; + } + } + return -1; + + } +} diff --git a/src/uk/ac/vamsas/test/simpleclient/VamsasArchive.java b/src/uk/ac/vamsas/test/simpleclient/VamsasArchive.java new file mode 100644 index 0000000..d682f10 --- /dev/null +++ b/src/uk/ac/vamsas/test/simpleclient/VamsasArchive.java @@ -0,0 +1,206 @@ +package uk.ac.vamsas.test.simpleclient; + +import java.io.File; +import java.io.ObjectOutputStream; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.vamsas.test.objects.Core; + +import uk.ac.vamsas.client.simpleclient.Lock; +import uk.ac.vamsas.client.simpleclient.SessionFile; +import uk.ac.vamsas.client.simpleclient.SimpleDocument; +import uk.ac.vamsas.client.simpleclient.VamsasArchiveReader; +import uk.ac.vamsas.client.simpleclient.VamsasFile; +import uk.ac.vamsas.objects.core.ApplicationData; +import uk.ac.vamsas.objects.core.User; +import uk.ac.vamsas.objects.core.VAMSAS; +import uk.ac.vamsas.objects.core.VamsasDocument; + +public class VamsasArchive { + /** + * test the org.vamsas.simpleclient.vamsasArchive class + */ + static Log log = LogFactory.getLog(VamsasArchive.class); + public static ApplicationData makeDemoAppdata(uk.ac.vamsas.client.simpleclient.VamsasArchive va, String apname, String userName, String userOrg) { + if (va==null) + return null; + VamsasArchiveReader vread=null; + try { + vread = va.getOriginalArchiveReader(); + } + catch (Exception e) { + log.error("Failed to get original archive reader!",e); + return null; + } + ApplicationData appdata = new ApplicationData(); + appdata.setName("uk.ac.vamsas.test.simpleclient.VamsasArchive"); + appdata.setData(new String("this is some test data.").getBytes()); + User apuser = new User(); + apuser.setFullname(userName); + apuser.setOrganization(userOrg); + String appdata_ref = "vamsas:"+apname+"/"+apuser.getOrganization()+"/"+apuser.getFullname(); + SimpleDocument sdoc = new SimpleDocument("test.simpleclient.VamsasArchive"); + if (vread!=null) { + VamsasDocument orignalnew; + try { + orignalnew = sdoc.getVamsasDocument(vread); + log.info("*** Dump follows ***"); + + ArchiveReports.reportDocument(orignalnew, vread, false, System.out); + log.info("*** Dump precedes ***"); + } catch (Exception e) { + log.info("makeDemoAppdata: Problems accessing original document"); + } + + log.info("Reading (and avoiding references to) original data"); + if (vread.getAppdataStream(appdata_ref)!=null) { + // transfer over + try { + va.transferAppDataEntry(appdata_ref); + } catch (Exception e) { + log.warn("Exception when transferring appdata reference : "+appdata_ref, e); + } + int i=0; + while (vread.getAppdataStream(appdata_ref+"/"+Integer.toString(++i))!=null) { + try { + // copy over another duplicate. + va.transferAppDataEntry(appdata_ref+"/"+Integer.toString(i)); + } catch (Exception e) { + log.warn("Exception when transferring appdata reference : "+appdata_ref, e); + } + } + // this one must be unique! + appdata_ref+="/"+Integer.toString(i); + } + } + + log.info("Adding new data stuff."); + log.info("Writing an apdata reference using AppDataStream interface."); + apuser.setDataReference(appdata_ref); + appdata.addUser(apuser); + appdata.setVersion("noggin"); + //TODO: write instance appdata appdata.setUrn("program:/the.nog/"); + try { + ObjectOutputStream ost = new ObjectOutputStream(va.getAppDataStream(appdata_ref)); + ost.writeObject(appdata); + ost.close(); + } catch (Exception e) { + log.warn("Couldn't write appdata reference "+appdata_ref); + } + return appdata; + } + public static void main(String args[]) { + + try { + File av; + if (args.length>0) + av = new File(args[0]); + else + av = new File("test/vamsas.zip"); + log.info("Opening archive "+av); + uk.ac.vamsas.client.simpleclient.VamsasArchive varchive = new uk.ac.vamsas.client.simpleclient.VamsasArchive(av, true); + + VAMSAS[] roots = (VAMSAS[]) varchive.getOriginalRoots(); + + if (roots!=null) { + log.info("Report on Original roots in archive:"); + ArchiveReports.rootReport(roots, true, System.out); + } + log.info("Getting current vamsas document."); + VamsasDocument doc = varchive.getVamsasDocument(); + ArchiveReports.reportDocument(doc, varchive.getOriginalArchiveReader(), true, System.out); // not modified document so references will still be valid + // do some stuff + log.info("Retrieving backup"); + File backup = varchive.backupFile(); + if (backup==null) + log.info(av+" is a New Archive."); + else + log.info(av+" has been backed up as "+backup); + File newf=new File(av.getAbsolutePath()+"_new.zip"); + VamsasFile sfile = new VamsasFile(newf); + /* if (newf.exists()) { + int q=1; + do { + newf=new File(av.getAbsolutePath()+"_"+q+++"_new.zip"); + } + while (newf.exists()); + } */ + if (newf.exists()) { + log.info("Removing existing "+newf); + newf.delete(); + } + + log.info("Now writing new Archive into "+newf.getAbsolutePath()); + uk.ac.vamsas.client.simpleclient.VamsasArchive va=null; + { // hold lock over deletion and write of new archive. + //Lock wlock = sfile.getLock(); + //newf.delete(); // clear out old file. + sfile.getLock(); + va = new uk.ac.vamsas.client.simpleclient.VamsasArchive(newf, true, true, sfile); + // open another and... + ApplicationData appdata = makeDemoAppdata(va, + "uk.ac.vamsas.test.simpleclient.VamsasArchive", "arnold Bugger esq", "disOrganised"); + log.info("Preparing to write new document."); + doc.addApplicationData(appdata); + doc.addVAMSAS(Core.getDemoVamsas()); + va.putVamsasDocument(doc); // gets stream and puts it. + va.closeArchive(); + sfile.unLock(); + } + log.info("Dump of new vamsas document :"); + log.info("Testing update: "); + { + Lock lock=sfile.getLock(); + if (lock==null) + while ((lock=sfile.getLock())==null) { + log.info("Waiting for lock."); + Thread.sleep(100); + } + VamsasArchiveReader vreader = new VamsasArchiveReader(sfile.getVamsasFile());// lock); // cannot do new JarFile on a locked file. // newf); + SimpleDocument sdoc = new SimpleDocument("testing new vamsas write"); + ArchiveReports.reportDocument(sdoc.getVamsasDocument(vreader), vreader, true, System.out); + sfile.unLock(); + } + // backup.delete(); // tidy up + + log.info("Now Cancelling write to original archive "+av); + if (varchive.cancelArchive()) + log.info("Successfully cancelled."); + else + log.info("Didn't cancel."); + long t=System.currentTimeMillis()+200; while (t>System.currentTimeMillis()); + log.info("Now testing archive update."); + va = new uk.ac.vamsas.client.simpleclient.VamsasArchive(newf, false, true, sfile); + doc = va.getVamsasDocument(); + doc.addVAMSAS(Core.getDemoVamsas()); + doc.addApplicationData(makeDemoAppdata(va, + "uk.ac.vamsas.test.simpleclient.VamsasArchive", "another old Bugger esq", "rescinded")); + if (va.transferRemainingAppDatas()) + log.info("Remain appdatas were transferred."); + else + log.warn("No appdatas were transferred. This is wrong."); + va.putVamsasDocument(doc); + va.closeArchive(); + sfile.unLock(); + log.info("Testing update: "); + { + Lock lock=sfile.getLock(); + if (lock==null) + while ((lock=sfile.getLock())==null) + log.info("Waiting for lock."); + // VamsasArchiveReader vreader = new VamsasArchiveReader(lock); + VamsasArchiveReader vreader = new VamsasArchiveReader(newf); + + SimpleDocument sdoc = new SimpleDocument("testing vamsas update"); + VamsasDocument finaldoc = sdoc.getVamsasDocument(vreader); + if (finaldoc!=null) + ArchiveReports.reportDocument(finaldoc, vreader, true, System.out); + else + log.error("Null Document Read from "+newf); + } + } catch (Exception e) { + e.printStackTrace(System.err); + } + } +} diff --git a/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java b/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java index a5c37e8..860f3af 100644 --- a/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java +++ b/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java @@ -14,8 +14,6 @@ import java.util.jar.JarOutputStream; import javax.swing.JInternalFrame; -import org.vamsas.test.simpleclient.ArchiveClient; -import org.vamsas.test.simpleclient.ClientDoc; import uk.ac.vamsas.client.UserHandle; import uk.ac.vamsas.client.simpleclient.FileWatcher; @@ -23,6 +21,8 @@ import uk.ac.vamsas.client.simpleclient.VamsasArchive; import uk.ac.vamsas.client.simpleclient.VamsasFile; import uk.ac.vamsas.objects.core.Entry; import uk.ac.vamsas.objects.core.VamsasDocument; +import uk.ac.vamsas.test.simpleclient.ArchiveClient; +import uk.ac.vamsas.test.simpleclient.ClientDoc; /** * @author jimp diff --git a/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasDatastore.java b/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasDatastore.java index aa2081f..7d74186 100644 --- a/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasDatastore.java +++ b/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasDatastore.java @@ -19,7 +19,6 @@ package uk.ac.vamsas.test.simpleclient.simpleapp; -import org.vamsas.test.simpleclient.ClientDoc; import java.io.*; @@ -36,6 +35,7 @@ import uk.ac.vamsas.client.Vobject; import uk.ac.vamsas.client.VorbaId; import uk.ac.vamsas.objects.core.*; import uk.ac.vamsas.objects.utils.DocumentStuff; +import uk.ac.vamsas.test.simpleclient.ClientDoc; /* * -- 1.7.10.2