[jboss-svn-commits] JBL Code SVN: r38143 - in labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main: java/org/jboss/soa/esb/services/jbpm5/actions and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jul 18 22:31:38 EDT 2012


Author: tcunning
Date: 2012-07-18 22:31:37 -0400 (Wed, 18 Jul 2012)
New Revision: 38143

Added:
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/AbstractBpm5Action.java
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Callback.java
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/workitem/esb/ESBActionWorkItemHandler.java
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/jbpm5-ds.xml
Modified:
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessType.java
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/deployment.xml
   labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/persistence.xml
Log:
JBESB-3830
Add ESBActionHandler and subsequent Bpm5Callback action.   The ESBActionHandler adds a jbpm 5 handler
which calls an ESB callback action.     The callback action checks whether the process instance and 
the work item itself are still valid, and then completes the workitem, while sending the message's
body items back as results.


Modified: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java	2012-07-19 02:21:57 UTC (rev 38142)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java	2012-07-19 02:31:37 UTC (rev 38143)
@@ -28,10 +28,15 @@
  * @since Version 4.11
  */
 public class ProcessConstants {
+	/* EPR reply/fault */
+	public static final String EPR_REPLY = "reply" ;
+    public static final String EPR_FAULT = "fault" ;
+    public static final String REPLY_TO = "jbpmReplyTo";
+    public static final String FAULT_TO = "jbpmFaultTo";
+
 	
 	/* Process Types */
 	public static final String START_PROCESS_TYPE = "startProcess";
-    public static final String SIGNAL_EVENT_TYPE = "signalEvent";
     public static final String ABORT_PROCESS_INSTANCE_TYPE = "abortProcessInstance";
 
 	/* Events */
@@ -54,4 +59,6 @@
     /* Message context properties */
     public static final String SESSION_ID = "jbpm5-session-id";
     public static final String PROCESS_INSTANCE_ID = "jbpm5-processinstance-id";
+	public static final String WORK_ITEM_ID					= "jbpmWorkItemId";
+
 }

Modified: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessType.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessType.java	2012-07-19 02:21:57 UTC (rev 38142)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessType.java	2012-07-19 02:31:37 UTC (rev 38143)
@@ -30,8 +30,6 @@
 public enum ProcessType {
 	/** startProcess . */
     START_PROCESS(ProcessConstants.START_PROCESS_TYPE),
-    /** signalEvent . */
-    SIGNAL_EVENT(ProcessConstants.SIGNAL_EVENT_TYPE),
     /** abortProcessInstance . */
     ABORT_PROCESS_INSTANCE(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE);
 
@@ -66,5 +64,4 @@
         }
         return null;
     }
-
 }

