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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Apr 3 00:00:57 EDT 2012


Author: tcunning
Date: 2012-04-03 00:00:56 -0400 (Tue, 03 Apr 2012)
New Revision: 37978

Added:
   labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/JBPMorm.xml
   labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/persistence.xml
   labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/hibernate.cfg.xml
   labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/jBPM-ds.xml
Modified:
   labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java
   labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java
   labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/deployment.xml
Log:
JBESB-3761
Implement persistence with bpm5processor action.


Modified: labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java	2012-04-03 03:58:48 UTC (rev 37977)
+++ labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/service/jbpm5/model/ProcessConstants.java	2012-04-03 04:00:56 UTC (rev 37978)
@@ -37,14 +37,16 @@
 	/* Events */
     public static final String PROCESS_EVENT_TYPE = "processEventType";
     public static final String PROCESS_EVENT = "processEvent";
-    
-    
+        
     /* Tags */
     public static final String PROCESS_DEFINITION_NAME = "process-definition-name";
     public static final String PROCESS_ID = "process-id";
     public static final String PROCESS_COMMAND = "command";
     public static final String PROCESS_ACTION = "process-action";
     public static final String ESB_TO_BPM_PARAMS = "esbToBpmParams";
-    
-    public static final String PROCESS_INSTANCE_ID = "processInstanceId";
+    public static final String ENTITY_FACTORY_NAME = "entityFactoryName";
+
+    /* Message context properties */
+    public static final String SESSION_ID = "jbpm5-session-id";
+    public static final String PROCESS_INSTANCE_ID = "jbpm5-processinstance-id";
 }

