added some docs on migration code. a little beautify

Project: http://git-wip-us.apache.org/repos/asf/ode/repo
Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/a04b2e90
Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/a04b2e90
Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/a04b2e90

Branch: refs/heads/master
Commit: a04b2e90462b67994ed15753c16ecfa672b6d0fb
Parents: a499545
Author: fangzhen <[email protected]>
Authored: Wed Jul 30 13:02:30 2014 +0800
Committer: fangzhen <[email protected]>
Committed: Wed Jul 30 13:02:30 2014 +0800

----------------------------------------------------------------------
 .../ode/bpel/compiler_2_0/GoodCompileTest.java  |   4 +-
 .../ode/bpel/compiler_2_0/MigrationTest.java    |   9 +-
 .../org/apache/ode/bpel/obj/ExtensibleImpl.java |   6 -
 .../bpel/obj/migrate/AbstractObjectVisitor.java |  20 ++-
 .../ode/bpel/obj/migrate/EqualityVisitor.java   |  19 +-
 .../ode/bpel/obj/migrate/OModelVisitor.java     |   8 -
 .../ode/bpel/obj/migrate/ObjectTraverser.java   | 175 +++++++++++++++++++
 .../ode/bpel/obj/migrate/ObjectVisitor.java     |  20 ++-
 .../apache/ode/bpel/obj/migrate/OmOld2new.java  |  22 ++-
 .../ode/bpel/obj/migrate/TraverseObject.java    | 166 ------------------
 .../ode/bpel/obj/migrate/DeepEqualityTest.java  |   8 +-
 bpel-nobj/src/test/resources/log4j.properties   |   2 +-
 12 files changed, 251 insertions(+), 208 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java
----------------------------------------------------------------------
diff --git 
a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java
 
b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java
index 10195f3..9f44e55 100644
--- 
a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java
+++ 
b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java
@@ -30,7 +30,7 @@ import org.apache.ode.bpel.compiler.api.CompileListener;
 import org.apache.ode.bpel.obj.OProcess;
 import org.apache.ode.bpel.obj.migrate.EqualityVisitor;
 import org.apache.ode.bpel.obj.migrate.ExtensibeImplEqualityComp;
-import org.apache.ode.bpel.obj.migrate.TraverseObject;
+import org.apache.ode.bpel.obj.migrate.ObjectTraverser;
 import org.apache.ode.bpel.obj.serde.OmDeserializer;
 import org.apache.ode.bpel.obj.serde.OmSerdeFactory;
 import org.junit.Assert;
@@ -56,7 +56,7 @@ public class GoodCompileTest extends AbstractCompileTestCase 
implements
                                        .createOmDeserializer(new 
FileInputStream(cbpPath));
                        OProcess desered = deserializer.deserialize();
 
-                       TraverseObject traverse = new TraverseObject();
+                       ObjectTraverser traverse = new ObjectTraverser();
                        EqualityVisitor visitor = new EqualityVisitor(desered);
                        visitor.addCustomComparator(new 
ExtensibeImplEqualityComp(visitor));
                        traverse.accept(visitor);

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/MigrationTest.java
----------------------------------------------------------------------
diff --git 
a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/MigrationTest.java
 
b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/MigrationTest.java
index 2971d6b..e8cbc95 100644
--- 
a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/MigrationTest.java
+++ 
b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/MigrationTest.java
@@ -14,12 +14,15 @@ import org.apache.ode.bpel.obj.OProcess;
 import org.apache.ode.bpel.obj.migrate.EqualityVisitor;
 import org.apache.ode.bpel.obj.migrate.ExtensibeImplEqualityComp;
 import org.apache.ode.bpel.obj.migrate.OmOld2new;
