You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2008/09/10 21:07:05 UTC

svn commit: r693931 [12/12] - in /ode/trunk: bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/ bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/xpath10/ bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/xpath20/ runtimes...

Added: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java?rev=693931&view=auto
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java (added)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XPath20ExpressionRuntime.java Wed Sep 10 12:06:59 2008
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ode.bpel.rtrep.v1.xpath20;
+
+import net.sf.saxon.trans.DynamicError;
+import net.sf.saxon.value.DurationValue;
+import net.sf.saxon.xpath.XPathEvaluator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.common.FaultException;
+import org.apache.ode.bpel.rtrep.v1.OExpression;
+import org.apache.ode.bpel.rtrep.v1.EvaluationContext;
+import org.apache.ode.bpel.rtrep.v1.ExpressionLanguageRuntime;
+import org.apache.ode.bpel.rtrep.v1.xpath10.OXPath10Expression;
+import org.apache.ode.bpel.rtrep.common.ConfigurationException;
+import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.ISO8601DateParser;
+import org.apache.ode.utils.xsd.Duration;
+import org.apache.ode.utils.xsl.XslTransformHandler;
+import org.w3c.dom.*;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import java.util.*;
+
+/**
+ * XPath 2.0 Expression Language run-time subsytem.
+ * Saxon implementation.
+ */
+public class XPath20ExpressionRuntime implements ExpressionLanguageRuntime {
+
+    static final short NODE_TYPE = 1;
+    static final short NODESET_TYPE = 2;
+    static final short STRING_TYPE = 3;
+    static final short BOOLEAN_TYPE = 4;
+    static final short NUMBER_TYPE = 5;
+
+    /** Class-level logger. */
+    private static final Log __log = LogFactory.getLog(XPath20ExpressionRuntime.class);
+
+    public XPath20ExpressionRuntime(){
+    }
+
+    public void initialize(Map properties) throws ConfigurationException {
+        TransformerFactory trsf = new net.sf.saxon.TransformerFactoryImpl();
+        XslTransformHandler.getInstance().setTransformerFactory(trsf);
+    }
+
+    /**
+     * @see org.apache.ode.bpel.explang.ExpressionLanguageRuntime#evaluateAsString(org.apache.ode.bpel.rtrep.v1.OExpression, org.apache.ode.bpel.explang.EvaluationContext)
+     */
+    public String evaluateAsString(OExpression cexp, EvaluationContext ctx) throws FaultException {
+        return (String)evaluate(cexp, ctx, XPathConstants.STRING);
+    }
+
+    /**
+     * @see org.apache.ode.bpel.explang.ExpressionLanguageRuntime#evaluateAsBoolean(org.apache.ode.bpel.rtrep.v1.OExpression, org.apache.ode.bpel.explang.EvaluationContext)
+     */
+    public boolean evaluateAsBoolean(OExpression cexp, EvaluationContext ctx) throws FaultException {
+        return (Boolean) evaluate(cexp, ctx, XPathConstants.BOOLEAN);
+    }
+
+    public Number evaluateAsNumber(OExpression cexp, EvaluationContext ctx) throws FaultException {
+        return (Number) evaluate(cexp, ctx, XPathConstants.NUMBER);
+    }
+
+    /**
+     * @see org.apache.ode.bpel.explang.ExpressionLanguageRuntime#evaluate(org.apache.ode.bpel.rtrep.v1.OExpression, org.apache.ode.bpel.explang.EvaluationContext)
+     */
+    public List evaluate(OExpression cexp, EvaluationContext ctx) throws FaultException {
+        List result;
+        Object someRes = evaluate(cexp, ctx, XPathConstants.NODESET);
+        if (someRes instanceof List) {
+            result = (List) someRes;
+            __log.debug("Returned list of size " + result.size());
+            if ((result.size() == 1) && !(result.get(0) instanceof Node)) {
+                // Dealing with a Java class
+                Object simpleType = result.get(0);
+                // Dates get a separate treatment as we don't want to call toString on them
+                String textVal;
+                if (simpleType instanceof Date)
+                    textVal = ISO8601DateParser.format((Date) simpleType);
+                else if (simpleType instanceof DurationValue)
+                    textVal = ((DurationValue)simpleType).getStringValue();
+                else
+                    textVal = simpleType.toString();
+
+                // Wrapping in a document
+                Document d = DOMUtils.newDocument();
+                // Giving our node a parent just in case it's an LValue expression
+                Element wrapper = d.createElement("wrapper");
+                Text text = d.createTextNode(textVal);
+                wrapper.appendChild(text);
+                d.appendChild(wrapper);
+                result = Collections.singletonList(text);
+            }
+        } else if (someRes instanceof NodeList) {
+            NodeList retVal = (NodeList) someRes;
+            __log.debug("Returned node list of size " + retVal.getLength());
+            result = new ArrayList(retVal.getLength());
+            for(int m = 0; m < retVal.getLength(); ++m) {
+                Node val = retVal.item(m);
+                if (val.getNodeType() == Node.DOCUMENT_NODE) val = ((Document)val).getDocumentElement();
+                result.add(val);
+            }
+        } else {
+            result = null;
+        }
+
+        return result;
+    }
+
+    public Node evaluateNode(OExpression cexp, EvaluationContext ctx) throws FaultException {
+        List retVal = evaluate(cexp, ctx);
+        if (retVal.size() == 0)
+            throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, "No results for expression: " + cexp);
+        if (retVal.size() > 1)
+            throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, "Multiple results for expression: " + cexp);
+        return (Node) retVal.get(0);
+    }
+
+    public Calendar evaluateAsDate(OExpression cexp, EvaluationContext context) throws FaultException {
+        List literal = DOMUtils.toList(evaluate(cexp, context, XPathConstants.NODESET));
+        if (literal.size() == 0)
+            throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, "No results for expression: " + cexp);
+        if (literal.size() > 1)
+            throw new FaultException(cexp.getOwner().constants.qnSelectionFailure, "Multiple results for expression: " + cexp);
+
+        Object date =literal.get(0);
+        if (date instanceof Calendar) return (Calendar) date;
+        if (date instanceof Date) {
+            Calendar cal = Calendar.getInstance();
+            cal.setTime((Date) date);
+            return cal;
+        }
+        if (date instanceof Element) date = ((Element)date).getTextContent();
+
+        try {
+            return ISO8601DateParser.parseCal(date.toString());
+        } catch (Exception ex) {
+            String errmsg = "Invalid date: " + literal;
+            __log.error(errmsg, ex);
+            throw new FaultException(cexp.getOwner().constants.qnInvalidExpressionValue,errmsg);
+        }
+    }
+
+    public Duration evaluateAsDuration(OExpression cexp, EvaluationContext context) throws FaultException {
+        String literal = this.evaluateAsString(cexp, context);
+        try {
+            return new Duration(literal);
+        } catch (Exception ex) {
+            String errmsg = "Invalid duration: " + literal;
+            __log.error(errmsg, ex);
+            throw new FaultException(cexp.getOwner().constants.qnInvalidExpressionValue,errmsg);
+        }
+    }
+
+    private Object evaluate(OExpression cexp, EvaluationContext ctx, QName type) throws FaultException {
+        try {
+            net.sf.saxon.xpath.XPathFactoryImpl xpf = new net.sf.saxon.xpath.XPathFactoryImpl();
+
+            OXPath20ExpressionBPEL20 oxpath20 = ((OXPath20ExpressionBPEL20) cexp);
+            xpf.setXPathFunctionResolver(new JaxpFunctionResolver(ctx, oxpath20));
+            xpf.setXPathVariableResolver(new JaxpVariableResolver(ctx, oxpath20));
+            XPathEvaluator xpe = (XPathEvaluator) xpf.newXPath();
+            xpe.setNamespaceContext(oxpath20.namespaceCtx);
+            // Just checking that the expression is valid
+            XPathExpression expr = xpe.compile(((OXPath10Expression)cexp).xpath);
+
+            Object evalResult = expr.evaluate(ctx.getRootNode() == null ? DOMUtils.newDocument() : ctx.getRootNode(), type);
+            if (evalResult != null && __log.isDebugEnabled()) {
+                __log.debug("Expression " + cexp.toString() + " generated result " + evalResult
+                        + " - type=" + evalResult.getClass().getName());
+                if (ctx.getRootNode() != null)
+                    __log.debug("Was using context node " + DOMUtils.domToString(ctx.getRootNode()));
+            }
+            return evalResult;
+        } catch (XPathExpressionException e) {
+            // Extracting the real cause from all this wrapping isn't a simple task
+            Throwable cause = e.getCause() != null ? e.getCause() : e;
+            if (cause instanceof DynamicError) {
+                Throwable th = ((DynamicError)cause).getException();
+                if (th != null) {
+                    cause = th;
+                    if (cause.getCause() != null) cause = cause.getCause();
+                }
+            }
+            throw new FaultException(cexp.getOwner().constants.qnSubLanguageExecutionFault, cause.getMessage(), cause);
+        } catch (WrappedFaultException wre) {
+            __log.debug("Could not evaluate expression because of ", wre);
+            throw (FaultException)wre.getCause();
+        } catch (Throwable t) {
+            __log.debug("Could not evaluate expression because of ", t);
+            throw new FaultException(cexp.getOwner().constants.qnSubLanguageExecutionFault, t.getMessage(), t);
+        }
+
+    }
+
+}

