You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by va...@apache.org on 2007/11/28 20:16:44 UTC

svn commit: r599101 - in /ode/trunk: bpel-api/src/main/java/org/apache/ode/bpel/eapi/ bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/ bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ bpel-obj/src/main/java/org/apache/ode/bpel/o/ ...

Author: vanto
Date: Wed Nov 28 11:16:43 2007
New Revision: 599101

URL: http://svn.apache.org/viewvc?rev=599101&view=rev
Log:
clean up and refactoring of the extension activity module.
base class for asynchronous extension activities added.

Added:
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractAsyncExtensionOperation.java
      - copied, changed from r599070, ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractExtensionOperation.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractSyncExtensionOperation.java
Removed:
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/eapi/
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/channels/ExtensionResponse.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractExtensionOperation.java
Modified:
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
    ode/trunk/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EXTENSIONACTIVITY.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ExtensionContextImpl.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionContext.java
    ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionOperation.java
    ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/CoreBpelTest.java
    ode/trunk/bpel-test/src/main/java/org/apache/ode/test/MockExtensionContext.java
    ode/trunk/bpel-test/src/test/java/org/apache/ode/test/ExtensibilityTest.java
    ode/trunk/extensions/README.extensions
    ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java
    ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java Wed Nov 28 11:16:43 2007
@@ -1523,8 +1523,11 @@
         
         oextension.debugInfo = createDebugInfo(_processDef, "Extension " + ext.getNamespaceURI());
 
-        _oprocess.declaredExtensions.add(oextension);
         _declaredExtensionNS.add(ext.getNamespaceURI());
+        _oprocess.declaredExtensions.add(oextension);
+        if (ext.isMustUnderstand()) {
+        	_oprocess.mustUnderstandExtensions.add(oextension);
+        }
 
         if (__log.isDebugEnabled())
             __log.debug("Compiled extension " + oextension);

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java Wed Nov 28 11:16:43 2007
@@ -31,5 +31,7 @@
     public static final QName FAILURE_HANDLING_RETRY_DELAY  = new QName(NS_ACTIVITY_RECOVERY, "retryDelay");
     public static final QName FAILURE_HANDLING_FAULT_ON     = new QName(NS_ACTIVITY_RECOVERY, "faultOnFailure");
 
+    public static final String NS_BPEL_EXTENSIBILITY = "http://ode.apache.org/bpelExtensibility";
+    public static final QName UNKNOWN_EA_FAULT_NAME  = new QName(NS_BPEL_EXTENSIBILITY, "unknownExtensionImplementation");
 }
 

Modified: ode/trunk/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java (original)
+++ ode/trunk/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java Wed Nov 28 11:16:43 2007
@@ -61,6 +61,8 @@
     /** All declared extensions in the process. **/
     public final Set<OExtension> declaredExtensions = new HashSet<OExtension>();
 
+    /** All must-understand extensions in the process. **/
+    public final Set<OExtension> mustUnderstandExtensions = new HashSet<OExtension>();
 
     /** Date process was compiled. */
     public Date compileDate;

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java Wed Nov 28 11:16:43 2007
@@ -124,8 +124,6 @@
 
     ExpressionLanguageRuntimeRegistry _expLangRuntimeRegistry;
     
-    Set<String> _mustUnderstandExtensions;
-
     private ReplacementMap _replacementMap;
 
     final ProcessConf _pconf;
@@ -1153,7 +1151,6 @@
             _endpointToMyRoleMap = null;
             _replacementMap = null;
             _expLangRuntimeRegistry = null;
