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 <[email protected]>
Authored: Tue Jul 29 10:48:34 2014 +0800
Committer: fangzhen <[email protected]>
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);

Reply via email to