X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Forg%2Fvamsas%2Fclient%2FVorbaXmlBinder.java;h=0f4feb18f5dd6e1960a4dfd12673f8cb0e885683;hb=705044b23ff07576f5827f68a4677eef007635fd;hp=ec6c7f4e7442a899718a34a21f70794d2428680e;hpb=1f066b7b070342e9a41189e039e80d2fefb57976;p=vamsas.git diff --git a/src/org/vamsas/client/VorbaXmlBinder.java b/src/org/vamsas/client/VorbaXmlBinder.java index ec6c7f4..0f4feb1 100644 --- a/src/org/vamsas/client/VorbaXmlBinder.java +++ b/src/org/vamsas/client/VorbaXmlBinder.java @@ -24,13 +24,13 @@ import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.ValidationException; import org.vamsas.objects.core.VamsasDocument; /** - * Implements the Vamsas object ID machinery for translating - * between non-volatile XML IDs and object references. Use the + * Implements the Vamsas Vobject ID machinery for translating + * between non-volatile XML IDs and Vobject references. Use the * marshalling and unmarshalling methods in this class in order * to avoid validation exceptions when marshalling new objects * into the vamsas document. */ -public class VorbaXmlBinder extends GeneralizedFieldHandler implements UnmarshalListener, MarshalListener { +public class VorbaXmlBinder implements UnmarshalListener { private final IVorbaIdFactory vorbafactory; private final Vector obj; @@ -58,6 +58,12 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal * java.lang.Object, java.lang.Object) */ public void fieldAdded(String fieldName, Object parent, Object child) { + if (parent instanceof Vobject && child instanceof Vobject) { + if (((Vobject) child).V_parent==null) { + // System.err.println("Setting parent of "+fieldName); + ((Vobject) child).setV_parent((Vobject) parent); + } + } } /* @@ -70,20 +76,20 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal /* * Check if the object has an 'id' field - if it does, copy the value into - * the VorbaId field of object, and add the object to the VorbaId hash. + * the VorbaId field of Vobject, and add the Vobject to the VorbaId hash. * * @see org.exolab.castor.xml.UnmarshalListener#unmarshalled(java.lang.Object) */ public void unmarshalled(Object newobj) { - if (newobj instanceof object) { - object nobj = (object) newobj; + if (newobj instanceof Vobject) { + Vobject nobj = (Vobject) newobj; nobj.set__stored_in_document(true); Field fd = null; try { if (nobj.isRegisterable()) { // look for the id field (should be an NCName string) nobj.__vorba = vorbafactory; - fd = nobj.getClass().getField("id"); + fd = nobj.getClass().getDeclaredField("_id"); String idstring; if (fd.get(nobj) != null) { idstring = (String) fd.get(nobj); @@ -131,12 +137,7 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal if (doc.__vorba==null) doc.__vorba = vorba; doc.__ensure_instance_ids(); // this may take a while. Do we allow for cyclic references ? - final Vector refstomake = new Vector(); - VorbaXmlBinder binder = new VorbaXmlBinder(vorba, refstomake, vorba.extantids); - Marshaller marshaller = new Marshaller(outstream); - marshaller.setMarshalAsDocument(true); - marshaller.setMarshalListener(binder); - marshaller.marshal(doc); + doc.marshal(outstream); } private static boolean ensure_references(Vector unrefed, Hashtable objrefs) { @@ -145,7 +146,7 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal sync=false; // document is out of sync - ids have been created. java.util.Iterator newobj = unrefed.listIterator(); while (newobj.hasNext()) { - object o = (object) newobj.next(); + Vobject o = (Vobject) newobj.next(); // forces registration and id field update. VorbaId id = o.getVorbaId(); if (!objrefs.containsKey(id)) { @@ -158,9 +159,9 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal return sync; } /** - * Unmarshals a vamsasDocument object from a stream, registers + * Unmarshals a vamsasDocument Vobject from a stream, registers * unregistered objects, records existing VorbaIds, and completes - * the org.vamsas.client.object housekeeping fields. + * the org.vamsas.client.Vobject housekeeping fields. * For a valid unmarshalling, the array of returned objects also includes * a sync parameter which is true if new VorbaIds * were created. If sync is false, then the caller should ensure that the @@ -168,11 +169,11 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal * TODO: ensure that provenance is correct for newly registered objects * @param instream - the XML input stream * @param factory - the SimpleClient's properly configured VorbaId factory to make new references. - * @param root the root element's org.vamsas.objects.core object. - * @return null or {(Object) VamsasDocument object, (Object) Hashtable of object references, (Object) Boolean(sync) } + * @param root the root element's org.vamsas.objects.core Vobject. + * @return null or {(Object) VamsasDocument Vobject, (Object) Hashtable of Vobject references, (Object) Boolean(sync) } */ public static Object[] getVamsasObjects(Reader instream, - IVorbaIdFactory factory, object root) { + IVorbaIdFactory factory, Vobject root) { Unmarshaller unmarshaller = new Unmarshaller(root); unmarshaller.setIDResolver(new IDResolver() { public Object resolve(String id) { @@ -192,7 +193,7 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal while (instream.ready()) { Object obj = unmarshaller.unmarshal(instream); boolean sync=ensure_references(unrefed, objrefs); - if (!(obj instanceof object)) + if (!(obj instanceof Vobject)) return null; return new Object[] { obj, objrefs, new Boolean(sync)}; } @@ -208,103 +209,4 @@ public class VorbaXmlBinder extends GeneralizedFieldHandler implements Unmarshal } return null; } - - /* (non-Javadoc) - * @see org.exolab.castor.xml.MarshalListener#postMarshal(java.lang.Object) - */ - public void postMarshal(Object object) { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see org.exolab.castor.xml.MarshalListener#preMarshal(java.lang.Object) - */ - public boolean preMarshal(Object newobj) { - if (newobj instanceof object) { - object nobj = (object) newobj; - nobj.set__stored_in_document(true); - Field fd = null; - try { - if (nobj.isRegisterable()) { - // make sure the id field is set - nobj.__vorba = vorbafactory; - fd = nobj.getClass().getField("_id"); - if (fd.get(nobj) != null) { - fd.set(nobj, nobj.getVorbaId().getId()); - /* all thats needed perhaps - * - *if (idstring.length() > 0) { - if (!objrefs.containsKey(idstring)) { - objrefs.put(idstring, nobj); - nobj.setVorbaId(VorbaId.newId(idstring)); - } else { - System.err.println("Serious problem : duplicate id '"+idstring+"' found! expect badness."); - return false; // TODO: HANDLE duplicate XML ids correctly - }*/ - } - } - } catch (Exception e) { - return false; - }; - - } - return false; - } - - /* (non-Javadoc) - * @see org.exolab.castor.mapping.GeneralizedFieldHandler#convertUponGet(java.lang.Object) - */ - public Object convertUponGet(Object value) { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) - * @see org.exolab.castor.mapping.GeneralizedFieldHandler#convertUponSet(java.lang.Object) - */ - public Object convertUponSet(Object value) { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) - * @see org.exolab.castor.mapping.GeneralizedFieldHandler#getFieldType() - */ - public Class getFieldType() { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) - * @see org.exolab.castor.mapping.GeneralizedFieldHandler#newInstance(java.lang.Object, java.lang.Object[]) - */ - public Object newInstance(Object parent, Object[] args) throws IllegalStateException { - // TODO Auto-generated method stub - return super.newInstance(parent, args); - } - - /* (non-Javadoc) - * @see org.exolab.castor.mapping.GeneralizedFieldHandler#newInstance(java.lang.Object) - */ - public Object newInstance(Object parent) throws IllegalStateException { - // TODO Auto-generated method stub - return super.newInstance(parent); - } - - /* (non-Javadoc) - * @see org.exolab.castor.mapping.GeneralizedFieldHandler#setCollectionIteration(boolean) - */ - public void setCollectionIteration(boolean autoCollectionIteration) { - // TODO Auto-generated method stub - super.setCollectionIteration(autoCollectionIteration); - } - - /* (non-Javadoc) - * @see org.exolab.castor.mapping.AbstractFieldHandler#hasValue(java.lang.Object) - */ - public boolean hasValue(Object object) { - // TODO Auto-generated method stub - return super.hasValue(object); - } } \ No newline at end of file