Added: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/AbstractBpm5Action.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/AbstractBpm5Action.java	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/AbstractBpm5Action.java	2012-07-19 02:31:37 UTC (rev 38143)
@@ -0,0 +1,262 @@
+/*
+ * JBoss, Home of Professinal Open Source
+ * Copyright 2006, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.soa.esb.services.jbpm5.actions;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import javax.naming.InitialContext;
+import javax.transaction.TransactionManager;
+import javax.transaction.UserTransaction;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.apache.log4j.Logger;
+import org.jboss.soa.esb.ConfigurationException;
+import org.jboss.soa.esb.actions.AbstractActionPipelineProcessor;
+import org.jboss.soa.esb.actions.ActionLifecycleException;
+import org.jboss.soa.esb.actions.ActionProcessingException;
+import org.jboss.soa.esb.helpers.ConfigTree;
+import org.jboss.soa.esb.message.Message;
+
+import org.jboss.soa.esb.service.jbpm5.model.ProcessConstants;
+import org.jboss.soa.esb.util.ClassUtil;
+import org.jboss.soa.esb.workitem.esb.ESBActionWorkItemHandler;
+import org.jboss.soa.esb.workitem.esb.ESBServiceWorkItemHandler;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.base.MapGlobalResolver;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+
+import org.drools.persistence.jpa.JPAKnowledgeService;
+
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.KnowledgeRuntime;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.conf.ClockTypeOption;
+import org.drools.runtime.process.WorkItemHandler;
+
+import org.drools.runtime.StatefulKnowledgeSession;
+
+/**
+ * The Bpm5Processor processes an action on a single JBPM process.
+ *  
+ * @author <a href="mailto:tcunning at redhat.com">tcunning at redhat.com</a>
+ * @since Version 4.11
+ */
+public abstract class AbstractBpm5Action extends AbstractActionPipelineProcessor {
+    protected ConfigTree configTree;
+    protected Logger logger;
+    
+    /* Defaults are HornetQ default settings to match the BRMS defaults */
+    public static final String DEFAULT_HANDLER_CLASS = "org.jbpm.task.service.hornetq.CommandBasedHornetQWSHumanTaskHandler";
+    public static final String DEFAULT_HANDLER_HOST = "127.0.0.1";
+    public static final String DEFAULT_HANDLER_PORT = "5446";
+    
+    private UserTransaction emfUserTransaction;
+    
+    protected String entityFactoryName;
+    
+    protected String processDefName;
+
+    /* Handler settings */
+    protected String handlerClass;
+    protected String handlerHost;
+    protected String handlerPort;
+    
+    protected KnowledgeBuilder kbuilder;
+    protected Environment kenvironment;
+    protected KnowledgeSessionConfiguration config;
+    protected KnowledgeBase kbase;
+            
+	public AbstractBpm5Action(ConfigTree configTree, Logger logger) throws ConfigurationException
+	{
+		this.configTree = configTree;
+		this.logger = logger;
+
+		this.entityFactoryName = configTree.getAttribute(ProcessConstants.ENTITY_FACTORY_NAME, "jbpm5Persistence.jpa");
+		
+        this.processDefName = configTree.getRequiredAttribute(ProcessConstants.PROCESS_DEFINITION_NAME);
+
+		this.handlerClass = configTree.getAttribute(ProcessConstants.PROCESS_HANDLER_CLASS, DEFAULT_HANDLER_CLASS);
+		this.handlerHost = configTree.getAttribute(ProcessConstants.PROCESS_HANDLER_HOST, DEFAULT_HANDLER_HOST);
+		this.handlerPort = configTree.getAttribute(ProcessConstants.PROCESS_HANDLER_PORT, DEFAULT_HANDLER_PORT);
+	}
+	
+	@Override
+	public void initialise() throws ActionLifecycleException
+	{
+        kenvironment = getEnvironment(new HashMap<String, Object>());
+        Properties properties = new Properties();
+        properties.put("drools.processInstanceManagerFactory","org.jbpm.persistence.processinstance.JPAProcessInstanceManagerFactory");
+        properties.put("drools.processSignalManagerFactory","org.jbpm.persistence.processinstance.JPASignalManagerFactory");
+        config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(properties);
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add(ResourceFactory.newClassPathResource(processDefName), ResourceType.BPMN2);
+        kbase = kbuilder.newKnowledgeBase();
+	}
+	
+    /**
+     * Verify that the process action matches one of the valid process action values.
+     * @param processAction process action
+     * @throws ConfigurationException 
+     */
+    public void verifyProcessAction(String processAction) throws ConfigurationException 
+    {
+    	if ((ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE.equals(processAction)) ||
+    		(ProcessConstants.START_PROCESS_TYPE.equals(processAction))) {
+    		return;
+    	} else {
+    		throw new ConfigurationException("Process action " + processAction +
+    			"does not match valid process actions (" + 
+    			ProcessConstants.START_PROCESS_TYPE + ", " +
+    			ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE + ")");
+    	}
+    			
+    }
+
+	public WorkItemHandler getHandler(StatefulKnowledgeSession session) throws ClassNotFoundException,
+		NoSuchMethodException, IllegalAccessException, InstantiationException,
+		InvocationTargetException {
+		Class handlerKlass = ClassUtil.forName(handlerClass, AbstractBpm5Action.class);
+		WorkItemHandler wih = (WorkItemHandler) handlerKlass.getDeclaredConstructor(KnowledgeRuntime.class).newInstance(session);
+		return wih;
+	}
+	
+	public void connectHandler(WorkItemHandler wih) 
+	    throws ClassNotFoundException, InstantiationException, NoSuchMethodException, IllegalAccessException,
+	    InvocationTargetException {
+		Class handlerKlass = ClassUtil.forName(handlerClass, AbstractBpm5Action.class);
+		Method connectionMethod = handlerKlass.getMethod("setConnection", String.class, Integer.TYPE);
+		connectionMethod.invoke(wih, handlerHost, Integer.valueOf(handlerPort));
+				
+		Method connectMethod = handlerKlass.getMethod("connect");
+		connectMethod.invoke(wih);
+	}
+	
+	public StatefulKnowledgeSession getSession(Message message) throws ActionProcessingException {
+	    StatefulKnowledgeSession ksession ;
+	    WorkItemHandler khandler;
+	    
+		int sessionId = getSessionId(message);
+		if (sessionId >= 0) {
+			ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId, kbase, config, kenvironment );		
+		} else {		
+			ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, config, kenvironment );
+		}
+		try {
+			khandler = getHandler(ksession);
+		} catch (Exception e) {
+			throw new ActionProcessingException(e);
+		}
+
+        // Register ESB WorkItemHandler as well
+		ESBServiceWorkItemHandler esbhandler = new ESBServiceWorkItemHandler();
+		ESBActionWorkItemHandler actionhandler = new ESBActionWorkItemHandler();
+		ksession.getWorkItemManager().registerWorkItemHandler("JBossESB", esbhandler);
+		ksession.getWorkItemManager().registerWorkItemHandler("ESBAction", actionhandler);
+		ksession.getWorkItemManager().registerWorkItemHandler("Human Task", khandler);
+
+		try {
+			connectHandler(khandler);
+		} catch (Exception e) {
+			throw new ActionProcessingException(e);
+		}
+		return ksession;
+	}
+
+	protected abstract int getSessionId(Message msg) throws ActionProcessingException ;
+	
+    /** 
+     * Return a knowledge session configuration.
+     * @param props
+     * @return
+     */
+    public static KnowledgeSessionConfiguration getSessionConfiguration(Properties props) {
+        KnowledgeSessionConfiguration ksess = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(props);
+        ksess.setOption(ClockTypeOption.get(org.drools.ClockType.REALTIME_CLOCK.getId()));
+        return ksess;
+    }
+    
+    /**
+     * Returns an environment with an entity manager factory, transaction manager, and user 
+     * transaction configured.
+     * @param overrides
+     * @return
+     */
+    public Environment getEnvironment(Map<String, Object> overrides) {
+    	Environment env = KnowledgeBaseFactory.newEnvironment();
+    	
+    	emfUserTransaction= getUserTransaction();
+    	EntityManagerFactory emf = Persistence.createEntityManagerFactory(entityFactoryName);
+    	if ((entityFactoryName != null) && (!"".equals(entityFactoryName))) {
+        	logger.info("Setting entityManager");
+            env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);  
+            env.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
+            env.set(EnvironmentName.TRANSACTION_MANAGER, getTransactionManager());
+            env.set(EnvironmentName.TRANSACTION, emfUserTransaction);
+    	}
+        return env;
+    }
+
+    /**
+     * Gets the user transaction from JNDI.
+     * @return
+     */
+    public static UserTransaction getUserTransaction()   {     
+    	UserTransaction ut  = null;
+    	try {
+    		InitialContext ic = new InitialContext();     
+    		ut  = (UserTransaction) ic.lookup("UserTransaction");
+    		if (ut == null) throw new IllegalStateException("JNDI lookup of user transaction failed.");     
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    		throw new IllegalStateException("JNDI lookup of user transaction failed.");
+    	}
+    	return ut; 
+    }
+    
+    /**
+     * Gets the transaction manager from JNDI.
+     * @return 
+     */
+    public static TransactionManager getTransactionManager()   {     
+    	TransactionManager tm  = null;
+    	try {
+    		InitialContext ic = new InitialContext();     
+    		tm  = (TransactionManager) ic.lookup("java:/TransactionManager");
+    		if (tm == null) throw new IllegalStateException("JNDI lookup of transaction manager failed.");     
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    		throw new IllegalStateException("JNDI lookup of transaction manager failed.");
+    	}
+    	return tm; 
+    }
+}