-            _mustUnderstandExtensions = null;
         }
 
         private void doHydrate() {
@@ -1184,15 +1181,12 @@
 
             // Checking for registered extension bundles, throw an exception when
             // a "mustUnderstand" extension is not available
-            _mustUnderstandExtensions = new HashSet<String>();
-            for (OProcess.OExtension extension : _oprocess.declaredExtensions) {
+            for (OProcess.OExtension extension : _oprocess.mustUnderstandExtensions) {
             	if (extension.mustUnderstand) {
             		if (_contexts.extensionRegistry.get(extension.namespaceURI) == null) {
             			String msg = __msgs.msgExtensionMustUnderstandError(_pid, extension.namespaceURI);
             			__log.error(msg);
             			throw new BpelEngineException(msg);
-            		} else {
-            			_mustUnderstandExtensions.add(extension.namespaceURI);
             		}
             	} else {
         			__log.warn("The process declares the extension namespace " + extension.namespaceURI + " that is unkown to the engine");

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java Wed Nov 28 11:16:43 2007
@@ -74,13 +74,11 @@
 import org.apache.ode.bpel.runtime.Selector;
 import org.apache.ode.bpel.runtime.VariableInstance;
 import org.apache.ode.bpel.runtime.channels.ActivityRecoveryChannel;
-import org.apache.ode.bpel.runtime.channels.ExtensionResponseChannel;
 import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.channels.InvokeResponseChannel;
 import org.apache.ode.bpel.runtime.channels.PickResponseChannel;
 import org.apache.ode.bpel.runtime.channels.TimerResponseChannel;
 import org.apache.ode.bpel.runtime.extension.AbstractExtensionBundle;
-import org.apache.ode.bpel.runtime.extension.ExtensionContext;
 import org.apache.ode.bpel.runtime.extension.ExtensionOperation;
 import org.apache.ode.jacob.JacobRunnable;
 import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
@@ -1204,52 +1202,7 @@
         _forceFlush = true;
     }
     
-	public void executeExtension(QName extensionId, ExtensionContext context, Element element, ExtensionResponseChannel extResponseChannel) throws FaultException {
-		__log.debug("Execute extension activity");
-		final String channelId = extResponseChannel.export();
-		ExtensionOperation ea = createExtensionActivityImplementation(extensionId);
-		if (ea == null) {
-			if (_bpelProcess._mustUnderstandExtensions.contains(extensionId.getNamespaceURI())) {
-				//TODO
-				__log.warn("Lookup of extension activity " + extensionId + " failed.");
-				throw new FaultException(new QName("urn:bpel20", "extlookup-failed"), "Lookup of extension activity " + extensionId + " failed.");
-			} else {
-				// act like <empty> - do nothing
-				completeExtensionExecution(channelId, null);
-				return;
-			}
-		}
-		
-		try {
-			ea.run(context, element);
-			completeExtensionExecution(channelId, null);
-		} catch (RuntimeException e) {
-			__log.error("Error during execution of extension activity.", e);
-			completeExtensionExecution(channelId, e);
-		} 
-	}
-
-	private void completeExtensionExecution(final String channelId, final Throwable t) {
-		if (t != null) {
-	        _vpu.inject(new BpelJacobRunnable() {
-	            private static final long serialVersionUID = -1L;
-
-	            public void run() {
-	               importChannel(channelId, ExtensionResponseChannel.class).onFailure(t);
-	            }
-	        });
-		} else {
-	        _vpu.inject(new BpelJacobRunnable() {
-	            private static final long serialVersionUID = -1L;
-
-	            public void run() {
-	               importChannel(channelId, ExtensionResponseChannel.class).onCompleted();
-	            }
-	        });
-		}
-	}
-
-	private ExtensionOperation createExtensionActivityImplementation(QName name) {
+	public ExtensionOperation createExtensionActivityImplementation(QName name) {
 		if (name == null) {
 			return null;
 		}

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java Wed Nov 28 11:16:43 2007
@@ -18,8 +18,6 @@
  */
 package org.apache.ode.bpel.runtime;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.List;
 
 import javax.xml.namespace.QName;
@@ -27,7 +25,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.common.FaultException;
-import org.apache.ode.bpel.compiler.bom.Bpel20QNames;
+import org.apache.ode.bpel.compiler.bom.ExtensibilityQNames;
 import org.apache.ode.bpel.evt.PartnerLinkModificationEvent;
 import org.apache.ode.bpel.evt.ScopeEvent;
 import org.apache.ode.bpel.evt.VariableModificationEvent;
@@ -45,10 +43,9 @@
 import org.apache.ode.bpel.o.OMessageVarType.Part;
 import org.apache.ode.bpel.o.OProcess.OProperty;
 import org.apache.ode.bpel.o.OScope.Variable;
-import org.apache.ode.bpel.runtime.channels.ExtensionResponseChannel;
-import org.apache.ode.bpel.runtime.channels.ExtensionResponseChannelListener;
 import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.extension.ExtensionContext;
+import org.apache.ode.bpel.runtime.extension.ExtensionOperation;
 import org.apache.ode.utils.DOMUtils;
 import org.apache.ode.utils.Namespaces;
 import org.apache.ode.utils.msg.MessageBundle;
@@ -581,31 +578,25 @@
     }
 
     private void invokeExtensionAssignOperation(OAssign.ExtensionAssignOperation eao) throws FaultException {
+    	final ExtensionContext context = new ExtensionContextImpl(_self, _scopeFrame, getBpelRuntimeContext());
+    	final QName extensionId = DOMUtils.getElementQName(eao.nestedElement.getElement());
     	try {
-	    	final ExtensionContext helper = new ExtensionContextImpl(_self.o, _scopeFrame, getBpelRuntimeContext());
-	    	final ExtensionResponseChannel responseChannel = newChannel(ExtensionResponseChannel.class);
-
-    		getBpelRuntimeContext().executeExtension(DOMUtils.getElementQName(eao.nestedElement.getElement()), helper, eao.nestedElement.getElement(), responseChannel);
-
-    		object(new ExtensionResponseChannelListener(responseChannel) {
-				private static final long serialVersionUID = 1L;
-
-				public void onCompleted() {
-					_self.parent.completed(null, CompensationHandler.emptySet());
-            	}
-            	
-            	public void onFailure(Throwable t) {
-            		StringWriter sw = new StringWriter();
-            		t.printStackTrace(new PrintWriter(sw));
-            		FaultData fault = createFault(new QName(Bpel20QNames.NS_WSBPEL2_0, "subLanguageExecutionFault"), _self.o, sw.getBuffer().toString());
-                    _self.parent.completed(fault, CompensationHandler.emptySet());
-            	};
-            });
+    		ExtensionOperation ea = getBpelRuntimeContext().createExtensionActivityImplementation(extensionId);
+    		if (ea == null) {
+    			if (eao.getOwner().mustUnderstandExtensions.contains(extensionId.getNamespaceURI())) {
+    				__log.warn("Lookup of extension activity " + extensionId + " failed.");
+    				throw new FaultException(ExtensibilityQNames.UNKNOWN_EA_FAULT_NAME, "Lookup of extension activity " + extensionId + " failed. No implementation found.");
+    			} else {
+    				// act like <empty> - do nothing
+    				context.complete();
+    				return;
+    			}
+    		}
 
+    		ea.run(context, eao.nestedElement.getElement());
     	} catch (FaultException fault) {
             __log.error(fault);
-            FaultData faultData = createFault(fault.getQName(), _self.o, fault.getMessage());
-            _self.parent.completed(faultData, CompensationHandler.emptySet());
+            context.completeWithFault(fault);
 		}
     }
     

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java Wed Nov 28 11:16:43 2007
@@ -18,31 +18,29 @@
  */
 package org.apache.ode.bpel.runtime;
 
+import java.util.Collection;
+import java.util.Date;
+
+import javax.wsdl.Operation;
+import javax.xml.namespace.QName;
+
 import org.apache.ode.bpel.common.CorrelationKey;
 import org.apache.ode.bpel.common.FaultException;
 import org.apache.ode.bpel.evt.ProcessInstanceEvent;
 import org.apache.ode.bpel.o.OMessageVarType;
-import org.apache.ode.bpel.o.OMessageVarType.Part;
 import org.apache.ode.bpel.o.OPartnerLink;
 import org.apache.ode.bpel.o.OProcess;
 import org.apache.ode.bpel.o.OScope;
-import org.apache.ode.bpel.runtime.channels.ExtensionResponseChannel;
+import org.apache.ode.bpel.o.OMessageVarType.Part;
+import org.apache.ode.bpel.runtime.channels.ActivityRecoveryChannel;
 import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.channels.InvokeResponseChannel;
 import org.apache.ode.bpel.runtime.channels.PickResponseChannel;
 import org.apache.ode.bpel.runtime.channels.TimerResponseChannel;
-import org.apache.ode.bpel.runtime.channels.ActivityRecoveryChannel;
-import org.apache.ode.bpel.runtime.extension.ExtensionContext;
-import org.apache.ode.utils.SerializableElement;
+import org.apache.ode.bpel.runtime.extension.ExtensionOperation;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import javax.wsdl.Operation;
-import java.util.Collection;
-import java.util.Date;
-
-import javax.xml.namespace.QName;
-
 /**
  * <p>A facade for accessing all the BPEL functionality that is not implemented
  * directly in the JACOB framework, but rather "natively" . Things that are so
@@ -260,5 +258,7 @@
 
     void releasePartnerMex(String mexId);
     
-    void executeExtension(QName extensionId, ExtensionContext context, Element element, ExtensionResponseChannel extResponseChannel) throws FaultException;
+    //void executeExtension(QName extensionId, ExtensionContext context, Element element, ExtensionResponseChannel extResponseChannel) throws FaultException;
+    
+    ExtensionOperation createExtensionActivityImplementation(QName name);
 }

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EXTENSIONACTIVITY.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EXTENSIONACTIVITY.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EXTENSIONACTIVITY.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/EXTENSIONACTIVITY.java Wed Nov 28 11:16:43 2007
@@ -18,22 +18,16 @@
  */
 package org.apache.ode.bpel.runtime;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
 import javax.xml.namespace.QName;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.common.FaultException;
-import org.apache.ode.bpel.compiler.bom.Bpel20QNames;
+import org.apache.ode.bpel.compiler.bom.ExtensibilityQNames;
 import org.apache.ode.bpel.o.OExtensionActivity;
-import org.apache.ode.bpel.runtime.channels.ExtensionResponseChannel;
-import org.apache.ode.bpel.runtime.channels.ExtensionResponseChannelListener;
-import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.extension.ExtensionContext;
+import org.apache.ode.bpel.runtime.extension.ExtensionOperation;
 import org.apache.ode.utils.DOMUtils;
-import org.apache.ode.utils.SerializableElement;
 
 /**
  * JacobRunnable that delegates the work of the <code>extensionActivity</code> activity
@@ -54,31 +48,25 @@
 	}
 
     public final void run() {
-        try {
-        	final ExtensionResponseChannel responseChannel = newChannel(ExtensionResponseChannel.class);
-        	final ExtensionContext helper = new ExtensionContextImpl(_self.o, _scopeFrame, getBpelRuntimeContext());
-        	
-        	getBpelRuntimeContext().executeExtension(DOMUtils.getElementQName(_oext.nestedElement.getElement()), helper, _oext.nestedElement.getElement(), responseChannel);
-        	
-            object(new ExtensionResponseChannelListener(responseChannel) {
-				private static final long serialVersionUID = -1L;
-
-				public void onCompleted() {
-					_self.parent.completed(null, CompensationHandler.emptySet());
-            	}
-            	
-            	public void onFailure(Throwable t) {
-            		StringWriter sw = new StringWriter();
-            		t.printStackTrace(new PrintWriter(sw));
-            		FaultData fault = createFault(new QName(Bpel20QNames.NS_WSBPEL2_0, "subLanguageExecutionFault"), _oext, sw.getBuffer().toString());
-                    _self.parent.completed(fault, CompensationHandler.emptySet());
-            	};
-            });
+    	final ExtensionContext context = new ExtensionContextImpl(_self, _scopeFrame, getBpelRuntimeContext());
+    	final QName extensionId = DOMUtils.getElementQName(_oext.nestedElement.getElement());
+    	try {
+    		ExtensionOperation ea = getBpelRuntimeContext().createExtensionActivityImplementation(extensionId);
+    		if (ea == null) {
+    			if (_oext.getOwner().mustUnderstandExtensions.contains(extensionId.getNamespaceURI())) {
+    				__log.warn("Lookup of extension activity " + extensionId + " failed.");
+    				throw new FaultException(ExtensibilityQNames.UNKNOWN_EA_FAULT_NAME, "Lookup of extension activity " + extensionId + " failed. No implementation found.");
+    			} else {
+    				// act like <empty> - do nothing
+    				context.complete();
+    				return;
+    			}
+    		}
 
+    		ea.run(context, _oext.nestedElement.getElement());
 		} catch (FaultException fault) {
             __log.error(fault);
-            FaultData faultData = createFault(fault.getQName(), _oext, fault.getMessage());
-            _self.parent.completed(faultData, CompensationHandler.emptySet());
+            context.completeWithFault(fault);
 		}
 
     }

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ExtensionContextImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ExtensionContextImpl.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ExtensionContextImpl.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ExtensionContextImpl.java Wed Nov 28 11:16:43 2007
@@ -18,15 +18,24 @@
  */
 package org.apache.ode.bpel.runtime;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.HashMap;
 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.common.FaultException;
+import org.apache.ode.bpel.compiler.bom.Bpel20QNames;
+import org.apache.ode.bpel.evt.ScopeEvent;
+import org.apache.ode.bpel.evt.VariableModificationEvent;
 import org.apache.ode.bpel.o.OActivity;
-import org.apache.ode.bpel.o.OLink;
 import org.apache.ode.bpel.o.OScope;
 import org.apache.ode.bpel.o.OProcess.OProperty;
 import org.apache.ode.bpel.o.OScope.Variable;
+import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.extension.ExtensionContext;
 import org.w3c.dom.Node;
 
@@ -35,15 +44,18 @@
  * @author Tammo van Lessen (University of Stuttgart)
  */
 public class ExtensionContextImpl implements ExtensionContext {
-
+	private static final Log __log = LogFactory.getLog(ExtensionContextImpl.class);
+	
 	private BpelRuntimeContext _context;
 	private ScopeFrame _scopeFrame;
-	private OActivity _activity;
+	private ActivityInfo _activityInfo;
+	
+	private boolean hasCompleted = false;
 
-	public ExtensionContextImpl(OActivity activity, ScopeFrame scopeFrame, BpelRuntimeContext context) {
+	public ExtensionContextImpl(ActivityInfo activityInfo, ScopeFrame scopeFrame, BpelRuntimeContext context) {
+		_activityInfo = activityInfo;
 		_context = context;
 		_scopeFrame = scopeFrame;
-		_activity = activity;
 	}
 	
 	public Long getProcessId() {
@@ -68,11 +80,6 @@
 		return visVars;
 	}
 
-	public boolean isLinkActive(OLink olink) throws FaultException {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
 	public String readMessageProperty(Variable variable, OProperty property)
 			throws FaultException {
 		VariableInstance vi = _scopeFrame.resolve(variable);
@@ -100,6 +107,9 @@
 			throws FaultException {
 		VariableInstance vi = _scopeFrame.resolve(variable);
 		_context.commitChanges(vi, value);
+        VariableModificationEvent vme = new VariableModificationEvent(variable.name);
+        vme.setNewValue(value);
+        sendEvent(vme);
 	}
 
 	private Variable getVisibleVariable(String varName) {
@@ -107,14 +117,60 @@
     }
 
 	public String getActivityName() {
-		return _activity.name;
+		return _activityInfo.o.name;
 	}
 
 	public OActivity getOActivity() {
-		return _activity;
+		return _activityInfo.o;
 	}
 
 	public BpelRuntimeContext getBpelRuntimeContext() {
 		return _context;
+	}
+	
+	public void sendEvent(ScopeEvent event) {
+        if (event.getLineNo() == -1 && _activityInfo.o.debugInfo != null) {
+        	event.setLineNo(_activityInfo.o.debugInfo.startLine);
+        }
+        _scopeFrame.fillEventInfo(event);
+        getBpelRuntimeContext().sendEvent(event);
+	}
+	
+	public void complete() {
+		if (!hasCompleted) {
+			_activityInfo.parent.completed(null, CompensationHandler.emptySet());
+			hasCompleted = true;
+		} else {
+			if (__log.isWarnEnabled()) {
+				__log.warn("Activity '" + _activityInfo.o.name + "' has already been completed.");
+			}
+		}
+	}
+	
+	public void completeWithFault(Throwable t) {
+		if (!hasCompleted) {
+			StringWriter sw = new StringWriter();
+			t.printStackTrace(new PrintWriter(sw));
+			FaultData fault = new FaultData(new QName(Bpel20QNames.NS_WSBPEL2_0, "subLanguageExecutionFault"), _activityInfo.o, sw.getBuffer().toString());
+	        _activityInfo.parent.completed(fault, CompensationHandler.emptySet());
+			hasCompleted = true;
+		} else {
+			if (__log.isWarnEnabled()) {
+				__log.warn("Activity '" + _activityInfo.o.name + "' has already been completed.");
+			}
+		}
+	}
+	
+	public void completeWithFault(FaultException ex) {
+		if (!hasCompleted) {
+			FaultData fault = new FaultData(ex.getQName(), _activityInfo.o, ex.getMessage());
+			_activityInfo.parent.completed(fault, CompensationHandler.emptySet());
+			hasCompleted = true;
+		} else {
+			if (__log.isWarnEnabled()) {
+				__log.warn("Activity '" + _activityInfo.o.name + "' has already been completed.");
+			}
+		}
+
 	}
 }

Copied: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractAsyncExtensionOperation.java (from r599070, ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractExtensionOperation.java)
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractAsyncExtensionOperation.java?p2=ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractAsyncExtensionOperation.java&p1=ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractExtensionOperation.java&r1=599070&r2=599101&rev=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractExtensionOperation.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractAsyncExtensionOperation.java Wed Nov 28 11:16:43 2007
@@ -18,20 +18,25 @@
  */
 package org.apache.ode.bpel.runtime.extension;
 
+import org.apache.ode.bpel.common.FaultException;
 import org.apache.ode.bpel.compiler.api.CompilationException;
 import org.apache.ode.bpel.compiler.api.ExtensionValidator;
 import org.apache.ode.bpel.compiler.bom.ExtensibleElement;
+import org.w3c.dom.Element;
 
 /**
- * Base class for creating new extension implementations.
+ * Base class for creating new asynchronous extension implementations.
  * 
  * @author Tammo van Lessen (University of Stuttgart)
  */
-public abstract class AbstractExtensionOperation implements ExtensionValidator,
+public abstract class AbstractAsyncExtensionOperation implements ExtensionValidator,
 															ExtensionOperation {
 
 	public void validate(ExtensibleElement element) throws CompilationException {
 		// default behavior: pass
 	}
 
+	public abstract void run(ExtensionContext context, Element element)
+			throws FaultException;
+	
 }

Added: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractSyncExtensionOperation.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractSyncExtensionOperation.java?rev=599101&view=auto
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractSyncExtensionOperation.java (added)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/AbstractSyncExtensionOperation.java Wed Nov 28 11:16:43 2007
@@ -0,0 +1,52 @@
+/*
+ * 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.runtime.extension;
+
+import org.apache.ode.bpel.common.FaultException;
+import org.apache.ode.bpel.compiler.api.CompilationException;
+import org.apache.ode.bpel.compiler.api.ExtensionValidator;
+import org.apache.ode.bpel.compiler.bom.ExtensibleElement;
+import org.w3c.dom.Element;
+
+/**
+ * Base class for creating new extension implementations.
+ * 
+ * @author Tammo van Lessen (University of Stuttgart)
+ */
+public abstract class AbstractSyncExtensionOperation implements ExtensionValidator,
+															ExtensionOperation {
+
+	public void validate(ExtensibleElement element) throws CompilationException {
+		// default behavior: pass
+	}
+
+	protected abstract void runSync(ExtensionContext context, Element element) throws FaultException;
+	
+	public void run(ExtensionContext context, Element element)
+			throws FaultException {
+		try {
+			runSync(context, element);
+			context.complete();
+		} catch (FaultException f) {
+			context.completeWithFault(f);
+		} catch (Exception e) {
+			context.completeWithFault(e);
+		}
+	}
+}

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionContext.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionContext.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionContext.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionContext.java Wed Nov 28 11:16:43 2007
@@ -103,16 +103,6 @@
             throws FaultException;
     
     /**
-     * Obtain the status of a control link.
-     *
-     * @param olink
-     *          link to check
-     * @return <code>true</code> if the link is active, <code>false</code>
-     *         otherwise.
-     */
-    boolean isLinkActive(OLink olink) throws FaultException;
-    
-    /**
      * Reads the current process instance id.
      * @return instance id
      */
@@ -131,6 +121,10 @@
     
     BpelRuntimeContext getBpelRuntimeContext();
     
+   
     //ScopeFrame getScopeFrame();
+    void complete();
     
+    void completeWithFault(Throwable t);
+    void completeWithFault(FaultException fault);
 }

Modified: ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionOperation.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionOperation.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionOperation.java (original)
+++ ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/extension/ExtensionOperation.java Wed Nov 28 11:16:43 2007
@@ -36,4 +36,5 @@
 public interface ExtensionOperation {
 
 	void run(ExtensionContext context, Element element) throws FaultException;
+	
 }

Modified: ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/CoreBpelTest.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/CoreBpelTest.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/CoreBpelTest.java (original)
+++ ode/trunk/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/CoreBpelTest.java Wed Nov 28 11:16:43 2007
@@ -43,12 +43,11 @@
 import org.apache.ode.bpel.o.OThrow;
 import org.apache.ode.bpel.o.OMessageVarType.Part;
 import org.apache.ode.bpel.runtime.channels.ActivityRecoveryChannel;
-import org.apache.ode.bpel.runtime.channels.ExtensionResponseChannel;
 import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.channels.InvokeResponseChannel;
 import org.apache.ode.bpel.runtime.channels.PickResponseChannel;
 import org.apache.ode.bpel.runtime.channels.TimerResponseChannel;
-import org.apache.ode.bpel.runtime.extension.ExtensionContext;
+import org.apache.ode.bpel.runtime.extension.ExtensionOperation;
 import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
 import org.apache.ode.jacob.vpu.JacobVPU;
 import org.w3c.dom.Element;
@@ -418,11 +417,9 @@
         
     }
 
-	public void executeExtension(QName extensionId, ExtensionContext context,
-			Element element,
-			ExtensionResponseChannel extResponseChannel) throws FaultException {
+	public ExtensionOperation createExtensionActivityImplementation(QName name) {
 		// TODO Auto-generated method stub
-		
+		return null;
 	}
 
 }

Modified: ode/trunk/bpel-test/src/main/java/org/apache/ode/test/MockExtensionContext.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/MockExtensionContext.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-test/src/main/java/org/apache/ode/test/MockExtensionContext.java (original)
+++ ode/trunk/bpel-test/src/main/java/org/apache/ode/test/MockExtensionContext.java Wed Nov 28 11:16:43 2007
@@ -38,6 +38,8 @@
  */
 public class MockExtensionContext implements ExtensionContext {
 	private Map<String, Node> variables = new HashMap<String, Node>();
+	public boolean completed;
+	public boolean faulted;
 	
 	public Map<String, Node> getVariables() {
 		return variables;
@@ -91,4 +93,19 @@
 	public void writeVariable(Variable variable, Node value) throws FaultException {
 		throw new UnsupportedOperationException("This method is not available in this mock implementation.");
 	}
+
+	public void complete() {
+		this.completed = true;
+	}
+
+	public void completeWithFault(Throwable t) {
+		this.completed = true;
+		this.faulted = true;
+	}
+
+	public void completeWithFault(FaultException fault) {
+		this.completed = true;
+		this.faulted = true;
+	}
+	
 }

Modified: ode/trunk/bpel-test/src/test/java/org/apache/ode/test/ExtensibilityTest.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/ExtensibilityTest.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/bpel-test/src/test/java/org/apache/ode/test/ExtensibilityTest.java (original)
+++ ode/trunk/bpel-test/src/test/java/org/apache/ode/test/ExtensibilityTest.java Wed Nov 28 11:16:43 2007
@@ -18,15 +18,13 @@
  */
 package org.apache.ode.test;
 
-import javax.xml.namespace.QName;
-
 import org.apache.ode.bpel.common.FaultException;
 import org.apache.ode.bpel.compiler.api.CompilationException;
 import org.apache.ode.bpel.compiler.api.CompilationMessage;
 import org.apache.ode.bpel.compiler.bom.ExtensibleElement;
 import org.apache.ode.bpel.iapi.BpelEngineException;
+import org.apache.ode.bpel.runtime.extension.AbstractAsyncExtensionOperation;
 import org.apache.ode.bpel.runtime.extension.AbstractExtensionBundle;
-import org.apache.ode.bpel.runtime.extension.AbstractExtensionOperation;
 import org.apache.ode.bpel.runtime.extension.ExtensionContext;
 import org.apache.ode.bpel.runtime.extension.ExtensionOperation;
 import org.apache.ode.utils.DOMUtils;
@@ -126,6 +124,7 @@
 		public void run(ExtensionContext context,
 				Element element) throws FaultException {
 			TestExtensionBundle.wasExecuted = true;
+			context.complete();
 		}
 	}
 	
@@ -142,16 +141,19 @@
 			} catch (Exception e) {
 				e.printStackTrace();
 				Assert.fail();
+			} finally {
+				context.complete();
 			}
 		}
 	}
 
-	public static class TestExtensionValidatorActivity extends AbstractExtensionOperation {
+	public static class TestExtensionValidatorActivity extends AbstractAsyncExtensionOperation {
 		private static final long serialVersionUID = 1L;
 
 		public void run(ExtensionContext context,
 				Element element) throws FaultException {
 			TestExtensionBundle.wasExecuted = true;
+			context.complete();
 		}
 
 		@Override

Modified: ode/trunk/extensions/README.extensions
URL: http://svn.apache.org/viewvc/ode/trunk/extensions/README.extensions?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/extensions/README.extensions (original)
+++ ode/trunk/extensions/README.extensions Wed Nov 28 11:16:43 2007
@@ -1 +1,22 @@
-TODO
\ No newline at end of file
+=============================================
+  Apache ODE - Extension Installation Guide
+=============================================
+
+BPEL 2.0 introduces extensibility mechanisms, which allow you to extend
+the set of activities and/or variable assignment mechanisms.
+With BPEL 2.0 it is possible to extend the language by user-defined
+activities and custom assignment logic.
+
+Since version 1.2 Apache ODE supports these extensibility mechanismns
+and provides a plug-in architecture that allows for registering
+third-party extensions.
+
+1.) Installation of extensions (WAR)
+  1) Copy the extension 
+      TBC
+  
+2.) Installation of extensions (JBI)
+      TBW
+
+3.) Writing ODE extensions
+      TBW
\ No newline at end of file

