added V_parent reference to parent object in document.
authorjprocter <jprocter@compbio.dundee.ac.uk>
Wed, 6 Sep 2006 13:43:37 +0000 (13:43 +0000)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Wed, 6 Sep 2006 13:43:37 +0000 (13:43 +0000)
git-svn-id: https://svn.lifesci.dundee.ac.uk/svn/repository/trunk@236 be28352e-c001-0410-b1a7-c7978e42abec

src/org/vamsas/client/Vobject.java
src/org/vamsas/client/VorbaXmlBinder.java

index a393b9e..e27ee86 100644 (file)
@@ -39,7 +39,10 @@ public abstract class Vobject {
    */
   protected boolean registerable = false; 
 
-
+  /**
+   * reference to containing object for this Vobject.
+   */
+  protected Vobject V_parent=null;
   /**
    * unique id for all vamsas objects allows unambiguous referencing to any
    * Vobject in the vamsas document
@@ -50,6 +53,16 @@ public abstract class Vobject {
    * the source of unique VorbaIds.
    */
   protected IVorbaIdFactory __vorba = null;
+  
+  /* (non-Javadoc)
+   * @see java.lang.Object#finalize()
+   */
+  protected void finalize() throws Throwable {
+    V_parent=null;
+    __vorba=null;
+    vorbaId=null;
+    super.finalize();
+  }
 
   /**
    * 
@@ -119,6 +132,8 @@ public abstract class Vobject {
   synchronized protected boolean doHash() {
     long __old_hash = __last_hash;
     __last_hash = 0;
+    Vobject _V_parent=V_parent;
+    V_parent=null;
     VorbaId thisid = vorbaId;
     IVorbaIdFactory factory = __vorba;
     boolean stored = __stored_in_document;
@@ -128,6 +143,7 @@ public abstract class Vobject {
     vorbaId = thisid;
     __vorba = factory;
     __stored_in_document = stored;
+    V_parent=_V_parent;
     return (__old_hash==0) || (__old_hash == __last_hash);
   }
 
@@ -270,6 +286,8 @@ public abstract class Vobject {
               for (int k=0, l=vals.length; k<l; k++) {
                 if (vals[k].__vorba==null)
                   vals[k].__vorba = __vorba; // propagate IVorbaIdFactory
+                if (vals[k].V_parent==null)
+                  vals[k].V_parent=this; // propagate parent reference to this element.
                 vals[k].__ensure_instance_ids();
               }
             }
@@ -293,6 +311,8 @@ public abstract class Vobject {
                       for (int k=0, l=vals.length; k<l; k++) {
                         if (vals[k].__vorba==null)
                           vals[k].__vorba = __vorba; // propagate IVorbaIdFactory
+                        if (vals[k].V_parent==null)
+                          vals[k].V_parent=this; // propagate parent reference to this field object
                         vals[k].__ensure_instance_ids();
                       }
                     }
@@ -306,6 +326,7 @@ public abstract class Vobject {
                 }
               }
             } else {
+              // castor's mechanism doesn't work for this object... so...*/
               // fuck around, fuck around, jump up jump up and get down! */
               Object o = fields[i].getClassDescriptor();
               if (o!=null) {
@@ -324,7 +345,9 @@ public abstract class Vobject {
             if (rf!=null) {
               if (rf.__vorba==null)
                 rf.__vorba = __vorba; // propagate IVorbaIdFactory
-              rf.__ensure_instance_ids();
+              if (rf.V_parent==null)
+                rf.V_parent=this; // propagate parent reference
+             rf.__ensure_instance_ids();
             }
           }
           catch (Exception e) {
@@ -334,4 +357,18 @@ public abstract class Vobject {
     }
     
   }
+
+  /**
+   * @return the __parent
+   */
+  public Vobject getV_parent() {
+    return V_parent;
+  }
+
+  /**
+   * @param __parent the __parent to set
+   */
+  protected void setV_parent(Vobject V_parent) {
+    this.V_parent = V_parent;
+  }
 }
index 22d5379..7272c1f 100644 (file)
@@ -58,6 +58,12 @@ public class VorbaXmlBinder implements UnmarshalListener {
    *      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);
+      }
+    }
   }
 
   /*