Added: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Callback.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Callback.java	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Callback.java	2012-07-19 02:31:37 UTC (rev 38143)
@@ -0,0 +1,111 @@
+package org.jboss.soa.esb.services.jbpm5.actions;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jboss.internal.soa.esb.addressing.helpers.EPRHelper;
+import org.jboss.soa.esb.ConfigurationException;
+import org.jboss.soa.esb.MarshalException;
+import org.jboss.soa.esb.actions.ActionProcessingException;
+import org.jboss.soa.esb.addressing.EPR;
+import org.jboss.soa.esb.addressing.PortReference;
+import org.jboss.soa.esb.helpers.ConfigTree;
+import org.jboss.soa.esb.message.Body;
+import org.jboss.soa.esb.message.Message;
+import org.jboss.soa.esb.service.jbpm5.model.ProcessConstants;
+
+import org.apache.log4j.Logger;
+
+import org.drools.KnowledgeBase;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemManager;
+
+import org.drools.runtime.process.ProcessInstance;
+
+import org.drools.runtime.StatefulKnowledgeSession;
+
+public class Bpm5Callback extends AbstractBpm5Action {
+    protected static Logger logger = Logger.getLogger(Bpm5Callback.class);
+
+    public static final String JBPM_CALL_BACK_SERVICE_NAME = "JBpm5CallbackService";
+    
+	public Bpm5Callback(ConfigTree configTree) throws ConfigurationException {
+	    super(configTree, logger) ;
+	}
+
+	public Message process(Message message) throws ActionProcessingException {					
+		// Retriever workItemId / processInstanceId from the EPR
+		EPR toEpr = message.getHeader().getCall().getTo();
+		PortReference portRef = toEpr.getAddr();
+        Long workItemId  = Long.parseLong(portRef.getExtensionValue(ProcessConstants.WORK_ITEM_ID));
+        Long processInstanceId = Long.parseLong(portRef.getExtensionValue(ProcessConstants.PROCESS_INSTANCE_ID));	
+        
+        final StatefulKnowledgeSession ksession = getSession(message);
+		// Check to make sure the Process is still active
+		ProcessInstance pi = ksession.getProcessInstance(processInstanceId);
+		if (pi == null) {
+			throw new ActionProcessingException("Could not find process for processInstanceId " 
+					+ processInstanceId);
+		} else if (ProcessInstance.STATE_ACTIVE != pi.getState()) {
+			throw new ActionProcessingException("Process " + processInstanceId + " was found "
+					+ "in state " + pi.getState() + ", not " + ProcessInstance.STATE_ACTIVE);
+		}
+		
+		WorkItemManager workItemManager = (WorkItemManager) ksession.getWorkItemManager();
+		WorkItem workItem = workItemManager.getWorkItem(workItemId);
+		if ((workItem == null) || (workItem.getState() != WorkItem.PENDING)) {
+            throw new ActionProcessingException("WorkItem " + workItemId + " is no longer active");
+		}
+		
+		Map<String,Object> results = new HashMap<String,Object>();
+		for (String name : message.getBody().getNames()) {
+			results.put(name, message.getBody().get(name));
+		}
+		workItemManager.completeWorkItem(workItemId, results);
+		
+		return null;
+	}
+	
+	/**
+	 * Return the session id from the context id.
+	 * @param msg
+	 * @return
+	 */
+	public int getSessionId(Message msg) {
+		int id = -1;
+
+		EPR toEpr = msg.getHeader().getCall().getTo();
+        PortReference portRef = toEpr.getAddr();
+        
+        String sessionId = portRef.getExtensionValue(ProcessConstants.SESSION_ID);
+        if (sessionId != null) {
+            try {
+                id = Integer.parseInt(sessionId);
+            } catch (final NumberFormatException nfe) {
+            }
+        }
+
+		try {
+			if (msg.getBody().get(ProcessConstants.SESSION_ID) != null) {
+				id = Integer.parseInt((String)msg.getBody().get(ProcessConstants.SESSION_ID));
+			}
+		} catch (Exception e) {
+		}
+		
+		if (id == -1) {
+			try {
+				id = ((Integer)msg.getContext().getContext(ProcessConstants.SESSION_ID)).intValue();
+			} catch (Exception e) {
+			}
+		}
+		
+		if (id == -1) {
+			try {
+				id = ((Integer)msg.getProperties().getProperty(ProcessConstants.SESSION_ID)).intValue();
+			} catch(Exception e) {
+			}
+		}
+		
+		return id;		
+	}	
+}

Modified: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java	2012-07-19 02:21:57 UTC (rev 38142)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java	2012-07-19 02:31:37 UTC (rev 38143)
@@ -21,29 +21,19 @@
  */
 package org.jboss.soa.esb.services.jbpm5.actions;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashMap;
 import java.util.Map;
-import java.util.Properties;
-import javax.naming.InitialContext;
-import javax.transaction.NotSupportedException;
-import javax.transaction.TransactionManager;
-import javax.transaction.UserTransaction;
-import javax.persistence.EntityManagerFactory;
-import javax.transaction.HeuristicMixedException;
-import javax.persistence.Persistence;
-import javax.transaction.RollbackException;
-import javax.transaction.SystemException;
 import javax.crypto.SealedObject;
 
 import org.apache.log4j.Logger;
+import org.jboss.internal.soa.esb.addressing.helpers.EPRHelper;
 import org.jboss.internal.soa.esb.assertion.AssertArgument;
 import org.jboss.soa.esb.ConfigurationException;
