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/master 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;
