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

Reply via email to