fed deserializer cbp file instead of inputStream, so that we can write back upgraded Omodel.
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/f23e68ed Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/f23e68ed Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/f23e68ed Branch: refs/heads/ODE-912 Commit: f23e68ede2a4011af6b8a3c583c3f2478325458e Parents: 565ccda Author: fangzhen <[email protected]> Authored: Tue Aug 12 21:22:16 2014 +0800 Committer: fangzhen <[email protected]> Committed: Tue Aug 12 21:22:16 2014 +0800 ---------------------------------------------------------------------- .../org/apache/ode/bpel/iapi/ProcessConf.java | 7 + .../compiler_2_0/JavaSerializationTest.java | 2 +- .../ode/bpel/compiler_2_0/MigrationTest.java | 7 +- .../apache/ode/bpel/obj/serde/DeSerializer.java | 139 +++++++++++++------ .../org/apache/ode/bpel/engine/BpelProcess.java | 16 +-- .../org/apache/ode/store/DeploymentUnitDir.java | 3 +- .../org/apache/ode/store/ProcessConfImpl.java | 8 ++ .../java/org/apache/ode/jbi/OdeContext.java | 16 +-- 8 files changed, 126 insertions(+), 72 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/bpel-api/src/main/java/org/apache/ode/bpel/iapi/ProcessConf.java ---------------------------------------------------------------------- diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/iapi/ProcessConf.java b/bpel-api/src/main/java/org/apache/ode/bpel/iapi/ProcessConf.java index 653fd29..526a199 100644 --- a/bpel-api/src/main/java/org/apache/ode/bpel/iapi/ProcessConf.java +++ b/bpel-api/src/main/java/org/apache/ode/bpel/iapi/ProcessConf.java @@ -84,8 +84,15 @@ public interface ProcessConf { /** * Get the CBP stream. * @return new stream to the CBP file. + * @deprecated use {@link #getCBPFile()} instead. */ InputStream getCBPInputStream(); + + /** + * Get the CBP file + * @return the CBP file + */ + File getCBPFile(); /** * Get the CBP file size. http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/JavaSerializationTest.java ---------------------------------------------------------------------- diff --git a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/JavaSerializationTest.java b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/JavaSerializationTest.java index a0c1126..eb4002d 100644 --- a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/JavaSerializationTest.java +++ b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler_2_0/JavaSerializationTest.java @@ -40,7 +40,7 @@ public class JavaSerializationTest extends GoodCompileTest{ serializer.serialize(new FileOutputStream(cbpPath), origi, format); - DeSerializer deserializer = new DeSerializer(new FileInputStream(cbpPath)); + DeSerializer deserializer = new DeSerializer(new File(cbpPath)); OProcess desered = deserializer.deserialize(); DeepEqualityHelper de = new DeepEqualityHelper(); http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/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 c9e4094..970a351 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 @@ -3,20 +3,16 @@ 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.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.migrate.DeepEqualityHelper; 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.OmUpgradeVisitor; import org.apache.ode.bpel.obj.migrate.UpgradeChecker; import org.apache.ode.bpel.obj.serde.DeSerializer; import org.junit.Assert; @@ -42,8 +38,7 @@ public class MigrationTest extends GoodCompileTest{ OProcess nu = _compiler.compile2OProcess(bpelFile, 0); __log.debug("compiled new OProcess " + nu.getFieldContainer()); - DeSerializer deSerializer = new DeSerializer(new FileInputStream(oldCbpFile)); - deSerializer.setWriteBackFile(oldCbpFile); //writeback newest + DeSerializer deSerializer = new DeSerializer(oldCbpFile); OProcess migrated = deSerializer.deserialize(); __log.debug("Read and migrated old OProcess " + migrated.getFieldContainer()); http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/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 cdea0d5..300ca12 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 @@ -4,6 +4,7 @@ import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; @@ -33,17 +34,31 @@ import org.apache.ode.bpel.obj.serde.OmSerdeFactory.SerializeFormat; * @see OmSerdeFactory */ public class DeSerializer { - private static final Log __log = LogFactory.getLog(DeSerializer.class); + private static final Log __log = LogFactory.getLog(DeSerializer.class); - private OProcessWrapper wrapper = new OProcessWrapper(); + private OProcessWrapper wrapper = new OProcessWrapper(); private InputStream is; private File writeBackFile; + private File cbpFile; - public DeSerializer(InputStream is) { + /** + * Constructor to create deserializer to deserialize from file. + * @param cbpFile the serialized compiled cbp file + * @throws FileNotFoundException + */ + public DeSerializer(File cbpFile) throws FileNotFoundException { + this(new FileInputStream(cbpFile)); + this.cbpFile = cbpFile; + } + + DeSerializer(InputStream is) { this.is = new BufferedInputStream(is); deserializeHeader(); } + /** + * Constructor to create serializer. + */ public DeSerializer() { } @@ -58,10 +73,11 @@ public class DeSerializer { wrapper.setFormat(format); serialize(out); } - private void serialize(OutputStream out){ + + private void serialize(OutputStream out) { try { - DataOutputStream dos = new DataOutputStream(out); - dos.write(wrapper.getMagic()); + DataOutputStream dos = new DataOutputStream(out); + dos.write(wrapper.getMagic()); ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(wrapper.getFormat()); oos.writeLong(wrapper.getCompileTime()); @@ -83,21 +99,22 @@ public class DeSerializer { private void deserializeHeader() { try { - DataInputStream oin = new DataInputStream(is); - oin.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)){ - oin.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); + DataInputStream oin = new DataInputStream(is); + oin.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)) { + oin.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()); @@ -106,8 +123,13 @@ public class DeSerializer { wrapper.setType((QName) ois.readObject()); wrapper.setOtherHeaders((Map<String, Object>) (ois.readObject())); wrapper.checkValid(); - } + } } catch (Exception e1) { + try { + is.close(); + } catch (IOException e2) { + e2.printStackTrace(); + } SerializaionRtException e = new SerializaionRtException( "Error when reading Headers during deseriazation"); e.initCause(e1); @@ -115,11 +137,28 @@ public class DeSerializer { } } + /** + * Deserialize the compiled <code>OProcess</code>. + * @return The deserialized OProcess + */ public OProcess deserialize() { OmSerdeFactory factory = new OmSerdeFactory(); factory.setFormat(wrapper.getFormat()); - OmDeserializer de = factory.createOmDeserializer(is); - OProcess process = de.deserialize(); + OProcess process = null; + try { + OmDeserializer de = factory.createOmDeserializer(is); + process = de.deserialize(); + } finally { + if (cbpFile != null) { + //this means that <code>is</code> is constructed from cbpFile, + // and we are reaponsible to close it. + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } wrapper.setProcess(process); //upgrade UpgradeChecker checker = new UpgradeChecker(); @@ -131,30 +170,48 @@ public class DeSerializer { traverser = new ObjectTraverser(); traverser.accept(upgrader); traverser.traverseObject(process); - if (writeBackFile != null){ - writeBack(); - } + writeBack(); } return process; } private void writeBack() { + if (writeBackFile == null && cbpFile == null) { + // we dont kown where to writeback; + return; + } + if (writeBackFile == null) { + // write back to original cbp file; + writeBackFile = cbpFile; + } 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")); + 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 = null; + if (writeBackFile.exists()) { + if (writeBackFile.renameTo(new File(writeBackFile.getAbsolutePath() + + ".bak"))) { + try { + wbStream = new FileOutputStream(writeBackFile); + serialize(wbStream); + } catch (FileNotFoundException e) { + __log.info("Error when write back upgraded process. file not found"); + } finally { + if (wbStream != null) { + try { + wbStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } else { + __log.debug("backup file failed. skip writing back upgraded file"); } - wbStream = new FileOutputStream(writeBackFile); - serialize(wbStream); - } catch (FileNotFoundException e) { - __log.info("Error when write back upgraded process. file not found"); } } http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java ---------------------------------------------------------------------- diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java index 77ed24e..817201a 100644 --- a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java +++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java @@ -18,6 +18,7 @@ */ package org.apache.ode.bpel.engine; +import java.io.File; import java.io.InputStream; import java.net.URI; import java.util.ArrayList; @@ -65,10 +66,7 @@ import org.apache.ode.bpel.obj.OExpressionLanguage; import org.apache.ode.bpel.obj.OMessageVarType; import org.apache.ode.bpel.obj.OPartnerLink; import org.apache.ode.bpel.obj.OProcess; -import org.apache.ode.bpel.obj.OProcessWrapper; import org.apache.ode.bpel.obj.serde.DeSerializer; -import org.apache.ode.bpel.obj.serde.OmDeserializer; -import org.apache.ode.bpel.obj.serde.OmSerdeFactory; import org.apache.ode.bpel.runtime.BpelRuntimeContext; import org.apache.ode.bpel.runtime.ExpressionLanguageRuntimeRegistry; import org.apache.ode.bpel.runtime.InvalidProcessException; @@ -563,9 +561,9 @@ public class BpelProcess { * input stream * @return process information from configuration database */ - private OProcess deserializeCompiledProcess(InputStream is) throws Exception { + private OProcess deserializeCompiledProcess(File file) throws Exception { OProcess compiledProcess; - DeSerializer deserializer = new DeSerializer(is); + DeSerializer deserializer = new DeSerializer(file); compiledProcess = deserializer.deserialize(); return compiledProcess; } @@ -878,12 +876,8 @@ public class BpelProcess { __log.debug("Rehydrating process " + _pconf.getProcessId()); } try { - InputStream inputStream = _pconf.getCBPInputStream(); - try { - _oprocess = deserializeCompiledProcess(inputStream); - } finally { - inputStream.close(); - } + File file = _pconf.getCBPFile(); + _oprocess = deserializeCompiledProcess(file); } catch (Exception e) { String errmsg = "The process " + _pid + " is no longer available."; __log.error(errmsg, e); http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/bpel-store/src/main/java/org/apache/ode/store/DeploymentUnitDir.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/DeploymentUnitDir.java b/bpel-store/src/main/java/org/apache/ode/store/DeploymentUnitDir.java index 213c7de..3c5e577 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/DeploymentUnitDir.java +++ b/bpel-store/src/main/java/org/apache/ode/store/DeploymentUnitDir.java @@ -218,8 +218,7 @@ class DeploymentUnitDir { private CBPInfo loadCBPInfo(File f) { InputStream is = null; try { - is = new FileInputStream(f); - DeSerializer deserializer = new DeSerializer(is); + DeSerializer deserializer = new DeSerializer(f); CBPInfo info = new CBPInfo(deserializer.getWrapper().getType(),deserializer.getWrapper().getGuid(), f); return info; } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java b/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java index d78601f..cf556c6 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java +++ b/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java @@ -269,6 +269,14 @@ public class ProcessConfImpl implements ProcessConf { throw new ContextException("File Not Found: " + cbpInfo.cbp, e); } } + + @Override + public File getCBPFile(){ + CBPInfo cbpInfo = _du.getCBPInfo(getType()); + if (cbpInfo == null) + throw new ContextException("CBP record not found for type " + getType()); + return cbpInfo.cbp; + } public long getCBPFileSize() { CBPInfo cbpInfo = _du.getCBPInfo(getType()); http://git-wip-us.apache.org/repos/asf/ode/blob/f23e68ed/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java ---------------------------------------------------------------------- diff --git a/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java b/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java index f633a43..c8fed8d 100644 --- a/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java +++ b/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java @@ -18,7 +18,7 @@ */ package org.apache.ode.jbi; -import java.io.InputStream; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -48,10 +48,7 @@ import org.apache.ode.bpel.iapi.EndpointReference; import org.apache.ode.bpel.iapi.ProcessConf; import org.apache.ode.bpel.obj.OPartnerLink; import org.apache.ode.bpel.obj.OProcess; -import org.apache.ode.bpel.obj.OProcessWrapper; import org.apache.ode.bpel.obj.serde.DeSerializer; -import org.apache.ode.bpel.obj.serde.OmDeserializer; -import org.apache.ode.bpel.obj.serde.OmSerdeFactory; import org.apache.ode.bpel.pmapi.InstanceManagement; import org.apache.ode.bpel.pmapi.ProcessManagement; import org.apache.ode.jbi.msgmap.Mapper; @@ -198,14 +195,11 @@ final public class OdeContext { service = new OdeService(this, endpoint); try { ProcessConf pc = _store.getProcessConfiguration(pid); - InputStream is = pc.getCBPInputStream(); + File cbpFile = pc.getCBPFile(); OProcess compiledProcess = null; - try { - DeSerializer deserializer = new DeSerializer(is); - compiledProcess = deserializer.deserialize(); - } finally { - is.close(); - } + DeSerializer deserializer = new DeSerializer(cbpFile); + compiledProcess = deserializer.deserialize(); + QName portType = null; for (Map.Entry<String, Endpoint> provide : pc.getProvideEndpoints().entrySet()) { if (provide.getValue().equals(endpoint)) {
