sequence mappings and DbRef mapping objects unified and source binding for castor...
[vamsas.git] / src / uk / ac / vamsas / objects / core / Sequence.java
index 03ea13a..519f57a 100644 (file)
@@ -48,9 +48,8 @@ implements java.io.Serializable
     private java.util.Vector _dbRefList;
 
     /**
-     * explicitly named cross reference to other objects in the
-     * document.
-     *  
+     * explicitly named cross reference to
+     *  other objects in the document. 
      */
     private java.util.Vector _vxrefList;
 
@@ -165,33 +164,95 @@ implements java.io.Serializable
         if (obj instanceof Sequence) {
         
             Sequence temp = (Sequence)obj;
+            boolean thcycle;
+            boolean tmcycle;
             if (this._id != null) {
                 if (temp._id == null) return false;
-                else if (!(this._id.equals(temp._id))) 
-                    return false;
-            }
-            else if (temp._id != null)
+                if (this._id != temp._id) {
+                    thcycle=org.castor.util.CycleBreaker.startingToCycle(this._id);
+                    tmcycle=org.castor.util.CycleBreaker.startingToCycle(temp._id);
+                    if (thcycle!=tmcycle) {
+                        if (!thcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(this._id); };
+                        if (!tmcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(temp._id); };
+                        return false;
+                    }
+                    if (!thcycle) {
+                        if (!this._id.equals(temp._id)) {
+                            org.castor.util.CycleBreaker.releaseCycleHandle(this._id);
+                            org.castor.util.CycleBreaker.releaseCycleHandle(temp._id);
+                            return false;
+                        }
+                        org.castor.util.CycleBreaker.releaseCycleHandle(this._id);
+                        org.castor.util.CycleBreaker.releaseCycleHandle(temp._id);
+                    }
+                }
+            } else if (temp._id != null)
                 return false;
             if (this._dictionary != null) {
                 if (temp._dictionary == null) return false;
-                else if (!(this._dictionary.equals(temp._dictionary))) 
-                    return false;
-            }
-            else if (temp._dictionary != null)
+                if (this._dictionary != temp._dictionary) {
+                    thcycle=org.castor.util.CycleBreaker.startingToCycle(this._dictionary);
+                    tmcycle=org.castor.util.CycleBreaker.startingToCycle(temp._dictionary);
+                    if (thcycle!=tmcycle) {
+                        if (!thcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(this._dictionary); };
+                        if (!tmcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(temp._dictionary); };
+                        return false;
+                    }
+                    if (!thcycle) {
+                        if (!this._dictionary.equals(temp._dictionary)) {
+                            org.castor.util.CycleBreaker.releaseCycleHandle(this._dictionary);
+                            org.castor.util.CycleBreaker.releaseCycleHandle(temp._dictionary);
+                            return false;
+                        }
+                        org.castor.util.CycleBreaker.releaseCycleHandle(this._dictionary);
+                        org.castor.util.CycleBreaker.releaseCycleHandle(temp._dictionary);
+                    }
+                }
+            } else if (temp._dictionary != null)
                 return false;
             if (this._dbRefList != null) {
                 if (temp._dbRefList == null) return false;
-                else if (!(this._dbRefList.equals(temp._dbRefList))) 
-                    return false;
-            }
-            else if (temp._dbRefList != null)
+                if (this._dbRefList != temp._dbRefList) {
+                    thcycle=org.castor.util.CycleBreaker.startingToCycle(this._dbRefList);
+                    tmcycle=org.castor.util.CycleBreaker.startingToCycle(temp._dbRefList);
+                    if (thcycle!=tmcycle) {
+                        if (!thcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(this._dbRefList); };
+                        if (!tmcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(temp._dbRefList); };
+                        return false;
+                    }
+                    if (!thcycle) {
+                        if (!this._dbRefList.equals(temp._dbRefList)) {
+                            org.castor.util.CycleBreaker.releaseCycleHandle(this._dbRefList);
+                            org.castor.util.CycleBreaker.releaseCycleHandle(temp._dbRefList);
+                            return false;
+                        }
+                        org.castor.util.CycleBreaker.releaseCycleHandle(this._dbRefList);
+                        org.castor.util.CycleBreaker.releaseCycleHandle(temp._dbRefList);
+                    }
+                }
+            } else if (temp._dbRefList != null)
                 return false;
             if (this._vxrefList != null) {
                 if (temp._vxrefList == null) return false;
-                else if (!(this._vxrefList.equals(temp._vxrefList))) 
-                    return false;
-            }
-            else if (temp._vxrefList != null)
+                if (this._vxrefList != temp._vxrefList) {
+                    thcycle=org.castor.util.CycleBreaker.startingToCycle(this._vxrefList);
+                    tmcycle=org.castor.util.CycleBreaker.startingToCycle(temp._vxrefList);
+                    if (thcycle!=tmcycle) {
+                        if (!thcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(this._vxrefList); };
+                        if (!tmcycle) { org.castor.util.CycleBreaker.releaseCycleHandle(temp._vxrefList); };
+                        return false;
+                    }
+                    if (!thcycle) {
+                        if (!this._vxrefList.equals(temp._vxrefList)) {
+                            org.castor.util.CycleBreaker.releaseCycleHandle(this._vxrefList);
+                            org.castor.util.CycleBreaker.releaseCycleHandle(temp._vxrefList);
+                            return false;
+                        }
+                        org.castor.util.CycleBreaker.releaseCycleHandle(this._vxrefList);
+                        org.castor.util.CycleBreaker.releaseCycleHandle(temp._vxrefList);
+                    }
+                }
+            } else if (temp._vxrefList != null)
                 return false;
             return true;
         }
@@ -351,17 +412,25 @@ implements java.io.Serializable
         int result = super.hashCode();
         
         long tmp;
-        if (_id != null) {
+        if (_id != null
+            && !org.castor.util.CycleBreaker.startingToCycle(_id)) {
            result = 37 * result + _id.hashCode();
+           org.castor.util.CycleBreaker.releaseCycleHandle(_id);
         }
-        if (_dictionary != null) {
+        if (_dictionary != null
+            && !org.castor.util.CycleBreaker.startingToCycle(_dictionary)) {
            result = 37 * result + _dictionary.hashCode();
+           org.castor.util.CycleBreaker.releaseCycleHandle(_dictionary);
         }
-        if (_dbRefList != null) {
+        if (_dbRefList != null
+            && !org.castor.util.CycleBreaker.startingToCycle(_dbRefList)) {
            result = 37 * result + _dbRefList.hashCode();
+           org.castor.util.CycleBreaker.releaseCycleHandle(_dbRefList);
         }
-        if (_vxrefList != null) {
+        if (_vxrefList != null
+            && !org.castor.util.CycleBreaker.startingToCycle(_vxrefList)) {
            result = 37 * result + _vxrefList.hashCode();
+           org.castor.util.CycleBreaker.releaseCycleHandle(_vxrefList);
         }
         
         return result;