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:16 UTC

[19/50] ode git commit: Deep Equality worked; passed some tests of migration from old to new.

Deep Equality worked; passed some tests of migration from old to new.


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

Branch: refs/heads/ODE-912
Commit: 349eacb9c8ae3dc8e4c5a52fe049259a5bd577dc
Parents: 6e9b07d
Author: fangzhen <fa...@gmail.com>
Authored: Tue Jul 29 10:48:34 2014 +0800
Committer: fangzhen <fa...@gmail.com>
Committed: Tue Jul 29 10:48:34 2014 +0800

----------------------------------------------------------------------
 .../ode/bpel/compiler_2_0/MigrationTest.java    |   5 +-
 .../elang/xpath10/obj/OXPath10Expression.java   |   2 +-
 .../java/org/apache/ode/bpel/obj/DebugInfo.java |  20 ++-
 .../ode/bpel/obj/OConstantExpression.java       |   6 +-
 .../org/apache/ode/bpel/obj/OPartnerLink.java   |   6 +-
 .../bpel/obj/migrate/AbstractObjectVisitor.java |   6 +-
 .../bpel/obj/migrate/DebugInfoComparator.java   |  40 +++++
 .../ode/bpel/obj/migrate/EqualityVisitor.java   | 174 +++++++++++++++----
 .../obj/migrate/ExtensibeImplEqualityComp.java  |  53 +++++-
 .../ode/bpel/obj/migrate/ObjectVisitor.java     |   2 +
 .../apache/ode/bpel/obj/migrate/OmOld2new.java  |   5 +-
 11 files changed, 270 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/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 6658931..314c036 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
@@ -11,6 +11,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.o.Serializer;
 import org.apache.ode.bpel.obj.OProcess;
+import org.apache.ode.bpel.obj.migrate.DebugInfoComparator;
 import org.apache.ode.bpel.obj.migrate.EqualityVisitor;
 import org.apache.ode.bpel.obj.migrate.ExtensibeImplEqualityComp;
 import org.apache.ode.bpel.obj.migrate.OmOld2new;
