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){
