added Upgradechecker to confirm if Omodel classes has upgraded to newest; not sure if it works, however
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/bbdf8e45 Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/bbdf8e45 Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/bbdf8e45 Branch: refs/heads/ODE-912 Commit: bbdf8e453651e795e786a4ebd5e2097537b85356 Parents: 0e5cf5b Author: fangzhen <[email protected]> Authored: Fri Aug 8 23:30:55 2014 +0800 Committer: fangzhen <[email protected]> Committed: Fri Aug 8 23:30:55 2014 +0800 ---------------------------------------------------------------------- .../ode/bpel/compiler_2_0/MigrationTest.java | 7 +++ .../org/apache/ode/bpel/obj/ExtensibleImpl.java | 2 +- .../ode/bpel/obj/migrate/OmUpgradeVisitor.java | 4 -- .../ode/bpel/obj/migrate/UpgradeChecker.java | 47 +++++++++++++++++ .../apache/ode/bpel/obj/serde/DeSerializer.java | 53 +++++++++++++------- 5 files changed, 89 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/bbdf8e45/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 ee27926..43809cf 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 @@ -16,6 +16,7 @@ import org.apache.ode.bpel.obj.migrate.DomElementComparator; import org.apache.ode.bpel.obj.migrate.ExtensibeImplEqualityComp; import org.apache.ode.bpel.obj.migrate.ObjectTraverser; import org.apache.ode.bpel.obj.migrate.OmOld2new; +import org.apache.ode.bpel.obj.migrate.UpgradeChecker; import org.junit.Assert; import org.junit.Test; @@ -50,6 +51,12 @@ public class MigrationTest extends GoodCompileTest{ de.addCustomComparator(new DomElementComparator()); boolean res = de.deepEquals(nu, migrated); assertEquals(Boolean.TRUE, res); + + UpgradeChecker checker = new UpgradeChecker(); + ObjectTraverser traverser = new ObjectTraverser(); + traverser.accept(checker); + traverser.traverseObject(migrated); + assertEquals(true, checker.isNewest()); } catch (Exception ex) { ex.printStackTrace(); Assert.fail("Compilation or migration did not succeed."); http://git-wip-us.apache.org/repos/asf/ode/blob/bbdf8e45/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 a6f6f68..bec1674 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 @@ -15,7 +15,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; @JsonIdentityInfo(generator = UniqueStringIdGenerator.class, property = "@id") public class ExtensibleImpl implements Extensible<Object>, Serializable{ public static final long serialVersionUID = -1L; - protected static final int CURRENT_CLASS_VERSION = 1; + public static final int CURRENT_CLASS_VERSION = 1; /** The wrapper wraps fields. Fields can be deleted, added or updated */ transient protected Map<String, Object> fieldContainer; http://git-wip-us.apache.org/repos/asf/ode/blob/bbdf8e45/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 index 75db83c..f0cde52 100644 --- 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 @@ -1,12 +1,8 @@ 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; http://git-wip-us.apache.org/repos/asf/ode/blob/bbdf8e45/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/UpgradeChecker.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/UpgradeChecker.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/UpgradeChecker.java new file mode 100644 index 0000000..ef9b93e --- /dev/null +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/UpgradeChecker.java @@ -0,0 +1,47 @@ +package org.apache.ode.bpel.obj.migrate; + +import java.lang.reflect.Field; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.ode.bpel.obj.ExtensibleImpl; + +public class UpgradeChecker extends AbstractObjectVisitor{ + private static final Log __log = LogFactory.getLog(UpgradeChecker.class); + + private boolean newest = true; + @Override + public Object visitPojo(Object obj) { + if (! (obj instanceof ExtensibleImpl)){ + return null; + } + visitExtensible(obj); + return null; + } + + private void visitExtensible(Object obj) { + ExtensibleImpl eobj = (ExtensibleImpl)obj; + if (eobj.getClassVersion() != eobj.CURRENT_CLASS_VERSION){ + newest = false; + __log.debug(obj.getClass() + "hasn't upgraded to newest version. current: " + + eobj.getClassVersion() + ", newest: " + eobj.CURRENT_CLASS_VERSION); + } + 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); + } + } + } + + public boolean isNewest() { + return newest; + } +} http://git-wip-us.apache.org/repos/asf/ode/blob/bbdf8e45/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 59b7a86..a661983 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 @@ -13,23 +13,27 @@ 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.migrate.UpgradeChecker; import org.apache.ode.bpel.obj.serde.OmSerdeFactory.SerializeFormat; public class DeSerializer { private OProcessWrapper wrapper = new OProcessWrapper(); private InputStream is; - public DeSerializer(InputStream is){ + + public DeSerializer(InputStream is) { this.is = is; deserializeHeader(); } - + public DeSerializer() { } - public void serialize(OutputStream out, OProcess process){ + public void serialize(OutputStream out, OProcess process) { serialize(out, process, OmSerdeFactory.FORMAT_SERIALIZED_DEFAULT); } - public void serialize(OutputStream out, OProcess process, SerializeFormat format){ + + public void serialize(OutputStream out, OProcess process, + SerializeFormat format) { wrapper.setCompileTime(System.currentTimeMillis()); wrapper.setProcess(process); wrapper.setFormat(format); @@ -42,49 +46,60 @@ public class DeSerializer { oos.writeObject(wrapper.getType()); oos.writeObject(wrapper.getOtherHeaders()); } catch (IOException e1) { - SerializaionRtException e = new SerializaionRtException("Error when serialize Headers."); + SerializaionRtException e = new SerializaionRtException( + "Error when serialize Headers."); e.initCause(e1); throw e; } OmSerdeFactory factory = new OmSerdeFactory(); factory.setFormat(format); - OmSerializer serializer = factory.createOmSerializer(out, wrapper.getProcess()); + OmSerializer serializer = factory.createOmSerializer(out, + wrapper.getProcess()); serializer.serialize(); } - - private void deserializeHeader(){ + + private void deserializeHeader() { try { ObjectInputStream ois = new ObjectInputStream(is); wrapper = new OProcessWrapper(); - wrapper.setMagic((byte[])ois.readObject()); - wrapper.setFormat((SerializeFormat)ois.readObject()); + wrapper.setMagic((byte[]) ois.readObject()); + wrapper.setFormat((SerializeFormat) ois.readObject()); wrapper.setCompileTime(ois.readLong()); - wrapper.setGuid((String)ois.readObject()); - wrapper.setType((QName)ois.readObject()); + wrapper.setGuid((String) ois.readObject()); + wrapper.setType((QName) ois.readObject()); wrapper.setOtherHeaders((Map<String, Object>) (ois.readObject())); wrapper.checkValid(); } catch (Exception e1) { - SerializaionRtException e = new SerializaionRtException("Error when reading Headers during deseriazation"); + SerializaionRtException e = new SerializaionRtException( + "Error when reading Headers during deseriazation"); e.initCause(e1); throw e; } } - public OProcess deserialize(){ + + public OProcess deserialize() { OmSerdeFactory factory = new OmSerdeFactory(); factory.setFormat(wrapper.getFormat()); - OmDeserializer de = factory.createOmDeserializer(is); - OProcess process = de.deserialize(); + OmDeserializer de = factory.createOmDeserializer(is); + OProcess process = de.deserialize(); //upgrade - OmUpgradeVisitor upgrader = new OmUpgradeVisitor(); + UpgradeChecker checker = new UpgradeChecker(); ObjectTraverser traverser = new ObjectTraverser(); - traverser.accept(upgrader); + traverser.accept(checker); traverser.traverseObject(process); + if (!checker.isNewest()) { + OmUpgradeVisitor upgrader = new OmUpgradeVisitor(); + traverser = new ObjectTraverser(); + traverser.accept(upgrader); + traverser.traverseObject(process); + } return process; } - + public OProcessWrapper getWrapper() { return wrapper; } + public void setWrapper(OProcessWrapper wrapper) { this.wrapper = wrapper; }
