refactoring org to uk
[vamsas.git] / src / org / vamsas / test / simpleclient / ArchiveClient.java
index 253e993..dec872a 100644 (file)
@@ -6,36 +6,40 @@ package org.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.client.ClientHandle;
-import org.vamsas.client.IVorbaIdFactory;
-import org.vamsas.client.SessionHandle;
-import org.vamsas.client.UserHandle;
-import org.vamsas.client.simpleclient.AppDataOutputStream;
-import org.vamsas.client.simpleclient.FileWatcher;
-import org.vamsas.client.simpleclient.IdFactory;
-import org.vamsas.client.simpleclient.SessionFile;
-import org.vamsas.client.simpleclient.SimpleDocBinding;
-import org.vamsas.client.simpleclient.SimpleDocument;
-import org.vamsas.client.simpleclient.VamsasArchive;
-import org.vamsas.client.simpleclient.VamsasArchiveReader;
-import org.vamsas.client.simpleclient.VamsasFile;
-import org.vamsas.objects.core.AppData;
-import org.vamsas.objects.core.ApplicationData;
-import org.vamsas.objects.core.User;
-import org.vamsas.objects.core.VamsasDocument;
-import org.vamsas.objects.utils.AppDataReference;
-import org.vamsas.objects.utils.DocumentStuff;
-import org.vamsas.objects.utils.ProvenanceStuff;
-import org.vamsas.objects.utils.SeqSet;
-import org.vamsas.objects.utils.document.VersionEntries;
 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.
@@ -80,7 +84,11 @@ public class ArchiveClient extends IdFactory {
     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.
@@ -88,21 +96,24 @@ public class ArchiveClient extends IdFactory {
    */
   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 {
-      org.vamsas.client.simpleclient.Lock doclock;
-      watcher.setState();
+      uk.ac.vamsas.client.simpleclient.Lock doclock;
       do {
-        Thread.sleep(50); // tuning.
         doclock=watcher.getChangedState();
-      } while (doclock==null && (time==0 || endtime>System.currentTimeMillis()));
+        if (doclock==null)
+          Thread.sleep(WATCH_SLEEP);
+      } while (watchForChange && doclock==null && (time==0 || endtime>System.currentTimeMillis())); // tuning.
       if (doclock==null)
         return null;
       else {
-        doclock = vsess.getLock(doclock);
-        VamsasArchiveReader varc = new VamsasArchiveReader(vsess.getVamsasFile());
-        return _getReadonly(varc);
+        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);
@@ -150,7 +161,7 @@ public class ArchiveClient extends IdFactory {
       d = docb.getVamsasDocument(vreader);
       
       if (d!=null) {
-        ClientDoc creader = new ClientDoc(d, null, vreader, getProvenanceUser());
+        ClientDoc creader = new ClientDoc(d, null, vreader, getClientHandle().getClientUrn(), getProvenanceUser(), getVorbaIdHash());
         return creader;
       }
     }
@@ -165,9 +176,18 @@ public class ArchiveClient extends IdFactory {
   }
   
   public ClientDoc getUpdateable() {
+    return getUpdateable(null);
+  }
+  public ClientDoc getUpdateable(uk.ac.vamsas.client.simpleclient.Lock lock) {
+    getVorbaIdHash().clear();
     valid();
     try {
-      vsess.getLock();
+      // 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
@@ -177,7 +197,7 @@ public class ArchiveClient extends IdFactory {
         varc.cancelArchive();
         return null;
       }      
-      ClientDoc cdoc = new ClientDoc(d, varc, varc.getOriginalArchiveReader(), getProvenanceUser());
+      ClientDoc cdoc = new ClientDoc(d, varc, varc.getOriginalArchiveReader(), getClientHandle().getClientUrn(), getProvenanceUser(), getVorbaIdHash());
       return cdoc;
       // do appHandle?
     } catch (Exception e) {
@@ -208,8 +228,10 @@ public class ArchiveClient extends IdFactory {
       // 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();
@@ -241,14 +263,17 @@ public class ArchiveClient extends IdFactory {
       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)");
-        cdoc = client.watch(0);
-        if (cdoc!=null) {
+        ClientDoc ucdoc = client.watch(0000);
+        if (ucdoc!=null) {
           System.out.println("****\nUpdate detected at "+new Date());
-          ArchiveReports.reportDocument(cdoc.doc, cdoc.getReader(), true, System.out);
+          ArchiveReports.reportDocument(ucdoc.doc, ucdoc.getReader(), true, System.out);
+          ucdoc.closeDoc();
+          ucdoc=null;
         } else {
           System.out.println("!!!! Null document update detected at "+new Date());
         }
@@ -259,5 +284,10 @@ public class ArchiveClient extends IdFactory {
     }
     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;
+    }
 }