added adapter for legacy omodel (de)serializer to cooperate with new omodel. 
need testing


Project: http://git-wip-us.apache.org/repos/asf/ode/repo
Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/912945b1
Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/912945b1
Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/912945b1

Branch: refs/heads/master
Commit: 912945b198d6b2bece31acd68e3f02b44fe42ca7
Parents: bbdf8e4
Author: fangzhen <[email protected]>
Authored: Sat Aug 9 20:07:25 2014 +0800
Committer: fangzhen <[email protected]>
Committed: Sat Aug 9 20:07:25 2014 +0800

----------------------------------------------------------------------
 .../obj/migrate/LegacySerializerAdapter.java    | 34 ++++++++
 .../apache/ode/bpel/obj/serde/DeSerializer.java | 83 +++++++++++++++++---
 .../ode/bpel/obj/serde/OmSerdeFactory.java      |  9 ++-
 3 files changed, 113 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/912945b1/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/LegacySerializerAdapter.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/LegacySerializerAdapter.java
 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/LegacySerializerAdapter.java
new file mode 100644
index 0000000..20e53a5
--- /dev/null
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/migrate/LegacySerializerAdapter.java
@@ -0,0 +1,34 @@
+package org.apache.ode.bpel.obj.migrate;
+
+import java.io.InputStream;
+
+import org.apache.ode.bpel.o.Serializer;
+import org.apache.ode.bpel.obj.OProcess;
+import org.apache.ode.bpel.obj.serde.OmDeserializer;
+import org.apache.ode.bpel.obj.serde.SerializaionRtException;
+
+public class LegacySerializerAdapter implements OmDeserializer{
+       private InputStream in;
+       private Serializer serializer;
+       public LegacySerializerAdapter(InputStream in) {
+               this.in = in;
+               serializer = new Serializer();
+               serializer._inputStream = in;
+       }
+       
+       @Override
+       public OProcess deserialize() throws SerializaionRtException {
+               org.apache.ode.bpel.o.OProcess old;
+               try {
+                       old = serializer.readOProcess();
+               } catch (Exception e) {
+                       throw new SerializaionRtException("Error when 
deserializing old OModle classes");
+               }
+               //migrate to new OModel
+               OmOld2new mig = new OmOld2new();
+               ObjectTraverser mtraverse = new ObjectTraverser();
+               mtraverse.accept(mig);
+               OProcess migrated = (OProcess) mtraverse.traverseObject(old);
+               return migrated;
+       }
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/912945b1/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 a661983..374e676 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
@@ -1,14 +1,23 @@
 package org.apache.ode.bpel.obj.serde;
 
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.OutputStream;
+import java.util.Arrays;
 import java.util.Map;
 
 import javax.xml.namespace.QName;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.o.Serializer;
 import org.apache.ode.bpel.obj.OProcess;
 import org.apache.ode.bpel.obj.OProcessWrapper;
 import org.apache.ode.bpel.obj.migrate.ObjectTraverser;
@@ -17,8 +26,11 @@ 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 static final Log __log = LogFactory.getLog(DeSerializer.class);
+
+    private OProcessWrapper wrapper = new OProcessWrapper();
        private InputStream is;
+       private File writeBackFile;
 
        public DeSerializer(InputStream is) {
                this.is = is;
@@ -37,9 +49,13 @@ public class DeSerializer {
                wrapper.setCompileTime(System.currentTimeMillis());
                wrapper.setProcess(process);
                wrapper.setFormat(format);
+               serialize(out);
+       }
+       private void serialize(OutputStream out){
                try {
+               DataOutputStream dos = new DataOutputStream(out);
+               dos.write(wrapper.getMagic());
                        ObjectOutputStream oos = new ObjectOutputStream(out);
-                       oos.writeObject(wrapper.getMagic());
                        oos.writeObject(wrapper.getFormat());
                        oos.writeLong(wrapper.getCompileTime());
                        oos.writeObject(wrapper.getGuid());
@@ -52,7 +68,7 @@ public class DeSerializer {
                        throw e;
                }
                OmSerdeFactory factory = new OmSerdeFactory();
-               factory.setFormat(format);
+               factory.setFormat(wrapper.getFormat());
                OmSerializer serializer = factory.createOmSerializer(out,
                                wrapper.getProcess());
                serializer.serialize();
@@ -60,15 +76,30 @@ public class DeSerializer {
 
        private void deserializeHeader() {
                try {
-                       ObjectInputStream ois = new ObjectInputStream(is);
-                       wrapper = new OProcessWrapper();
-                       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.setOtherHeaders((Map<String, Object>) 
(ois.readObject()));
-                       wrapper.checkValid();
+               DataInputStream oin = new DataInputStream(is);
+               is.mark(OProcessWrapper.CURRENT_MAGIC_NUMBER.length + 2);
+               byte[] magic = new 
byte[OProcessWrapper.CURRENT_MAGIC_NUMBER.length];
+               oin.read(magic, 0, magic.length);
+               if (Arrays.equals(Serializer.MAGIC_NUMBER_OFH_20040908, magic) 
||
+                               
Arrays.equals(Serializer.MAGIC_NUMBER_OFH_20061101, magic)){
+                       is.reset();
+                       Serializer serializer = new Serializer(is);
+                       wrapper.setMagic(magic);
+                       wrapper.setGuid(serializer.guid);
+                       wrapper.setCompileTime(serializer.compileTime);
+                       wrapper.setType(serializer.type);
+                       
wrapper.setFormat(SerializeFormat.FORMAT_SERIALIZED_LEGACY);
+               }else{
+                       ObjectInputStream ois = new ObjectInputStream(is);
+                               wrapper = new OProcessWrapper();
+                               wrapper.setMagic(magic);
+                               wrapper.setFormat((SerializeFormat) 
ois.readObject());
+                               wrapper.setCompileTime(ois.readLong());
+                               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");
@@ -92,10 +123,34 @@ public class DeSerializer {
                        traverser = new ObjectTraverser();
                        traverser.accept(upgrader);
                        traverser.traverseObject(process);
+                       if (writeBackFile != null){
+                               writeBack();
+                       }
                }
+               wrapper.setProcess(process);
                return process;
        }
 
+       private void writeBack() {
+               byte[] magic = wrapper.getMagic();
+        if (Arrays.equals(Serializer.MAGIC_NUMBER_OFH_20040908, magic) ||
+                       Arrays.equals(Serializer.MAGIC_NUMBER_OFH_20061101, 
magic)){
+               //upgrade to new omodel magic and format
+               wrapper.setMagic(OProcessWrapper.CURRENT_MAGIC_NUMBER);
+               wrapper.setFormat(OmSerdeFactory.FORMAT_SERIALIZED_DEFAULT);
+        }
+        OutputStream wbStream;
+               try {
+                       if (writeBackFile.exists()){
+                               writeBackFile.renameTo(new 
File(writeBackFile.getAbsolutePath()+ ".bak"));
+                       }
+                       wbStream = new FileOutputStream(writeBackFile);
+                       serialize(wbStream);
+               } catch (FileNotFoundException e) {
+                       __log.info("Error when write back upgraded process. 
file not found");
+               }
+       }
+
        public OProcessWrapper getWrapper() {
                return wrapper;
        }
@@ -104,4 +159,8 @@ public class DeSerializer {
                this.wrapper = wrapper;
        }
 
+       public void setWriteBackFile(File writeBack) {
+               this.writeBackFile = writeBack;
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/912945b1/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/OmSerdeFactory.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/OmSerdeFactory.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/OmSerdeFactory.java
index 869b055..baf967c 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/OmSerdeFactory.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/OmSerdeFactory.java
@@ -4,6 +4,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.ode.bpel.obj.OProcess;
+import org.apache.ode.bpel.obj.migrate.LegacySerializerAdapter;
 
 public class OmSerdeFactory {
        public static final SerializeFormat FORMAT_SERIALIZED_DEFAULT = 
SerializeFormat.FORMAT_SERIALIZED_SMILE;
@@ -41,6 +42,9 @@ public class OmSerdeFactory {
                case FORMAT_SERIALIZED_JAVA:
                        deser = new JavaSerOmDeserializer(is);
                        break;
+               case FORMAT_SERIALIZED_LEGACY:
+                       deser = new LegacySerializerAdapter(is);
+                       break;
                default:
                        throw new SerializaionRtException("Unsupported format");
                }
@@ -58,7 +62,10 @@ public class OmSerdeFactory {
                FORMAT_UNINITIALIZED(0x00),
                FORMAT_SERIALIZED_JSON(0x10),
                FORMAT_SERIALIZED_SMILE(0x11),
-               FORMAT_SERIALIZED_JAVA(0x20);
+               FORMAT_SERIALIZED_JAVA(0x20),
+               
+               //convenient for legacy format
+               FORMAT_SERIALIZED_LEGACY(0x90);
                
                private int code;
                private SerializeFormat(int code){

Reply via email to