-import org.jboss.soa.esb.actions.ActionLifecycle;
-import org.jboss.soa.esb.actions.ActionLifecycleException;
-import org.jboss.soa.esb.common.ModulePropertyManager;
+import org.jboss.soa.esb.MarshalException;
+import org.jboss.soa.esb.actions.ActionProcessingException;
+import org.jboss.soa.esb.addressing.Call;
+import org.jboss.soa.esb.addressing.EPR;
 import org.jboss.soa.esb.helpers.ConfigTree;
+import org.jboss.soa.esb.message.Body;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.services.security.SecurityContext;
 import org.jboss.soa.esb.services.security.SecurityService;
@@ -51,73 +41,34 @@
 
 import org.jboss.soa.esb.service.jbpm5.model.ProcessType;
 import org.jboss.soa.esb.service.jbpm5.model.ProcessConstants;
-import org.jboss.soa.esb.util.ClassUtil;
-import org.jboss.soa.esb.workitem.esb.ESBServiceWorkItemHandler;
-import org.jbpm.process.workitem.wsht.CommandBasedWSHumanTaskHandler;
 
-import org.drools.KnowledgeBase;
-import org.drools.KnowledgeBaseFactory;
-import org.drools.agent.KnowledgeAgent;
-import org.drools.base.MapGlobalResolver;
-import org.drools.builder.KnowledgeBuilder;
-import org.drools.builder.KnowledgeBuilderFactory;
-
-import org.drools.builder.ResourceType;
-import org.drools.impl.EnvironmentFactory;
-import org.drools.io.ResourceFactory;
-import org.drools.logger.KnowledgeRuntimeLogger;
-import org.drools.logger.KnowledgeRuntimeLoggerFactory;
-
-import org.drools.persistence.jpa.JPAKnowledgeService;
-
-import org.drools.runtime.Environment;
-import org.drools.runtime.EnvironmentName;
-import org.drools.runtime.KnowledgeRuntime;
-import org.drools.runtime.KnowledgeSessionConfiguration;
-import org.drools.runtime.conf.ClockTypeOption;
 import org.drools.runtime.process.ProcessInstance;
-import org.drools.runtime.process.WorkItemHandler;
 
 import org.drools.runtime.StatefulKnowledgeSession;
 
-import com.arjuna.common.util.propertyservice.PropertyManager;
-
 /**
  * The Bpm5Processor processes an action on a single JBPM process.
  *  
  * @author <a href="mailto:tcunning at redhat.com">tcunning at redhat.com</a>
  * @since Version 4.11
  */
