[jboss-svn-commits] JBL Code SVN: r30727 - in labs/jbossrules/trunk: drools-container/drools-spring/src/main/java/org/drools/container/spring/beans and 14 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Dec 16 14:09:50 EST 2009


Author: baunax
Date: 2009-12-16 14:09:49 -0500 (Wed, 16 Dec 2009)
New Revision: 30727

Added:
   labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/
   labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java
   labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/
   labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml
Modified:
   labs/jbossrules/trunk/drools-container/drools-spring/pom.xml
   labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java
Log:
JBRULES-2332 Spring Transactions
	- Created SpringSingleSessionCommandService to allow Drools participates in spring transactions.
	- Created JPAKwonledgeServiceBean to easy drools config from spring.
	

Modified: labs/jbossrules/trunk/drools-container/drools-spring/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/pom.xml	2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-container/drools-spring/pom.xml	2009-12-16 19:09:49 UTC (rev 30727)
@@ -8,6 +8,10 @@
     <version>5.1.0.SNAPSHOT</version>
   </parent>
 
+	<properties>
+		<spring.version>2.5.6</spring.version>
+	</properties>
+
   <artifactId>drools-spring</artifactId>
   <packaging>jar</packaging>
   <name>Drools :: Spring</name> 
@@ -37,26 +41,74 @@
     	<dependency>
     		<groupId>org.drools</groupId>
     		<artifactId>drools-decisiontables</artifactId>
+    	</dependency>
+    	
+    	<dependency>
+    		<groupId>org.drools</groupId>
+    		<artifactId>drools-persistence-jpa</artifactId>
+    		<optional>true</optional>
     	</dependency>    	
         
     	<dependency>
     		<groupId>org.springframework</groupId>
     		<artifactId>spring-core</artifactId>
-            <version>2.5.6</version>
+            <version>${spring.version}</version>
     	</dependency>     
 
         <dependency>
     		<groupId>org.springframework</groupId>
     		<artifactId>spring-beans</artifactId>
-            <version>2.5.6</version>
+            <version>${spring.version}</version>
     	</dependency> 
         
         <dependency>
     		<groupId>org.springframework</groupId>
+    		<artifactId>spring-orm</artifactId>
+            <version>${spring.version}</version>
+            <optional>true</optional>
+    	</dependency>
+    	
+    	<dependency>
+    		<groupId>org.springframework</groupId>
+    		<artifactId>spring-jdbc</artifactId>
+            <version>${spring.version}</version>
+            <optional>true</optional>
+    	</dependency>
+        
+        <dependency>
+    		<groupId>org.springframework</groupId>
     		<artifactId>spring-context</artifactId>
-            <version>2.5.6</version>
-    	</dependency>         
+            <version>${spring.version}</version>
+    	</dependency>
 
