refactoring org to uk
[vamsas.git] / src / org / vamsas / test / simpleclient / VamsasArchive.java
index c023a24..c98b4b7 100644 (file)
@@ -5,19 +5,91 @@ import java.io.ObjectOutputStream;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.vamsas.client.simpleclient.VamsasArchiveReader;
-import org.vamsas.objects.core.ApplicationData;
-import org.vamsas.objects.core.User;
-import org.vamsas.objects.core.VAMSAS;
-import org.vamsas.objects.core.VamsasDocument;
 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("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");
+    //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 {
@@ -27,17 +99,17 @@ public class VamsasArchive {
       else
         av = new File("test/vamsas.zip");
       log.info("Opening archive "+av);
-      org.vamsas.client.simpleclient.VamsasArchive varchive = new org.vamsas.client.simpleclient.VamsasArchive(av, true);
+      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);
+        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();
@@ -45,61 +117,88 @@ public class VamsasArchive {
         log.info(av+" is a New Archive.");
       else 
         log.info(av+" has been backed up as "+backup);
-      if (backup!=null) {
-        File newf=new File(av.getAbsolutePath()+"_new.zip");
-        log.info("Now writing new Archive "+newf.getAbsolutePath());
-        org.vamsas.client.simpleclient.VamsasArchive va = new org.vamsas.client.simpleclient.VamsasArchive(newf, true);
-        // open another and...
-        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("arnold Bugger esq");
-        apuser.setOrganization("disOrganised");
-        String appdata_ref = "vamsas:org.vamsas.test.simpleclient.VamsasArchive/"+apuser.getOrganization()+"/"+apuser.getFullname();
-
-        
-        VamsasArchiveReader vread = va.getOriginalArchiveReader();
-        
-        if (vread!=null) {
-          log.info("Reading (and avoiding references to) original data in "+newf);
-          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");
         }
+        while (newf.exists()); 
+      } */
+      if (newf.exists()) {
+        log.info("Removing existing "+newf);
+        newf.delete();
+      }
         
-        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/");
-        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!
-        log.info("Written Appdata Stream");
+      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, 
+            "org.vamsas.test.simpleclient.VamsasArchive", "arnold Bugger esq", "disOrganised");
         log.info("Preparing to write new document.");
         doc.addApplicationData(appdata);
         doc.addVAMSAS(Core.getDemoVamsas());
-        // TODO: ensure all jar entries are transferred over (at least those that are referenced - make a flag for 'tidy zip manifest'.
         va.putVamsasDocument(doc); // gets stream and puts it.
-        // TODO: verify that the vxml stream close method overridden ?
         va.closeArchive();
-        
-        log.info("Dump of new vamsas document :");
-        va = new org.vamsas.client.simpleclient.VamsasArchive(newf, true); // TODO - refactor Reader class to have deserializing helpers
-        ArchiveReports.reportDocument(va.getVamsasDocument(), va.getOriginalArchiveReader(), true);
-        log.info("Cancelling write (which was necessary to dump new vamsas document!)");
-        va.cancelArchive();
-        // 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.");
+            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);
-      varchive.cancelArchive();
-
+      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, 
+          "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();
+      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);
     }