-public class Bpm5Processor implements ActionLifecycle {
-    protected ConfigTree configTree;
-    private static Logger logger = Logger.getLogger(Bpm5Processor.class);
+public class Bpm5Processor extends AbstractBpm5Action {
+    protected static Logger logger = Logger.getLogger(Bpm5Processor.class);
+
+    protected String processId;    
+    protected String processAction;
     
-    /* Defaults are HornetQ default settings to match the BRMS defaults */
-    private static final String DEFAULT_HANDLER_CLASS = "org.jbpm.task.service.hornetq.CommandBasedHornetQWSHumanTaskHandler";
-    private static final String DEFAULT_HANDLER_HOST = "127.0.0.1";
-    private static final String DEFAULT_HANDLER_PORT = "5446";
-    
-    private UserTransaction emfUserTransaction;
-    
-    private String entityFactoryName;
-    private String processDefName;
-    private String processId;
-    private String processAction;
-    
-    /* Handler settings */
-    private String handlerClass;
-    private String handlerHost;
-    private String handlerPort;
-    
-    KnowledgeBuilder kbuilder;
-    KnowledgeBase kbase;
-    private Environment kenvironment;
-    private KnowledgeSessionConfiguration config;
-    private StatefulKnowledgeSession ksession = null;
-    private KnowledgeRuntimeLogger klogger;
-    private WorkItemHandler khandler;
-        
-    
+	public Bpm5Processor(ConfigTree configTree) throws ConfigurationException
+	{
+	    super(configTree, logger) ;
+
+        this.processId = configTree.getRequiredAttribute(ProcessConstants.PROCESS_ID);
+
+		// verify the process action
+		this.processAction = configTree.getRequiredAttribute(ProcessConstants.PROCESS_ACTION);
+		verifyProcessAction(processAction);
+	}
+	
     /**
      * Verify that the process action matches one of the valid process action values.
      * @param processAction process action
@@ -125,96 +76,19 @@
      */
     public void verifyProcessAction(String processAction) throws ConfigurationException 
     {
-    	if ((ProcessConstants.SIGNAL_EVENT_TYPE.equals(processAction)) ||
-    		(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE.equals(processAction)) ||
+    	if ((ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE.equals(processAction)) ||
     		(ProcessConstants.START_PROCESS_TYPE.equals(processAction))) {
     		return;
     	} else {
     		throw new ConfigurationException("Process action " + processAction +
     			"does not match valid process actions (" + 
     			ProcessConstants.START_PROCESS_TYPE + ", " +
-    			ProcessConstants.SIGNAL_EVENT_TYPE + ", " +
     			ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE + ")");
     	}
     			
     }
-    
-	public Bpm5Processor(ConfigTree configTree) throws ConfigurationException
-	{
-		this.configTree = configTree;
-
-		this.processDefName = configTree.getRequiredAttribute(ProcessConstants.PROCESS_DEFINITION_NAME);
-		this.processId = configTree.getRequiredAttribute(ProcessConstants.PROCESS_ID);
-		this.entityFactoryName = configTree.getAttribute(ProcessConstants.ENTITY_FACTORY_NAME, "jbpm5Persistence");
-
-		this.handlerClass = configTree.getAttribute(ProcessConstants.PROCESS_HANDLER_CLASS, DEFAULT_HANDLER_CLASS);
-		this.handlerHost = configTree.getAttribute(ProcessConstants.PROCESS_HANDLER_HOST, DEFAULT_HANDLER_HOST);
-		this.handlerPort = configTree.getAttribute(ProcessConstants.PROCESS_HANDLER_PORT, DEFAULT_HANDLER_PORT);
-		
-		// verify the process action
-		this.processAction = configTree.getRequiredAttribute(ProcessConstants.PROCESS_ACTION);
-		verifyProcessAction(processAction);
-		
-		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-		kbuilder.add(ResourceFactory.newClassPathResource(processDefName), ResourceType.BPMN2);
-		kbase = kbuilder.newKnowledgeBase();
-		
-		kenvironment = getEnvironment(new HashMap<String, Object>());
-		Properties properties = new Properties();
-		properties.put("drools.processInstanceManagerFactory","org.jbpm.persistence.processinstance.JPAProcessInstanceManagerFactory");
-		properties.put("drools.processSignalManagerFactory","org.jbpm.persistence.processinstance.JPASignalManagerFactory");
-		config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(properties);
-	}
-
-	public WorkItemHandler getHandler(StatefulKnowledgeSession session) throws ClassNotFoundException,
-		NoSuchMethodException, IllegalAccessException, InstantiationException,
-		InvocationTargetException {
-		Class handlerKlass = ClassUtil.forName(handlerClass, Bpm5Processor.class);
-		WorkItemHandler wih = (WorkItemHandler) handlerKlass.getDeclaredConstructor(KnowledgeRuntime.class).newInstance(session);
-		return wih;
-	}
 	
-	public void connectHandler(WorkItemHandler wih) 
-	    throws ClassNotFoundException, InstantiationException, NoSuchMethodException, IllegalAccessException,
-	    InvocationTargetException {
-		Class handlerKlass = ClassUtil.forName(handlerClass, Bpm5Processor.class);
-		Method connectionMethod = handlerKlass.getMethod("setConnection", String.class, Integer.TYPE);
-		connectionMethod.invoke(wih, handlerHost, Integer.valueOf(handlerPort));
-				
-		Method connectMethod = handlerKlass.getMethod("connect");
-		connectMethod.invoke(wih);
-	}
-	
-	public Message process(Message message) throws ConfigurationException {		
-		
-		int sessionId = getSessionId(message);
-		if ((ksession == null) || (sessionId < 0) || (ksession.getId() != sessionId)) {
-			if (sessionId >= 0) {
-				ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId, kbase, config, kenvironment );		
-			} else {		
-				ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, config, kenvironment );
-				sessionId = ksession.getId();
-			}
-		
-			klogger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession, "test", 1000);
-		}
-		try {
-			khandler = getHandler(ksession);
-		} catch (Exception e) {
-			throw new ConfigurationException(e);
-		}
-
-        // Register ESB WorkItemHandler as well
-		ESBServiceWorkItemHandler esbhandler = new ESBServiceWorkItemHandler();
-		ksession.getWorkItemManager().registerWorkItemHandler("JBossESB", esbhandler);
-		ksession.getWorkItemManager().registerWorkItemHandler("Human Task", khandler);
-
-		try {
-			connectHandler(khandler);
-		} catch (Exception e) {
-			throw new ConfigurationException(e);
-		}
-			
+	public Message process(Message message) throws ActionProcessingException {
 		// Add security context to message context.
 		addSecurityContext(message);
 		// Add authentication request context to message context.
@@ -224,38 +98,23 @@
         ProcessInstance processInstance = null;
 				
 		ProcessType processType = ProcessType.fromAction((String)processAction);
+		
+	    final StatefulKnowledgeSession ksession = getSession(message);
+	    int sessionId = ksession.getId();
 		switch (processType) {
 			case START_PROCESS:
 				logger.info(ProcessConstants.START_PROCESS_TYPE);				
 				Map<String, Object> params = BpmParameterMapper.mapPropertiesToParams(message, configTree);
-				if (params.size() > 0) {
-	                processInstance = ksession.startProcess(processId, params);
-	            } else {
-	                processInstance = ksession.startProcess(processId);
-	            }
-				processInstanceId = Long.valueOf(processInstance.getId());				
-				
-                break;
-		    case SIGNAL_EVENT:
-				logger.info(ProcessConstants.SIGNAL_EVENT_TYPE);
-				Map<String, Object> eventParams = BpmParameterMapper.mapPropertiesToParams(message, configTree);
-				try {
-					eventParams.remove(ProcessConstants.PROCESS_EVENT);
-					eventParams.put(ProcessConstants.PROCESS_EVENT, message.getProperties().getProperty(ProcessConstants.PROCESS_EVENT));
-				} catch (Exception e) {					
-				}
-				
-                String processEventType = (String) message.getProperties().getProperty(ProcessConstants.PROCESS_EVENT_TYPE);
-                processInstanceId = getProcessInstanceId(message);
+				params.put(ProcessConstants.SESSION_ID, Integer.toString(sessionId));
+	            processInstance = ksession.startProcess(processId, params);
+	            processInstanceId = Long.valueOf(processInstance.getId());				
 
-	            if (processInstanceId != null) {
-	                ksession.signalEvent(processEventType, eventParams, processInstanceId.longValue());
-	            } else {
-	                throw new ConfigurationException(ProcessConstants.SIGNAL_EVENT_TYPE 
-	                    + ": tried to abort and process id was null");
-	            }
-                break;
+	            final Call call = message.getHeader().getCall() ;
+	            setEPR(message.getBody(), ProcessConstants.REPLY_TO, getEPR(call.getReplyTo())) ;
+	            setEPR(message.getBody(), ProcessConstants.FAULT_TO, getEPR(call.getFaultTo())) ;
 
+	            
+                break;
 	        case ABORT_PROCESS_INSTANCE:
 				logger.info(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE);
                 processInstanceId = getProcessInstanceId(message);
@@ -263,10 +122,15 @@
                 if (processInstanceId != null) {
 	                ksession.abortProcessInstance(processInstanceId.longValue());
                 } else {
-	                throw new ConfigurationException(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE 
+	                throw new ActionProcessingException(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE 
 	                    + ": tried to abort and process id was null");
 	            }
-				break;
+
+                final Call abortCall = message.getHeader().getCall() ;
+                setEPR(message.getBody(), ProcessConstants.REPLY_TO, getEPR(abortCall.getReplyTo())) ;
+                setEPR(message.getBody(), ProcessConstants.FAULT_TO, getEPR(abortCall.getFaultTo())) ;
+
+                break;
 		}
 		
 		// Set Session and ProcessInstance information
@@ -337,78 +201,30 @@
         {
             message.getContext().setContext(SecurityService.AUTH_REQUEST, encryptedAuthRequest);
         }
-    }
+    }    
     
-    /** 
-     * Return a knowledge session configuration.
-     * @param props
-     * @return
-     */
-    public static KnowledgeSessionConfiguration getSessionConfiguration(Properties props) {
-        KnowledgeSessionConfiguration ksess = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(props);
-        ksess.setOption(ClockTypeOption.get(org.drools.ClockType.REALTIME_CLOCK.getId()));
-        return ksess;
+    private void setEPR(final Body body, final String name, final String value)
+    {
+        if (value == null)
+        {
+            body.remove(name) ;
+        }
+        else
+        {
+            body.add(name, value) ;
+        }
     }
     
-    /**
-     * Returns an environment with an entity manager factory, transaction manager, and user 
-     * transaction configured.
-     * @param overrides
-     * @return
-     */
-    public Environment getEnvironment(Map<String, Object> overrides) {
-    	Environment env = KnowledgeBaseFactory.newEnvironment();
-    	
-    	emfUserTransaction= getUserTransaction();
-    	EntityManagerFactory emf = Persistence.createEntityManagerFactory("jbpm5Persistence.jpa");
-    	if ((entityFactoryName != null) && (!"".equals(entityFactoryName))) {
-        	logger.info("Setting entityManager");
-            env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);  
-            env.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
-            env.set(EnvironmentName.TRANSACTION_MANAGER, getTransactionManager());
-            env.set(EnvironmentName.TRANSACTION, emfUserTransaction);
-    	}
-        return env;
-    }
-
-    /**
-     * Gets the user transaction from JNDI.
-     * @return
-     */
-    public static UserTransaction getUserTransaction()   {     
-    	UserTransaction ut  = null;
-    	try {
-    		InitialContext ic = new InitialContext();     
-    		ut  = (UserTransaction) ic.lookup("UserTransaction");
-    		if (ut == null) throw new IllegalStateException("JNDI lookup of user transaction failed.");     
-    	} catch (Exception e) {
-    		e.printStackTrace();
-    		throw new IllegalStateException("JNDI lookup of user transaction failed.");
-    	}
-    	return ut; 
-    }
-    
-    /**
-     * Gets the transaction manager from JNDI.
-     * @return 
-     */
-    public static TransactionManager getTransactionManager()   {     
-    	TransactionManager tm  = null;
-    	try {
-    		InitialContext ic = new InitialContext();     
-    		tm  = (TransactionManager) ic.lookup("java:/TransactionManager");
-    		if (tm == null) throw new IllegalStateException("JNDI lookup of transaction manager failed.");     
-    	} catch (Exception e) {
-    		e.printStackTrace();
-    		throw new IllegalStateException("JNDI lookup of transaction manager failed.");
-    	}
-    	return tm; 
-    }
-    
-    public void initialise() throws ActionLifecycleException {
-    }
-
-    public void destroy() throws ActionLifecycleException {
-    }
-
+	private String getEPR(final EPR epr)
+	{
+		if (epr == null) {
+			return null ;
+		}
+		
+		try {
+			return EPRHelper.toXMLString(epr) ;
+		} catch (final MarshalException me) {
+			throw new IllegalArgumentException("Failed to marshall epr", me) ;
+		}
+	}	
 }