@@ -43,10 +44,10 @@ public class MigrationTest extends GoodCompileTest{
     		TraverseObject traverse = new TraverseObject();
     		EqualityVisitor visitor = new EqualityVisitor(nu);
     		visitor.addCustomComparator(new ExtensibeImplEqualityComp(visitor));
+    		visitor.addCustomComparator(new DebugInfoComparator(visitor));
     		traverse.accept(visitor);
     		boolean res = (Boolean)traverse.traverseObject(migrated);
-    		System.out.print(visitor.getFalseChain());
-    		assertEquals(Boolean.TRUE, res);   		
+       		assertEquals(Boolean.TRUE, res);   		
      } catch (Exception ex) {
             ex.printStackTrace();
             Assert.fail("Compilation did not succeed.");

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/bpel-nobj/src/main/java/org/apache/ode/bpel/elang/xpath10/obj/OXPath10Expression.java
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/elang/xpath10/obj/OXPath10Expression.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/elang/xpath10/obj/OXPath10Expression.java
index 6620441..809c2d1 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/elang/xpath10/obj/OXPath10Expression.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/elang/xpath10/obj/OXPath10Expression.java
@@ -309,7 +309,7 @@ public class OXPath10Expression extends OLValueExpression implements Serializabl
 		private final String LOCATION = "location";
 
 		@JsonCreator
-		SigGetVariableData(){}
+		public SigGetVariableData(){}
 		private SigGetVariableData(String varname, String partname,
 				String location) {
 			setVarname(varname);

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/DebugInfo.java
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/DebugInfo.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/DebugInfo.java
index 584ed69..3135a74 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/DebugInfo.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/DebugInfo.java
@@ -18,6 +18,8 @@
  */
 package org.apache.ode.bpel.obj;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
@@ -114,5 +116,21 @@ public class DebugInfo extends ExtensibleImpl  implements Serializable{
 		fieldContainer.put(STARTLINE, startLine);
 	}
 
-	//TODO: check legacy OModel DebugInfo#readObject.
+	private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{
+		ois.defaultReadObject();
+		int size = ois.readInt();
+		String cls = (String)ois.readObject();
+		try {
+			fieldContainer = (Map<String, Object>)(Class.forName(cls).newInstance());
+		} catch (Exception e) {
+			//should never get here
+			e.printStackTrace();
+		}
+		for (int i = 0; i < size; i++){
+			String key = (String)ois.readObject();
+			Object value = ois.readObject();
+			if (!key.equals(DESCRIPTION))
+				fieldContainer.put(key, value);
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OConstantExpression.java
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OConstantExpression.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OConstantExpression.java
index d240449..793922f 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OConstantExpression.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OConstantExpression.java
@@ -24,7 +24,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 public class OConstantExpression extends OExpression  implements Serializable{
 	public static final long serialVersionUID = -1L;
 
-    private Object _val;
+    private static String VAL = "_val";
 
     @JsonCreator 
     public OConstantExpression(){}
@@ -34,14 +34,14 @@ public class OConstantExpression extends OExpression  implements Serializable{
     }
 
     public Object getVal() {
-        return _val;
+        return fieldContainer.get(VAL);
     }
 
     public void setVal(Object val) {
         if (val == null)
           throw new IllegalArgumentException("OConstatExpression cannot be null.");
 
-        _val = val;
+         fieldContainer.put(VAL, val);
     }
 
     public String toString() {

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OPartnerLink.java
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OPartnerLink.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OPartnerLink.java
index 1d61b29..7d302b0 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OPartnerLink.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OPartnerLink.java
@@ -56,11 +56,11 @@ public class OPartnerLink extends OBase  implements Serializable{
 	private static final String INITIALIZEPARTNERROLE = "initializePartnerRole";
 
 	/** The set of CorrelationSets that may be used as a match criteria, organized by {@link Operation} */
-	private static final String NONINITIATINGCORRELATIONSETS = "nonIntitiatingCorrelationSets";
+	private static final String NONINITIATINGCORRELATIONSETS = "_nonIntitiatingCorrelationSets";
 	/** The set of joining CorrelationSets that may be used as a match criteria, organized by {@link Operation} */
-	private static final String JOININGCORRELATIONSETS = "joiningCorrelationSets";
+	private static final String JOININGCORRELATIONSETS = "_joiningCorrelationSets";
 	/** The set of {@link Operation}s that can be used to create a process instance. */
-	private static final String CREATEINSTANCEOPERATIONS = "createInstanceOperations";
+	private static final String CREATEINSTANCEOPERATIONS = "_createInstanceOperations";
 
 	@JsonCreator
 	public OPartnerLink(){

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/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 1a0dca2..5a8ce53 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
@@ -21,7 +21,11 @@ public abstract class AbstractObjectVisitor implements ObjectVisitor{
 		}
 		return rtab.lookup(obj);
 	}
-
+	
+	@Override
+	public TraverseObject getTraverse(){
+		return traverse;
+	}
 	@Override
 	public Object visit(Object obj) {
 		ObjectVisitor customVisitor = visitors.get(obj.getClass());

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DebugInfoComparator.java
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DebugInfoComparator.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DebugInfoComparator.java
new file mode 100644
index 0000000..9d562ae
--- /dev/null
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DebugInfoComparator.java
@@ -0,0 +1,40 @@
+package org.apache.ode.bpel.obj.migrate;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.obj.DebugInfo;
+
+public class DebugInfoComparator implements EqualityComparator{
+    private static final Log __log = LogFactory.getLog(DebugInfoComparator.class);
+    private EqualityVisitor visitor;
+    public DebugInfoComparator(EqualityVisitor visitor){
+    	this.visitor = visitor;
+    }
+    
+	@Override
+	public Boolean objectsEqual(Object obj1, Object obj2) {
+		if (!(obj2 instanceof DebugInfo)){
+			if (!visitor.logFalseThrough){
+				__log.debug("Unequal in DebugInfo, object2 is not a DebugInfo");
+			}
+			return false;
+		}
+		DebugInfo o1 = (DebugInfo)obj1;
+		DebugInfo o2 = (DebugInfo)obj2;
+		boolean res =  o1.getStartLine() == o2.getStartLine() &&
+				o1.getEndLine() == o2.getEndLine() &&
+				o1.getSourceURI().equals(o2.getSourceURI());
+		if (!res){
+			if (!visitor.logFalseThrough){
+				__log.info("Unequal in DebugInfo, " + o1 + " and " + o2);
+			}
+		}
+		return res;
+	}
+
+	@Override
+	public Boolean canHanle(Object obj) {
+		return obj instanceof DebugInfo;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/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 14fdb39..bfcbd15 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
@@ -9,79 +9,96 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 public class EqualityVisitor extends AbstractObjectVisitor{
-    private static final Log __log = LogFactory.getLog(TraverseObject.class);
+	private static final Log __log = LogFactory.getLog(TraverseObject.class);
     private List<EqualityComparator> comparators = new LinkedList<EqualityComparator>();
-    private List<String> falseChain = new LinkedList<String>();
+    private Stack<String> st = new Stack<String>();
     
     protected Object other;
-    
+    public boolean logFalseThrough = false;
     public EqualityVisitor(){
     	
     }
 	public EqualityVisitor(Object other){
 		this.other = other;
+		st.push(":" + other.getClass().getSimpleName());
 	}
 
-	public void setOther(Object other){
-		this.other = other;
-	}
-	public void addCustomComparator(EqualityComparator oe){
-		comparators.add(0, oe);
-	}
-	public List<String> getFalseChain(){
-		return falseChain;
-	}
-	@Override
-	public Boolean visited(Object obj){
-		return true;
-	}
 	@Override
 	public Boolean visit(Object obj){
-		__log.debug("comparing Object " + obj.getClass() + "@" + System.identityHashCode(obj) + " " + obj + 
+		if (!logFalseThrough){
+			__log.debug("comparing Object " + obj.getClass() + "@" + System.identityHashCode(obj) + " " + obj + 
 				" and " + other.getClass() + "@" + System.identityHashCode(other) + " " + other);
-		Boolean res =  (Boolean)super.visit(obj);
-		if (!res){
-			falseChain.add(0, obj.getClass().getSimpleName());
 		}
+		Boolean res =  (Boolean)super.visit(obj);
 		return res;
 	}
 	@SuppressWarnings("rawtypes")
 	@Override
 	public Boolean visitMap(Object obj) {
 		if (obj == other) return true;
-		if (other == null) return false;
+		if (other == null) {
+			if (!logFalseThrough){
+				__log.debug("Unequal in Map: Object2 is null. " + st);
+			}
+			return false;
+		}
 		Map m1 = (Map)obj;
 		Map m2 = null;
 		try{
 			m2 = (Map)other;
 		}catch (ClassCastException e){
+			if (!logFalseThrough){
+				__log.debug("Unequal in Map: Object2 is not a map, it's a" + other.getClass() + "\n" + st);
+			}
+			return false;
+		}
+		if (m1.size() != m2.size()) {
+			if (!logFalseThrough){
+				__log.debug("Unequal in Map: size mismatch. " + st + 
+					"\n size: " + m1.size() + " and " + m2.size());
+			}
 			return false;
 		}
-		if (m1.size() != m2.size()) return false;
 		Set ks1 = m1.keySet();
 		Set ks2 = m2.keySet();
 		for (Object k1 : ks1){
+			st.push(k1.toString());
 			Object k2 = contains(ks2, k1);
 			if (k2 == null){
+				if (!logFalseThrough){
+					__log.debug("Unequal in Map: cant find key. " + st + "\n missing key: " + k1);
+				}
 				return false;
 			}
 			Object o1 = m1.get(k1);
 			Object o2 = m2.get(k2);
 			if (o1 == null){
 				if (!(o2 == null)){
-					return false;
+					if (!logFalseThrough){
+						__log.debug("Unequal in Map: mismatch, one is null" + st + 
+							"\n When dealing with " + o1 + " and " + o2);
+					}					
+						return false;
 				}
 			}
+
+			st.pop();
+			st.push(k1.toString() + ":" + o1.getClass().getSimpleName());
+			
 			Object pre = other;
 			other = o2;
 			Boolean e = (Boolean)traverse.traverseObject(o1);
-			if (!e) return false;
+			if (!e) {
+				return false;
+			}
 			other = pre;
+			st.pop();
 		}
 		return true;
 	}
@@ -90,19 +107,42 @@ public class EqualityVisitor extends AbstractObjectVisitor{
 	@SuppressWarnings("rawtypes")
 	public Boolean visitSet(Object obj){
 		if (obj == other) return true;
-		if (other == null) return false;
+		if (other == null) {
+			if (!logFalseThrough){
+				__log.debug("Unequal in Set, Object2 is null. " + st);
+			}
+			return false;
+		}
 		
 		Collection c1 = (Collection)obj;
 		Collection c2 = null;
 		try {
 			c2 = (Collection)other;
 		}catch(ClassCastException e){
+			if (!logFalseThrough){
+				__log.debug("Unequal in Set: Object2 is not a Set, it's a" + other.getClass() + "\n" + st);
+			}
+			return false;
+		}
+		if (c1.size() != c2.size()) {
+			if (!logFalseThrough){
+				__log.debug("Unequal in Set: size mismatch. " + st + 
+					"\n. sizes are " + c1.size() + " and " + c2.size());
+			}
 			return false;
 		}
-		if (c1.size() != c2.size()) return false;
 		Iterator i1 = c1.iterator();
 		while (i1.hasNext()){
-			if (contains(c2, i1.next()) == null) return false;
+			Object o1 = i1.next();
+			st.push(":" + o1.getClass().getSimpleName());
+			if (contains(c2, o1) == null) {
+				if (!logFalseThrough){
+					__log.debug("Unequal in Set: Object mismatch. " + st + 
+						"\n" + "cann't find" + o1);
+				}
+				return false;
+			}
+			st.pop();
 		}
 		return true;
 	}
@@ -111,15 +151,18 @@ public class EqualityVisitor extends AbstractObjectVisitor{
 		Iterator itor = c.iterator();
 		Object t2;
 		Object pre = other;
+		logFalseThrough = true;
 		while (itor.hasNext()){
 			t2 = itor.next();
 			other = t2;
 			if ((Boolean)traverse.traverseObject(t1, false)) {
+				logFalseThrough = false;
 				return t2;
 			}
 		}
 		traverse.getHtab().assign(t1);
 		other = pre;
+		logFalseThrough = false;
 		return null;
 	}
 
@@ -127,27 +170,45 @@ public class EqualityVisitor extends AbstractObjectVisitor{
 	@Override
 	public Boolean visitCollection(Object obj) {
 		if (obj == other) return true;
-		if (other == null) return false;
+		if (other == null) {
+			if (!logFalseThrough){
+				__log.debug("Unequal in Collection, Object2 is null. " + st);
+			}
+			return false;
+		}
 		
 		Collection c = (Collection)obj;
 		Collection c2 = null;
 		try {
 			c2 = (Collection)other;
 		}catch(ClassCastException e){
+			if (!logFalseThrough){
+				__log.debug("Unequal in Collection: Object2 is not a Collection, it's a" + other.getClass() + "\n" + st);
+			}
+			return false;
+		}
+		if (c.size() != c2.size()) {
+			if (!logFalseThrough){
+				__log.debug("Unequal in Collection: size mismatch. " + st + 
+					"\n. sizes are " + c.size() + " and " + c2.size());
+			}
 			return false;
 		}
-		if (c.size() != c2.size()) return false;
 
 		Iterator i1 = c.iterator();
 		Iterator i2 = c2.iterator();
 		while (i1.hasNext()){
 			Object o1 = i1.next();
 			Object o2 = i2.next();
+			st.push(":" + o1.getClass().getSimpleName());
 			Object pre = other;
 			other = o2;
 			Boolean e = (Boolean)traverse.traverseObject(o1);
-			if (!e) return false;
+			if (!e) {
+				return false;
+			}
 			other = pre;
+			st.pop();
 		}
 		return true;
 	}
@@ -164,11 +225,29 @@ public class EqualityVisitor extends AbstractObjectVisitor{
 			return customComp.objectsEqual(obj, other);
 		}
 		if (obj == other) return true;
-		if (other == null) return false;
-		if (obj.getClass() != other.getClass()) return false;
+		if (other == null) {
+			if (!logFalseThrough){
+				__log.debug("Unequal in POJO: Object2 is null." + st);
+			}
+			return false;
+		}
+		if (obj.getClass() != other.getClass()) {
+			if(!logFalseThrough){
+				__log.debug("Unequal in POJO: type mistach. " + st + 
+						"\nmismatched types are: " + obj.getClass().getSimpleName() + 
+						" and " + other.getClass().getSimpleName());
+			}
+			return false;
+		}
 		try{
 			obj.getClass().getDeclaredMethod("equals", Object.class);
-			return obj.equals(other);
+			boolean e = obj.equals(other);
+			if (!e){
+				if (!logFalseThrough){
+					__log.debug("Unequal in POJO: not equal by equals() method" + st); 
+				}
+			}
+			return e;
 		}catch (NoSuchMethodException e){
 			return equalityByReflection(obj);
 		}
@@ -187,6 +266,9 @@ public class EqualityVisitor extends AbstractObjectVisitor{
 		Field[] fields = obj.getClass().getFields();
 		Field[] fields2 = other.getClass().getFields();
 		if (! Arrays.equals(fields, fields2)){
+			if (!logFalseThrough){
+				__log.debug("Unequal: getFields() of two Object do not match " + st);
+			}
 			return false;
 		}
 		
@@ -195,22 +277,31 @@ public class EqualityVisitor extends AbstractObjectVisitor{
 				continue; //skip transient fields
 			}
 			try {
+				st.push(f.getName()+ ":" + f.getType().getSimpleName());
 				Object v1 = f.get(obj);
 				Object v2 = f.get(other);
 				if (v1 == null && v2 == null){
 					continue;
 				}
 				if (v1 == null || v2 == null){
+					if (!logFalseThrough){
+						__log.debug("Unequal: one field is null" + st + ".\n When dealing with " 
+							+ v1 + " and " + v2);
+					}
 					return false;
 				}
 				Object pre = other;
 				other = v2;
 				Boolean res = (Boolean)traverse.traverseObject(v1);
 				if (!res){
-					falseChain.add(f.getName());
+					if (!logFalseThrough){
+						__log.debug("Unequal:" + st + ".\n When dealing with " 
+							+ v1 + " and " + v2);
+					}
 					return false;
 				}
 				other = pre;
+				st.pop();
 			} catch (Exception e) {
 				//should not get here
 				e.printStackTrace();
@@ -218,5 +309,18 @@ public class EqualityVisitor extends AbstractObjectVisitor{
 		}
 		return true;
 	}
-
+	
+	public void setOther(Object other){
+		this.other = other;
+	}
+	public void addCustomComparator(EqualityComparator oe){
+		comparators.add(0, oe);
+	}
+	@Override
+	public Boolean visited(Object obj){
+		return true;
+	}
+    public Stack<String> getSt() {
+		return st;
+	}
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ExtensibeImplEqualityComp.java
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ExtensibeImplEqualityComp.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ExtensibeImplEqualityComp.java
index 0985ac2..14db7d8 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ExtensibeImplEqualityComp.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ExtensibeImplEqualityComp.java
@@ -1,8 +1,18 @@
 package org.apache.ode.bpel.obj.migrate;
 
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.obj.ExtensibleImpl;
+import org.apache.ode.bpel.obj.OProcess;
 
 public class ExtensibeImplEqualityComp implements EqualityComparator{
+    private static final Log __log = LogFactory.getLog(DebugInfoComparator.class);
 	private EqualityVisitor visitor;
 	
 	public ExtensibeImplEqualityComp() {
@@ -13,15 +23,54 @@ public class ExtensibeImplEqualityComp implements EqualityComparator{
 
 	@Override
 	public Boolean objectsEqual(Object obj1, Object obj2) {
+		if (obj2 == null) {
+			if (!visitor.logFalseThrough){
+				__log.debug("Unequal in ExtensibleImpl: Object2 is null. " +
+					visitor.getSt());
+		}
+			return false;
+		}
 		ExtensibleImpl esi = (ExtensibleImpl)obj1;
 		ExtensibleImpl esio = null;
+		if (obj1.getClass() != obj2.getClass()){			
+			if (!visitor.logFalseThrough){
+				__log.debug("Unequal in ExtensibleImpl: Type mismatch. " + visitor.getSt() + 
+					"\nmismatched type: " + obj1.getClass().getSimpleName() + 
+					" and " + obj2.getClass().getSimpleName());
+			}
+			return false;
+		}
 		try{
 			esio = (ExtensibleImpl)obj2;
 		}catch(ClassCastException e){
+			//won't get here
 			return false;
 		}
-		visitor.setOther(esio.getFieldContainer());
-		return visitor.visit(esi.getFieldContainer());
+		Map m1 = new LinkedHashMap(esi.getFieldContainer());
+		Map m2 = new LinkedHashMap(esio.getFieldContainer());
+		dehydrate(m1);
+		dehydrate(m2);
+		if (obj1.getClass() == OProcess.class){
+			dehydrateOProcess(m1);
+			dehydrateOProcess(m2);
+		}
+		visitor.setOther(m2);
+		return (Boolean) visitor.getTraverse().traverseObject(m1);
+	}
+	private void dehydrateOProcess(Map m) {
+		m.remove("compileDate");
+	}
+	@SuppressWarnings("rawtypes")
+	private void dehydrate(Map map) {
+		if (map == null) return;
+		Set<Entry> entries = map.entrySet();
+		Iterator<Entry> itor = entries.iterator();
+		while (itor.hasNext()){
+			Entry entry = itor.next();
+			if (entry.getValue() == null){
+				itor.remove();
+			}
+		}
 	}
 	@Override
 	public Boolean canHanle(Object obj) {

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/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 b9caa12..972697f 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
@@ -9,4 +9,6 @@ public interface ObjectVisitor {
 	void setTraverse(TraverseObject traverseObject);
 
 	void addCustomVisitor(Class cls, ObjectVisitor visitor);
+
+	TraverseObject getTraverse();
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/349eacb9/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 c7caa86..432e2df 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
@@ -1,5 +1,6 @@
 package org.apache.ode.bpel.obj.migrate;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
@@ -183,7 +184,9 @@ public class OmOld2new extends AbstractObjectVisitor{
 		String clsName = old.getClass().getName();
 		String qcls = clsName.replace(".o.", ".obj.");
 		try {
-			return Class.forName(qcls).newInstance();
+			Constructor cons = Class.forName(qcls).getConstructor();
+			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());
 			rte.initCause(e);