current deep equal has serious bugs. need to be reimpled

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

Branch: refs/heads/ODE-912
Commit: 016c34498c117fae11c86796fde2f72f0f68b7c8
Parents: 646ca99
Author: fangzhen <[email protected]>
Authored: Fri Aug 1 22:57:40 2014 +0800
Committer: fangzhen <[email protected]>
Committed: Fri Aug 1 22:57:40 2014 +0800

----------------------------------------------------------------------
 .../ode/bpel/obj/migrate/EqualityVisitor.java   | 38 +++++++++++++++-----
 1 file changed, 30 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/016c3449/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 9e419ba..b600940 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
@@ -2,6 +2,7 @@ package org.apache.ode.bpel.obj.migrate;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
@@ -166,6 +167,7 @@ public class EqualityVisitor extends AbstractObjectVisitor{
                        other = t2;
                        if ((Boolean)traverse.traverseObject(t1, false)) {
                                logFalseThrough = false;
+                               other = pre;
                                return t2;
                        }
                }
@@ -272,9 +274,9 @@ public class EqualityVisitor extends AbstractObjectVisitor{
        }
        public Boolean equalityByReflection(Object obj) {
                //TODO if it's sufficient to just compare public fields?
-               Field[] fields = obj.getClass().getFields();
-               Field[] fields2 = other.getClass().getFields();
-               if (! Arrays.equals(fields, fields2)){
+               List<Field> fields = getAllFields(obj.getClass());
+               List<Field> fields2 = getAllFields(other.getClass());
+               if (!fields.equals(fields2)){
                        if (!logFalseThrough){
                                __log.debug("Unequal: getFields() of two Object 
do not match " + st);
                        }
@@ -282,7 +284,8 @@ public class EqualityVisitor extends AbstractObjectVisitor{
                }
                
                for (Field f : fields){
-                       if ((Modifier.TRANSIENT & f.getModifiers()) != 0){
+                       f.setAccessible(true);
+                       if (((Modifier.TRANSIENT | Modifier.STATIC) & 
f.getModifiers()) != 0){
                                continue; //skip transient fields
                        }
                        try {
@@ -303,10 +306,6 @@ public class EqualityVisitor extends AbstractObjectVisitor{
                                other = v2;
                                Boolean res = 
(Boolean)traverse.traverseObject(v1);
                                if (!res){
-                                       if (!logFalseThrough){
-                                               __log.debug("Unequal:" + st + 
".\n When dealing with " 
-                                                       + v1 + " and " + v2);
-                                       }
                                        return false;
                                }
                                other = pre;
@@ -318,6 +317,29 @@ public class EqualityVisitor extends AbstractObjectVisitor{
                }
                return true;
        }
+       private List<Field> getAllFields(Class cls) {
+               List<Field> fields = getFieldsRec(cls.getSuperclass(), new 
ArrayList<Field>());
+               fields.addAll(Arrays.asList(cls.getDeclaredFields()));
+               return fields;
+       }
+       /**
+        * get fields that are accessible to its sub-classes.
+        * @param cls
+        * @param fields
+        * @return
+        */
+       private List<Field> getFieldsRec(Class cls, ArrayList<Field> fields) {
+               if (cls != null){
+                       Field[] fs = cls.getDeclaredFields();
+                       for (Field f : fs){
+                               if ((f.getModifiers() & Modifier.PRIVATE) == 0){
+                                       fields.add(f);
+                               }
+                       }
+                       getFieldsRec(cls.getSuperclass(), fields);
+               }
+               return fields;
+       }
        
        public void setOther(Object other){
                this.other = other;

Reply via email to