Added: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XslRuntimeUriResolver.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XslRuntimeUriResolver.java?rev=693931&view=auto
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XslRuntimeUriResolver.java (added)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/xpath20/XslRuntimeUriResolver.java Wed Sep 10 12:06:59 2008
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ode.bpel.rtrep.v1.xpath20;
+
+import org.apache.ode.bpel.rtrep.v1.OXslSheet;
+import org.apache.ode.bpel.rtrep.v1.xpath10.OXPath10Expression;
+import org.apache.ode.utils.StreamUtils;
+import org.apache.ode.utils.fs.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.stream.StreamSource;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+
+/**
+ * Used to give the Xsl processor a way to access included XSL sheets
+ * by using the maps of sheets pre-processed at compilation time and
+ * stored in the OXPath10Expression.
+ */
+public class XslRuntimeUriResolver implements URIResolver {
+
+    private static final Log __log = LogFactory.getLog(XslRuntimeUriResolver.class);
+
+    private OXPath10Expression _expr;
+    private final URI _baseResourceURI;
+
+    public XslRuntimeUriResolver(OXPath10Expression expr, URI baseResourceURI) {
+        _expr = expr;
+        _baseResourceURI= baseResourceURI;
+    }
+
+    public Source resolve(String href, String base) throws TransformerException {
+        String result;
+        URI uri;
+        try {
+            uri = new URI(FileUtils.encodePath(href));
+        } catch (URISyntaxException e) {
+            return null;
+        }
+
+        OXslSheet sheet = _expr.xslSheets.get(uri);
+        if( sheet != null) {
+            result = sheet.sheetBody;
+        } else {
+            result = getResourceAsString(uri);
+        }
+
+        if( result != null ) {
+            return new StreamSource(new StringReader(result));
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Given a URI this function will attempt to retrieve the resource declared at that URI location
+     * as a string.  (Hopefully everything's character encodings are all ok...)  This URI can be
+     * defined as being relative to the executing process instance's physical file location.
+     *
+     * @param docUri - the URI to resolve
+     * @return String - the resource contents, or null if none found.
+     */
+    private String getResourceAsString(URI docUri) {
+        URI resolvedURI= _baseResourceURI.resolve(docUri);
+        InputStream is = null;
+        try {
+            File f = new File(resolvedURI);
+            if (!f.exists()) return null;
+            is = new FileInputStream(f);
+            return new String(StreamUtils.read(is));
+        } catch (IOException e) {
+            __log.info("Couldn't load XSL resource " + docUri);
+        } finally {
+            try {
+                if (is != null) is.close();
+            } catch (Exception ex) {
+                // No worries.
+            }
+        }
+        return null;
+    }
+
+
+
+}

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ACTIVITYGUARD.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ACTIVITYGUARD.java?rev=693931&r1=693930&r2=693931&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ACTIVITYGUARD.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ACTIVITYGUARD.java Wed Sep 10 12:06:59 2008
@@ -128,8 +128,7 @@
 
     private boolean evaluateTransitionCondition(OExpression transitionCondition)
             throws FaultException {
-        if (transitionCondition == null)
-            return true;
+        if (transitionCondition == null) return true;
 
         return getBpelRuntime().getExpLangRuntime().evaluateAsBoolean(transitionCondition,
                 new ExprEvaluationContextImpl(_scopeFrame, getBpelRuntime()));

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ASSIGN.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ASSIGN.java?rev=693931&r1=693930&r2=693931&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ASSIGN.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ASSIGN.java Wed Sep 10 12:06:59 2008
@@ -199,9 +199,8 @@
                         + tempVal.getClass().getName() + " has value " + DOMUtils.domToString(tempVal));
             retVal = tempVal;
         } else if (from instanceof OAssign.Expression) {
-            List<Node> l;
             OExpression expr = ((OAssign.Expression) from).expression;
-            l = getBpelRuntime().getExpLangRuntime().evaluate(expr, getEvaluationContext());
+            List<Node> l = getBpelRuntime().getExpLangRuntime().evaluate(expr, getEvaluationContext());
 
             if (l.size() == 0) {
                 String msg = __msgs.msgRValueNoNodesSelected(expr.toString());

Added: ode/trunk/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v1/CoreBpelTest.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v1/CoreBpelTest.java?rev=693931&view=auto
==============================================================================
--- ode/trunk/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v1/CoreBpelTest.java (added)
+++ ode/trunk/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v1/CoreBpelTest.java Wed Sep 10 12:06:59 2008
@@ -0,0 +1,459 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ode.bpel.rtrep.v1;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.net.URI;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Collection;
+
+import javax.wsdl.Operation;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.ode.bpel.common.CorrelationKey;
+import org.apache.ode.bpel.common.FaultException;
+import org.apache.ode.bpel.evt.ScopeEvent;
+import org.apache.ode.bpel.evt.ProcessInstanceStartedEvent;
+import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
+import org.apache.ode.jacob.vpu.JacobVPU;
+import org.apache.ode.bpel.evar.ExternalVariableModuleException;
+import org.apache.ode.bpel.rapi.*;
+import org.apache.ode.bpel.rtrep.v1.channels.*;
+import org.apache.ode.bpel.extension.ExtensionOperation;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.junit.Assert;
+
+/**
+ * Test core BPEL processing capabilities.
+ */
+public class CoreBpelTest extends TestCase implements OdeInternalInstance {
+    private boolean _completedOk;
+
+    private boolean _terminate;
+
+    private FaultInfo _fault;
+
+    private ExecutionQueueImpl _soup;
+
+    private JacobVPU _vpu;
+
+    private Long _pid;
+
+    private long _seq;
+
+    protected void setUp() throws Exception {
+        _completedOk = false;
+        _terminate = false;
+        _fault = null;
+        _soup = new ExecutionQueueImpl(CoreBpelTest.class.getClassLoader());
+        _vpu = new JacobVPU(_soup);
+        _vpu.registerExtension(OdeRTInstanceContext.class, this);
+        _pid = (long) 19355;
+    }
+
+    public Long getPid() {
+        return _pid;
+    }
+
+    public Long createScopeInstance(Long parentScopeId, String scopename, int scopemodelid) {
+        return (long) (Math.random() * 1000L) + scopemodelid;
+    }
+
+    public void completedOk() {
+        _completedOk = true;
+    }
+
+    public void completedFault(FaultData faultData) {
+        _fault = faultData;
+    }
+
+    public void terminate() {
+        _terminate = true;
+    }
+
+    public boolean isCorrelationInitialized(CorrelationSetInstance correlationSet) {
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public String readProperty(VariableInstance variable, OProcess.OProperty property) throws FaultException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void writeCorrelation(CorrelationSetInstance cset, CorrelationKey ckeyVal) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Node initializeVariable(VariableInstance var, ScopeFrame scopeFrame, Node val) throws ExternalVariableModuleException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Long createScopeInstance(Long scopeInstanceId, OScope scopedef) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void initializePartnerLinks(Long parentScopeId, Collection<OPartnerLink> partnerLinks) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public String invoke(String invokeId, PartnerLinkInstance instance, Operation operation, Element outboundMsg, Object object) throws FaultException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void registerTimer(TimerResponseChannel timerChannel, Date future) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void select(PickResponseChannel pickResponseChannel, Date timeout, boolean createInstance, Selector[] selectors) throws FaultException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public CorrelationKey readCorrelation(CorrelationSetInstance cset) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ExpressionLanguageRuntimeRegistry getExpLangRuntime() {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void cancel(PickResponseChannel responseChannel) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void commitChanges(VariableInstance var, ScopeFrame scopeFrame, Node value) throws ExternalVariableModuleException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Node fetchVariableData(VariableInstance var, ScopeFrame scopeFrame, OMessageVarType.Part part, boolean forWriting) throws FaultException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void sendEvent(ScopeEvent event) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void sendEvent(ProcessInstanceStartedEvent evt) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public boolean isVariableInitialized(VariableInstance var) {
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Node fetchVariableData(VariableInstance variable, ScopeFrame scopeFrame, boolean forWriting) throws FaultException {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void reply(PartnerLinkInstance plink, String opName, String bpelmex, Element element, QName fault) throws FaultException {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void testEmptyProcess() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        proc.procesScope.activity = new OEmpty(proc, proc.procesScope);
+
+        run(proc);
+
+        Assert.assertTrue(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertNull(_fault);
+    }
+
+    public void testThrow() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        OThrow othrow = new OThrow(proc, proc.procesScope);
+        othrow.faultName = new QName("foo", "bar");
+        proc.procesScope.activity = othrow;
+
+        run(proc);
+
+        Assert.assertFalse(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertEquals(_fault.getFaultName(), othrow.faultName);
+    }
+
+    public void testFaultHandling() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        OThrow othrow = new OThrow(proc, proc.procesScope);
+        othrow.faultName = new QName("foo", "bar");
+        proc.procesScope.activity = othrow;
+        proc.procesScope.faultHandler = new OFaultHandler(proc);
+        OCatch ocatch = new OCatch(proc, proc.procesScope);
+        proc.procesScope.faultHandler.catchBlocks.add(ocatch);
+        ocatch.activity = new OEmpty(proc, ocatch);
+        run(proc);
+
+        Assert.assertTrue(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertNull(_fault);
+    }
+
+    public void testOneElementSequence() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        OSequence sequence = new OSequence(proc, proc.procesScope);
+        proc.procesScope.activity = sequence;
+        sequence.sequence.add(new OEmpty(proc, sequence));
+
+        run(proc);
+
+        Assert.assertTrue(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertNull(_fault);
+    }
+
+    public void testTwoElementSequence() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        OSequence sequence = new OSequence(proc, proc.procesScope);
+        proc.procesScope.activity = sequence;
+        sequence.sequence.add(new OEmpty(proc, sequence));
+        sequence.sequence.add(new OEmpty(proc, sequence));
+
+        run(proc);
+
+        Assert.assertTrue(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertNull(_fault);
+    }
+
+    public void testEmptyFlow() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        proc.procesScope.activity = new OFlow(proc, proc.procesScope);
+
+        run(proc);
+
+        Assert.assertTrue(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertNull(_fault);
+    }
+
+    public void testSingleElementFlow() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        OFlow flow = new OFlow(proc, proc.procesScope);
+        proc.procesScope.activity = flow;
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+
+        run(proc);
+
+        Assert.assertTrue(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertNull(_fault);
+    }
+
+    public void testTwoElementFlow() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        OFlow flow = new OFlow(proc, proc.procesScope);
+        proc.procesScope.activity = flow;
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+
+        run(proc);
+
+        Assert.assertTrue(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertNull(_fault);
+    }
+
+    public void testFlowTermination() {
+        OProcess proc = new OProcess("2.0");
+        proc.procesScope = new OScope(proc, null);
+        OFlow flow = new OFlow(proc, proc.procesScope);
+        proc.procesScope.activity = flow;
+        OThrow othrow = new OThrow(proc, flow);
+        othrow.faultName = new QName("foo", "bar");
+        flow.parallelActivities.add(othrow);
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+        flow.parallelActivities.add(new OEmpty(proc, flow));
+
+        run(proc);
+
+        Assert.assertFalse(_completedOk);
+        Assert.assertFalse(_terminate);
+        Assert.assertEquals(_fault.getFaultName(), othrow.faultName);
+    }
+
+    private void run(OProcess proc) {
+        _vpu.inject(new PROCESS(proc));
+        for (int i = 0; i < 100000 && !_completedOk && _fault == null && !_terminate; ++i) {
+            _vpu.execute();
+        }
+
+        Assert.assertTrue(_soup.isComplete());
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+        try {
+            _soup.write(bos);
+            _soup.read(new ByteArrayInputStream(bos.toByteArray()));
+            // check empty soup.
+        } catch (Exception ex) {
+
+        }
+    }
+
+    public long genId() {
+        return _seq++;
+    }
+
+    public Element getPartnerResponse(String mexId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Element getMyRequest(String mexId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public QName getPartnerFault(String mexId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public QName getPartnerResponseType(String mexId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Node convertEndpointReference(Element epr, Node targetNode) {
+        return null;
+    }
+
+    public Node getPartData(Element message, OMessageVarType.Part part) {
+        return null;
+    }
+
+    public Element getSourceEPR(String mexId) {
+        return null;
+    }
+
+    public void writeEndpointReference(PartnerLinkInstance variable, Element data) {
+    }
+
+    public Element fetchMyRoleEndpointReferenceData(PartnerLinkInstance pLink) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Element fetchPartnerRoleEndpointReferenceData(PartnerLinkInstance pLink) throws FaultException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public boolean isPartnerRoleEndpointInitialized(PartnerLinkInstance pLink) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public String fetchMySessionId(PartnerLinkInstance pLink) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public String fetchPartnersSessionId(PartnerLinkInstance pLink) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void initializePartnersSessionId(PartnerLinkInstance pLink, String session) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public String getSourceSessionId(String mexId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void registerActivityForRecovery(ActivityRecoveryChannel channel, long activityId, String reason,
+                                            Date dateTime, Element data, String[] actions, int retries) {
+    }
+
+    public void unregisterActivityForRecovery(ActivityRecoveryChannel channel) {
+    }
+
+    public void recoverActivity(String channel, long activityId, String action, FaultData fault) {
+    }
+
+    public String getPartnerFaultExplanation(String mexid) {
+      return null;
+    }
+
+    public void releasePartnerMex(String mexId) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void forceFlush() {
+        // TODO Auto-generated method stub
+
+    }
+
+	public ExtensionOperation createExtensionActivityImplementation(QName name) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+    public void initializeExternalVariable(VariableInstance instance, HashMap<String, String> keymap) {
+        // TODO Auto-generated method stub
+
+    }
+
+	public Node readExtVar(OScope.Variable variable, Node reference) throws ExternalVariableModuleException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public Node readVariable(Long scopeInstanceId, String varname, boolean forWriting) throws FaultException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public VariableContext.ValueReferencePair writeExtVar(OScope.Variable variable, Node reference, Node value)
+            throws ExternalVariableModuleException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public Node writeVariable(VariableInstance var, Node changes) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public URI getBaseResourceURI() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
\ No newline at end of file