/* * */ package org.vamsas.client.simpleclient; import java.util.Hashtable; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.vamsas.client.IClient; import org.vamsas.client.IClientAppdata; import org.vamsas.client.IClientDocument; import org.vamsas.client.VorbaId; import org.vamsas.client.object; import org.vamsas.objects.core.AppData; 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.objects.utils.AppDataReference; /** * @author jimp Contains a collection of vamsas objects and reference to a * specified ClientHandle's information. */ public class ClientDocument extends org.vamsas.client.ClientDocument implements IClientDocument { private static Log log = LogFactory.getLog(ClientDocument.class); private VamsasDocument doc; protected IClient vorba; protected ApplicationData appsglobal=null; protected User usersdata=null; protected byte[] appData=null; protected VamsasArchive archive = null; /** * * prepare Application-side dataset from the vamsas Document archive * @param doc - the dataset * @param docHandler - the sessionFile IO handler * @param Factory - the source of current and new vorbaIds * @param vorba - the client instance */ protected ClientDocument(VamsasDocument doc, VamsasArchive docHandler, IdFactory Factory, IClient vorba) { super(Factory.getVorbaIdHash(), Factory); /** * prepare Application-side dataset from the vamsas Document archive */ this.vorba = vorba; archive = docHandler; this.doc = doc; extractAppData(); } /** * gets appropriate app data for the application, if it exists in this dataset * */ private void extractAppData() { Vector apldataset = AppDataReference.getUserandApplicationsData( doc, vorbafactory.getUserHandle(), vorbafactory.getClientHandle()); if (apldataset!=null) { if (apldataset.size()>0) { AppData clientdat = (AppData) apldataset.get(0); if (clientdat instanceof ApplicationData) { appsglobal = (ApplicationData) clientdat; if (apldataset.size()>1) { clientdat = (AppData) apldataset.get(1); if (clientdat instanceof User) usersdata = (User) clientdat; if (apldataset.size()>2) log.info("Ignoring additional ("+(apldataset.size()-2)+") AppDatas returned by document appdata query."); } } else { log.warn("Unexpected entry in AppDataReference query: id="+clientdat.getVorbaId()+" type="+clientdat.getClass().getName()); } } } } /* * (non-Javadoc) * * @see org.vamsas.client.IClientDocument#getObject(org.vamsas.client.VorbaId) */ public object getObject(VorbaId id) { // TODO: 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) { // TODO: getObject in bulk return null; } /* * (non-Javadoc) * * @see org.vamsas.client.IClientDocument#getVamsasRoots() */ public VAMSAS[] getVamsasRoots() { if (doc.getVAMSAS() == null) // Make a new one to return to client : TODO: Decide if this is correct return new VAMSAS[] { new VAMSAS() }; return doc.getVAMSAS(); } /** * 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) { // LATER: 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#addVamsasRoot(org.vamsas.objects.core.VAMSAS) */ public void addVamsasRoot(VAMSAS newroot) { // TODO Auto-generated method stub } /* * (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