still dealing with JarInputStream issues.
[vamsas.git] / src / org / vamsas / test / simpleclient / VamsasArchive.java
index 0b85bfc..6793019 100644 (file)
@@ -1,16 +1,15 @@
 package org.vamsas.test.simpleclient;
 
-import java.io.BufferedInputStream;
 import java.io.File;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.io.ObjectOutputStream;
-import java.io.PrintWriter;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.vamsas.client.simpleclient.*;
-import org.vamsas.objects.core.AppDataChoice;
+import org.vamsas.client.simpleclient.Lock;
+import org.vamsas.client.simpleclient.SessionFile;
+import org.vamsas.client.simpleclient.SimpleDocument;
+import org.vamsas.client.simpleclient.VamsasArchiveReader;
+import org.vamsas.client.simpleclient.VamsasFile;
 import org.vamsas.objects.core.ApplicationData;
 import org.vamsas.objects.core.User;
 import org.vamsas.objects.core.VAMSAS;
@@ -22,7 +21,74 @@ public class VamsasArchive {
    * test the org.vamsas.simpleclient.vamsasArchive class
    */
   static Log log = LogFactory.getLog(VamsasArchive.class);
-  
+  public static ApplicationData makeDemoAppdata(org.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("org.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");
+    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 {
@@ -38,11 +104,11 @@ public class VamsasArchive {
       
       if (roots!=null) {
         log.info("Report on Original roots in archive:");
-        ArchiveReports.rootReport(roots, true);
+        ArchiveReports.rootReport(roots, true, System.out);
       }
       log.info("Getting current vamsas document.");
       VamsasDocument doc = varchive.getVamsasDocument();
-      ArchiveReports.reportDocument(doc, varchive.getOriginalArchiveReader(), true); // not modified document so references will still be valid
+      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();
@@ -50,47 +116,79 @@ public class VamsasArchive {
         log.info(av+" is a New Archive.");
       else 
         log.info(av+" has been backed up as "+backup);
-      if (backup!=null) {
-        log.info("Backup "+backup+" is being written to.");
-        // open another and...
-        ApplicationData appdata = new ApplicationData();
-        appdata.setName("org.vamsas.test.simpleclient.VamsasArchive");
-        appdata.setAppDataChoice(new AppDataChoice());
-        appdata.getAppDataChoice().setData(new String("this is some test data.").getBytes());
-        User apuser = new User();
-        apuser.setFullname("arnold Bugger esq");
-        apuser.setOrganization("disOrganised");
-        String appdata_ref = "vamsas:org.vamsas.test.simpleclient.VamsasArchive/"+apuser.getOrganization()+"/"+apuser.getFullname();
-        org.vamsas.client.simpleclient.VamsasArchive va = new org.vamsas.client.simpleclient.VamsasArchive(backup, true);
-        VamsasArchiveReader vread = va.getOriginalArchiveReader();
-        if (vread.getAppdataStream(appdata_ref)!=null) {
-          int i=0;
-          while (vread.getAppdataStream(appdata_ref+"/"+Integer.toString(++i))!=null)
-              ;
-          appdata_ref+="/"+Integer.toString(i);
+      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");
         }
-        log.info("Writing an apdata reference using AppDataStream interface.");
-        apuser.setAppDataChoice(new AppDataChoice());
-        apuser.getAppDataChoice().setDataReference(appdata_ref);
-        ObjectOutputStream apdos = new ObjectOutputStream(va.getAppDataStream(appdata_ref));
-        apdos.writeObject(appdata_ref);
-        apdos.writeObject(apuser); // some random content
-        apdos.close(); // this should *not* close the archive!
+        while (newf.exists()); 
+      } */
+      log.info("Now writing new Archive into "+newf.getAbsolutePath());
+      org.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.
+        va = new org.vamsas.client.simpleclient.VamsasArchive(newf, true, true); // , sfile);
+        // open another and...
+        ApplicationData appdata = makeDemoAppdata(va, 
+            "org.vamsas.test.simpleclient.VamsasArchive", "arnold Bugger esq", "disOrganised");
         log.info("Preparing to write new document.");
         doc.addApplicationData(appdata);
         doc.addVAMSAS(Core.getDemoVamsas());
-        PrintWriter vxml = varchive.getDocumentOutputStream();
-        doc.marshal(vxml);
-        // TODO: verify that the vxml stream close method overridden ?
+        va.putVamsasDocument(doc); // gets stream and puts it.
         va.closeArchive();
-        log.info("Dump of new vamsas document :");
-        va = new org.vamsas.client.simpleclient.VamsasArchive(backup, true); // TODO - refactor Reader class to have deserializing helpers
-        ArchiveReports.reportDocument(va.getVamsasDocument(), va.getOriginalArchiveReader(), true);
-        backup.delete(); // tidy up
+        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.");
+        VamsasArchiveReader vreader = new VamsasArchiveReader(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 org.vamsas.client.simpleclient.VamsasArchive(newf, false, true, sfile);
+      doc = va.getVamsasDocument();
+      doc.addVAMSAS(Core.getDemoVamsas());
+      doc.addApplicationData(makeDemoAppdata(va, 
+          "org.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();
+      System.exit(0);
+      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);
+        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);
       }
-      log.info("Cancelling write to original archive "+av);
-      varchive.cancelArchive();
-
     } catch (Exception e) {
       e.printStackTrace(System.err);
     }