-import org.apache.ode.bpel.obj.migrate.TraverseObject;
+import org.apache.ode.bpel.obj.migrate.ObjectTraverser;
 import org.junit.Assert;
 
 public class MigrationTest extends GoodCompileTest{
     private static final Log __log = LogFactory.getLog(MigrationTest.class);
 
+    /**
+     * compare compiled OProcess with migrated ones.
+     */
     public void runTest(String bpel) throws Exception {
         try {
             Class testClass = getClass();
@@ -35,12 +38,12 @@ public class MigrationTest extends GoodCompileTest{
                __log.debug("compiled new OProcess " + nu.getFieldContainer());
                org.apache.ode.bpel.o.OProcess old = new Serializer(new 
FileInputStream(oldCbpFile)).readOProcess();
                OmOld2new mig = new OmOld2new();
-               TraverseObject mtraverse = new TraverseObject();
+               ObjectTraverser mtraverse = new ObjectTraverser();
                mtraverse.accept(mig);
                OProcess migrated = (OProcess) mtraverse.traverseObject(old);
                __log.debug("migrated new OProcess " + 
migrated.getFieldContainer());
                
-               TraverseObject traverse = new TraverseObject();
+               ObjectTraverser traverse = new ObjectTraverser();
                EqualityVisitor visitor = new EqualityVisitor(nu);
                visitor.addCustomComparator(new 
ExtensibeImplEqualityComp(visitor));
                traverse.accept(visitor);

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java
index 98ae216..489d6d2 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java
@@ -7,8 +7,6 @@ import java.io.Serializable;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import org.apache.ode.bpel.obj.migrate.OModelVisitor;
-
 import com.fasterxml.jackson.annotation.JsonIdentityInfo;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@@ -51,10 +49,6 @@ public class ExtensibleImpl  implements Extensible<Object>, 
Serializable{
                return fieldContainer.remove(fieldName);
        }
        
-       public void accept(OModelVisitor visitor){
-               visitor.visitExtensibleImpl(this);
-       }
-       
        @JsonIgnore
        public int getClassVersion() {
                Object o = fieldContainer.get(CLASS_VERSION);

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/AbstractObjectVisitor.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/AbstractObjectVisitor.java
 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/AbstractObjectVisitor.java
index 5a8ce53..968aeeb 100644
--- 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/AbstractObjectVisitor.java
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/AbstractObjectVisitor.java
@@ -6,12 +6,11 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.ode.bpel.obj.migrate.TraverseObject.HandleTable;
-
+import org.apache.ode.bpel.obj.migrate.ObjectTraverser.HandleTable;
 
 public abstract class AbstractObjectVisitor implements ObjectVisitor{
        protected ReplaceTable rtab = new ReplaceTable(1000, 0.8f);
-       protected TraverseObject traverse;
+       protected ObjectTraverser traverse;
        protected Map<Class, ObjectVisitor>  visitors = new HashMap<Class, 
ObjectVisitor>();
        
        @Override
@@ -23,7 +22,7 @@ public abstract class AbstractObjectVisitor implements 
ObjectVisitor{
        }
        
        @Override
-       public TraverseObject getTraverse(){
+       public ObjectTraverser getTraverse(){
                return traverse;
        }
        @Override
@@ -48,6 +47,12 @@ public abstract class AbstractObjectVisitor implements 
ObjectVisitor{
                rtab.assign(obj, n);
                return n;
        }
+       
+       /**
+        * determine if obj is collections that order doesn't matter.
+        * @param obj
+        * @return
+        */
        protected boolean isSet(Object obj) {
                return obj instanceof Set;
        }
@@ -56,6 +61,11 @@ public abstract class AbstractObjectVisitor implements 
ObjectVisitor{
                return old.getClass().isArray();
        }
 
+       /**
+        * determine if obj is collections that order does matter.
+        * @param obj
+        * @return
+        */
        protected boolean isCollection(Object old) {
                return (old instanceof Collection) && !isSet(old);
        }
@@ -64,7 +74,7 @@ public abstract class AbstractObjectVisitor implements 
ObjectVisitor{
                return old instanceof Map;
        }
        @Override
-       public void setTraverse(TraverseObject traverseObject) {
+       public void setTraverse(ObjectTraverser traverseObject) {
                this.traverse = traverseObject;         
        }
        

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/EqualityVisitor.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/EqualityVisitor.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/EqualityVisitor.java
index bfcbd15..9e419ba 100644
--- 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/EqualityVisitor.java
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/EqualityVisitor.java
@@ -14,16 +14,25 @@ import java.util.Stack;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+/**
+ * compare two object for equality. default strategy:
+ * for collections and maps, compare their contents
+ * for POJO, 
+ *             if any custom equality comparator can handle it, then use it;
+ *             if it has an equals() method defined, use it.
+ *             or compare their non-transient accessible fields by reflection.
+ * @author fangzhen
+ *
+ */
 public class EqualityVisitor extends AbstractObjectVisitor{
-       private static final Log __log = 
LogFactory.getLog(TraverseObject.class);
+       private static final Log __log = 
LogFactory.getLog(ObjectTraverser.class);
     private List<EqualityComparator> comparators = new 
LinkedList<EqualityComparator>();
+    /**stack that holds current visit path */
     private Stack<String> st = new Stack<String>();
-    
+    /**object that compared to */
     protected Object other;
     public boolean logFalseThrough = false;
-    public EqualityVisitor(){
-       
-    }
+
        public EqualityVisitor(Object other){
                this.other = other;
                st.push(":" + other.getClass().getSimpleName());

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OModelVisitor.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OModelVisitor.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OModelVisitor.java
deleted file mode 100644
index a780837..0000000
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OModelVisitor.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.apache.ode.bpel.obj.migrate;
-
-import org.apache.ode.bpel.obj.ExtensibleImpl;
-
-public interface OModelVisitor {
-
-       void visitExtensibleImpl(ExtensibleImpl extensibleImpl);
-}

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java
new file mode 100644
index 0000000..6e48c59
--- /dev/null
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java
@@ -0,0 +1,175 @@
+package org.apache.ode.bpel.obj.migrate;
+
+import java.util.Arrays;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Traverse an Object with help of an {@link ObjectVisitor}, taking into 
consideration of cyclic references.
+ * 
+ */
+public class ObjectTraverser{
+    private static final Log __log = LogFactory.getLog(ObjectTraverser.class);
+
+    private HandleTable htab = new HandleTable(1000, 0.8f);
+       private ObjectVisitor visitor;
+       
+       public HandleTable getHtab() {
+               return htab;
+       }
+
+       public void accept(ObjectVisitor visitor){
+               this.visitor = visitor;
+               visitor.setTraverse(this);
+       }
+       public Object traverseObject(Object obj){
+               return traverseObject(obj, true);
+       }
+       
+       /**
+        * 
+        * @param obj current object
+        * @param assign should we record this visit. Usually, this should be 
true to avoid infinite loop of cyclic reference. 
+        * Sometime set to false when we need visit an object more than once.
+        * @return anything the visitor returns.
+        */
+       public Object traverseObject(Object obj, boolean assign){
+               __log.debug("current object " + obj);
+               if (obj == null) return null;
+               if (htab.lookup(obj) != -1){
+                       return visitor.visited(obj);
+               }
+               if (assign) htab.assign(obj);
+               Object n;
+               n = visitor.visit(obj);
+               return n;
+       }
+       
+       /**
+       * Stole from openjdk ObjectOutputStream
+    * Lightweight identity hash table which maps objects to integer handles,
+    * assigned in ascending order.
+    */
+   public static class HandleTable {
+
+       /* number of mappings in table/next available handle */
+       private int size;
+       /* size threshold determining when to expand hash spine */
+       private int threshold;
+       /* factor for computing size threshold */
+       private final float loadFactor;
+       /* maps hash value -> candidate handle value */
+       private int[] spine;
+       /* maps handle value -> next candidate handle value */
+       private int[] next;
+       /* maps handle value -> associated object */
+       private Object[] objs;
+
+       /**
+        * Creates new HandleTable with given capacity and load factor.
+        */
+       HandleTable(int initialCapacity, float loadFactor) {
+           this.loadFactor = loadFactor;
+           spine = new int[initialCapacity];
+           next = new int[initialCapacity];
+           objs = new Object[initialCapacity];
+           threshold = (int) (initialCapacity * loadFactor);
+           clear();
+       }
+
+       /**
+        * Assigns next available handle to given object, and returns handle
+        * value.  Handles are assigned in ascending order starting at 0.
+        */
+       int assign(Object obj) {
+           if (size >= next.length) {
+               growEntries();
+           }
+           if (size >= threshold) {
+               growSpine();
+           }
+           insert(obj, size);
+           return size++;
+       }
+
+       /**
+        * Looks up and returns handle associated with given object, or -1 if
+        * no mapping found.
+        */
+       int lookup(Object obj) {
+           if (size == 0) {
+               return -1;
+           }
+           int index = hash(obj) % spine.length;
+           for (int i = spine[index]; i >= 0; i = next[i]) {
+               if (objs[i] == obj) {
+                   return i;
+               }
+           }
+           return -1;
+       }
+
+       /**
+        * Resets table to its initial (empty) state.
+        */
+       void clear() {
+           Arrays.fill(spine, -1);
+           Arrays.fill(objs, 0, size, null);
+           size = 0;
+       }
+
+       /**
+        * Returns the number of mappings currently in table.
+        */
+       int size() {
+           return size;
+       }
+
+       /**
+        * Inserts mapping object -> handle mapping into table.  Assumes table
+        * is large enough to accommodate new mapping.
+        */
+       private void insert(Object obj, int handle) {
+           int index = hash(obj) % spine.length;
+           objs[handle] = obj;
+           next[handle] = spine[index];
+           spine[index] = handle;
+       }
+
+       /**
+        * Expands the hash "spine" -- equivalent to increasing the number of
+        * buckets in a conventional hash table.
+        */
+       private void growSpine() {
+           spine = new int[(spine.length << 1) + 1];
+           threshold = (int) (spine.length * loadFactor);
+           Arrays.fill(spine, -1);
+           for (int i = 0; i < size; i++) {
+               insert(objs[i], i);
+           }
+       }
+
+       /**
+        * Increases hash table capacity by lengthening entry arrays.
+        */
+       private void growEntries() {
+           int newLength = (next.length << 1) + 1;
+           int[] newNext = new int[newLength];
+           System.arraycopy(next, 0, newNext, 0, size);
+           next = newNext;
+
+           Object[] newObjs = new Object[newLength];
+           System.arraycopy(objs, 0, newObjs, 0, size);
+           objs = newObjs;
+       }
+
+       /**
+        * Returns hash value for given object.
+        */
+       private int hash(Object obj) {
+           return System.identityHashCode(obj) & 0x7FFFFFFF;
+       }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectVisitor.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectVisitor.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectVisitor.java
index 972697f..fd18807 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectVisitor.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectVisitor.java
@@ -1,14 +1,24 @@
 package org.apache.ode.bpel.obj.migrate;
 
+/**
+ * Object visitor used when traverse an object.
+ * @author fangzhen
+ *
+ */
 public interface ObjectVisitor {
-
+       /**
+        * Operation if obj has been visited before 
+        * @return we may need to return new object corresponding to the 
visiting object.
+        */
        Object visited(Object obj);
 
+       /**
+        * Operation when obj is first visited or its former wasn't recorded.
+        * @return we may need to return new object corresponding to the 
visiting object.
+        */
        Object visit(Object obj);
 
-       void setTraverse(TraverseObject traverseObject);
-
+       void setTraverse(ObjectTraverser traverseObject);
        void addCustomVisitor(Class cls, ObjectVisitor visitor);
-
-       TraverseObject getTraverse();
+       ObjectTraverser getTraverse();
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmOld2new.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmOld2new.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmOld2new.java
index 432e2df..418c2af 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmOld2new.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmOld2new.java
@@ -16,6 +16,11 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.obj.ExtensibleImpl;
 
+/**
+ * Migrate from old Omodel classes to new ones.
+ * @author fangzhen
+ *
+ */
 public class OmOld2new extends AbstractObjectVisitor{
     private static final Log __log = LogFactory.getLog(OmOld2new.class);
     
@@ -30,6 +35,13 @@ public class OmOld2new extends AbstractObjectVisitor{
        public Object visit(Object obj){
                __log.debug("migrating object: " + obj.getClass() + "@" + 
System.identityHashCode(obj));
                Object n;
+               /*
+                * we use two category of visitXXX methods here. The first  
visitXXX(Object) 
+                * return corresponding new object instance without fulfilling 
its contents, 
+                * which avoids recursively call. And then assign the new 
object. then fill contents.
+                * other wise, on cyclic reference case, the object re-visited 
but hasn't prepared yet.
+                * However, this workaround assumes that the new object is 
mutable, which is true in our case.
+                */
                if (isMap(obj)){
                        n = visitMap(obj);
                }else if (isCollection(obj)){
@@ -61,7 +73,8 @@ public class OmOld2new extends AbstractObjectVisitor{
 
        private boolean isOmodelBean(Object old){
                Class<?> cls = old.getClass();
-               if (beanPkgMap.containsKey(cls.getPackage().getName()) && 
!cls.getSimpleName().equals("Serializer")){
+               if (beanPkgMap.containsKey(cls.getPackage().getName()) &&
+                               !cls.getSimpleName().equals("Serializer")){
                        return true;
                }
                return false;
@@ -158,7 +171,8 @@ public class OmOld2new extends AbstractObjectVisitor{
                                        fieldMap.put(fname, null);
                                }
                        } catch (Exception e) {
-                               RuntimeException rte = new 
RuntimeException("Error when try to construct corresponding new Omodel class 
from old one:"
+                               RuntimeException rte = new RuntimeException(
+                                               "Error when try to construct 
corresponding new Omodel class from old one:"
                                                +old.getClass() + "; Failed on 
field:" + f.getName());
                                rte.initCause(e);
                                throw rte;
@@ -188,7 +202,9 @@ public class OmOld2new extends AbstractObjectVisitor{
                        cons.setAccessible(true);
                        return cons.newInstance();
                } catch (Exception e) {
-                       RuntimeException rte = new RuntimeException("Error when 
try to initiate corresponding new Omodel class of old one:"+old.getClass());
+                       RuntimeException rte = new RuntimeException(
+                                       "Error when try to initiate 
corresponding new Omodel class of old one:"
+                                                       + old.getClass());
                        rte.initCause(e);
                        throw rte;
                }

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/TraverseObject.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/TraverseObject.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/TraverseObject.java
deleted file mode 100644
index 260ce92..0000000
--- 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/TraverseObject.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package org.apache.ode.bpel.obj.migrate;
-
-import java.util.Arrays;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-
-public class TraverseObject{
-    private static final Log __log = LogFactory.getLog(TraverseObject.class);
-
-    private HandleTable htab = new HandleTable(1000, 0.8f);
-       private ObjectVisitor visitor;
-       
-       public HandleTable getHtab() {
-               return htab;
-       }
-
-       public TraverseObject(){
-       }
-       public void accept(ObjectVisitor visitor){
-               this.visitor = visitor;
-               visitor.setTraverse(this);
-       }
-       public Object traverseObject(Object obj){
-               return traverseObject(obj, true);
-       }
-       public Object traverseObject(Object obj, boolean assign){
-               __log.debug("current object " + obj);
-               if (obj == null) return null;
-               if (htab.lookup(obj) != -1){
-                       return visitor.visited(obj);
-               }
-               if (assign) htab.assign(obj);
-               Object n;
-               n = visitor.visit(obj);
-               return n;
-       }
-       
-       /**
-       * Stole from openjdk OOS
-    * Lightweight identity hash table which maps objects to integer handles,
-    * assigned in ascending order.
-    */
-   public static class HandleTable {
-
-       /* number of mappings in table/next available handle */
-       private int size;
-       /* size threshold determining when to expand hash spine */
-       private int threshold;
-       /* factor for computing size threshold */
-       private final float loadFactor;
-       /* maps hash value -> candidate handle value */
-       private int[] spine;
-       /* maps handle value -> next candidate handle value */
-       private int[] next;
-       /* maps handle value -> associated object */
-       private Object[] objs;
-
-       /**
-        * Creates new HandleTable with given capacity and load factor.
-        */
-       HandleTable(int initialCapacity, float loadFactor) {
-           this.loadFactor = loadFactor;
-           spine = new int[initialCapacity];
-           next = new int[initialCapacity];
-           objs = new Object[initialCapacity];
-           threshold = (int) (initialCapacity * loadFactor);
-           clear();
-       }
-
-       /**
-        * Assigns next available handle to given object, and returns handle
-        * value.  Handles are assigned in ascending order starting at 0.
-        */
-       int assign(Object obj) {
-           if (size >= next.length) {
-               growEntries();
-           }
-           if (size >= threshold) {
-               growSpine();
-           }
-           insert(obj, size);
-           return size++;
-       }
-
-       /**
-        * Looks up and returns handle associated with given object, or -1 if
-        * no mapping found.
-        */
-       int lookup(Object obj) {
-           if (size == 0) {
-               return -1;
-           }
-           int index = hash(obj) % spine.length;
-           for (int i = spine[index]; i >= 0; i = next[i]) {
-               if (objs[i] == obj) {
-                   return i;
-               }
-           }
-           return -1;
-       }
-
-       /**
-        * Resets table to its initial (empty) state.
-        */
-       void clear() {
-           Arrays.fill(spine, -1);
-           Arrays.fill(objs, 0, size, null);
-           size = 0;
-       }
-
-       /**
-        * Returns the number of mappings currently in table.
-        */
-       int size() {
-           return size;
-       }
-
-       /**
-        * Inserts mapping object -> handle mapping into table.  Assumes table
-        * is large enough to accommodate new mapping.
-        */
-       private void insert(Object obj, int handle) {
-           int index = hash(obj) % spine.length;
-           objs[handle] = obj;
-           next[handle] = spine[index];
-           spine[index] = handle;
-       }
-
-       /**
-        * Expands the hash "spine" -- equivalent to increasing the number of
-        * buckets in a conventional hash table.
-        */
-       private void growSpine() {
-           spine = new int[(spine.length << 1) + 1];
-           threshold = (int) (spine.length * loadFactor);
-           Arrays.fill(spine, -1);
-           for (int i = 0; i < size; i++) {
-               insert(objs[i], i);
-           }
-       }
-
-       /**
-        * Increases hash table capacity by lengthening entry arrays.
-        */
-       private void growEntries() {
-           int newLength = (next.length << 1) + 1;
-           int[] newNext = new int[newLength];
-           System.arraycopy(next, 0, newNext, 0, size);
-           next = newNext;
-
-           Object[] newObjs = new Object[newLength];
-           System.arraycopy(objs, 0, newObjs, 0, size);
-           objs = newObjs;
-       }
-
-       /**
-        * Returns hash value for given object.
-        */
-       private int hash(Object obj) {
-           return System.identityHashCode(obj) & 0x7FFFFFFF;
-       }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/migrate/DeepEqualityTest.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/migrate/DeepEqualityTest.java 
b/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/migrate/DeepEqualityTest.java
index 4509ed1..2b8bad6 100644
--- 
a/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/migrate/DeepEqualityTest.java
+++ 
b/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/migrate/DeepEqualityTest.java
@@ -24,7 +24,7 @@ public class DeepEqualityTest {
                List<String> ls2 = new ArrayList<String>();
                ls2.add("Hello");
                ls2.add("world");
-               TraverseObject traverse = new TraverseObject();
+               ObjectTraverser traverse = new ObjectTraverser();
                EqualityVisitor visitor = new EqualityVisitor(ls2);
                traverse.accept(visitor);
                assertEquals(Boolean.TRUE, traverse.traverseObject(ls1));
@@ -43,7 +43,7 @@ public class DeepEqualityTest {
                s2.add("world");
                s2.add("hello");
                
-               TraverseObject traverse = new TraverseObject();
+               ObjectTraverser traverse = new ObjectTraverser();
                EqualityVisitor visitor = new EqualityVisitor(s2);
                traverse.accept(visitor);
                assertEquals(Boolean.TRUE, traverse.traverseObject(s1));
@@ -60,7 +60,7 @@ public class DeepEqualityTest {
                m2.put("item1", "string1");
                m2.put("item2", new ArrayList());
 
-               TraverseObject traverse = new TraverseObject();
+               ObjectTraverser traverse = new ObjectTraverser();
                EqualityVisitor visitor = new EqualityVisitor(m2);
                traverse.accept(visitor);
                assertEquals(Boolean.TRUE, traverse.traverseObject(m1));
@@ -83,7 +83,7 @@ public class DeepEqualityTest {
                DebugInfo d2 = new DebugInfo("/a/path", 0, 1, m2);
                m2.put("cylic", d2);
 
-               TraverseObject traverse = new TraverseObject();
+               ObjectTraverser traverse = new ObjectTraverser();
                EqualityVisitor visitor = new EqualityVisitor(d2);
                visitor.addCustomComparator(new 
ExtensibeImplEqualityComp(visitor));
                traverse.accept(visitor);

http://git-wip-us.apache.org/repos/asf/ode/blob/a04b2e90/bpel-nobj/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/test/resources/log4j.properties 
b/bpel-nobj/src/test/resources/log4j.properties
index 2b02abc..f50576a 100644
--- a/bpel-nobj/src/test/resources/log4j.properties
+++ b/bpel-nobj/src/test/resources/log4j.properties
@@ -1,4 +1,4 @@
-log4j.rootLogger=DEBUG, file, stdout
+log4j.rootLogger=DEBUG, file
 
 # Console appender
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

Reply via email to