+        <dependency>
+        	<groupId>javax.persistence</groupId>
+        	<artifactId>persistence-api</artifactId>
+        	<version>1.0</version>
+        	<optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-entitymanager</artifactId>
+            <version>3.4.0.GA</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+        	<groupId>org.slf4j</groupId>
+        	<artifactId>slf4j-log4j12</artifactId>
+        	<version>1.5.2</version>
+        	<scope>test</scope>
+        </dependency>
+
+        <dependency>
+        	<groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>1.1.117</version>
+        	<scope>test</scope>
+        </dependency>         
+
       </dependencies>              
                   
 </project>

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,141 @@
+package org.drools.container.spring.beans.persistence;
+
+import java.util.Collections;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
+
+import org.drools.KnowledgeBase;
+import org.drools.RuntimeDroolsException;
+import org.drools.base.MapGlobalResolver;
+import org.drools.persistence.jpa.JPAKnowledgeServiceProvider;
+import org.drools.persistence.jpa.impl.JPAKnowledgeServiceProviderImpl;
+import org.drools.persistence.processinstance.VariablePersistenceStrategyFactory;
+import org.drools.persistence.processinstance.persisters.VariablePersister;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.vsm.ServiceManager;
+import org.drools.vsm.local.ServiceManagerLocalClient;
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.orm.jpa.support.JpaDaoSupport;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.AbstractPlatformTransactionManager;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
+
+public class JPAKnowledgeServiceBean extends JpaDaoSupport  {
+	private ServiceManager serviceManager;
+	private KnowledgeBase kbase;
+	private JPAKnowledgeServiceProvider jpaKnowledgeServiceProvider;
+	private Environment environment;
+	private AbstractPlatformTransactionManager transactionManager;
+	private Map<Class<?>, Class<? extends VariablePersister>> variablePersisters = Collections.emptyMap();
+
+	public StatefulKnowledgeSession newStatefulKnowledgeSession() {
+		TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+		return (StatefulKnowledgeSession) txTemplate.execute(new TransactionCallback() {
+			public Object doInTransaction(TransactionStatus status) {
+				return getJpaTemplate().execute(new JpaCallback() {
+					public StatefulKnowledgeSession doInJpa(EntityManager em) throws PersistenceException {
+						return jpaKnowledgeServiceProvider.newStatefulKnowledgeSession(kbase, null, environment);
+					}
+				});
+			}
+		});
+	}
+	
+	public StatefulKnowledgeSession loadStatefulKnowledgeSession(final int sessionId) {
+		TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+		return (StatefulKnowledgeSession) txTemplate.execute(new TransactionCallback() {
+			public Object doInTransaction(TransactionStatus status) {
+				return getJpaTemplate().execute(new JpaCallback() {
+					public StatefulKnowledgeSession doInJpa(EntityManager em) throws PersistenceException {
+						return jpaKnowledgeServiceProvider.loadStatefulKnowledgeSession(sessionId, kbase, null, environment);
+					}
+				});
+			}
+		});
+	}
+	
+	@Override
+	protected void initDao() {
+		if (kbase == null) {
+			throw new IllegalArgumentException("property kbase is mandatory");
+		}
+		if (serviceManager == null) {
+			serviceManager = new ServiceManagerLocalClient();
+		}
+		if (environment == null) {
+			environment = serviceManager.getKnowledgeBaseFactory().newEnvironment();
+		}
+
+		if (environment.get(EnvironmentName.ENTITY_MANAGER_FACTORY) != null) {
+			logger.debug("overwriting environment key: " + EnvironmentName.ENTITY_MANAGER_FACTORY);
+		}
+		environment.set(EnvironmentName.ENTITY_MANAGER_FACTORY, getJpaTemplate().getEntityManagerFactory());
+		
+		if (environment.get(EnvironmentName.TRANSACTION_MANAGER) != null) {
+			logger.debug("overwriting environment key: " + EnvironmentName.TRANSACTION_MANAGER);
+		}
+		environment.set(EnvironmentName.TRANSACTION_MANAGER, getTransactionManager());
+		environment.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
+		jpaKnowledgeServiceProvider = serviceManager.JPAKnowledgeService();
+		if (jpaKnowledgeServiceProvider instanceof JPAKnowledgeServiceProviderImpl) {
+			((JPAKnowledgeServiceProviderImpl) jpaKnowledgeServiceProvider).setCommandServiceClass(SpringSingleSessionCommandService.class);
+		} else {
+			throw new RuntimeDroolsException("JPAKnowledgeService is not instance of: " + JPAKnowledgeServiceProviderImpl.class.getName());
+		}
+		
+		if (variablePersisters != null && !variablePersisters.isEmpty()) {
+			for (Map.Entry<Class<?>, Class<? extends VariablePersister>> entry : variablePersisters.entrySet()) {
+				 VariablePersistenceStrategyFactory.getVariablePersistenceStrategy().setPersister(entry.getKey().getName(), entry.getValue().getName());
+			}
+		}
+//		serviceManager.JPAKnowledgeService().loadStatefulKnowledgeSession(0, 
+//					serviceManager.getKnowledgeBaseFactory().newKnowledgeBase(), 
+//					null, 
+//					environment);
+	}
+
+	public KnowledgeBase getKbase() {
+		return kbase;
+	}
+
+	public void setKbase(KnowledgeBase kbase) {
+		this.kbase = kbase;
+	}
+	
+	public ServiceManager getServiceManager() {
+		return serviceManager;
+	}
+
+	public void setServiceManager(ServiceManager serviceManager) {
+		this.serviceManager = serviceManager;
+	}
+
+	public Environment getEnvironment() {
+		return environment;
+	}
+
+	public void setEnvironment(Environment environment) {
+		this.environment = environment;
+	}
+
+	public AbstractPlatformTransactionManager getTransactionManager() {
+		return transactionManager;
+	}
+
+	public void setTransactionManager(AbstractPlatformTransactionManager transactionManager) {
+		this.transactionManager = transactionManager;
+	}
+
+	public void setVariablePersisters(Map<Class<?>, Class<? extends VariablePersister>> variablePersisters) {
+		this.variablePersisters = variablePersisters;
+	}
+
+	public Map<Class<?>, Class<? extends VariablePersister>> getVariablePersisters() {
+		return variablePersisters;
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/JPAKnowledgeServiceBean.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,202 @@
+package org.drools.container.spring.beans.persistence;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceException;
+
+import org.drools.KnowledgeBase;
+import org.drools.RuleBase;
+import org.drools.SessionConfiguration;
+import org.drools.command.CommandService;
+import org.drools.command.Context;
+import org.drools.command.impl.ContextImpl;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.persistence.processinstance.JPAProcessInstanceManager;
+import org.drools.persistence.processinstance.JPASignalManager;
+import org.drools.persistence.processinstance.JPAWorkItemManager;
+import org.drools.persistence.session.JPASessionMarshallingHelper;
+import org.drools.persistence.session.SessionInfo;
+import org.drools.reteoo.ReteooStatefulSession;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.orm.jpa.JpaTemplate;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
+
+public class SpringSingleSessionCommandService implements CommandService {
+	private JpaTemplate jpaTemplate;
+	private SessionInfo sessionInfo;
+	private JPASessionMarshallingHelper marshallingHelper;
+	private StatefulKnowledgeSession ksession;
+	private Environment env;
+	private KnowledgeCommandContext kContext;
+	private PlatformTransactionManager transactionManager;
+
+	public void checkEnvironment(Environment env) {
+		if (env.get(EnvironmentName.ENTITY_MANAGER_FACTORY) == null) {
+			throw new IllegalArgumentException("Environment must have an EntityManagerFactory");
+		}
+		this.env = env;
+		transactionManager = (PlatformTransactionManager) env.get(EnvironmentName.TRANSACTION_MANAGER);
+		if (transactionManager == null) {
+			throw new IllegalArgumentException("Environment must have an TransactionManager");
+		}
+	}
+
+	public SpringSingleSessionCommandService(RuleBase ruleBase,
+			SessionConfiguration conf,
+			Environment env) {
+		this(new KnowledgeBaseImpl(ruleBase), conf, env);
+	}
+
+	public SpringSingleSessionCommandService(int sessionId,
+			RuleBase ruleBase,
+			SessionConfiguration conf,
+			Environment env) {
+		this(sessionId, new KnowledgeBaseImpl(ruleBase), conf, env);
+	}
+
+	public SpringSingleSessionCommandService(KnowledgeBase kbase,
+			KnowledgeSessionConfiguration conf,
+			Environment env) {
+		if (conf == null) {
+			conf = new SessionConfiguration();
+		}
+		checkEnvironment(env);
+		this.sessionInfo = new SessionInfo();
+
+		ReteooStatefulSession session = (ReteooStatefulSession)
+				((KnowledgeBaseImpl) kbase).ruleBase.newStatefulSession((SessionConfiguration) conf, this.env);
+		this.ksession = new StatefulKnowledgeSessionImpl(session, kbase);
+
+		this.kContext = new KnowledgeCommandContext(new ContextImpl("ksession", null), null, null, this.ksession, null);
+		((JPASignalManager) ((StatefulKnowledgeSessionImpl) ksession).session.getSignalManager())
+				.setCommandService(this);
+
+		this.marshallingHelper = new JPASessionMarshallingHelper(this.ksession, conf);
+
+		this.sessionInfo.setJPASessionMashallingHelper(this.marshallingHelper);
+
+		TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+		jpaTemplate = new JpaTemplate((EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY));
+
+		txTemplate.execute(new TransactionCallback() {
+			public Object doInTransaction(TransactionStatus status) {
+				Object result = jpaTemplate.execute(new JpaCallback() {
+					public Object doInJpa(EntityManager em) throws PersistenceException {
+						SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, em);
+						em.persist(sessionInfo);
+						// update the session id to be the same as the session info id
+						((StatefulKnowledgeSessionImpl) ksession).session.setId(sessionInfo.getId());
+						em.flush();
+						SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, null);
+						return null;
+					}
+				});
+				return result;
+			}
+		});
+	}
+
+	public SpringSingleSessionCommandService(final int sessionId,
+			final KnowledgeBase kbase,
+			KnowledgeSessionConfiguration conf,
+			Environment env) {
+		final KnowledgeSessionConfiguration localConf = conf == null ? new SessionConfiguration() : conf;
+		this.env = env;
+		checkEnvironment(env);
+		TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+		jpaTemplate = new JpaTemplate((EntityManagerFactory) env.get(EnvironmentName.ENTITY_MANAGER_FACTORY));
+		txTemplate.execute(new TransactionCallback() {
+			public Object doInTransaction(TransactionStatus status) {
+				return jpaTemplate.execute(new JpaCallback() {
+
+					public Object doInJpa(EntityManager em) throws PersistenceException {
+						SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, em);
+						sessionInfo = em.find(SessionInfo.class, sessionId);
+
+						if (sessionInfo == null) {
+							SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, null);
+							throw new RuntimeException("Could not find session data for id " + sessionId);
+						}
+
+						marshallingHelper = new JPASessionMarshallingHelper(sessionInfo,
+								kbase,
+								localConf,
+								SpringSingleSessionCommandService.this.env);
+
+						sessionInfo.setJPASessionMashallingHelper(marshallingHelper);
+						ksession = marshallingHelper.getObject();
+						kContext = new KnowledgeCommandContext(new ContextImpl("ksession", null), null, null, ksession,
+								null);
+						((JPASignalManager) ((StatefulKnowledgeSessionImpl) ksession).session.getSignalManager())
+								.setCommandService(SpringSingleSessionCommandService.this);
+
+						// update the session id to be the same as the session info id
+						((StatefulKnowledgeSessionImpl) ksession).session.setId(sessionInfo.getId());
+						em.flush();
+						SpringSingleSessionCommandService.this.env.set(EnvironmentName.ENTITY_MANAGER, null);
+						return sessionInfo;
+					}
+				});
+			}
+		});
+	}
+
+	public Context getContext() {
+		return this.kContext;
+	}
+
+	@SuppressWarnings("unchecked")
+	public synchronized <T> T execute(final GenericCommand<T> command) {
+		ksession.halt();
+
+		TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
+		T result = (T) txTemplate.execute(new TransactionCallback() {
+			public Object doInTransaction(TransactionStatus status) {
+				T result = (T) jpaTemplate.execute(new JpaCallback() {
+					public Object doInJpa(EntityManager em) {
+						env.set(EnvironmentName.ENTITY_MANAGER, em);
+						SessionInfo sessionInfoMerged = em.merge(sessionInfo);
+						sessionInfoMerged.setJPASessionMashallingHelper(sessionInfo.getJPASessionMashallingHelper());
+						sessionInfo = sessionInfoMerged;
+						// sessionInfo = em.find(SessionInfo.class, sessionInfo.getId());
+						// sessionInfo.setJPASessionMashallingHelper(marshallingHelper);
+						// marshallingHelper.loadSnapshot(sessionInfo.getData(), ksession);
+						sessionInfo.setDirty();
+						T result = command.execute(kContext);
+						em.flush();
+						env.set(EnvironmentName.ENTITY_MANAGER, null);
+						return result;
+					}
+
+				});
+				// clean up cached process and work item instances
+				((JPAProcessInstanceManager) ((StatefulKnowledgeSessionImpl) ksession).session
+						.getProcessInstanceManager()).clearProcessInstances();
+				((JPAWorkItemManager) ((StatefulKnowledgeSessionImpl) ksession).session.getWorkItemManager())
+						.clearWorkItems();
+				return result;
+			}
+		});
+		return result;
+	}
+
+	public void dispose() {
+		if (ksession != null) {
+			ksession.dispose();
+		}
+	}
+
+	public int getSessionId() {
+		return sessionInfo.getId();
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandService.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java	2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/main/java/org/drools/container/spring/namespace/KnowledgeBaseDefinitionParser.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -14,7 +14,6 @@
 
 public class KnowledgeBaseDefinitionParser extends AbstractBeanDefinitionParser {
 	
-	private static final String RESOUCES_ATTRIBUTE = "resources";
 	private static final String SERVICE_MANAGER_ATTRIBUTE = "serviceManager";
 
 	@SuppressWarnings("unchecked")

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,660 @@
+package org.drools.container.spring.beans.persistence;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.SessionConfiguration;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+import org.drools.command.runtime.process.GetProcessInstanceCommand;
+import org.drools.command.runtime.process.StartProcessCommand;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.ProcessBuilder;
+import org.drools.definition.KnowledgePackage;
+import org.drools.definitions.impl.KnowledgePackageImp;
+import org.drools.helper.FileHelper;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory;
+import org.drools.persistence.processinstance.JPASignalManagerFactory;
+import org.drools.persistence.processinstance.JPAWorkItemManagerFactory;
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.process.core.timer.Timer;
+import org.drools.rule.Package;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.SubProcessNode;
+import org.drools.workflow.core.node.TimerNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+import org.h2.tools.Server;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.transaction.PlatformTransactionManager;
+
+public class SpringSingleSessionCommandServiceTest {
+	private static final Logger log = LoggerFactory.getLogger(SpringSingleSessionCommandServiceTest.class);
+	private static Server h2Server;
+    
+    private ClassPathXmlApplicationContext ctx;
+    private EntityManagerFactory emf;
+    private PlatformTransactionManager txManager;
+    
+    @BeforeClass
+    public static void startH2Database() throws Exception {
+    	File dbDir = new File(System.getProperty("java.io.tmpdir") + "/_droolsFlowDB");
+    	if (dbDir.exists()) {
+    		log.info("database exists, deleting before run tests, db location: {}", dbDir.getAbsolutePath());
+    		FileHelper.remove(dbDir);
+    	}
+    	dbDir.mkdirs();
+    	log.info("creating database on: {}", dbDir );
+    	h2Server = Server.createTcpServer(new String[] {"-baseDir " + dbDir.getAbsolutePath()});
+    	h2Server.start();
+    }
+    
+    @AfterClass
+    public static void stopH2Database() {
+    	log.info("stoping database");
+    	h2Server.stop();
+    	File dbDir = new File(System.getProperty("java.io.tmpdir") + "/_droolsFlowDB");
+    	log.info("deleting database: {}", dbDir.getAbsoluteFile());
+    	FileHelper.remove(dbDir);
+    }
+
+    @Before
+    public void createSpringContext() {
+    	log.info("creating spring context");
+    	ctx = new ClassPathXmlApplicationContext("org/drools/container/spring/beans/persistence/beans.xml");
+    	emf = (EntityManagerFactory) ctx.getBean("myEmf");
+    	txManager = (PlatformTransactionManager) ctx.getBean("txManager");
+    }
+    
+    @After
+    public void destrySpringContext() {
+    	log.info("destroy spring context");
+    	ctx.destroy();
+    }
+    
+	private SpringSingleSessionCommandService buildCommandService(KnowledgeBase kbase) {
+		Environment env = KnowledgeBaseFactory.newEnvironment();
+		env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
+		env.set(EnvironmentName.TRANSACTION_MANAGER, txManager);
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                SpringSingleSessionCommandService.class.getName() );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                JPAProcessInstanceManagerFactory.class.getName() );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                JPAWorkItemManagerFactory.class.getName() );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                JPASignalManagerFactory.class.getName() );
+        SessionConfiguration config = new SessionConfiguration( properties );
+
+        return new SpringSingleSessionCommandService( kbase, config, env );
+	}
+	
+	private SpringSingleSessionCommandService buildCommandService(int sessionId, KnowledgeBase kbase) {
+		Environment env = KnowledgeBaseFactory.newEnvironment();
+		env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
+		env.set(EnvironmentName.TRANSACTION_MANAGER, txManager);
+        Properties properties = new Properties();
+        properties.setProperty( "drools.commandService",
+                                SpringSingleSessionCommandService.class.getName() );
+        properties.setProperty( "drools.processInstanceManagerFactory",
+                                JPAProcessInstanceManagerFactory.class.getName() );
+        properties.setProperty( "drools.workItemManagerFactory",
+                                JPAWorkItemManagerFactory.class.getName() );
+        properties.setProperty( "drools.processSignalManagerFactory",
+                                JPASignalManagerFactory.class.getName() );
+        SessionConfiguration config = new SessionConfiguration( properties );
+
+        return new SpringSingleSessionCommandService(sessionId, kbase, config, env );
+	}
+    
+    @Test
+    public void testPersistenceWorkItems() throws Exception {
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+        kbase.addKnowledgePackages( kpkgs );
+
+        SpringSingleSessionCommandService service = buildCommandService(kbase);
+
+        int sessionId = service.getSessionId();
+
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = service.execute( startProcessCommand );
+        log.info( "Started process instance {}", processInstance.getId() );
+
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        Assert.assertNotNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+
+        workItem = handler.getWorkItem();
+        Assert.assertNotNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+
+        workItem = handler.getWorkItem();
+        Assert.assertNotNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+
+        workItem = handler.getWorkItem();
+        Assert.assertNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNull( processInstance );
+        service.dispose();
+    }
+
+    @Test
+    public void testPersistenceWorkItemsUserTransaction() throws Exception {
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
+        kbase.addKnowledgePackages( kpkgs );
+
+        SpringSingleSessionCommandService service = buildCommandService(kbase);
+        int sessionId = service.getSessionId();
+
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = service.execute( startProcessCommand );
+        log.info( "Started process instance {}", processInstance.getId() );
+
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        Assert.assertNotNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+
+        workItem = handler.getWorkItem();
+        Assert.assertNotNull( workItem );
+        service.dispose();
+
+        service =buildCommandService(sessionId, kbase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+
+        workItem = handler.getWorkItem();
+        Assert.assertNotNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+
+        workItem = handler.getWorkItem();
+        Assert.assertNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNull( processInstance );
+        service.dispose();
+    }
+
+    private Collection<KnowledgePackage> getProcessWorkItems() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 2 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode = new WorkItemNode();
+        workItemNode.setId( 3 );
+        workItemNode.setName( "WorkItem1" );
+        Work work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode.setWork( work );
+        process.addNode( workItemNode );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode2 = new WorkItemNode();
+        workItemNode2.setId( 4 );
+        workItemNode2.setName( "WorkItem2" );
+        work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode2.setWork( work );
+        process.addNode( workItemNode2 );
+        new ConnectionImpl( workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode2,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode3 = new WorkItemNode();
+        workItemNode3.setId( 5 );
+        workItemNode3.setName( "WorkItem3" );
+        work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode3.setWork( work );
+        process.addNode( workItemNode3 );
+        new ConnectionImpl( workItemNode2,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode3,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( workItemNode3,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+        List<KnowledgePackage> list = new ArrayList<KnowledgePackage>();
+        list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
+        return list;
+    }
+
+    @Test
+    public void testPersistenceSubProcess() {
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        Package pkg = getProcessSubProcess();
+        ruleBase.addPackage( pkg );
+
+        SpringSingleSessionCommandService service = buildCommandService( new KnowledgeBaseImpl( ruleBase ));
+        int sessionId = service.getSessionId();
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) service.execute( startProcessCommand );
+        log.info( "Started process instance {}", processInstance.getId() );
+        long processInstanceId = processInstance.getId();
+
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        Assert.assertNotNull( workItem );
+        service.dispose();
+
+        service = buildCommandService(sessionId, new KnowledgeBaseImpl( ruleBase ));
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstanceId );
+        processInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+
+        Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
+        Assert.assertEquals( 1,
+                      nodeInstances.size() );
+        SubProcessNodeInstance subProcessNodeInstance = (SubProcessNodeInstance) nodeInstances.iterator().next();
+        long subProcessInstanceId = subProcessNodeInstance.getProcessInstanceId();
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( subProcessInstanceId );
+        RuleFlowProcessInstance subProcessInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( subProcessInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, new KnowledgeBaseImpl( ruleBase ));
+        CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId( workItem.getId() );
+        service.execute( completeWorkItemCommand );
+        service.dispose();
+
+        service = buildCommandService(sessionId, new KnowledgeBaseImpl( ruleBase ));
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( subProcessInstanceId );
+        subProcessInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        Assert.assertNull( subProcessInstance );
+
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstanceId );
+        processInstance = (RuleFlowProcessInstance) service.execute( getProcessInstanceCommand );
+        Assert.assertNull( processInstance );
+        service.dispose();
+    }
+
+    private Package getProcessSubProcess() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 2 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        SubProcessNode subProcessNode = new SubProcessNode();
+        subProcessNode.setId( 3 );
+        subProcessNode.setName( "SubProcess" );
+        subProcessNode.setProcessId( "org.drools.test.SubProcess" );
+        process.addNode( subProcessNode );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            subProcessNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 4 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( subProcessNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+
+        process = new RuleFlowProcess();
+        process.setId( "org.drools.test.SubProcess" );
+        process.setName( "SubProcess" );
+        process.setPackageName( "org.drools.test" );
+        start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        actionNode = new ActionNode();
+        actionNode.setId( 2 );
+        actionNode.setName( "Action" );
+        action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        WorkItemNode workItemNode = new WorkItemNode();
+        workItemNode.setId( 3 );
+        workItemNode.setName( "WorkItem1" );
+        Work work = new WorkImpl();
+        work.setName( "MyWork" );
+        workItemNode.setWork( work );
+        process.addNode( workItemNode );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( workItemNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        processBuilder.buildProcess( process,
+                                     null );
+        return packageBuilder.getPackage();
+    }
+
+    @Test
+    public void testPersistenceTimer() throws Exception {
+    	KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessTimer();
+        kbase.addKnowledgePackages( kpkgs );
+
+        SpringSingleSessionCommandService service = buildCommandService(kbase);
+        int sessionId = service.getSessionId();
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = service.execute( startProcessCommand );
+        log.info( "Started process instance {}", processInstance.getId() );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNotNull( processInstance );
+        service.dispose();
+
+        service = buildCommandService(sessionId, kbase);
+        Thread.sleep( 3000 );
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNull( processInstance );
+    }
+
+    private List<KnowledgePackage> getProcessTimer() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        TimerNode timerNode = new TimerNode();
+        timerNode.setId( 2 );
+        timerNode.setName( "Timer" );
+        Timer timer = new Timer();
+        timer.setDelay( "2000" );
+        timerNode.setTimer( timer );
+        process.addNode( timerNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 3 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+        List<KnowledgePackage> list = new ArrayList<KnowledgePackage>();
+        list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
+        return list;
+    }
+
+    @Test
+    public void testPersistenceTimer2() throws Exception {
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Collection<KnowledgePackage> kpkgs = getProcessTimer2();
+        kbase.addKnowledgePackages( kpkgs );
+
+        SpringSingleSessionCommandService service = buildCommandService(kbase);
+        int sessionId = service.getSessionId();
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId( "org.drools.test.TestProcess" );
+        ProcessInstance processInstance = service.execute( startProcessCommand );
+        log.info( "Started process instance {}", processInstance.getId() );
+
+        Thread.sleep( 2000 );
+
+        service = buildCommandService(sessionId, kbase);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId( processInstance.getId() );
+        processInstance = service.execute( getProcessInstanceCommand );
+        Assert.assertNull( processInstance );
+    }
+
+    private List<KnowledgePackage> getProcessTimer2() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( "org.drools.test.TestProcess" );
+        process.setName( "TestProcess" );
+        process.setPackageName( "org.drools.test" );
+        StartNode start = new StartNode();
+        start.setId( 1 );
+        start.setName( "Start" );
+        process.addNode( start );
+        TimerNode timerNode = new TimerNode();
+        timerNode.setId( 2 );
+        timerNode.setName( "Timer" );
+        Timer timer = new Timer();
+        timer.setDelay( "0" );
+        timerNode.setTimer( timer );
+        process.addNode( timerNode );
+        new ConnectionImpl( start,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        ActionNode actionNode = new ActionNode();
+        actionNode.setId( 3 );
+        actionNode.setName( "Action" );
+        DroolsConsequenceAction action = new DroolsConsequenceAction();
+        action.setDialect( "java" );
+        action.setConsequence( "try { Thread.sleep(1000); } catch (Throwable t) {} System.out.println(\"Executed action\");" );
+        actionNode.setAction( action );
+        process.addNode( actionNode );
+        new ConnectionImpl( timerNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE );
+        EndNode end = new EndNode();
+        end.setId( 6 );
+        end.setName( "End" );
+        process.addNode( end );
+        new ConnectionImpl( actionNode,
+                            Node.CONNECTION_DEFAULT_TYPE,
+                            end,
+                            Node.CONNECTION_DEFAULT_TYPE );
+
+        PackageBuilder packageBuilder = new PackageBuilder();
+        ProcessBuilder processBuilder = new ProcessBuilder( packageBuilder );
+        processBuilder.buildProcess( process,
+                                     null );
+        List<KnowledgePackage> list = new ArrayList<KnowledgePackage>();
+        list.add( new KnowledgePackageImp( packageBuilder.getPackage() ) );
+        return list;
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/SpringSingleSessionCommandServiceTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,33 @@
+package org.drools.container.spring.beans.persistence;
+
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+
+public class TestWorkItemHandler implements WorkItemHandler {
+
+	private static TestWorkItemHandler INSTANCE = new TestWorkItemHandler();
+	
+	private WorkItem workItem;
+	
+	private TestWorkItemHandler() {
+	}
+	
+	public static TestWorkItemHandler getInstance() {
+		return INSTANCE;
+	}
+	
+	public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+		this.workItem = workItem;
+	}
+
+	public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+	}
+	
+	public WorkItem getWorkItem() {
+		WorkItem result = workItem;
+		workItem = null;
+		return result;
+	}
+
+}


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/container/spring/beans/persistence/TestWorkItemHandler.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,15 @@
+package org.drools.helper;
+
+import java.io.File;
+
+public class FileHelper {
+	public static void remove(File file) {
+		if (file.isDirectory()) {
+			File[] files = file.listFiles();
+			for (File f : files) {
+				remove(f);
+			}
+		}
+		file.delete();
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/java/org/drools/helper/FileHelper.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/MyWorkItemHandlers.conf	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,12 @@
+// We use MVEL to return a List of work definitions
+// The properties of the work definitions are specified as a Map<String, Object>
+// The allowed properties are name, parameters, displayName, icon and customEditor
+// The returned result should thus be of type List<Map<String, Object>>
+import org.drools.container.spring.beans.persistence.TestWorkItemHandler;
+
+[
+
+  "MyWork" : TestWorkItemHandler.getInstance(),
+  "Human Task" : TestWorkItemHandler.getInstance()
+      
+]
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/drools.session.conf	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,5 @@
+drools.workItemHandlers = MyWorkItemHandlers.conf
+#drools.commandService = org.drools.persistence.session.SingleSessionCommandService
+#drools.processInstanceManagerFactory = org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory
+#drools.workItemManagerFactory = org.drools.persistence.processinstance.JPAWorkItemManagerFactory
+#drools.processSignalManagerFactory = org.drools.persistence.processinstance.JPASignalManagerFactory
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml	2009-12-16 19:09:49 UTC (rev 30727)
@@ -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
+where
+    :type in elements(processInstanceInfo.eventTypes)
+          </query>
+      </named-query>
+</entity-mappings>


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/orm.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
+		xmlns:orm="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			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">
+
+	<persistence-unit name="org.drools.persistence.jpa.local" transaction-type="RESOURCE_LOCAL">
+		<provider>org.hibernate.ejb.HibernatePersistence</provider>
+		<!--
+		<jta-data-source>jdbc/testDS1</jta-data-source>
+		-->
+		<class>org.drools.persistence.session.SessionInfo</class>
+		<class>org.drools.persistence.processinstance.ProcessInstanceInfo</class>
+		<class>org.drools.persistence.processinstance.WorkItemInfo</class>
+		<class>org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo</class>
+		<class>org.drools.persistence.processinstance.variabletypes.JPAPersistedVariable</class>
+		<class>org.drools.persistence.processinstance.variabletypes.SerializablePersistedVariable</class>
+		<!-- 	
+		<class>org.plugtree.labs.variablepersistence.StringPersistedVariable</class>
+		<class>org.plugtree.labs.variablepersistence.MyEntity</class>
+		<class>org.plugtree.labs.variablepersistence.MyVariableSerializable</class>
+		 -->
+		<properties>
+			<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
+			<!--property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/-->
+			<!--property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/-->
+
+			<property name="hibernate.max_fetch_depth" value="3" />
+			<property name="hibernate.hbm2ddl.auto" value="create" />
+			<property name="hibernate.show_sql" value="false" />
+			
+			<!--
+			<property name="hibernate.connection.autocommit" value="false" />
+			<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
+			-->
+		</properties>
+	</persistence-unit>
+</persistence>


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/META-INF/persistence.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out"/>
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%-4r %d{dd/MM HH:mm:ss,SSS}[%t] %-5p %c{3}.%M %x - %m%n"/>
+		</layout>
+	</appender>
+	<!--
+	<logger name="org.drools">
+		<level value="DEBUG"/>
+	</logger>
+	-->
+	
+	<logger name="org.hibernate">
+		<level value="DEBUG"/>
+	</logger>
+	<root>
+		<priority value="INFO"/>
+		<appender-ref ref="CONSOLE"/>
+	</root>
+</log4j:configuration>


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/log4j.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml
===================================================================
--- labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml	2009-12-16 19:09:49 UTC (rev 30727)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:drools="http://drools.org/schema/drools-spring"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+                        http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd">
+
+	<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+		<!-- org.h2.jdbcx.JdbcDataSource -->
+		<property name="driverClassName" value="org.h2.Driver" />
+		<!-- jdbc:h2:mem:mydb 
+		jdbc:h2:tcp://localhost/DroolsFlow-->
+		<property name="url" value="jdbc:h2:tcp://localhost/DroolsFlow" />
+		<property name="username" value="sa" />
+		<property name="password" value="" />
+	</bean>
+
+	<!--
+		<bean id="sm1" class="org.drools.vsm.local.ServiceManagerLocalClient" /> 
+	<drools:kbase id="kbase1" serviceManager="sm1">
+		<drools:resource type="DRF" source="classpath:rules/VariablePersistenceStrategyProcess.rf" />
+	</drools:kbase>
+	<drools:ksession id="ksession1" type="stateless" name="stateless1" kbase="kbase1" serviceManager="sm1" />
+	<drools:ksession id="ksession2" type="stateful" kbase="kbase1" serviceManager="sm1" />
+	 -->
+	<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+		<property name="dataSource" ref="ds" />
+		<property name="persistenceUnitName" value="org.drools.persistence.jpa.local" />
+	</bean>
+
+	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
+		<property name="entityManagerFactory" ref="myEmf" />
+	</bean>
+
+	<!-- 
+	<bean id="jpaProcessKnowledgeProvider" class="org.drools.container.spring.beans.persistence.JPAKnowledgeServiceBean">
+		<property name="kbase" ref="kbase1" />
+		<property name="serviceManager" ref="sm1" />
+		<property name="entityManagerFactory" ref="myEmf" />
+		<property name="transactionManager" ref="txManager" />
+		<property name="variablePersisters">
+			<map>
+				<entry key="javax.persistence.Entity" value="org.drools.persistence.processinstance.persisters.JPAVariablePersister"/>
+				<entry key="java.lang.String" value="org.plugtree.labs.variablepersistence.StringVariablePersister"/>
+				<entry key="java.io.Serializable" value="org.drools.persistence.processinstance.persisters.SerializableVariablePersister"/>
+			</map>
+		</property>
+	</bean>
+	 -->
+</beans>
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-container/drools-spring/src/test/resources/org/drools/container/spring/beans/persistence/beans.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java	2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/jpa/impl/JPAKnowledgeServiceProviderImpl.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -1,5 +1,7 @@
 package org.drools.persistence.jpa.impl;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.Properties;
 
 import org.drools.KnowledgeBase;
@@ -7,86 +9,177 @@
 import org.drools.command.CommandService;
 import org.drools.command.impl.CommandBasedStatefulKnowledgeSession;
 import org.drools.persistence.jpa.JPAKnowledgeServiceProvider;
+import org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory;
+import org.drools.persistence.processinstance.JPASignalManagerFactory;
+import org.drools.persistence.processinstance.JPAWorkItemManagerFactory;
 import org.drools.persistence.session.SingleSessionCommandService;
+import org.drools.process.instance.ProcessInstanceManagerFactory;
+import org.drools.process.instance.WorkItemManagerFactory;
+import org.drools.process.instance.event.SignalManagerFactory;
 import org.drools.runtime.Environment;
 import org.drools.runtime.KnowledgeSessionConfiguration;
 import org.drools.runtime.StatefulKnowledgeSession;
-import org.drools.runtime.process.ProcessInstance;
 
 public class JPAKnowledgeServiceProviderImpl
-    implements
-    JPAKnowledgeServiceProvider {
+		implements
+		JPAKnowledgeServiceProvider {
 
-    public StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase,
-                                                                KnowledgeSessionConfiguration configuration,
-                                                                Environment environment) {
-        if ( configuration == null ) {
-            configuration = new SessionConfiguration();
-        }
-        
-        if ( environment == null ) {
-            throw new IllegalArgumentException( "Environment cannot be null" );
-        }
-        
-        Properties props = new Properties();
-        
-        props.setProperty( "drools.commandService",
-                                   "org.drools.persistence.session.SingleSessionCommandService" );
-        props.setProperty( "drools.processInstanceManagerFactory",
-                                   "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
-        props.setProperty( "drools.workItemManagerFactory",
-                                   "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
-        props.setProperty( "drools.processSignalManagerFactory",
-                                   "org.drools.persistence.processinstance.JPASignalManagerFactory" );   
-        
-        ((SessionConfiguration)configuration).addProperties( props );
+	private Class<? extends CommandService> commandServiceClass;
+	private Class<? extends ProcessInstanceManagerFactory> processInstanceManagerFactoryClass;
+	private Class<? extends WorkItemManagerFactory> workItemManagerFactoryClass;
+	private Class<? extends SignalManagerFactory> processSignalManagerFactoryClass;
 
-        CommandService commandService = new SingleSessionCommandService( kbase,
-                                                                         configuration,
-                                                                         environment );
-        return new CommandBasedStatefulKnowledgeSession( commandService );
-    }
+	private Properties configProps = new Properties();
 
-    public StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
-                                                                 KnowledgeBase kbase,
-                                                                 KnowledgeSessionConfiguration configuration,
-                                                                 Environment environment) {
-        if ( configuration == null ) {
-            configuration = new SessionConfiguration();
-        }
-        
-        if ( environment == null ) {
-            throw new IllegalArgumentException( "Environment cannot be null" );
-        }
-        
-        Properties props = new Properties();
-        
-        props.setProperty( "drools.commandService",
-                                   "org.drools.persistence.session.SingleSessionCommandService" );
-        props.setProperty( "drools.processInstanceManagerFactory",
-                                   "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory" );
-        props.setProperty( "drools.workItemManagerFactory",
-                                   "org.drools.persistence.processinstance.JPAWorkItemManagerFactory" );
-        props.setProperty( "drools.processSignalManagerFactory",
-                                   "org.drools.persistence.processinstance.JPASignalManagerFactory" );   
-        
-        ((SessionConfiguration)configuration).addProperties( props );
-        
-        CommandService commandService = new SingleSessionCommandService( id,
-                                                                         kbase,
-                                                                         configuration,
-                                                                         environment );
-        return new CommandBasedStatefulKnowledgeSession( commandService );
-    }
-    
-    public int getStatefulKnowledgeSessionId(StatefulKnowledgeSession ksession) {
-        if ( ksession instanceof CommandBasedStatefulKnowledgeSession) {
-            SingleSessionCommandService commandService = ( SingleSessionCommandService ) ((CommandBasedStatefulKnowledgeSession)ksession).getCommandService();
-            return commandService.getSessionId();
-        } else {
-            throw new IllegalArgumentException( "StatefulKnowledgeSession must be an a CommandBasedStatefulKnowledgeSession" );
-        }
-    }
-    
+	public JPAKnowledgeServiceProviderImpl() {
+		setDefaultImplementations();
+	}
 
+	protected void setDefaultImplementations() {
+		setCommandServiceClass(SingleSessionCommandService.class);
+		setProcessInstanceManagerFactoryClass(JPAProcessInstanceManagerFactory.class);
+		setWorkItemManagerFactoryClass(JPAWorkItemManagerFactory.class);
+		setProcessSignalManagerFactoryClass(JPASignalManagerFactory.class);
+	}
+
+	public StatefulKnowledgeSession newStatefulKnowledgeSession(KnowledgeBase kbase,
+			KnowledgeSessionConfiguration configuration,
+			Environment environment) {
+		if (configuration == null) {
+			configuration = new SessionConfiguration();
+		}
+
+		if (environment == null) {
+			throw new IllegalArgumentException("Environment cannot be null");
+		}
+
+		return new CommandBasedStatefulKnowledgeSession(
+				buildCommanService(kbase, mergeConfig(configuration), environment));
+	}
+
+	public StatefulKnowledgeSession loadStatefulKnowledgeSession(int id,
+			KnowledgeBase kbase,
+			KnowledgeSessionConfiguration configuration,
+			Environment environment) {
+		if (configuration == null) {
+			configuration = new SessionConfiguration();
+		}
+
+		if (environment == null) {
+			throw new IllegalArgumentException("Environment cannot be null");
+		}
+
+		return new CommandBasedStatefulKnowledgeSession(
+				buildCommanService(id, kbase, mergeConfig(configuration), environment));
+	}
+
+	private CommandService buildCommanService(int sessionId,
+			KnowledgeBase kbase,
+			KnowledgeSessionConfiguration conf,
+			Environment env) {
+
+		try {
+			Class<? extends CommandService> serviceClass = getCommandServiceClass();
+			Constructor<? extends CommandService> constructor = serviceClass.getConstructor(int.class,
+					KnowledgeBase.class, KnowledgeSessionConfiguration.class, Environment.class);
+			return constructor.newInstance(sessionId, kbase, conf, env);
+		} catch (SecurityException e) {
+			throw new IllegalStateException(e);
+		} catch (NoSuchMethodException e) {
+			throw new IllegalStateException(e);
+		} catch (IllegalArgumentException e) {
+			throw new IllegalStateException(e);
+		} catch (InstantiationException e) {
+			throw new IllegalStateException(e);
+		} catch (IllegalAccessException e) {
+			throw new IllegalStateException(e);
+		} catch (InvocationTargetException e) {
+			throw new IllegalStateException(e);
+		}
+	}
+
+	private CommandService buildCommanService(KnowledgeBase kbase,
+			KnowledgeSessionConfiguration conf,
+			Environment env) {
+
+		Class<? extends CommandService> serviceClass = getCommandServiceClass();
+		try {
+			Constructor<? extends CommandService> constructor = serviceClass.getConstructor(KnowledgeBase.class,
+					KnowledgeSessionConfiguration.class, Environment.class);
+			return constructor.newInstance(kbase, conf, env);
+		} catch (SecurityException e) {
+			throw new IllegalStateException(e);
+		} catch (NoSuchMethodException e) {
+			throw new IllegalStateException(e);
+		} catch (IllegalArgumentException e) {
+			throw new IllegalStateException(e);
+		} catch (InstantiationException e) {
+			throw new IllegalStateException(e);
+		} catch (IllegalAccessException e) {
+			throw new IllegalStateException(e);
+		} catch (InvocationTargetException e) {
+			throw new IllegalStateException(e);
+		}
+	}
+
+	private KnowledgeSessionConfiguration mergeConfig(KnowledgeSessionConfiguration configuration) {
+		((SessionConfiguration) configuration).addProperties(configProps);
+		return configuration;
+	}
+
+	public int getStatefulKnowledgeSessionId(StatefulKnowledgeSession ksession) {
+		if (ksession instanceof CommandBasedStatefulKnowledgeSession) {
+			SingleSessionCommandService commandService = (SingleSessionCommandService) ((CommandBasedStatefulKnowledgeSession) ksession)
+					.getCommandService();
+			return commandService.getSessionId();
+		}
+		throw new IllegalArgumentException("StatefulKnowledgeSession must be an a CommandBasedStatefulKnowledgeSession");
+	}
+
+	public void setCommandServiceClass(Class<? extends CommandService> commandServiceClass) {
+		if (commandServiceClass != null) {
+			this.commandServiceClass = commandServiceClass;
+			configProps.put("drools.commandService", commandServiceClass.getName());
+		}
+	}
+
+	public Class<? extends CommandService> getCommandServiceClass() {
+		return commandServiceClass;
+	}
+
+	public void setProcessInstanceManagerFactoryClass(
+			Class<? extends ProcessInstanceManagerFactory> processInstanceManagerFactoryClass) {
+		if (processInstanceManagerFactoryClass != null) {
+			this.processInstanceManagerFactoryClass = processInstanceManagerFactoryClass;
+			configProps.put("drools.processInstanceManagerFactory", processInstanceManagerFactoryClass.getName());
+		}
+	}
+
+	public Class<? extends ProcessInstanceManagerFactory> getProcessInstanceManagerFactoryClass() {
+		return processInstanceManagerFactoryClass;
+	}
+
+	public void setWorkItemManagerFactoryClass(Class<? extends WorkItemManagerFactory> workItemManagerFactoryClass) {
+		if (workItemManagerFactoryClass != null) {
+			this.workItemManagerFactoryClass = workItemManagerFactoryClass;
+			configProps.put("drools.workItemManagerFactory", workItemManagerFactoryClass.getName());
+		}
+	}
+
+	public Class<? extends WorkItemManagerFactory> getWorkItemManagerFactoryClass() {
+		return workItemManagerFactoryClass;
+	}
+
+	public void setProcessSignalManagerFactoryClass(
+			Class<? extends SignalManagerFactory> processSignalManagerFactoryClass) {
+		if (processSignalManagerFactoryClass != null) {
+			this.processSignalManagerFactoryClass = processSignalManagerFactoryClass;
+			configProps.put("drools.processSignalManagerFactory", processSignalManagerFactoryClass.getName());
+		}
+	}
+
+	public Class<? extends SignalManagerFactory> getProcessSignalManagerFactoryClass() {
+		return processSignalManagerFactoryClass;
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java	2009-12-16 19:09:39 UTC (rev 30726)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/session/SessionInfo.java	2009-12-16 19:09:49 UTC (rev 30727)
@@ -59,6 +59,10 @@
         this.helper = helper;
     }
 
+    public JPASessionMarshallingHelper getJPASessionMashallingHelper() {
+        return helper;
+    }
+    
     public byte[] getData() {
         return this.rulesByteArray;
     }



More information about the jboss-svn-commits mailing list