Modified: labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java	2012-04-03 03:58:48 UTC (rev 37977)
+++ labs/jbossesb/trunk/product/services/jbpm5/src/main/java/org/jboss/soa/esb/services/jbpm5/actions/Bpm5Processor.java	2012-04-03 04:00:56 UTC (rev 37978)
@@ -1,5 +1,5 @@
 /*
- * JBoss, Home of Professional Open Source
+ * 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.
@@ -24,7 +24,15 @@
 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;
@@ -55,6 +63,8 @@
 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.KnowledgeSessionConfiguration;
@@ -71,58 +81,22 @@
 public class Bpm5Processor implements ActionLifecycle {
     protected ConfigTree configTree;
     private static Logger logger = Logger.getLogger(Bpm5Processor.class);
+    private UserTransaction emfUserTransaction;
     
+    private String entityFactoryName;
     private String processDefName;
     private String processId;
     private String processAction;
     
     KnowledgeBuilder kbuilder;
     KnowledgeBase kbase;
-    private KnowledgeAgent kagent;
     private Environment kenvironment;
-    private KnowledgeSessionConfiguration ksessionConfig;
-
-    private StatefulKnowledgeSession ksession;
+    private KnowledgeSessionConfiguration config;
+    private StatefulKnowledgeSession ksession = null;
     private KnowledgeRuntimeLogger klogger;
-
     private CommandBasedWSHumanTaskHandler khandler;
-    
-    public void initialise() throws ActionLifecycleException {
-    }
-
-    public void destroy() throws ActionLifecycleException {
-        if (ksession != null) {
-            try {
-                ksession.halt();
-            } finally {
-                try {
-                    ksession.dispose();
-                } finally {
-                    ksession = null;
-                    if (klogger != null) {
-                        try {
-                            klogger.close();
-                        } finally {
-                            klogger = null;
-                        }
-                    }
-                }
-            }
-        }
-
-        kbase = null;
         
-        processId = null;
-        if (kagent != null) {
-            try {
-                kagent.dispose();
-            } finally {
-                kagent = null;
-            }
-        }
-    }
     
-    
     /**
      * Verify that the process action matches one of the valid process action values.
      * @param processAction process action
@@ -149,6 +123,7 @@
 		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");
 		
 		// verify the process action
 		this.processAction = configTree.getRequiredAttribute(ProcessConstants.PROCESS_ACTION);
@@ -157,27 +132,31 @@
 		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
 		kbuilder.add(ResourceFactory.newClassPathResource(processDefName), ResourceType.BPMN2);
 		kbase = kbuilder.newKnowledgeBase();
-		ksessionConfig = getSessionConfiguration(new Properties());
+		
 		kenvironment = getEnvironment(new HashMap<String, Object>());
-		ksession = kbase.newStatefulKnowledgeSession(ksessionConfig, kenvironment);
-		klogger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession, "test", 1000);
+		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 Message process(Message message) throws ConfigurationException {		
 		
+		int sessionId = getSessionId(message);
+		if ((ksession == null) || (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);
+		}
 		khandler = new CommandBasedWSHumanTaskHandler(ksession);
 		ksession.getWorkItemManager().registerWorkItemHandler("Human Task", khandler);
 		khandler.connect();
-	}
 
-	public Long getProcessInstanceId(Message msg) {
-		Long id = null;
-		try {
-			id = (Long)msg.getContext().getContext(ProcessConstants.PROCESS_INSTANCE_ID);
-		} catch (Exception e) {
-		}
-		return id;
-	}
-	
-	public Message process(Message message) throws ConfigurationException
-	{
 		// Add security context to message context.
 		addSecurityContext(message);
 		// Add authentication request context to message context.
@@ -189,52 +168,82 @@
 		ProcessType processType = ProcessType.fromAction((String)processAction);
 		switch (processType) {
 			case START_PROCESS:
-				logger.error(ProcessConstants.START_PROCESS_TYPE);
-				
+				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;
+	                processInstance = ksession.startProcess(processId, params);
+	            } else {
+	                processInstance = ksession.startProcess(processId);
+	            }
+				processInstanceId = Long.valueOf(processInstance.getId());				
+				
+                break;
 		    case SIGNAL_EVENT:
-				logger.error(ProcessConstants.SIGNAL_EVENT_TYPE);
+				logger.info(ProcessConstants.SIGNAL_EVENT_TYPE);
                 String processEventType = (String) message.getProperties().getProperty(ProcessConstants.PROCESS_EVENT_TYPE);
                 Object processEvent = message.getProperties().getProperty(ProcessConstants.PROCESS_EVENT);
                 processInstanceId = getProcessInstanceId(message);
-                if (processInstanceId != null) {
-                    ksession.signalEvent(processEventType, processEvent, processInstanceId.longValue());
-                } else {
-                    throw new ConfigurationException(ProcessConstants.SIGNAL_EVENT_TYPE 
-                    		+ ": tried to abort and process id was null");
-                }
+
+	            if (processInstanceId != null) {
+	                ksession.signalEvent(processEventType, processEvent, processInstanceId.longValue());
+	            } else {
+	                throw new ConfigurationException(ProcessConstants.SIGNAL_EVENT_TYPE 
+	                    + ": tried to abort and process id was null");
+	            }
                 break;
+
 	        case ABORT_PROCESS_INSTANCE:
-				logger.error(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE);
+				logger.info(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE);
                 processInstanceId = getProcessInstanceId(message);
+
                 if (processInstanceId != null) {
-                    ksession.abortProcessInstance(processInstanceId.longValue());
-                } else {
-                    throw new ConfigurationException(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE 
-                    		+ ": tried to abort and process id was null");
-                }
-
+	                ksession.abortProcessInstance(processInstanceId.longValue());
+	            } else {
+	                throw new ConfigurationException(ProcessConstants.ABORT_PROCESS_INSTANCE_TYPE 
+	                    + ": tried to abort and process id was null");
+	            }
 				break;
-			}
-  
+		}
+		
+		// Set Session and ProcessInstance information
+		message.getContext().setContext(ProcessConstants.SESSION_ID, sessionId);
 		message.getContext().setContext(ProcessConstants.PROCESS_INSTANCE_ID, 
 				processInstanceId);
 
-		if (processInstance == null) {
-			processInstance = ksession.getProcessInstance(processInstanceId.longValue());
-        }
-        
+		ksession.dispose();
+		
 		return message;
 	}
+
+	/**
+	 * Return the session id from the context id.
+	 * @param msg
+	 * @return
+	 */
+	public int getSessionId(Message msg) {
+		int id = -1;
+		try {
+			id = ((Integer)msg.getContext().getContext(ProcessConstants.SESSION_ID)).intValue();
+		} catch (Exception e) {
+		}
+		return id;		
+	}
 	
 	/**
+	 * Return the process instance id from the message context.
+	 * @param msg
+	 * @return
+	 */
+	public Long getProcessInstanceId(Message msg) {
+		Long id = null;
+		try {
+			id = (Long)msg.getContext().getContext(ProcessConstants.PROCESS_INSTANCE_ID);
+		} catch (Exception e) {
+		}
+		return id;
+	}
+	
+	/**
 	 * Adds the current security context to the passed in message.
 	 * The context is added, if set, to the message context keyed by {@link SecurityService#CONTEXT}.
 	 *
@@ -280,20 +289,64 @@
     }
     
     /**
-     * Returns an environment.
+     * Returns an environment with an entity manager factory, transaction manager, and user 
+     * transaction configured.
      * @param overrides
      * @return
      */
