You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by sa...@apache.org on 2018/01/30 10:20:50 UTC

[04/14] ode git commit: Apply latest improvements on extension bundle support based on commit 1d5fa185a77c944e8d4a708b451611fa74d5c2dc

Apply latest improvements on extension bundle support based on commit 1d5fa185a77c944e8d4a708b451611fa74d5c2dc


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

Branch: refs/heads/master
Commit: cf630ce49e72cbd31a170ee5886f2a39069e824d
Parents: acb7e8e
Author: hahnml <ha...@users.noreply.github.com>
Authored: Wed Nov 29 17:58:32 2017 +0100
Committer: hahnml <ha...@users.noreply.github.com>
Committed: Wed Nov 29 17:58:32 2017 +0100

----------------------------------------------------------------------
 .../webapp/WEB-INF/conf/ode-axis2.properties    |   3 +-
 .../java/org/apache/ode/axis2/ODEServer.java    | 133 +++++--------
 .../ode/bpel/eapi/AbstractExtensionBundle.java  |  71 +++++++
 .../apache/ode/bpel/eapi/ExtensionContext.java  | 128 ++++++++++++
 .../ode/bpel/eapi/ExtensionOperation.java       |  39 ++++
 .../ode/bpel/extension/ExtensibleElement.java   |  32 ---
 .../bpel/extension/ExtensionBundleRuntime.java  |  12 --
 .../extension/ExtensionBundleValidation.java    |  13 --
 .../ode/bpel/extension/ExtensionOperation.java  |  54 ------
 .../ode/bpel/extension/ExtensionValidator.java  |  38 ----
 .../ode/bpel/compiler/AssignGenerator.java      |   7 +-
 .../org/apache/ode/bpel/compiler/BpelC.java     |  15 --
 .../apache/ode/bpel/compiler/BpelCompiler.java  |  14 --
 .../compiler/ExtensionActivtityGenerator.java   |   9 +-
 .../ode/bpel/compiler/api/CompilerContext.java  |   5 +-
 .../ode/bpel/compiler/bom/AssignActivity.java   |   3 +
 .../ode/bpel/compiler/bom/BpelObject.java       |   2 +-
 .../bpel/compiler/bom/ExtensibilityQNames.java  |   7 +-
 .../bpel/compiler/bom/ExtensionActivity.java    |  12 +-
 .../compiler/bom/ExtensionAssignOperation.java  |  11 +-
 .../org/apache/ode/bpel/compiler/XPathTest.java |   7 +-
 .../ode/il/config/OdeConfigProperties.java      |  12 +-
 .../java/org/apache/ode/bpel/obj/OProcess.java  |  17 --
 .../java/org/apache/ode/bpel/o/OAssign.java     |  60 +-----
 .../java/org/apache/ode/bpel/o/OProcess.java    |  24 +--
 .../org/apache/ode/bpel/engine/BpelProcess.java |  14 +-
 .../ode/bpel/engine/BpelRuntimeContextImpl.java |  80 ++++++--
 .../apache/ode/bpel/engine/BpelServerImpl.java  |  11 +-
 .../org/apache/ode/bpel/engine/Contexts.java    |   6 +-
 .../org/apache/ode/bpel/runtime/ASSIGN.java     | 129 +++++++------
 .../ode/bpel/runtime/BpelRuntimeContext.java    |  18 +-
 .../ode/bpel/runtime/EXTENSIONACTIVITY.java     |  80 ++++----
 .../ode/bpel/runtime/ExtensionContextImpl.java  | 193 +++++--------------
 .../runtime/channels/ExtensionResponse.java     |  34 ++++
 .../AbstractAsyncExtensionOperation.java        |  36 ----
 .../extension/AbstractExtensionBundle.java      | 109 -----------
 .../AbstractSyncExtensionOperation.java         |  45 -----
 .../common/extension/ExtensibilityQNames.java   |  58 ------
 .../common/extension/ExtensionContext.java      | 190 ------------------
 .../xpath20/runtime/MockCompilerContext.java    |   7 -
 .../apache/ode/bpel/runtime/CoreBpelTest.java   |  21 +-
 .../org/apache/ode/store/DeploymentUnitDir.java |  12 --
 .../org/apache/ode/store/ProcessStoreImpl.java  |  13 --
 .../java/org/apache/ode/jbi/OdeLifeCycle.java   |  66 ++-----
 44 files changed, 607 insertions(+), 1243 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/axis2-war/src/main/webapp/WEB-INF/conf/ode-axis2.properties
----------------------------------------------------------------------
diff --git a/axis2-war/src/main/webapp/WEB-INF/conf/ode-axis2.properties b/axis2-war/src/main/webapp/WEB-INF/conf/ode-axis2.properties
index 3c61926..ed6d2d1 100644
--- a/axis2-war/src/main/webapp/WEB-INF/conf/ode-axis2.properties
+++ b/axis2-war/src/main/webapp/WEB-INF/conf/ode-axis2.properties
@@ -104,5 +104,4 @@ ode-axis2.db.emb.name=derby-jpadb
 
 ## Extension Bundles
 ## FQCNs, comma separated.
-#ode-axis2.extension.bundles.runtime=[packageName].[bundleClassName]
-#ode-axis2.extension.bundles.validation=[packageName].[bundleClassName]
+#ode-axis2.extension.bundles=[packageName].[bundleClassName]

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
----------------------------------------------------------------------
diff --git a/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java b/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
index 347f44c..2d9f0ca 100644
--- a/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
+++ b/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
@@ -19,13 +19,38 @@
 
 package org.apache.ode.axis2;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.sql.DataSource;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
 import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
 import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.ode.axis2.deploy.DeploymentPoller;
 import org.apache.ode.axis2.service.DeploymentWebService;
 import org.apache.ode.axis2.service.ManagementService;
@@ -35,19 +60,21 @@ import org.apache.ode.bpel.clapi.ClusterMemberListener;
 import org.apache.ode.bpel.clapi.ClusterProcessStore;
 import org.apache.ode.bpel.connector.BpelServerConnector;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
+import org.apache.ode.bpel.eapi.AbstractExtensionBundle;
 import org.apache.ode.bpel.engine.BpelServerImpl;
 import org.apache.ode.bpel.engine.CountLRUDehydrationPolicy;
 import org.apache.ode.bpel.engine.cron.CronScheduler;
-import org.apache.ode.bpel.extension.ExtensionBundleRuntime;
-import org.apache.ode.bpel.extension.ExtensionBundleValidation;
-import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.extvar.jdbc.JdbcExternalVariableModule;
-import org.apache.ode.bpel.iapi.*;
+import org.apache.ode.bpel.iapi.BpelEventListener;
+import org.apache.ode.bpel.iapi.EndpointReferenceContext;
+import org.apache.ode.bpel.iapi.ProcessConf;
+import org.apache.ode.bpel.iapi.ProcessStoreEvent;
+import org.apache.ode.bpel.iapi.ProcessStoreListener;
+import org.apache.ode.bpel.iapi.Scheduler;
 import org.apache.ode.bpel.intercept.MessageExchangeInterceptor;
 import org.apache.ode.bpel.memdao.BpelDAOConnectionFactoryImpl;
 import org.apache.ode.bpel.pmapi.InstanceManagement;
 import org.apache.ode.bpel.pmapi.ProcessManagement;
-import org.apache.ode.bpel.runtime.common.extension.AbstractExtensionBundle;
 import org.apache.ode.il.config.OdeConfigProperties;
 import org.apache.ode.il.dbutil.Database;
 import org.apache.ode.scheduler.simple.JdbcDelegate;
@@ -56,22 +83,8 @@ import org.apache.ode.store.ClusterProcessStoreImpl;
 import org.apache.ode.store.ProcessStoreImpl;
 import org.apache.ode.utils.GUID;
 import org.apache.ode.utils.fs.TempFileManager;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.sql.DataSource;
