/* * */ package org.vamsas.client; 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. */ 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; } /** * 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