You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by va...@apache.org on 2015/07/21 22:52:24 UTC
[27/50] ode git commit: added some docs on migration code. a little
beautify
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/ODE-912
Commit: a04b2e90462b67994ed15753c16ecfa672b6d0fb
Parents: a499545
Author: fangzhen <fa...@gmail.com>
Authored: Wed Jul 30 13:02:30 2014 +0800
Committer: fangzhen <fa...@gmail.com>
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