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

[35/50] ode git commit: current deep equal has serious bugs. need to be reimpled

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 <fa...@gmail.com>
Authored: Fri Aug 1 22:57:40 2014 +0800
Committer: fangzhen <fa...@gmail.com>
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;