refactored Client to simpleClient. Implemented many housekeeping functions.
[vamsas.git] / src / org / vamsas / client / ClientDocument.java
index 85014e0..66eaef0 100644 (file)
  */
 package org.vamsas.client;
 
-import java.util.Vector;
+import java.util.Hashtable;
+
+import org.vamsas.objects.core.VAMSAS;
+import org.vamsas.objects.core.VamsasDocument;
 
 /**
- * @author jimp
- * Contains a collection of vamsas objects and reference 
- * to a specified ClientHandle's information.
+ * @author jimp Contains a collection of vamsas objects and reference to a
+ *         specified ClientHandle's information.
  */
 public class ClientDocument implements IClientDocument {
+  protected IClient vorba;
+  protected org.vamsas.objects.core.VAMSAS[] roots;
+  protected byte[] appData;
+
+  /**
+   * collection of org.vamsas.client.object references
+   */
+  protected Hashtable vamsasObjects;
+  
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.vamsas.client.IClientDocument#getApplicationData()
+   */
+
+  /**
+   * 
+   * @param data
+   * @param doc
+   * @param objects
+   * @param vorba
+   */
+  protected ClientDocument(byte[] data, VAMSAS[] roots, Hashtable objects, IClient vorba) {
+    // TODO Auto-generated constructor stub
+    appData = data;
+    this.roots =roots;
+    vamsasObjects = objects;
+    this.vorba = vorba;
+  }
+
+  public byte[] getApplicationData() {
+    // Look up client byte stash using client and user handle
+    return appData;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.vamsas.client.IClientDocument#getObject(org.vamsas.client.VorbaId)
+   */
+  public object getObject(VorbaId id) {
+    // look up id in document object
+    // retrieve object and return
+    return null;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.vamsas.client.IClientDocument#getObjects(org.vamsas.client.VorbaId[])
+   */
+  public object[] getObjects(VorbaId[] ids) {
+    // getObject in bulk
+    return null;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.vamsas.client.IClientDocument#getVamsasRoots()
+   */
+  public object[] getVamsasRoots() {
+    // extract root objects
+    if (roots == null)
+      return new VAMSAS[] { new VAMSAS() };
+    return roots;
+  }
+
   /**
-   * collection of org.vamsas.client.objects
+   * update the document with new roots.
+   */
+  public void setVamsasRoots(VAMSAS[] newroots) {
+    // extract root objects
+    if (newroots != null) {
+      // check newroots for objects that were present in the old document
+      // check to see if the 'old' objects have been modified
+      // if they have ? we overwrite them with their new version, ensuring that
+      // provenance is updated.
+      // if they haven't ? do nothing ?
+
+      for (int i = 0, k = newroots.length; i < k; i++) {
+        if (newroots[i].isRegistered()) {
+          // easy - just check if anything has changed and do provenance
+          object oldversion = getObject(newroots[i].getVorbaId());
+          if (oldversion instanceof VAMSAS) {
+            // TODO: appropriate merging behaviour when two clients have
+            // modified the same registered object independently
+            if (newroots[i].get__last_hash() != newroots[i].hashCode()) {
+              // client has modified this object since last retrieval.
+              if (newroots[i].get__last_hash() != oldversion.get__last_hash()) {
+                // object has been modified by another client since this
+                // client's
+                // last access to document.
+              }
+            }
+          } else {
+            throw new Error(
+                "SimpleClient error when using setVamsasRoots : The vorbaId for object "
+                    + i
+                    + " does not refer to an object of type VAMSAS in the current document!");
+          }
+        } else {
+          if (!newroots[i].is__stored_in_document()) {
+            // check if object is modified
+            if (newroots[i].get__last_hash() != newroots[i].hashCode()) {
+              // it is - so we add newroots[i] as a new object, with updated
+              // provenance.
+            } else {
+              // do nothing
+              newroots[i] = null;
+            }
+          } else {
+            // just add newroots[i] as a new object in the document
+            // - with appropriate provenance.
+          }
+        }
+      }
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.vamsas.client.IClientDocument#registerObject(org.vamsas.client.object)
+   */
+public VorbaId registerObject(object unregistered) {
+    if (!unregistered.isRegistered())
+      unregistered.setVorbaId(unregistered.__vorba.makeVorbaId());
+    return unregistered.getVorbaId();
+  }
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.vamsas.client.IClientDocument#registerObjects(org.vamsas.client.object[])
+   */
+  public VorbaId[] registerObjects(object[] unregistered) {
+    if (unregistered!=null) {
+      VorbaId ids[] = new VorbaId[unregistered.length];
+      for (int i=0,k=unregistered.length; i<k; i++)
+        ids[i]=registerObject(unregistered[i]);
+      return ids;
+    }
+    return null;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.vamsas.client.IClientDocument#setApplicationData(byte[])
    */
-  Vector VamsasObjects;
-  byte[] appData;
+  public void setApplicationData(byte[] newData) {
+    appData = newData;
+  }
 }