-    public static Environment getEnvironment(Map<String, Object> overrides) {
-        Environment env = EnvironmentFactory.newEnvironment();
-        // set the default global resolver
-        env.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
-        // apply any overrides
-        if (overrides != null) {
-            for (Map.Entry<String, Object> entry : overrides.entrySet()) {
-                env.set(entry.getKey(), entry.getValue());
-            }
-        }
+    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 {
+    }
+
 }

Added: labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/JBPMorm.xml
===================================================================
--- labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/JBPMorm.xml	                        (rev 0)
+++ labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/JBPMorm.xml	2012-04-03 04:00:56 UTC (rev 37978)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+               version="1.0">  
+      <named-query name="ProcessInstancesWaitingForEvent">
+          <query>
+select 
+    processInstanceInfo.processInstanceId
+from 
+    ProcessInstanceInfo processInstanceInfo join processInstanceInfo.eventTypes eventTypes
+where
+    eventTypes = :type
+          </query>
+      </named-query>
+</entity-mappings>

Modified: labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/deployment.xml
===================================================================
--- labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/deployment.xml	2012-04-03 03:58:48 UTC (rev 37977)
+++ labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/deployment.xml	2012-04-03 04:00:56 UTC (rev 37978)
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<jbossesb-deployment>
+<?xml version="1.0" encoding="UTF-8"?><jbossesb-deployment>
   <depends>jboss.esb:deployment=jbossesb.esb</depends>
 </jbossesb-deployment>

Added: labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/persistence.xml	                        (rev 0)
+++ labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/META-INF/persistence.xml	2012-04-03 04:00:56 UTC (rev 37978)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<persistence version="1.0"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
+                                 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
+                                 http://java.sun.com/xml/ns/persistence/orm 
+                                 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
+             xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xmlns="http://java.sun.com/xml/ns/persistence">
+
+  <persistence-unit name="jbpm5Persistence.jpa" transaction-type="JTA">
+    <provider>org.hibernate.ejb.HibernatePersistence</provider>
+    <jta-data-source>java:jboss/datasources/jbpm5DS</jta-data-source>
+
+    <mapping-file>META-INF/JBPMorm.xml</mapping-file>
+    <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
+    <class>org.drools.persistence.info.SessionInfo</class>
+    <class>org.drools.persistence.info.WorkItemInfo</class>
+    <properties> 
+         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
+         <property name="hibernate.hbm2ddl.auto" value="update"/>
+         <!-- for AS5 -->
+         <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
+    </properties>        
+  </persistence-unit>
+</persistence>

Added: labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/hibernate.cfg.xml
===================================================================
--- labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/hibernate.cfg.xml	                        (rev 0)
+++ labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/hibernate.cfg.xml	2012-04-03 04:00:56 UTC (rev 37978)
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE hibernate-configuration PUBLIC
+        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+
+    <session-factory>
+
+        <!-- Database connection settings -->
+        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
+        <property name="connection.url">jdb:mysql://localhost:3306/jbpm5</property>
+        <!--property name="connection.url">jdbc:h2:file:/NotBackedUp/data/mydb</property-->
+        <property name="connection.username">jbpm5</property>
+        <property name="connection.password">jbpm5</property>
+
+        <!-- JDBC connection pool (use the built-in) -->
+        <property name="connection.pool_size">1</property>
+
+        <!-- SQL dialect -->
+        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
+
+        <!-- Enable Hibernate's automatic session context management -->
+        <property name="current_session_context_class">thread</property>
+
+        <!-- Disable the second-level cache  -->
+        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
+
+        <!-- Echo all executed SQL to stdout -->
+        <property name="show_sql">false</property>
+
+        <!-- Drop and re-create the database schema on startup? -->
+        <property name="hbm2ddl.auto">create</property>
+
+        <mapping resource="AuditLog.hbm.xml"/>
+
+    </session-factory>
+
+</hibernate-configuration>

Added: labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/jBPM-ds.xml
===================================================================
--- labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/jBPM-ds.xml	                        (rev 0)
+++ labs/jbossesb/trunk/product/services/jbpm5/src/main/resources/jBPM-ds.xml	2012-04-03 04:00:56 UTC (rev 37978)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<datasources>
+   <local-tx-datasource>
+         <jndi-name>jboss/datasources/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