Added: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/workitem/esb/ESBActionWorkItemHandler.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/workitem/esb/ESBActionWorkItemHandler.java	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/java/org/jboss/soa/esb/workitem/esb/ESBActionWorkItemHandler.java	2012-07-19 02:31:37 UTC (rev 38143)
@@ -0,0 +1,263 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.soa.esb.workitem.esb;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+
+import org.jboss.internal.soa.esb.addressing.helpers.EPRHelper;
+import org.jboss.internal.soa.esb.util.LRUCache;
+import org.jboss.soa.esb.addressing.EPR;
+import org.jboss.soa.esb.addressing.PortReference;
+import org.jboss.soa.esb.addressing.eprs.LogicalEPR;
+import org.jboss.soa.esb.addressing.MalformedEPRException;
+import org.jboss.soa.esb.client.ServiceInvoker;
+import org.jboss.soa.esb.couriers.Courier;
+import org.jboss.soa.esb.couriers.CourierException;	
+import org.jboss.soa.esb.couriers.CourierFactory;
+import org.jboss.soa.esb.couriers.CourierUtil;
+import org.jboss.soa.esb.listeners.message.MessageDeliverException;
+import org.jboss.soa.esb.message.Body;
+import org.jboss.soa.esb.message.Message;
+import org.jboss.soa.esb.message.format.MessageFactory;
+
+import org.jboss.soa.esb.service.jbpm5.model.ProcessConstants;
+
+public class ESBActionWorkItemHandler implements WorkItemHandler {
+
+    public static final String REPLY_TO                     = "jbpmReplyTo";
+    public static final String FAULT_TO                     = "jbpmFaultTo";
+    public static final String ESB_MESSAGE_ID               = "jbpmEsbMessageId";
+
+	public static final String PROCESS_ID                   = "jbpmProcessId";
+	public static final String PROCESS_SCOPE_ATTR 			= "process-scope";
+
+    public String replyToOriginator;
+    public String esbCategoryName;
+    public String esbServiceName;
+    public String jbpmSessionId;
+    public String callbackCategoryName;
+    public String callbackServiceName;
+    
+    public Boolean globalProcessScope;
+
+    public String exceptionTransition;
+
+    public Integer millisToWaitForResponse;
+
+    private transient Logger logger = Logger.getLogger(ESBActionWorkItemHandler.class);
+    private static transient LRUCache<String, ServiceInvoker> siCache = new LRUCache<String, ServiceInvoker>(20);
+    
+    public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+
+    	esbCategoryName = (String) workItem.getParameter("ServiceCategory");
+    	esbServiceName = (String) workItem.getParameter("ServiceName");
+    	jbpmSessionId = (String) workItem.getParameter("jbpm5-session-id");
+        callbackCategoryName = (String) workItem.getParameter("CallbackServiceCategory");
+        callbackServiceName = (String) workItem.getParameter("CallbackServiceName");
+    	
+        if (replyToOriginator != null) {
+            if (!(ProcessConstants.EPR_REPLY.equals(replyToOriginator) 
+            		|| ProcessConstants.EPR_FAULT.equals(replyToOriginator))) {            	
+            	logger.error("EPR type (replyToOriginator) must be \"" 
+            			+ ProcessConstants.EPR_REPLY + "\" or \"" 
+            			+ ProcessConstants.EPR_FAULT + "\"");
+            }
+        } else {
+            if (null == esbCategoryName)
+            	logger.error("Service category (ServiceCategory element) must not be null");
+            if (null == esbServiceName)
+            	logger.error("Service name (ServiceName element) must not be null");
+        }
+    	
+        Message message = MessageFactory.getInstance().getMessage();
+        Body body = message.getBody();
+        body.add("");
+
+        Map<String,Object> parameters = (Map<String,Object>)workItem.getParameters();
+        if (parameters != null) {
+            for (Map.Entry<String,Object> entry : parameters.entrySet()) {
+                body.add((String)entry.getKey(), entry.getValue());
+            }
+        }
+
+        EPR replyTo = createReplyTo(workItem, manager);
+        message.getHeader().getCall().setReplyTo(replyTo);
+        if (exceptionTransition!=null) {
+        	// Set the replyTo to the JBpmCallback Service
+            EPR faultTo = createFaultTo(workItem, manager);
+            message.getHeader().getCall().setFaultTo(faultTo);
+        }
+        
+        if (isReplyToOrFaultToSet(workItem))
+        {
+            setRelatesToMessageId(workItem, message);
+        }
+        
+        //Sending the message on its way
+        if (logger.isDebugEnabled()) logger.debug("Created ESB message=" + message);
+        
+        if (replyToOriginator != null) {
+            EPR epr = null;
+            final Object replyToEPR = workItem.getParameters().get(REPLY_TO);
+            final Object faultToEPR = workItem.getParameters().get(FAULT_TO);
+
+            if (ProcessConstants.EPR_FAULT.equals(replyToOriginator) && (faultToEPR != null)) {
+            	try {
+            		epr = EPRHelper.fromXMLString(faultToEPR.toString()) ;
+            	} catch (org.jboss.soa.esb.UnmarshalException ue) {
+            		logger.error("Could not create FaultToEPR");
+            	}
+            } else if (replyToEPR != null) {
+            	try {
+            		epr = EPRHelper.fromXMLString(replyToEPR.toString()) ;
+            	} catch (org.jboss.soa.esb.UnmarshalException ue) {
+            		logger.error("Could not create ReplyToEPR");
+            	}
+            } 
+                        
+            if(epr instanceof LogicalEPR) {
+            	try {
+            		final ServiceInvoker invoker = ((LogicalEPR)epr).getServiceInvoker();
+                    invoker.deliverAsync(message);
+            	} catch (MessageDeliverException mde) {
+            		logger.error("Could not retrieve/deliverAsync LogicalEPR with ServiceInvoker", mde);
+            	}
+            } else {
+            	Courier courier = null;
+                try {
+                    courier = CourierFactory.getCourier(epr);
+                	courier.deliver(message);
+                } catch (CourierException ce) {
+                	logger.error("Could not deliver message with courier", ce);
+                } catch (MalformedEPRException mee) {
+                	logger.error("MalformedEPR " + epr, mee);
+                } finally {
+                	if (courier != null) {
+                		CourierUtil.cleanCourier(courier);
+                	}
+                }
+            }
+        } else {
+        	try {
+        		getServiceInvoker().deliverAsync(message);
+        	} catch (MessageDeliverException mde) {
+        		logger.error("Could not deliver message", mde);
+            	manager.abortWorkItem(workItem.getId());
+        	}
+        }
+        logger.debug("Message send successfully");        
+    }
+
+    public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+    }
+    
+    /**
+     * Caches the most recently used ServiceInvokers.
+     * 
+     * @return a ServiceInvoker for the current esbService and esbCategoryName.
+     * @throws MessageDeliverException
+     */
+    private ServiceInvoker getServiceInvoker() throws MessageDeliverException
+    {
+        String key = esbCategoryName + esbServiceName;
+        final ServiceInvoker origInvoker = siCache.get(key) ;
+        if (origInvoker != null) {
+            return origInvoker;
+        } else {
+            System.setProperty("javax.xml.registry.ConnectionFactoryClass","org.apache.ws.scout.registry.ConnectionFactoryImpl");
+
+            ServiceInvoker invoker = new ServiceInvoker(esbCategoryName,  esbServiceName);
+            siCache.put(key, invoker);
+            return invoker;
+        }
+    }
+    
+    /**
+     * Setup the replyTo for the CallBack Service.
+     * 
+     * Creates or increments a process-node-version-counter whose name is related to 
+     * the current node ID. The name of the counter is jbpmProcessNodeVersionCounter<NodeId>.
+     * The counter is added to the ProcessVariable Map (global to the ProcessInstance) 
+     * on the jBPM side The same variable should be added to the 
+     * EsbMessage before it is passed onto the ESB. Other parameters added
+     * are the returnVariable mapping, the nodeId and the tokenId.
+     * 
+     * @param returnVars - XML fragment from the processdefinition.xml describing
+     * the mapping of ESB Message objects to the jBPM variableMap.
+     * @param executionContext of the currently invoked EsbActionHandler.
+     * @return the replyTo EPR of the JBpmCallbackService.
+     */
+    protected EPR createReplyTo(WorkItem workItem, WorkItemManager manager)
+    {
+        EPR replyTo = new LogicalEPR(callbackCategoryName, callbackServiceName);
+        PortReference portReference = replyTo.getAddr();
+        if (globalProcessScope != null) {
+            portReference.addExtension(PROCESS_SCOPE_ATTR, globalProcessScope.toString());
+        }
+        
+        String workItemId = String.valueOf(workItem.getId());
+        portReference.addExtension(ProcessConstants.WORK_ITEM_ID, workItemId);
+        portReference.addExtension(ProcessConstants.SESSION_ID, jbpmSessionId);
+        portReference.addExtension(ProcessConstants.PROCESS_INSTANCE_ID, String.valueOf(workItem.getProcessInstanceId()));
+        return replyTo;
+    }
+    
+    /**
+     * Sets the faultTo EPR. This way jBPM can handle a failure in the ESB service by taking a 
+     * exception (faultTo) transition.
+     * @param returnVars - XML fragment from the processdefinition.xml describing
+     * the mapping of ESB Message objects to the jBPM variableMap.
+     * @param executionContext of the currently invoked EsbActionHandler.
+     * @return the faultTo EPR of the JBpmCallbackService.
+     */
+    protected EPR createFaultTo(WorkItem workItem, WorkItemManager manager)
+    {
+        EPR faultTo = createReplyTo(workItem, manager);
+        if (!exceptionTransition.equals("condition")) {
+            String workItemId = String.valueOf(workItem.getId());
+
+        	PortReference portReference = faultTo.getAddr();
+            portReference.addExtension(ProcessConstants.WORK_ITEM_ID, workItemId);
+            portReference.addExtension(ProcessConstants.SESSION_ID, jbpmSessionId);
+            portReference.addExtension(ProcessConstants.PROCESS_INSTANCE_ID, String.valueOf(workItem.getProcessInstanceId()));
+        }
+        return faultTo;
+    }
+    
+    public static boolean isReplyToOrFaultToSet(final WorkItem workItem)
+    {
+        return workItem.getParameter(REPLY_TO) != null || workItem.getParameter(FAULT_TO) != null;
+    }
+    
+    public static void setRelatesToMessageId(final WorkItem workItem, final Message message)
+    {
+        final URI esbMessageId = (URI) workItem.getParameter(ESB_MESSAGE_ID);
+        message.getHeader().getCall().setRelatesTo(esbMessageId);
+    }
+}