-import javax.transaction.*;
-import javax.transaction.xa.XAResource;
-import javax.xml.namespace.QName;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Server class called by our Axis hooks to handle all ODE lifecycle management.
@@ -700,38 +713,18 @@ public class ODEServer {
 
     // Add support for extension bundles based on ODE 2.0 alpha branch
     private void registerExtensionActivityBundles() {
-		String extensionsRTStr = _odeConfig.getExtensionActivityBundlesRT();
-		String extensionsValStr = _odeConfig
-				.getExtensionActivityBundlesValidation();
-		if (extensionsRTStr != null) {
+		String extensionsStr = _odeConfig.getExtensionActivityBundles();
+		
+		if (extensionsStr != null) {
 			// TODO replace StringTokenizer by regex
-			for (StringTokenizer tokenizer = new StringTokenizer(
-					extensionsRTStr, ",;"); tokenizer.hasMoreTokens();) {
-				String bundleCN = tokenizer.nextToken();
-				
-				//@hahnml: Remove any whitespaces
-				bundleCN = bundleCN.replaceAll(" ", "");
-				
+			for (String bundleCN : extensionsStr.split("\\s*(,|;)\\s*")) {
 				try {
 					// instantiate bundle
-					ExtensionBundleRuntime bundleRT = (ExtensionBundleRuntime) Class
+					AbstractExtensionBundle bundle = (AbstractExtensionBundle) Class
 							.forName(bundleCN).newInstance();
 					
 					// register extension bundle (BPEL server)
-					_bpelServer.registerExtensionBundle(bundleRT);
-					
-					if (bundleRT instanceof AbstractExtensionBundle) {
-						AbstractExtensionBundle bundle = (AbstractExtensionBundle) bundleRT;
-						
-						//@hahnml: Get the registered validators from the process store
-						Map<QName, ExtensionValidator> validators = _store.getExtensionValidators();
-						
-						//Add the validators of this bundle to the existing validators
-						validators.putAll(bundle.getExtensionValidators());
-						
-						// register extension bundle (BPEL store)
-						_store.setExtensionValidators(validators);
-					}
+					_bpelServer.registerExtensionBundle(bundle);
 				} catch (Exception e) {
 					__log.warn("Couldn't register the extension bundle runtime "
 							+ bundleCN
@@ -739,45 +732,9 @@ public class ODEServer {
 							+ "loaded properly.");
 				}
 			}
-		}
-		if (extensionsValStr != null) {
-			Map<QName, ExtensionValidator> validators = new HashMap<QName, ExtensionValidator>();
-			for (StringTokenizer tokenizer = new StringTokenizer(
-					extensionsValStr, ",;"); tokenizer.hasMoreTokens();) {
-				String bundleCN = tokenizer.nextToken();
-				
-				//@hahnml: Remove any whitespaces
-				bundleCN = bundleCN.replaceAll(" ", "");
-				
-				try {
-					// instantiate bundle
-					ExtensionBundleValidation bundleVal = (ExtensionBundleValidation) Class
-							.forName(bundleCN).newInstance();
-					// add validators
-					validators.putAll(bundleVal.getExtensionValidators());
-				} catch (Exception e) {
-					__log.warn("Couldn't register the extension bundle validator "
-							+ bundleCN
-							+ ", the class couldn't be "
-							+ "loaded properly.");
-				}
-			}
-			// register extension bundle (BPEL store)
-			//@hahnml: Check if validators are registered already
-			if (_store.getExtensionValidators().isEmpty()) {
-				_store.setExtensionValidators(validators);
-			} else {
-				//@hahnml: Get the registered validators from the process store
-				Map<QName, ExtensionValidator> allValidators = _store.getExtensionValidators();
-				
-				//Add the registered validators to the existing validators
-				allValidators.putAll(validators);
-				
-				// register extension bundle (BPEL store)
-				_store.setExtensionValidators(allValidators);
-			}
-		}
-	}
+		}		
+    }
+
     private class ProcessStoreListenerImpl implements ProcessStoreListener {
 
         public void onProcessStoreEvent(ProcessStoreEvent event) {

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/eapi/AbstractExtensionBundle.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/eapi/AbstractExtensionBundle.java b/bpel-api/src/main/java/org/apache/ode/bpel/eapi/AbstractExtensionBundle.java
new file mode 100644
index 0000000..2210242
--- /dev/null
+++ b/bpel-api/src/main/java/org/apache/ode/bpel/eapi/AbstractExtensionBundle.java
@@ -0,0 +1,71 @@
+/*
+ * 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.eapi;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+* Abstract class that bundles and registers <code>&lt;extensionActivity&gt;</code> and
+* <code>&lt;extensionAssignOperation&gt;</code> implementations related to a particular namespace.
+*  
+* @author Tammo van Lessen (University of Stuttgart)
+*/
+public abstract class AbstractExtensionBundle {
+	private Map<String, Class<? extends ExtensionOperation>> extensionsByName = new HashMap<String, Class<? extends ExtensionOperation>>();
+
+	/**
+	 * Returns the extension namespace this bundle provides implementations for.
+	 * @return
+	 */
+	public abstract String getNamespaceURI();
+	
+	/**
+	 * Register extension operations.
+	 */
+	public abstract void registerExtensionActivities();
+
+	/**
+	 * Register an {@link ExtensionOperation} implementation as <code>&lt;extensionActivity&gt;</code>.
+	 *
+	 * @param localName
+	 * @param activity
+	 */
+	protected final void registerExtensionOperation(String localName, Class<? extends ExtensionOperation> operation) {
+		extensionsByName.put(localName, operation);
+	}
+	
+	/**
+	 * Returns a list of the local names of registered extension operations.
+	 */
+	public final Set<String> getExtensionOperationNames() {
+		return Collections.unmodifiableSet(extensionsByName.keySet());
+	}
+
+	public final Class<? extends ExtensionOperation> getExtensionOperationClass(String localName) {
+		return extensionsByName.get(localName);
+	}
+
+	public final ExtensionOperation getExtensionOperationInstance(String localName) throws InstantiationException, IllegalAccessException {
+		return getExtensionOperationClass(localName).newInstance();
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionContext.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionContext.java b/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionContext.java
new file mode 100644
index 0000000..2ffbba7
--- /dev/null
+++ b/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionContext.java
@@ -0,0 +1,128 @@
+/*
+ * 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.eapi;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ode.bpel.common.FaultException;
+import org.apache.ode.bpel.obj.OLink;
+import org.apache.ode.bpel.obj.OProcess;
+import org.apache.ode.bpel.obj.OScope;
+import org.w3c.dom.Node;
+
+
+/**
+ * Context for executing extension activities or extension assign operations. 
+ * Implementations of the {@link ExtensionOperation} class use this interface to access BPEL
+ * variables, property sets and link status.
+ * 
+ * @author Tammo van Lessen (University of Stuttgart)
+ */
+public interface ExtensionContext {
+
+	/**
+	 * Returns a list of variables visible in the current scope.
+	 * 
+	 * @return an unmodifiable list of visible variables.
+	 * @throws FaultException
+	 */
+	Map<String, OScope.Variable> getVisibleVariables() throws FaultException;
+	
+	/**
+	 * Returns a list of links.
+	 * 
+	 * @return an unmodifiable list of visible variables.
+	 * @throws FaultException
+	 */
+	List<OLink> getLinks() throws FaultException;
+
+	/**
+     * Read the value of a BPEL variable.
+     *
+     * @param variable
+     *          variable to read
+     * @param part
+     *          the part (or <code>null</code>)
+     * @return the value of the variable, wrapped in a <code>Node</code>
+     */
+    Node readVariable(OScope.Variable variable) throws FaultException;
+    
+	/**
+     * Read the value of a BPEL variable.
+     *
+     * @param variableName
+     *          variable to read
+     * @param part
+     *          the part (or <code>null</code>)
+     * @return the value of the variable, wrapped in a <code>Node</code>
+     */
+    Node readVariable(String variableName) throws FaultException;
+
+    /**
+     * Write the value into a BPEL variable.
+     *
+     * @param variable
+     *          variable to write
+     * @param value
+     *          the value to be stored into the variable
+     * @return the value of the variable, wrapped in a <code>Node</code>
+     */
+    void writeVariable(OScope.Variable variable, Node value) throws FaultException;
+
+    /**
+     * Write the value into a BPEL variable.
+     *
+     * @param variableName
+     *          variable to write
+     * @param value
+     *          the value to be stored into the variable
+     * @return the value of the variable, wrapped in a <code>Node</code>
+     */
+    void writeVariable(String variableName, Node value) throws FaultException;
+
+    /**
+     * Read the value of a BPEL property.
+     *
+     * @param variable
+     *          variable containing property
+     * @param property
+     *          property to read
+     * @return value of the property
+     */
+    String readMessageProperty(OScope.Variable variable, OProcess.OProperty property)
+            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
+     */
+    Long getProcessId();
+    
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionOperation.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionOperation.java b/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionOperation.java
new file mode 100644
index 0000000..8bcba6c
--- /dev/null
+++ b/bpel-api/src/main/java/org/apache/ode/bpel/eapi/ExtensionOperation.java
@@ -0,0 +1,39 @@
+/*
+ * 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.eapi;
+
+import org.apache.ode.bpel.common.FaultException;
+import org.w3c.dom.Element;
+
+/**
+ * This is the basis interface for implementations of  
+ * <code>&lt;extensionAssignOperation&gt;</code> and <code>&lt;extensionActivity&gt;</code>
+ * nodes.
+ * 
+ * Implementations of this interface must provide a default constructor as they are created
+ * using reflection.
+ * 
+ * @see AbstractExtensionBundle
+ * 
+ * @author Tammo van Lessen (University of Stuttgart)
+ */
+public interface ExtensionOperation {
+
+	void run(ExtensionContext context, Element element) throws FaultException;
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensibleElement.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensibleElement.java b/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensibleElement.java
deleted file mode 100644
index f7922d4..0000000
--- a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensibleElement.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.extension;
-
-import org.w3c.dom.Element;
-
-/**
- * Common interface for ExtensionActivity and AssignExtensionOperation.
- * 
- * @author Tammo van Lessen (University of Stuttgart)
- */
-public interface ExtensibleElement {
-
-	Element getNestedElement();
-
-}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleRuntime.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleRuntime.java b/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleRuntime.java
deleted file mode 100644
index 2ddf3ac..0000000
--- a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleRuntime.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.ode.bpel.extension;
-
-public interface ExtensionBundleRuntime {
-
-	String getNamespaceURI();
-
-	void registerExtensionActivities();
-
-	ExtensionOperation getExtensionOperationInstance(String localName)
-			throws InstantiationException, IllegalAccessException;
-
-}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleValidation.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleValidation.java b/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleValidation.java
deleted file mode 100644
index f12cf14..0000000
--- a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionBundleValidation.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.apache.ode.bpel.extension;
-
-import javax.xml.namespace.QName;
-import java.util.Map;
-
-/**
- * Compile-time validation of extensions implemented by your bundle.
- */
-public interface ExtensionBundleValidation {
-
-	Map<QName, ExtensionValidator> getExtensionValidators();
-
-}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionOperation.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionOperation.java b/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionOperation.java
deleted file mode 100644
index da1c930..0000000
--- a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionOperation.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.extension;
-
-import org.apache.ode.bpel.common.FaultException;
-import org.w3c.dom.Element;
-
-/**
- * This is the basis interface for implementations of
- * <code>&lt;extensionAssignOperation&gt;</code> and
- * <code>&lt;extensionActivity&gt;</code> nodes.
- * 
- * Implementations of this interface must provide a default constructor as they
- * are created using reflection.
- * 
- * @see AbstractExtensionBundle
- * 
- * @author Tammo van Lessen (University of Stuttgart)
- */
-public interface ExtensionOperation {
-
-	/**
-	 * Provides the runtime implementation.
-	 * 
-	 * <strong>Note:</strong> This method MAY run concurrently. Since Xerces'
-	 * DOM implementation is not thread-safe, please make sure to synchronize
-	 * the access to <code>element</code> if necessary.
-	 * 
-	 * @param context
-	 *            injected ExtensionContext
-	 * @param element
-	 *            the extension element (child of <code>extensionActivity</code>
-	 *            or <code>extensionAssignOperation</code>
-	 * @throws FaultException
-	 */
-	void run(Object context, Element element) throws FaultException;
-
-}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionValidator.java
----------------------------------------------------------------------
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionValidator.java b/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionValidator.java
deleted file mode 100644
index 5159c1b..0000000
--- a/bpel-api/src/main/java/org/apache/ode/bpel/extension/ExtensionValidator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.extension;
-
-import org.apache.ode.bpel.extension.ExtensibleElement;
-
-/**
- * Interface that allows Ode extensions to validate an extension element's
- * content during compilation.
- * 
- * @author Tammo van Lessen (University of Stuttgart)
- */
-public interface ExtensionValidator {
-
-	/**
-	 * 
-	 * @param compilerContext
-	 * @param element
-	 */
-	void validate(Object compilerContext, ExtensibleElement element);
-
-}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java
index 91a6384..79cf3eb 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/AssignGenerator.java
@@ -33,7 +33,6 @@ import org.apache.ode.bpel.compiler.bom.PartnerLinkVal;
 import org.apache.ode.bpel.compiler.bom.PropertyVal;
 import org.apache.ode.bpel.compiler.bom.To;
 import org.apache.ode.bpel.compiler.bom.VariableVal;
-import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.obj.DebugInfo;
 import org.apache.ode.bpel.obj.OActivity;
 import org.apache.ode.bpel.obj.OAssign;
@@ -51,6 +50,7 @@ import javax.xml.namespace.QName;
  * Generates code for <code>&lt;assign&gt;</code> activities.
  *
  * @author Maciej Szefler ( m s z e f l e r @ g m a i l . c o m )
+ * @author Tammo van Lessen (University of Stuttgart)
  */
 class AssignGenerator extends DefaultActivityGenerator {
     private static final Logger __log = LoggerFactory.getLogger(AssignGenerator.class);
@@ -113,11 +113,6 @@ class AssignGenerator extends DefaultActivityGenerator {
 								.errUndeclaredExtensionAssignOperation()
 								.setSource(sop));
 					}
-					ExtensionValidator validator = _context
-							.getExtensionValidator(DOMUtils.getElementQName(el));
-					if (validator != null) {
-						validator.validate(_context, sop);
-					}
 					oext.setExtensionName(DOMUtils.getElementQName(el));
 					oext.setNestedElement(DOMUtils.domToString(el));
 					oassign.getOperations().add(oext);

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelC.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelC.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelC.java
index 71cb107..9436838 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelC.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelC.java
@@ -38,7 +38,6 @@ import org.apache.ode.bpel.compiler.api.CompileListener;
 import org.apache.ode.bpel.compiler.api.SourceLocation;
 import org.apache.ode.bpel.compiler.bom.BpelObjectFactory;
 import org.apache.ode.bpel.compiler.bom.Process;
-import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.obj.OProcess;
 import org.apache.ode.bpel.obj.OProcessWrapper;
 import org.apache.ode.bpel.obj.serde.DeSerializer;
@@ -73,8 +72,6 @@ public class BpelC {
     private Map<String,Object> _compileProperties;
     private boolean _dryRun = false;
 
-    private Map<QName, ExtensionValidator> _extensionValidators;
-
     public static BpelC newBpelCompiler() {
         return new BpelC();
     }
@@ -255,9 +252,6 @@ public class BpelC {
                 if (_compileProperties.get(PROCESS_CUSTOM_PROPERTIES) != null)
                     compiler.setCustomProperties((Map<QName, Node>) _compileProperties.get(PROCESS_CUSTOM_PROPERTIES));
             }
-            if (_extensionValidators != null) {
-            	compiler.setExtensionValidators(_extensionValidators);
-            }
         } catch (CompilationException ce) {
             this.invalidate();
             throw ce;
@@ -528,13 +522,4 @@ public class BpelC {
             }
         }
     }
-
-    /**
-     * Registers extension validators to eventually validate the content of extensibility
-     * elements. 
-     * @param extensionValidators
-     */
-    public void setExtensionValidators(Map<QName, ExtensionValidator> extensionValidators) {
-        _extensionValidators = extensionValidators;
-    }
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
index a1545ee..b29580a 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/BpelCompiler.java
@@ -82,7 +82,6 @@ import org.apache.ode.bpel.compiler.bom.TerminationHandler;
 import org.apache.ode.bpel.compiler.bom.Variable;
 import org.apache.ode.bpel.compiler.wsdl.Definition4BPEL;
 import org.apache.ode.bpel.compiler.wsdl.WSDLFactory4BPEL;
-import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.obj.DebugInfo;
 import org.apache.ode.bpel.obj.OActivity;
 import org.apache.ode.bpel.obj.OAssign;
@@ -185,7 +184,6 @@ public abstract class BpelCompiler implements CompilerContext {
     private URI _processURI;
 
     private final Set<String> _declaredExtensionNS = new HashSet<String>();
-	private Map<QName, ExtensionValidator> _extensionValidators = new HashMap<QName, ExtensionValidator>();
 
     BpelCompiler(WSDLFactory4BPEL wsdlFactory) {
         _wsdlFactory = wsdlFactory;
@@ -1668,9 +1666,6 @@ public abstract class BpelCompiler implements CompilerContext {
 
 		_declaredExtensionNS.add(ext.getNamespaceURI());
 		_oprocess.getDeclaredExtensions().add(oextension);
-		if (ext.isMustUnderstand()) {
-			_oprocess.getMustUnderstandExtensions().add(oextension);
-		}
 
 		if (__log.isDebugEnabled())
 			__log.debug("Compiled extension " + oextension);
@@ -1752,19 +1747,10 @@ public abstract class BpelCompiler implements CompilerContext {
         registerExpressionLanguage(expLangUri, (ExpressionCompiler) cls.newInstance());
     }
 
-    public void setExtensionValidators(
-			Map<QName, ExtensionValidator> extensionValidators) {
-		_extensionValidators = extensionValidators;
-	}
-
 	public boolean isExtensionDeclared(String namespace) {
 		return _declaredExtensionNS.contains(namespace);
 	}
 
-	public ExtensionValidator getExtensionValidator(QName extensionElementName) {
-		return _extensionValidators.get(extensionElementName);
-	}
-
     public List<OActivity> getActivityStack() {
         ArrayList<OActivity> rval = new ArrayList<OActivity>(_structureStack._stack);
         Collections.reverse(rval);

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/ExtensionActivtityGenerator.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/ExtensionActivtityGenerator.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/ExtensionActivtityGenerator.java
index 22d949b..25b298a 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/ExtensionActivtityGenerator.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/ExtensionActivtityGenerator.java
@@ -22,7 +22,6 @@ import org.apache.ode.bpel.compiler.api.CompilationException;
 import org.apache.ode.bpel.compiler.bom.Activity;
 import org.apache.ode.bpel.compiler.bom.CompositeActivity;
 import org.apache.ode.bpel.compiler.bom.ExtensionActivity;
-import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.obj.OActivity;
 import org.apache.ode.bpel.obj.OExtensionActivity;
 import org.apache.ode.utils.DOMUtils;
@@ -41,7 +40,7 @@ public class ExtensionActivtityGenerator extends DefaultActivityGenerator {
 	public void compile(OActivity output, Activity srcx) {
 		ExtensionActivity src = (ExtensionActivity) srcx;
 		OExtensionActivity oactivity = (OExtensionActivity) output;
-		Element child = src.getFirstExtensibilityElementElement();
+		Element child = src.getFirstExtensibilityElement();
 		try {
 			if (child == null) {
 				throw new CompilationException(
@@ -51,11 +50,7 @@ public class ExtensionActivtityGenerator extends DefaultActivityGenerator {
 				throw new CompilationException(__cmsgs
 						.errUndeclaredExtensionActivity().setSource(src));
 			}
-			ExtensionValidator validator = _context
-					.getExtensionValidator(DOMUtils.getElementQName(child));
-			if (validator != null) {
-				validator.validate(_context, src);
-			}
+			
 			oactivity.setExtensionName(DOMUtils.getElementQName(child));
 			oactivity.setNestedElement(DOMUtils.domToString(child));
 

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/api/CompilerContext.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/api/CompilerContext.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/api/CompilerContext.java
index 83467df..457bdb0 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/api/CompilerContext.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/api/CompilerContext.java
@@ -29,7 +29,6 @@ import javax.xml.transform.Source;
 import org.apache.ode.bpel.compiler.bom.Activity;
 import org.apache.ode.bpel.compiler.bom.Expression;
 import org.apache.ode.bpel.compiler.bom.ScopeLikeActivity;
-import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.obj.OActivity;
 import org.apache.ode.bpel.obj.OExpression;
 import org.apache.ode.bpel.obj.OLValueExpression;
@@ -147,9 +146,7 @@ public interface CompilerContext {
 
     Map<URI, Source> getSchemaSources();
 
-	boolean isExtensionDeclared(String namespace);
-
-	ExtensionValidator getExtensionValidator(QName extensionElementName);
+    boolean isExtensionDeclared(String namespace);
 
     /**
      * Retrieves the base URI that the BPEL Process execution contextis running relative to.

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/AssignActivity.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/AssignActivity.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/AssignActivity.java
index 1c890aa..8c436f4 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/AssignActivity.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/AssignActivity.java
@@ -27,6 +27,9 @@ import org.w3c.dom.Element;
  * BOM representation of the BPEL <code>&lt;assign&gt;</code> activity. The
  * <code>&lt;assign&gt;</code> activity is simply a collection of
  * <code>&lt;copy&gt;</code> entries ({@link Copy}).
+ * 
+ * @author Ode team
+ * @author Tammo van Lessen (University of Stuttgart)
  */
 public class AssignActivity extends Activity {
 

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObject.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObject.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObject.java
index d479265..b300db6 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObject.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/BpelObject.java
@@ -130,7 +130,7 @@ public class BpelObject implements SourceLocation {
         return e.getElement();
     }
 
-    public Element getFirstExtensibilityElementElement() {
+    public Element getFirstExtensibilityElement() {
         Element child = null;
         NodeList nl = getElement().getChildNodes();
         for (int i = 0; i < nl.getLength(); ++i) {

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
index b838e98..8f87d57 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensibilityQNames.java
@@ -31,8 +31,6 @@ public abstract class ExtensibilityQNames {
     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");
 
-
-
     //
     // External variables
     //
@@ -46,5 +44,10 @@ public abstract class ExtensibilityQNames {
     /** Attribute holding the name of the "related" variable. */
     public static final QName EXTVAR_RELATED = new QName(EXTVAR_NS, "relates-to");
 
+    public static final String NS_BPEL_EXTENSIBILITY = "http://ode.apache.org/bpelExtensibility";
+    	
+    public static final QName UNKNOWN_EO_FAULT_NAME = new QName(NS_BPEL_EXTENSIBILITY, "unknownExtensionOperation");
+    	
+    public static final QName INVALID_EXTENSION_ELEMENT = new QName(NS_BPEL_EXTENSIBILITY, "invalidExtensionElement");
 }
 

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionActivity.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionActivity.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionActivity.java
index 78c5d87..575f401 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionActivity.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionActivity.java
@@ -22,7 +22,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.w3c.dom.Element;
-import org.apache.ode.bpel.extension.ExtensibleElement;
 
 /**
  * BOM representation of the BPEL <code>&lt;extensionActivity&gt;</code>
@@ -35,16 +34,15 @@ import org.apache.ode.bpel.extension.ExtensibleElement;
  * 
  * @author Tammo van Lessen (University of Stuttgart)
  */
-public class ExtensionActivity extends CompositeActivity implements
-		ExtensibleElement {
+public class ExtensionActivity extends CompositeActivity {
 	private Activity _childActivity;
 
 	public ExtensionActivity(Element el) {
 		super(el);
 		_childActivity = null;
-		Element child = getFirstExtensibilityElementElement();
+                Element child = getFirstExtensibilityElement();
 		if (child != null) {
-			_childActivity = new Activity(getFirstExtensibilityElementElement());
+        	    _childActivity = new Activity(getFirstExtensibilityElement());
 		}
 	}
 
@@ -97,8 +95,4 @@ public class ExtensionActivity extends CompositeActivity implements
 		return _childActivity.getChildren(Activity.class);
 	}
 
-	public Element getNestedElement() {
-		return getFirstExtensibilityElementElement();
-	}
-
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionAssignOperation.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionAssignOperation.java b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionAssignOperation.java
index 6a18cdf..9356618 100644
--- a/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionAssignOperation.java
+++ b/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ExtensionAssignOperation.java
@@ -19,7 +19,6 @@
 package org.apache.ode.bpel.compiler.bom;
 
 import org.apache.ode.bpel.compiler.bom.AssignActivity.AssignOperation;
-import org.apache.ode.bpel.extension.ExtensibleElement;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -29,8 +28,7 @@ import org.w3c.dom.NodeList;
  * 
  * @author Tammo van Lessen (University of Stuttgart)
  */
-public class ExtensionAssignOperation extends BpelObject implements
-		AssignOperation, ExtensibleElement {
+public class ExtensionAssignOperation extends BpelObject implements AssignOperation {
 	private Element _childElement;
 
 	public ExtensionAssignOperation(Element el) {
@@ -38,15 +36,12 @@ public class ExtensionAssignOperation extends BpelObject implements
 	}
 
 	public Element getNestedElement() {
-		// XXX
-		// return getFirstExtensibilityElement();
 		if (_childElement == null) {
 			NodeList nl = getElement().getChildNodes();
 			for (int i = 0; i < nl.getLength(); ++i) {
 				Node node = nl.item(i);
-				if (node.getNodeType() == Node.ELEMENT_NODE
-						&& !Bpel20QNames.NS_WSBPEL2_0.equals(node
-								.getNamespaceURI())) {
+	            if (node.getNodeType() == Node.ELEMENT_NODE && 
+	            		!Bpel20QNames.NS_WSBPEL2_0.equals(node.getNamespaceURI())) {
 					_childElement = (Element) node;
 					break;
 				}

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler/XPathTest.java
----------------------------------------------------------------------
diff --git a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler/XPathTest.java b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler/XPathTest.java
index df00dac..429783e 100644
--- a/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler/XPathTest.java
+++ b/bpel-compiler/src/test/java/org/apache/ode/bpel/compiler/XPathTest.java
@@ -44,7 +44,6 @@ import org.apache.ode.bpel.elang.xpath10.compiler.XPath10ExpressionCompilerBPEL2
 import org.apache.ode.bpel.elang.xpath10.compiler.XPath10ExpressionCompilerBPEL20Draft;
 import org.apache.ode.bpel.elang.xpath20.compiler.XPath20ExpressionCompilerBPEL20;
 import org.apache.ode.bpel.elang.xpath20.compiler.XPath20ExpressionCompilerBPEL20Draft;
-import org.apache.ode.bpel.extension.ExtensionValidator;
 import org.apache.ode.bpel.obj.OActivity;
 import org.apache.ode.bpel.obj.OElementVarType;
 import org.apache.ode.bpel.obj.OExpression;
@@ -305,9 +304,5 @@ class MockCompilerContext implements CompilerContext {
 
     public boolean isExtensionDeclared(String namespace) {
 		return false;
-	}
-
-	public ExtensionValidator getExtensionValidator(QName extensionElementName) {
-		return null;
-	}
+    }
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java
----------------------------------------------------------------------
diff --git a/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java b/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java
index abfc50f..a828086 100644
--- a/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java
+++ b/bpel-epr/src/main/java/org/apache/ode/il/config/OdeConfigProperties.java
@@ -112,10 +112,8 @@ public class OdeConfigProperties {
 
     public static final String DEFAULT_CLUSTERING_IMPL_CLASS_NAME = "org.apache.ode.clustering.hazelcast.HazelcastClusterImpl";
 
-    public static final String PROP_EXTENSION_BUNDLES_RT = "extension.bundles.runtime";
+    public static final String PROP_EXTENSION_BUNDLES = "extension.bundles";
     
-    public static final String PROP_EXTENSION_BUNDLES_VAL = "extension.bundles.validation";
-
     private File _cfgFile;
 
     private String _prefix;
@@ -388,11 +386,7 @@ public class OdeConfigProperties {
         return Integer.valueOf(getProperty(PROP_MIGRATION_TRANSACTION_TIMEOUT, String.valueOf(0)));
     }
 
-    public String getExtensionActivityBundlesRT() {
-	return getProperty(PROP_EXTENSION_BUNDLES_RT);
-    }
-
-    public String getExtensionActivityBundlesValidation() {
-	return getProperty(PROP_EXTENSION_BUNDLES_VAL);
+    public String getExtensionActivityBundles() {
+    	return getProperty(PROP_EXTENSION_BUNDLES);
     }
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OProcess.java
----------------------------------------------------------------------
diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OProcess.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OProcess.java
index d8f0e67..b4a3d2a 100644
--- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OProcess.java
+++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/OProcess.java
@@ -94,8 +94,6 @@ public class OProcess extends OBase  implements Serializable{
 	
 	/** All declared extensions in the process. **/
 	private static final String DECLAREDEXTENSIONS = "declaredExtensions";
-	/** All must-understand extensions in the process. **/
-	private static final String MUSTUNDERSTANDEXTENSIONS = "mustUnderstandExtensions";
 	
 	/**
 	 * This constructor should only be used by Jackson when deserialize.
@@ -119,7 +117,6 @@ public class OProcess extends OBase  implements Serializable{
 		setXslSheets(new HashMap<URI, OXslSheet>());
 		
 		setDeclaredExtensions(new HashSet<OExtension>());
-		setMustUnderstandExtensions(new HashSet<OExtension>());
 		
 		setChildIdCounter(0);
 	}
@@ -138,7 +135,6 @@ public class OProcess extends OBase  implements Serializable{
 		getXsdTypes().clear();
 		getXslSheets().clear();
 		getDeclaredExtensions().clear();
-		getMustUnderstandExtensions().clear();
 	}
 
 	@Override
@@ -329,13 +325,6 @@ public class OProcess extends OBase  implements Serializable{
 				.get(DECLAREDEXTENSIONS);
 	}
 	
-	@SuppressWarnings("unchecked")
-	@JsonIgnore
-	public Set<OExtension> getMustUnderstandExtensions() {
-		return (Set<OExtension>) fieldContainer
-				.get(MUSTUNDERSTANDEXTENSIONS);
-	}
-
 	public void setAllPartnerLinks(Set<OPartnerLink> allPartnerLinks) {
 		if (getAllPartnerLinks() == null) {
 			fieldContainer.put(ALLPARTNERLINKS, allPartnerLinks);
@@ -429,12 +418,6 @@ public class OProcess extends OBase  implements Serializable{
 		}
 	}
 	
-	public void setMustUnderstandExtensions(Set<OExtension> extensions) {
-		if (getMustUnderstandExtensions() == null) {
-			fieldContainer.put(MUSTUNDERSTANDEXTENSIONS, extensions);
-		}
-	}
-
 	private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{
 		ois.defaultReadObject();
 		fieldContainer.remove(NAMESPACECONTEXT);

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
----------------------------------------------------------------------
diff --git a/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java b/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
index 5212a13..64248a3 100644
--- a/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
+++ b/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
@@ -26,13 +26,12 @@ import javax.xml.namespace.QName;
 
 import org.apache.ode.bpel.o.OScope.Variable;
 import org.apache.ode.utils.DOMUtils;
-import org.apache.ode.utils.SerializableElement;
 import org.w3c.dom.Document;
 
 public class OAssign extends OActivity {
     static final long serialVersionUID = -1L  ;
 
-    public final List<OAssignOperation> operations = new ArrayList<OAssignOperation>();
+    public final List<Copy> copy = new ArrayList<Copy>();
 
     public OAssign(OProcess owner, OActivity parent) {
         super(owner, parent);
@@ -42,26 +41,11 @@ public class OAssign extends OActivity {
     public String toString() {
         return "{OAssign : " + name + ", joinCondition=" + joinCondition + "}";
     }
-    
-    /** 
-     * Base class for assign operations.
-     */
-    public static abstract class OAssignOperation extends OBase {
-		private static final long serialVersionUID = -3042873658302758854L;
-
-		public enum Type { Copy, ExtensionOperation }
-
-    	public OAssignOperation(OProcess owner) {
-    		super(owner);
-    	}
-    	
-    	public abstract Type getType();
-    }
 
     /**
      * Assignmenet copy entry, i.e. what the assignment consits of.
      */
-    public static class Copy extends OAssignOperation {
+    public static class Copy extends OBase {
         private static final long serialVersionUID = 1L;
         public LValue to;
         public RValue from;
@@ -84,38 +68,6 @@ public class OAssign extends OActivity {
             to = null;
             from = null;
         }
-        
-        public Type getType() {
-        	return Type.Copy;
-        }
-    }
-    
-    /**
-     * Assignment extension operation entry, i.e. what the assignment consists of.
-     */
-    public static class ExtensionAssignOperation extends OAssignOperation {
-        private static final long serialVersionUID = 1L;
-        public SerializableElement nestedElement;
-        public QName extensionName;
-
-        public ExtensionAssignOperation(OProcess owner) {
-            super(owner);
-        }
-
-        public String toString() {
-            return "{OExtensionAssignOperation; " + nestedElement.getElement().getTagName() + "}";
-        }
-        
-        @Override
-		public void dehydrate() {
-			super.dehydrate();
-			nestedElement = null;
-			extensionName = null;
-		}
-
-        public Type getType() {
-			return Type.ExtensionOperation;
-		}
     }
 
     public interface LValue {
@@ -303,12 +255,8 @@ public class OAssign extends OActivity {
     @Override
     public void dehydrate() {
         super.dehydrate();
-		for (OAssignOperation operation : this.operations) {
-			if (operation.getType().equals(OAssignOperation.Type.Copy)) {
-				((Copy)operation).dehydrate();
-			} else if (operation.getType().equals(OAssignOperation.Type.ExtensionOperation)) {
-				((ExtensionAssignOperation)operation).dehydrate();
-			}
+        for (Copy copy : this.copy) {
+            copy.dehydrate();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
----------------------------------------------------------------------
diff --git a/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java b/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
index 7b95919..717b9e2 100644
--- a/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
+++ b/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
@@ -76,12 +76,6 @@ public class OProcess extends OBase {
 
     public final HashMap<URI, OXslSheet> xslSheets = new HashMap<URI, OXslSheet>();
 
-    /** 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>();
-
     public OProcess(String bpelVersion) {
         super(null);
         this.version = bpelVersion;
@@ -120,12 +114,12 @@ public class OProcess extends OBase {
         return processName;
     }
 
-    @SuppressWarnings("rawtypes")
-	public Collection getExpressionLanguages() {
+    @SuppressWarnings("unchecked")
+    public Collection getExpressionLanguages() {
         throw new UnsupportedOperationException(); // TODO: implement me!
     }
 
-    @SuppressWarnings("rawtypes")
+    @SuppressWarnings("unchecked")
     public List<String> getCorrelators() {
         // MOVED from ProcessSchemaGenerator
         List<String> correlators = new ArrayList<String>();
@@ -192,18 +186,6 @@ public class OProcess extends OBase {
         }
 
     }
-    
-    public static class OExtension extends OBase {
-        static final long serialVersionUID = -1L  ;
-        public String namespaceURI;
-        public boolean mustUnderstand;
-        
-        public OExtension(OProcess process) { super(process); }
-
-        public String toString() {
-            return "{OExtension " + namespaceURI + (mustUnderstand ? " mustUnderstand" : "") + "}";
-        }
-    }
 
     public QName getQName() {
         return new QName(targetNamespace, processName);

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/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 9208136..50def20 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
@@ -51,7 +51,6 @@ import org.apache.ode.bpel.engine.extvar.ExternalVariableManager;
 import org.apache.ode.bpel.evt.ProcessInstanceEvent;
 import org.apache.ode.bpel.explang.ConfigurationException;
 import org.apache.ode.bpel.explang.EvaluationException;
-import org.apache.ode.bpel.extension.ExtensionBundleRuntime;
 import org.apache.ode.bpel.iapi.BpelEngineException;
 import org.apache.ode.bpel.iapi.Endpoint;
 import org.apache.ode.bpel.iapi.EndpointReference;
@@ -131,8 +130,7 @@ public class BpelProcess {
     private ReplacementMap _replacementMap;
     final ProcessConf _pconf;
 
-	Set<String> _mustUnderstandExtensions;
-	Map<String, ExtensionBundleRuntime> _extensionRegistry;
+    Set<String> _mustUnderstandExtensions;
     
     /** {@link MessageExchangeInterceptor}s registered for this process. */
     private final List<MessageExchangeInterceptor> _mexInterceptors = new ArrayList<MessageExchangeInterceptor>();
@@ -591,10 +589,6 @@ public class BpelProcess {
         return routed;
     }
 
-	public void setExtensionRegistry(Map<String, ExtensionBundleRuntime> extensionRegistry) {
-		_extensionRegistry = extensionRegistry;
-	}
-    
     private void setRoles(OProcess oprocess) {
         _partnerRoles = new HashMap<OPartnerLink, PartnerLinkPartnerRoleImpl>();
         _myRoles = new HashMap<OPartnerLink, PartnerLinkMyRoleImpl>();
@@ -966,7 +960,7 @@ public class BpelProcess {
 //            }
             _replacementMap = null;
             _expLangRuntimeRegistry = null;
-	    _extensionRegistry = null;
+            _mustUnderstandExtensions = null;
         }
 
         private void doHydrate() {
@@ -1013,8 +1007,8 @@ public class BpelProcess {
 			_mustUnderstandExtensions = new HashSet<String>();
 			for (OProcess.OExtension extension : _oprocess.getDeclaredExtensions()) {
 				if (extension.isMustUnderstand()) {
-					if (_extensionRegistry.get(extension.getNamespace()) == null) {
-						String msg = __msgs.msgExtensionMustUnderstandError(_pconf.getProcessId(),
+					if (_engine._contexts.extensionRegistry.get(extension.getNamespace()) == null) {
+						String msg = __msgs.msgExtensionMustUnderstandError(_pid,
 								extension.getNamespace());
 						__log.error(msg);
 						throw new BpelEngineException(msg);

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
index 1457a80..939541c 100644
--- a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
+++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
@@ -37,6 +37,7 @@ import org.apache.ode.bpel.common.CorrelationKey;
 import org.apache.ode.bpel.common.CorrelationKeySet;
 import org.apache.ode.bpel.common.FaultException;
 import org.apache.ode.bpel.common.ProcessState;
+import org.apache.ode.bpel.compiler.bom.ExtensibilityQNames;
 import org.apache.ode.bpel.dao.CorrelationSetDAO;
 import org.apache.ode.bpel.dao.CorrelatorDAO;
 import org.apache.ode.bpel.dao.MessageDAO;
@@ -48,6 +49,9 @@ import org.apache.ode.bpel.dao.ProcessInstanceDAO;
 import org.apache.ode.bpel.dao.ScopeDAO;
 import org.apache.ode.bpel.dao.ScopeStateEnum;
 import org.apache.ode.bpel.dao.XmlDataDAO;
+import org.apache.ode.bpel.eapi.AbstractExtensionBundle;
+import org.apache.ode.bpel.eapi.ExtensionContext;
+import org.apache.ode.bpel.eapi.ExtensionOperation;
 import org.apache.ode.bpel.evar.ExternalVariableModule.Value;
 import org.apache.ode.bpel.evar.ExternalVariableModuleException;
 import org.apache.ode.bpel.evt.CorrelationSetWriteEvent;
@@ -60,8 +64,6 @@ import org.apache.ode.bpel.evt.ScopeCompletionEvent;
 import org.apache.ode.bpel.evt.ScopeEvent;
 import org.apache.ode.bpel.evt.ScopeFaultEvent;
 import org.apache.ode.bpel.evt.ScopeStartEvent;
-import org.apache.ode.bpel.extension.ExtensionBundleRuntime;
-import org.apache.ode.bpel.extension.ExtensionOperation;
 import org.apache.ode.bpel.iapi.BpelEngineException;
 import org.apache.ode.bpel.iapi.ContextException;
 import org.apache.ode.bpel.iapi.Endpoint;
@@ -91,6 +93,7 @@ import org.apache.ode.bpel.runtime.PartnerLinkInstance;
 import org.apache.ode.bpel.runtime.Selector;
 import org.apache.ode.bpel.runtime.VariableInstance;
 import org.apache.ode.bpel.runtime.channels.ActivityRecovery;
+import org.apache.ode.bpel.runtime.channels.ExtensionResponse;
 import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.channels.InvokeResponse;
 import org.apache.ode.bpel.runtime.channels.PickResponse;
@@ -1534,17 +1537,66 @@ public class BpelRuntimeContextImpl implements BpelRuntimeContext {
         _forceFlush = true;
     }
 
-	public ExtensionOperation createExtensionActivityImplementation(QName name) {
-		if (name == null) return null;
-        ExtensionBundleRuntime bundle = _bpelProcess._extensionRegistry.get(name.getNamespaceURI());
-        if (bundle == null) {
-            return null;
-        } else {
-            try {
-                return bundle.getExtensionOperationInstance(name.getLocalPart());
-            } catch (Exception e) {
-                return null;
-            }
-        }
+    public void executeExtension(QName extensionId, ExtensionContext context, Element element, ExtensionResponse extResponseChannel) throws FaultException {
+		__log.debug("Execute extension activity");
+		final String extResponseChannelStr = ProcessUtil.exportChannel(extResponseChannel);
+		
+		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(ExtensibilityQNames.UNKNOWN_EO_FAULT_NAME, "Lookup of extension operation " + extensionId + " failed.");
+			} else {
+				// act like <empty> - do nothing
+				completeExtensionExecution(extResponseChannelStr, null);
+				return;
+			}
+		}
+		
+		try {
+			// should be running in a pooled thread
+			ea.run(context, element);
+			completeExtensionExecution(extResponseChannelStr, null);
+		} catch (RuntimeException e) {
+			__log.error("Error during execution of extension activity.", e);
+			completeExtensionExecution(extResponseChannelStr, 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, ExtensionResponse.class).onFailure(t);
+	            }
+	        });
+		} else {
+	        _vpu.inject(new BpelJacobRunnable() {
+	            private static final long serialVersionUID = -1L;
+
+	            public void run() {
+	               importChannel(channelId, ExtensionResponse.class).onCompleted();
+	            }
+	        });
+		}
+	}
+
+	private ExtensionOperation createExtensionActivityImplementation(QName name) {
+		if (name == null) {
+			return null;
+		}
+		AbstractExtensionBundle bundle = _bpelProcess._engine._contexts.extensionRegistry.get(name.getNamespaceURI());
+		if (bundle == null) {
+			return null;
+		} else {
+			try {
+				return (ExtensionOperation)bundle.getExtensionOperationInstance(name.getLocalPart());
+			} catch (Exception e) {
+				return null;
+			}
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
index ffb805c..9344e84 100644
--- a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
+++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
@@ -40,11 +40,11 @@ import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
 import org.apache.ode.bpel.dao.DeferredProcessInstanceCleanable;
 import org.apache.ode.bpel.dao.ProcessDAO;
+import org.apache.ode.bpel.eapi.AbstractExtensionBundle;
 import org.apache.ode.bpel.engine.cron.CronScheduler;
 import org.apache.ode.bpel.engine.migration.MigrationHandler;
 import org.apache.ode.bpel.evar.ExternalVariableModule;
 import org.apache.ode.bpel.evt.BpelEvent;
-import org.apache.ode.bpel.extension.ExtensionBundleRuntime;
 import org.apache.ode.bpel.iapi.BindingContext;
 import org.apache.ode.bpel.iapi.BpelEngine;
 import org.apache.ode.bpel.iapi.BpelEngineException;
@@ -176,13 +176,13 @@ public class BpelServerImpl implements BpelServer, Scheduler.JobProcessor {
         }
     }
 
-    public void registerExtensionBundle(ExtensionBundleRuntime bundle) {
-        _contexts.extensionRegistry.put(bundle.getNamespaceURI(), bundle);
-        bundle.registerExtensionActivities();
+    public void registerExtensionBundle(AbstractExtensionBundle bundle) {
+    	_contexts.extensionRegistry.put(bundle.getNamespaceURI(), bundle);
+    	bundle.registerExtensionActivities();
     }
 
     public void unregisterExtensionBundle(String nsURI) {
-        _contexts.extensionRegistry.remove(nsURI);
+    	_contexts.extensionRegistry.remove(nsURI);
     }
 
     public void registerExternalVariableEngine(ExternalVariableModule eve) {
@@ -328,7 +328,6 @@ public class BpelServerImpl implements BpelServer, Scheduler.JobProcessor {
 
             BpelProcess process = createBpelProcess(conf);
             
-            process.setExtensionRegistry(_contexts.extensionRegistry);
             process._classLoader = Thread.currentThread().getContextClassLoader();
 
             _engine.registerProcess(process);

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java
index ce4edd9..0d0ff2f 100644
--- a/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java
+++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java
@@ -21,6 +21,7 @@ package org.apache.ode.bpel.engine;
 
 import org.apache.ode.bpel.clapi.ClusterManager;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
+import org.apache.ode.bpel.eapi.AbstractExtensionBundle;
 import org.apache.ode.bpel.iapi.BindingContext;
 import org.apache.ode.bpel.iapi.BpelEventListener;
 import org.apache.ode.bpel.iapi.EndpointReferenceContext;
@@ -29,7 +30,6 @@ import org.apache.ode.bpel.iapi.Scheduler;
 import org.apache.ode.bpel.intercept.MessageExchangeInterceptor;
 import org.apache.ode.bpel.engine.cron.CronScheduler;
 import org.apache.ode.bpel.evar.ExternalVariableModule;
-import org.apache.ode.bpel.extension.ExtensionBundleRuntime;
 
 import java.util.HashMap;
 import java.util.List;
@@ -70,7 +70,7 @@ public class Contexts {
     
     public CustomProcessProperties customProcessProperties = new CustomProcessProperties(); 
 
-    /** Global extension bundle registry **/
-    final Map<String, ExtensionBundleRuntime> extensionRegistry = new ConcurrentHashMap<String, ExtensionBundleRuntime>();
+    	/** Global extension bundle registry **/
+    final Map<String, AbstractExtensionBundle> extensionRegistry = new ConcurrentHashMap<String, AbstractExtensionBundle>();
 
 }

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
index ca442a0..0881ac0 100644
--- a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
+++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/ASSIGN.java
@@ -18,15 +18,26 @@
  */
 package org.apache.ode.bpel.runtime;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URI;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
 import org.apache.ode.bpel.common.FaultException;
+import org.apache.ode.bpel.compiler.bom.ExtensibilityQNames;
+import org.apache.ode.bpel.eapi.ExtensionContext;
+import org.apache.ode.bpel.evar.ExternalVariableModuleException;
 import org.apache.ode.bpel.evt.PartnerLinkModificationEvent;
 import org.apache.ode.bpel.evt.ScopeEvent;
 import org.apache.ode.bpel.evt.VariableModificationEvent;
 import org.apache.ode.bpel.explang.EvaluationContext;
 import org.apache.ode.bpel.explang.EvaluationException;
-import org.apache.ode.bpel.extension.ExtensionOperation;
 import org.apache.ode.bpel.obj.OAssign;
 import org.apache.ode.bpel.obj.OAssign.DirectRef;
 import org.apache.ode.bpel.obj.OAssign.LValueExpression;
@@ -37,17 +48,17 @@ import org.apache.ode.bpel.obj.OExpression;
 import org.apache.ode.bpel.obj.OLink;
 import org.apache.ode.bpel.obj.OMessageVarType;
 import org.apache.ode.bpel.obj.OMessageVarType.Part;
-import org.apache.ode.bpel.obj.OProcess;
 import org.apache.ode.bpel.obj.OProcess.OProperty;
 import org.apache.ode.bpel.obj.OScope;
 import org.apache.ode.bpel.obj.OScope.Variable;
+import org.apache.ode.bpel.runtime.channels.ExtensionResponse;
 import org.apache.ode.bpel.runtime.channels.FaultData;
-import org.apache.ode.bpel.runtime.common.extension.ExtensibilityQNames;
-import org.apache.ode.bpel.runtime.common.extension.ExtensionContext;
+import org.apache.ode.jacob.ReceiveProcess;
 import org.apache.ode.utils.DOMUtils;
 import org.apache.ode.utils.Namespaces;
 import org.apache.ode.utils.msg.MessageBundle;
-import org.apache.ode.bpel.evar.ExternalVariableModuleException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -57,17 +68,11 @@ import org.w3c.dom.NodeList;
 import org.w3c.dom.Text;
 import org.xml.sax.SAXException;
 
-import javax.xml.namespace.QName;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Assign activity run-time template.
+ * 
+ * @author Ode team
+ * @author Tammo van Lessen (University of Stuttgart) - extensionAssignOperation
  */
 class ASSIGN extends ACTIVITY {
     private static final long serialVersionUID = 1L;
@@ -82,7 +87,7 @@ class ASSIGN extends ACTIVITY {
     }
 
     public void run() {
-        OAssign oassign = getOAsssign();
+        OAssign oassign = getOAssign();
 
         FaultData faultData = null;
 
@@ -98,7 +103,7 @@ class ASSIGN extends ACTIVITY {
 					if (((OAssign.Copy) operation).isIgnoreMissingFromData()) {
 						if (fault
 								.getQName()
-								.equals(getOAsssign().getOwner().getConstants().getQnSelectionFailure())
+								.equals(getOAssign().getOwner().getConstants().getQnSelectionFailure())
 								&& (fault.getCause() != null && "ignoreMissingFromData"
 										.equals(fault.getCause().getMessage()))) {
 							continue;
@@ -107,7 +112,7 @@ class ASSIGN extends ACTIVITY {
 					if (((OAssign.Copy) operation).isIgnoreUninitializedFromVariable()) {
 						if (fault
 								.getQName()
-								.equals(getOAsssign().getOwner().getConstants().getQnUninitializedVariable())
+								.equals(getOAssign().getOwner().getConstants().getQnUninitializedVariable())
 								&& (fault.getCause() == null || !"throwUninitializedToVariable"
 										.equals(fault.getCause().getMessage()))) {
 							continue;
@@ -139,7 +144,7 @@ class ASSIGN extends ACTIVITY {
         return __log;
     }
 
-    private OAssign getOAsssign() {
+    private OAssign getOAssign() {
         return (OAssign) _self.o;
     }
 
@@ -152,12 +157,12 @@ class ASSIGN extends ACTIVITY {
                 lvar = _scopeFrame.resolve(to.getVariable());
             } catch (RuntimeException e) {
                 __log.error("iid: " + getBpelRuntimeContext().getPid() + " error evaluating lvalue");
-                throw new FaultException(getOAsssign().getOwner().getConstants().getQnSelectionFailure(), e.getMessage());
+                throw new FaultException(getOAssign().getOwner().getConstants().getQnSelectionFailure(), e.getMessage());
             }
             if (lvar == null) {
                 String msg = __msgs.msgEvalException(to.toString(), "Could not resolve variable in current scope");
                 if (__log.isDebugEnabled()) __log.debug(to + ": " + msg);
-                throw new FaultException(getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg);
+                throw new FaultException(getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg);
             }
             if (!napi.isVariableInitialized(lvar)) {
                 Document doc = DOMUtils.newDocument();
@@ -260,16 +265,16 @@ class ASSIGN extends ACTIVITY {
                 String msg = __msgs.msgEvalException(from.toString(), e.getMessage());
                 if (__log.isDebugEnabled()) __log.debug(from + ": " + msg);
                 if (e.getCause() instanceof FaultException) throw (FaultException)e.getCause();
-                throw new FaultException(getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg);
+                throw new FaultException(getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg);
             }
             if (l.size() == 0) {
                 String msg = __msgs.msgRValueNoNodesSelected(expr.toString());
                 if (__log.isDebugEnabled()) __log.debug(from + ": " + msg);
-                throw new FaultException(getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg, new Throwable("ignoreMissingFromData"));
+                throw new FaultException(getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg, new Throwable("ignoreMissingFromData"));
             } else if (l.size() > 1) {
                 String msg = __msgs.msgRValueMultipleNodesSelected(expr.toString());
                 if (__log.isDebugEnabled()) __log.debug(from + ": " + msg);
-                throw new FaultException(getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg);
+                throw new FaultException(getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg);
             }
             retVal = (Node) l.get(0);
         } else if (from instanceof OAssign.Literal) {
@@ -305,7 +310,7 @@ class ASSIGN extends ACTIVITY {
                         if (__log.isDebugEnabled())
                             __log.debug(from + ": " + msg);
                         throw new FaultException(
-                                getOAsssign().getOwner().getConstants().getQnSelectionFailure(),
+                                getOAssign().getOwner().getConstants().getQnSelectionFailure(),
                                 msg);
 
                     }
@@ -320,7 +325,7 @@ class ASSIGN extends ACTIVITY {
                         if (__log.isDebugEnabled())
                             __log.debug(from + ": " + msg);
                         throw new FaultException(
-                                getOAsssign().getOwner().getConstants().getQnSelectionFailure(),
+                                getOAssign().getOwner().getConstants().getQnSelectionFailure(),
                                 msg);
 
                     }
@@ -334,7 +339,7 @@ class ASSIGN extends ACTIVITY {
                 if (__log.isDebugEnabled())
                     __log.debug(from + ": " + msg);
                 throw new FaultException(
-                        getOAsssign().getOwner().getConstants().getQnSelectionFailure(),
+                        getOAssign().getOwner().getConstants().getQnSelectionFailure(),
                         msg);
             }
         } else {
@@ -343,7 +348,7 @@ class ASSIGN extends ACTIVITY {
             if (__log.isErrorEnabled())
                 __log.error(from + ": " + msg);
             throw new FaultException(
-                    getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg);
+                    getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg);
         }
 
         // Now verify we got something.
@@ -352,7 +357,7 @@ class ASSIGN extends ACTIVITY {
             if (__log.isDebugEnabled())
                 __log.debug(from + ": " + msg);
             throw new FaultException(
-                    getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg);
+                    getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg);
         }
 
         // Now check that we got the right thing.
@@ -368,7 +373,7 @@ class ASSIGN extends ACTIVITY {
                     __log.debug(from + ": " + msg);
 
                 throw new FaultException(
-                        getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg);
+                        getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg);
 
         }
 
@@ -625,7 +630,7 @@ class ASSIGN extends ACTIVITY {
                 if (__log.isDebugEnabled())
                     __log.debug(lvaluePtr + ": " + msg);
                 throw new FaultException(
-                        getOAsssign().getOwner().getConstants().getQnSelectionFailure(), msg);
+                        getOAssign().getOwner().getConstants().getQnSelectionFailure(), msg);
         }
 
         return lvalue;
@@ -665,7 +670,7 @@ class ASSIGN extends ACTIVITY {
                 String msg = __msgs.msgEvalException(expression.toString(), e.getMessage());
                 if (__log.isDebugEnabled()) __log.debug(expression + ": " + msg);
                 if (e.getCause() instanceof FaultException) throw (FaultException)e.getCause();
-                throw new FaultException(getOAsssign().getOwner().getConstants().getQnSubLanguageExecutionFault(), msg);
+                throw new FaultException(getOAssign().getOwner().getConstants().getQnSubLanguageExecutionFault(), msg);
             }
         }
 
@@ -673,31 +678,41 @@ class ASSIGN extends ACTIVITY {
     }
 
 	private void invokeExtensionAssignOperation(OAssign.ExtensionAssignOperation eao) throws FaultException {
-        final ExtensionContext context = new ExtensionContextImpl(this, getBpelRuntimeContext());
-
-        try {
-            ExtensionOperation ea = getBpelRuntimeContext().createExtensionActivityImplementation(eao.getExtensionName());
-            if (ea == null) {
-                for (OProcess.OExtension oe : eao.getOwner().getMustUnderstandExtensions()) {
-                    if (eao.getExtensionName().getNamespaceURI().equals(oe.getNamespace())) {
-                        __log.warn("Lookup of extension assign operation " + eao.getExtensionName() + " failed.");
-                        throw new FaultException(ExtensibilityQNames.UNKNOWN_EA_FAULT_NAME, "Lookup of extension assign operation " + eao.getExtensionName() + " failed. No implementation found.");
-                    }
-                }
-                // act like <empty> - do nothing
-                context.complete();
-                return;
-            }
-
-            ea.run(context, DOMUtils.stringToDOM(eao.getNestedElement()));
-        } catch (FaultException fault) {
-            context.completeWithFault(fault);
-        } catch (SAXException e) {
-        	FaultException fault = new FaultException(ExtensibilityQNames.INVALID_EXTENSION_ELEMENT, "The nested element of extension assign operation '" + eao.getExtensionName() + "' is no valid XML.");
-        	context.completeWithFault(fault);
+    	try {
+	    	final ExtensionContext helper = new ExtensionContextImpl(this._scopeFrame, getBpelRuntimeContext());
+	    	final ExtensionResponse responseChannel = newChannel(ExtensionResponse.class);
+
+    		getBpelRuntimeContext().executeExtension(eao.getExtensionName(), helper, DOMUtils.stringToDOM(eao.getNestedElement()), responseChannel);
+
+    		object(new ReceiveProcess() {
+					private static final long serialVersionUID = 1467660715539203917L;
+				}.setChannel(responseChannel).setReceiver(new ExtensionResponse() {
+					private static final long serialVersionUID = 509910466826372712L;
+
+					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(_self.o.getOwner().getConstants().getQnSubLanguageExecutionFault(), _self.o, sw.getBuffer().toString());
+	                    _self.parent.completed(fault, CompensationHandler.emptySet());
+	            	};
+            }));
+
+    	} catch (FaultException fault) {
+            __log.error("Exception while invoking extension assign operation", fault);
+            FaultData faultData = createFault(fault.getQName(), _self.o, fault.getMessage());
+            _self.parent.completed(faultData, CompensationHandler.emptySet());
+    	} catch (SAXException e) {
+    		__log.error("Exception while invoking extension assign operation", e);
+    		FaultData faultData = createFault(ExtensibilityQNames.INVALID_EXTENSION_ELEMENT, _self.o, "The nested element of extension assign operation '" + eao.getExtensionName() + "' is no valid XML.");
+    		_self.parent.completed(faultData, CompensationHandler.emptySet());
 		} catch (IOException e) {
-			FaultException fault = new FaultException(ExtensibilityQNames.INVALID_EXTENSION_ELEMENT, "The nested element of extension assign operation '" + eao.getExtensionName() + "' is no valid XML.");
-			context.completeWithFault(fault);
+			__log.error("Exception while invoking extension assign operation", e);
+			FaultData faultData = createFault(ExtensibilityQNames.INVALID_EXTENSION_ELEMENT, _self.o, "The nested element of extension assign operation '" + eao.getExtensionName() + "' is no valid XML.");
+			_self.parent.completed(faultData, CompensationHandler.emptySet());
 		}
     }
 

http://git-wip-us.apache.org/repos/asf/ode/blob/cf630ce4/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
----------------------------------------------------------------------
diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
index 8aad3ec..30b318a 100644
--- a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
+++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/BpelRuntimeContext.java
@@ -18,28 +18,29 @@
  */
 package org.apache.ode.bpel.runtime;
 
+import java.net.URI;
 import java.util.Collection;
 import java.util.Date;
-import java.net.URI;
 
 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.eapi.ExtensionContext;
+import org.apache.ode.bpel.evar.ExternalVariableModuleException;
 import org.apache.ode.bpel.evt.ProcessInstanceEvent;
-import org.apache.ode.bpel.extension.ExtensionOperation;
+import org.apache.ode.bpel.iapi.ProcessConf.PartnerRoleConfig;
 import org.apache.ode.bpel.obj.OPartnerLink;
 import org.apache.ode.bpel.obj.OProcess;
 import org.apache.ode.bpel.obj.OScope;
 import org.apache.ode.bpel.obj.OScope.Variable;
 import org.apache.ode.bpel.runtime.channels.ActivityRecovery;
+import org.apache.ode.bpel.runtime.channels.ExtensionResponse;
 import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.bpel.runtime.channels.InvokeResponse;
 import org.apache.ode.bpel.runtime.channels.PickResponse;
 import org.apache.ode.bpel.runtime.channels.TimerResponse;
-import org.apache.ode.bpel.evar.ExternalVariableModuleException;
-import org.apache.ode.bpel.iapi.ProcessConf.PartnerRoleConfig;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
@@ -313,12 +314,5 @@ public interface BpelRuntimeContext {
     
     void checkInvokeExternalPermission();
     
-    /**
-     * Create a new extension operation based on the given qualified name.
-     * 
-     * @param name The qualified name for which a corresponding extension operation should be created.
-     * 
-     * @return The created extension operation or NULL if no extension bundle registered a corresponding extension operation for the given qualified name.
-     */
-    ExtensionOperation createExtensionActivityImplementation(QName name);
+    void executeExtension(QName extensionId, ExtensionContext context, Element element, ExtensionResponse extResponseChannel) throws FaultException;
 }