Modified: ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java
URL: http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java (original)
+++ ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java Wed Nov 28 11:16:43 2007
@@ -21,7 +21,7 @@
 import javax.xml.namespace.QName;
 
 import org.apache.ode.bpel.common.FaultException;
-import org.apache.ode.bpel.runtime.extension.AbstractExtensionOperation;
+import org.apache.ode.bpel.runtime.extension.AbstractSyncExtensionOperation;
 import org.apache.ode.bpel.runtime.extension.ExtensionContext;
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.ContextFactory;
@@ -36,9 +36,9 @@
  * 
  * @author Tammo van Lessen (University of Stuttgart)
  */
-public class JSExtensionOperation extends AbstractExtensionOperation {
+public class JSExtensionOperation extends AbstractSyncExtensionOperation {
 	
-	public void run(ExtensionContext context, Element element) throws FaultException {
+	public void runSync(ExtensionContext context, Element element) throws FaultException {
 
 		CustomContextFactory.init();
 		Context ctx = Context.enter();

Modified: ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java
URL: http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java?rev=599101&r1=599100&r2=599101&view=diff
==============================================================================
--- ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java (original)
+++ ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java Wed Nov 28 11:16:43 2007
@@ -22,7 +22,6 @@
 import org.apache.ode.test.MockExtensionContext;
 import org.apache.ode.utils.DOMUtils;
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.w3c.dom.Element;
 
@@ -44,6 +43,8 @@
 		jso.run(c, e);
 		String res = DOMUtils.domToString(c.getVariables().get("request"));
 		Assert.assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<message><TestPart>Hello World</TestPart></message>", res);
+		Assert.assertTrue(c.completed);
+		Assert.assertFalse(c.faulted);
 	}
 	
 	@Test public void testArrayCopy() throws Exception {
@@ -62,6 +63,8 @@
 		jso.run(c, e);
 		String res = DOMUtils.domToString(c.getVariables().get("items"));
 		Assert.assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<message><TestPart><items><item><name>WSDL consulting</name><price>2500</price></item><item hyped=\"true\"><name>BPEL consulting</name><price>6000</price></item></items></TestPart></message>", res);
+		Assert.assertTrue(c.completed);
+		Assert.assertFalse(c.faulted);
 	}
 
 }