Modified: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/deployment.xml
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/deployment.xml	2012-07-19 02:21:57 UTC (rev 38142)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/deployment.xml	2012-07-19 02:31:37 UTC (rev 38143)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?><jbossesb-deployment>
   <depends>jboss.esb:deployment=jbossesb.esb</depends>
-  <depends>jboss.jca:name=DefaultDS,service=DataSourceBinding</depends>
+  <depends>jboss.jca:name=Jbpm5DS,service=DataSourceBinding</depends>
 </jbossesb-deployment>

Modified: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/persistence.xml	2012-07-19 02:21:57 UTC (rev 38142)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/META-INF/persistence.xml	2012-07-19 02:31:37 UTC (rev 38143)
@@ -10,7 +10,7 @@
 
   <persistence-unit name="jbpm5Persistence.jpa" transaction-type="JTA">
     <provider>org.hibernate.ejb.HibernatePersistence</provider>
-    <jta-data-source>java:/DefaultDS</jta-data-source>
+    <jta-data-source>java:/Jbpm5DS</jta-data-source>
 
     <mapping-file>META-INF/ProcessInstanceInfo.hbm.xml</mapping-file>
     <mapping-file>META-INF/JBPMorm.xml</mapping-file>
@@ -18,7 +18,7 @@
     <class>org.drools.persistence.info.SessionInfo</class>
     <class>org.drools.persistence.info.WorkItemInfo</class>
     <properties> 
