unify upgrade logic of different serialization format
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/0e5cf5b0 Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/0e5cf5b0 Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/0e5cf5b0 Branch: refs/heads/master Commit: 0e5cf5b03cca53a6e67213d3e23ddea6303b6d14 Parents: 9e13387 Author: fangzhen <[email protected]> Authored: Fri Aug 8 23:00:28 2014 +0800 Committer: fangzhen <[email protected]> Committed: Fri Aug 8 23:01:21 2014 +0800 ---------------------------------------------------------------------- .../ode/bpel/compiler_2_0/GoodCompileTest.java | 7 --- .../org/apache/ode/bpel/obj/ExtensibleImpl.java | 3 -- .../bpel/obj/migrate/AbstractObjectVisitor.java | 39 +++++++++++++--- .../bpel/obj/migrate/DeepEqualityHelper.java | 27 +---------- .../apache/ode/bpel/obj/migrate/MigUtils.java | 33 +++++++++++++ .../ode/bpel/obj/migrate/ObjectTraverser.java | 4 ++ .../ode/bpel/obj/migrate/OmUpgradeVisitor.java | 49 ++++++++++++++++++++ .../apache/ode/bpel/obj/serde/DeSerializer.java | 10 +++- .../bpel/obj/serde/JavaSerOmDeserializer.java | 2 + .../ode/bpel/obj/serde/JsonOmDeserializer.java | 4 +- 10 files changed, 134 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java ---------------------------------------------------------------------- diff --git a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java index 9a1d973..45e4be5 100644 --- a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java +++ b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/GoodCompileTest.java @@ -19,19 +19,12 @@ package org.apache.ode.bpel.compiler_2_0; -import static org.junit.Assert.assertEquals; - import java.io.File; -import java.io.FileInputStream; import java.net.URI; import java.net.URL; import org.apache.ode.bpel.compiler.api.CompileListener; import org.apache.ode.bpel.obj.OProcess; -import org.apache.ode.bpel.obj.migrate.DeepEqualityHelper; -import org.apache.ode.bpel.obj.migrate.DomElementComparator; -import org.apache.ode.bpel.obj.migrate.ExtensibeImplEqualityComp; -import org.apache.ode.bpel.obj.serde.DeSerializer; import org.junit.Assert; import org.junit.Test; http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java index 2979340..a6f6f68 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/ExtensibleImpl.java @@ -98,9 +98,6 @@ public class ExtensibleImpl implements Extensible<Object>, Serializable{ Object value = ois.readObject(); fieldContainer.put(key, value); } - - //migrate to newest version - upgrade2Newest(); } @Override http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/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 968aeeb..b5c2f13 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 @@ -1,10 +1,12 @@ package org.apache.ode.bpel.obj.migrate; +import java.lang.reflect.Array; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.Map.Entry; import org.apache.ode.bpel.obj.migrate.ObjectTraverser.HandleTable; @@ -78,17 +80,42 @@ public abstract class AbstractObjectVisitor implements ObjectVisitor{ this.traverse = traverseObject; } - @Override public void addCustomVisitor(Class cls, ObjectVisitor visitor){ visitors.put(cls, visitor); } + public Object visitMap(Object obj) { + Map m = (Map)obj; + Set<Entry> entries = m.entrySet(); + for (Entry e : entries){ + traverse.traverseObject(e.getKey()); + traverse.traverseObject(e.getValue()); + } + return null; + } + + public Object visitCollection(Object obj) { + Collection c = (Collection)obj; + for (Object item : c){ + traverse.traverseObject(item); + } + return null; + } - public abstract Object visitMap(Object obj); - public abstract Object visitCollection(Object obj); - public abstract Object visitArray(Object obj); - public abstract Object visitPojo(Object obj); - public abstract Object visitSet(Object obj); + public Object visitArray(Object obj) { + int len = Array.getLength(obj); + int i; + for (i = 0; i < len; i++){ + traverse.traverseObject(Array.get(obj, i)); + } + return null; + } + public Object visitSet(Object obj) { + //nothing to do + return null; + } + + public abstract Object visitPojo(Object obj); /** * Lightweight identity hash table which maps objects to replacement * objects. http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DeepEqualityHelper.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DeepEqualityHelper.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DeepEqualityHelper.java index 5982665..1872894 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DeepEqualityHelper.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/DeepEqualityHelper.java @@ -287,8 +287,8 @@ public class DeepEqualityHelper{ return null; } public Boolean equalityByReflection(Object obj, Object other) { - List<Field> fields = getAllFields(obj.getClass()); - List<Field> fields2 = getAllFields(other.getClass()); + List<Field> fields = MigUtils.getAllFields(obj.getClass()); + List<Field> fields2 = MigUtils.getAllFields(other.getClass()); if (!fields.equals(fields2)){ if (!logFalseThrough){ __log.debug("Unequal: getFields() of two Object do not match " + st); @@ -329,29 +329,6 @@ public class DeepEqualityHelper{ } 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; - } /** * determine if obj is collections that order doesn't matter. http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/MigUtils.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/MigUtils.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/MigUtils.java new file mode 100644 index 0000000..a44696b --- /dev/null +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/MigUtils.java @@ -0,0 +1,33 @@ +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.List; + +public class MigUtils { + public static 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 static 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; + } +} http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java index 6e48c59..30865dd 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/ObjectTraverser.java @@ -1,6 +1,10 @@ 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.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmUpgradeVisitor.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmUpgradeVisitor.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmUpgradeVisitor.java new file mode 100644 index 0000000..75db83c --- /dev/null +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/OmUpgradeVisitor.java @@ -0,0 +1,49 @@ +package org.apache.ode.bpel.obj.migrate; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.ode.bpel.obj.Extensible; + +public class OmUpgradeVisitor extends AbstractObjectVisitor{ + + @Override + protected boolean isCollection(Object old) { + return old instanceof Collection; + } + @Override + protected boolean isSet(Object obj){ + return false; + } + + @Override + public Object visitPojo(Object obj) { + if (! (obj instanceof Extensible)){ + return null; + } + visitExtensible(obj); + return null; + } + + private void visitExtensible(Object obj) { + ((Extensible)obj).upgrade2Newest(); + List<Field> fields = MigUtils.getAllFields(obj.getClass()); + for (Field f : fields){ + f.setAccessible(true); + try { + Object value = f.get(obj); + if (value != null){ + traverse.traverseObject(value); + } + } catch (Exception e){ + throw new RuntimeException(e); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/DeSerializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/DeSerializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/DeSerializer.java index db623fb..59b7a86 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/DeSerializer.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/DeSerializer.java @@ -11,6 +11,8 @@ import javax.xml.namespace.QName; import org.apache.ode.bpel.obj.OProcess; import org.apache.ode.bpel.obj.OProcessWrapper; +import org.apache.ode.bpel.obj.migrate.ObjectTraverser; +import org.apache.ode.bpel.obj.migrate.OmUpgradeVisitor; import org.apache.ode.bpel.obj.serde.OmSerdeFactory.SerializeFormat; public class DeSerializer { @@ -71,7 +73,13 @@ public class DeSerializer { OmSerdeFactory factory = new OmSerdeFactory(); factory.setFormat(wrapper.getFormat()); OmDeserializer de = factory.createOmDeserializer(is); - return de.deserialize(); + OProcess process = de.deserialize(); + //upgrade + OmUpgradeVisitor upgrader = new OmUpgradeVisitor(); + ObjectTraverser traverser = new ObjectTraverser(); + traverser.accept(upgrader); + traverser.traverseObject(process); + return process; } public OProcessWrapper getWrapper() { http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JavaSerOmDeserializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JavaSerOmDeserializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JavaSerOmDeserializer.java index ce6a6e1..5f774c2 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JavaSerOmDeserializer.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JavaSerOmDeserializer.java @@ -4,6 +4,8 @@ import java.io.InputStream; import java.io.ObjectInputStream; import org.apache.ode.bpel.obj.OProcess; +import org.apache.ode.bpel.obj.migrate.ObjectTraverser; +import org.apache.ode.bpel.obj.migrate.OmUpgradeVisitor; public class JavaSerOmDeserializer implements OmDeserializer { private InputStream is; http://git-wip-us.apache.org/repos/asf/ode/blob/0e5cf5b0/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java index 0c1b09a..9081d1d 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java @@ -8,14 +8,14 @@ import java.util.List; import java.util.Map; import java.util.Vector; -import javax.wsdl.Message; import javax.wsdl.OperationType; -import javax.wsdl.Part; import javax.xml.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.bpel.obj.OProcess; +import org.apache.ode.bpel.obj.migrate.ObjectTraverser; +import org.apache.ode.bpel.obj.migrate.OmUpgradeVisitor; import org.apache.ode.bpel.obj.serde.jacksonhack.TypeBeanSerializerFactory; import org.apache.ode.utils.NSContext; import org.w3c.dom.Element;