-         <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+         <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
          <property name="hibernate.hbm2ddl.auto" value="update"/>
          <!-- for AS5 -->
          <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />

Added: labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/jbpm5-ds.xml
===================================================================
--- labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/jbpm5-ds.xml	                        (rev 0)
+++ labs/jbossesb/branches/JBESB_4_11_CP/product/services/jbpm5/src/main/resources/jbpm5-ds.xml	2012-07-19 02:31:37 UTC (rev 38143)
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<datasources>
+<!--
+   <xa-datasource>
+         <jndi-name>Jbpm5DS</jndi-name>
+         <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
+         <track-connection-by-tx/>
+         <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
+         <xa-datasource-property name="URL">jdbc:h2:${jboss.server.data.dir}${/}h2${/}jbpm5DB;MVCC=TRUE</xa-datasource-property>
+         <xa-datasource-property name="User">sa</xa-datasource-property>
+         <xa-datasource-property name="Password"></xa-datasource-property>
+         <min-pool-size>5</min-pool-size>
+         <max-pool-size>20</max-pool-size>
+         <idle-timeout-minutes>0</idle-timeout-minutes>
+         <prepared-statement-cache-size>32</prepared-statement-cache-size>
+         <depends>jboss:service=h2,database=jbpm5DB</depends>
+   </xa-datasource>
+-->
+   <local-tx-datasource>
+         <jndi-name>Jbpm5DS</jndi-name>
+         <connection-url>jdbc:h2:${jboss.server.data.dir}${/}h2${/}jbpm5DB;MVCC=TRUE</connection-url>
+         <driver-class>org.h2.Driver</driver-class>
+         <user-name>sa</user-name>
+         <password/>
+         <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
+         <min-pool-size>5</min-pool-size>
+         <max-pool-size>20</max-pool-size>
+         <idle-timeout-minutes>0</idle-timeout-minutes>
+         <prepared-statement-cache-size>32</prepared-statement-cache-size>
+         <depends>jboss:service=h2,database=jbpm5DB</depends>
+   </local-tx-datasource>
+   <mbean code="org.jboss.internal.soa.esb.dependencies.H2Database"
+        name="jboss:service=h2,database=jbpm5DB">
+        <attribute name="Database">jbpm5DB</attribute>
+		<attribute name="DataDir">${jboss.server.data.dir}</attribute>
+   </mbean>
+</datasources>



More information about the jboss-svn-commits mailing list