package org.jbpm.persistence.session;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.naming.InitialContext;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.transaction.UserTransaction;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.base.MapGlobalResolver;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.event.process.ProcessCompletedEvent;
import org.drools.event.process.ProcessEvent;
import org.drools.event.process.ProcessEventListener;
import org.drools.event.process.ProcessNodeLeftEvent;
import org.drools.event.process.ProcessNodeTriggeredEvent;
import org.drools.event.process.ProcessStartedEvent;
import org.drools.event.process.ProcessVariableChangedEvent;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.ClassPathResource;
import org.drools.persistence.jpa.JPAKnowledgeService;
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.process.ProcessInstance;
import org.drools.runtime.process.WorkItem;
import org.jbpm.JbpmTestCase;
import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler;
import bitronix.tm.TransactionManagerServices;
import bitronix.tm.resource.jdbc.PoolingDataSource;
public class PersistentStatefulSessionTest extends JbpmTestCase {
PoolingDataSource ds1;
@Override
protected void setUp() throws Exception {
ds1 = new PoolingDataSource();
ds1.setUniqueName( "jdbc/testDS1" );
ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
ds1.setMaxPoolSize( 3 );
ds1.setAllowLocalTransactions( true );
ds1.getDriverProperties().put( "user",
"sa" );
ds1.getDriverProperties().put( "password",
"sasa" );
ds1.getDriverProperties().put( "URL",
"jdbc:h2:mem:mydb" );
ds1.init();
}
@Override
protected void tearDown() throws Exception {
ds1.close();
}
public void testLocalTransactionPerStatement() {
String str = "";
str += "package org.drools.test\n";
str += "global java.util.List list\n";
str += "rule rule1\n";
str += "when\n";
str += " Integer(intValue > 0)\n";
str += "then\n";
str += " list.add( 1 );\n";
str += "end\n";
str += "\n";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
ResourceType.DRL );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
if ( kbuilder.hasErrors() ) {
fail( kbuilder.getErrors().toString() );
}
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
List<?> list = new ArrayList<Object>();
ksession.setGlobal( "list",
list );
ksession.insert( 1 );
ksession.insert( 2 );
ksession.insert( 3 );
ksession.fireAllRules();
assertEquals( 3,
list.size() );
}
public void testUserTransactions() throws Exception {
String str = "";
str += "package org.drools.test\n";
str += "global java.util.List list\n";
str += "rule rule1\n";
str += "when\n";
str += " $i : Integer(intValue > 0)\n";
str += "then\n";
str += " list.add( $i );\n";
str += "end\n";
str += "\n";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
ResourceType.DRL );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
if ( kbuilder.hasErrors() ) {
fail( kbuilder.getErrors().toString() );
}
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
ut.commit();
// EntityManager em = emf.createEntityManager();
// SessionInfo sInfo = em.find( SessionInfo.class, 1 );
// assertNotNull( sInfo );
// //System.out.println( "session creation : " + sInfo.getVersion() );
// em.close();
List<?> list = new ArrayList<Object>();
// insert and commit
ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ksession.setGlobal( "list",
list );
ksession.insert( 1 );
ksession.insert( 2 );
ut.commit();
//
// insert and rollback
ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ksession.insert( 3 );
ut.rollback();
// check we rolled back the state changes from the 3rd insert
ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ksession.fireAllRules();
ut.commit();
assertEquals( 2,
list.size() );
// // insert and commit
ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ksession.insert( 3 );
ksession.insert( 4 );
ut.commit();
// rollback again, this is testing that we can do consecutive rollbacks and commits without issue
ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ksession.insert( 5 );
ksession.insert( 6 );
ut.rollback();
ksession.fireAllRules();
assertEquals( 4,
list.size() );
// now load the ksession
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( ksession.getId(), kbase, null, env );
ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ksession.insert( 7 );
ksession.insert( 8 );
ut.commit();
ksession.fireAllRules();
assertEquals( 6,
list.size() );
}
public void testPersistenceWorkItems() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
ResourceType.DRF );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int id = ksession.getId();
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
ksession.insert( "TestString" );
System.out.println( "Started process instance " + processInstance.getId() );
TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
WorkItem workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertEquals( 1,
ksession.getObjects().size() );
for ( Object o : ksession.getObjects() ) {
System.out.println( o );
}
assertNull( processInstance );
}
public void testPersistenceWorkItems2() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
ResourceType.DRF );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int id = ksession.getId();
UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
ut.begin();
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
ksession.insert( "TestString" );
System.out.println( "Started process instance " + processInstance.getId() );
TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
WorkItem workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
ut.commit();
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertEquals( 1,
ksession.getObjects().size() );
for ( Object o : ksession.getObjects() ) {
System.out.println( o );
}
assertNull( processInstance );
}
public void testPersistenceWorkItems3() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
ResourceType.DRF );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
ksession.getWorkItemManager().registerWorkItemHandler("MyWork", new SystemOutWorkItemHandler());
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
ksession.insert( "TestString" );
assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
public void testPersistenceState() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "StateProcess.rf" ),
ResourceType.DRF );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
env.set( EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int id = ksession.getId();
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
System.out.println( "Started process instance " + processInstance.getId() );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.insert(new ArrayList<Object>());
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNull( processInstance );
}
public void testPersistenceRuleSet() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "RuleSetProcess.rf" ),
ResourceType.DRF );
kbuilder.add( new ClassPathResource( "RuleSetRules.drl" ),
ResourceType.DRL );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
env.set( EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int id = ksession.getId();
ksession.insert(new ArrayList<Object>());
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.fireAllRules();
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNull( processInstance );
}
public void testPersistenceEvents() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "EventsProcess.rf" ),
ResourceType.DRF );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int id = ksession.getId();
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
System.out.println( "Started process instance " + processInstance.getId() );
TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
WorkItem workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession.signalEvent("MyEvent1", null, processInstance.getId());
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession.signalEvent("MyEvent2", null, processInstance.getId());
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNull( processInstance );
}
public void testProcessListener() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "WorkItemsProcess.rf" ),
ResourceType.DRF );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
final List<ProcessEvent> events = new ArrayList<ProcessEvent>();
ProcessEventListener listener = new ProcessEventListener() {
public void afterNodeLeft(ProcessNodeLeftEvent event) {
System.out.println("After node left: " + event.getNodeInstance().getNodeName());
events.add(event);
}
public void afterNodeTriggered(ProcessNodeTriggeredEvent event) {
System.out.println("After node triggered: " + event.getNodeInstance().getNodeName());
events.add(event);
}
public void afterProcessCompleted(ProcessCompletedEvent event) {
System.out.println("After process completed");
events.add(event);
}
public void afterProcessStarted(ProcessStartedEvent event) {
System.out.println("After process started");
events.add(event);
}
public void beforeNodeLeft(ProcessNodeLeftEvent event) {
System.out.println("Before node left: " + event.getNodeInstance().getNodeName());
events.add(event);
}
public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) {
System.out.println("Before node triggered: " + event.getNodeInstance().getNodeName());
events.add(event);
}
public void beforeProcessCompleted(ProcessCompletedEvent event) {
System.out.println("Before process completed");
events.add(event);
}
public void beforeProcessStarted(ProcessStartedEvent event) {
System.out.println("Before process started");
events.add(event);
}
public void afterVariableChanged(ProcessVariableChangedEvent event) {
System.out.println("After Variable Changed");
events.add(event);
}
public void beforeVariableChanged(ProcessVariableChangedEvent event) {
System.out.println("Before Variable Changed");
events.add(event);
}
};
ksession.addEventListener(listener);
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
System.out.println( "Started process instance " + processInstance.getId() );
assertEquals(12, events.size());
assertTrue(events.get(0) instanceof ProcessStartedEvent);
assertTrue(events.get(1) instanceof ProcessNodeTriggeredEvent);
assertTrue(events.get(2) instanceof ProcessNodeLeftEvent);
assertTrue(events.get(3) instanceof ProcessNodeTriggeredEvent);
assertTrue(events.get(4) instanceof ProcessNodeLeftEvent);
assertTrue(events.get(5) instanceof ProcessNodeTriggeredEvent);
assertTrue(events.get(6) instanceof ProcessNodeTriggeredEvent);
assertTrue(events.get(7) instanceof ProcessNodeLeftEvent);
assertTrue(events.get(8) instanceof ProcessNodeTriggeredEvent);
assertTrue(events.get(9) instanceof ProcessNodeLeftEvent);
assertTrue(events.get(10) instanceof ProcessNodeTriggeredEvent);
assertTrue(events.get(11) instanceof ProcessStartedEvent);
ksession.removeEventListener(listener);
events.clear();
processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
System.out.println( "Started process instance " + processInstance.getId() );
assertTrue(events.isEmpty());
}
public void testPersistenceSubProcess() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "SuperProcess.rf" ),
ResourceType.DRF );
kbuilder.add( new ClassPathResource( "SubProcess.rf" ),
ResourceType.DRF );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int id = ksession.getId();
ProcessInstance processInstance = ksession.startProcess( "com.sample.SuperProcess" );
System.out.println( "Started process instance " + processInstance.getId() );
TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
WorkItem workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(),
null );
workItem = handler.getWorkItem();
assertNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNull( processInstance );
}
public void testPersistenceVariables() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( new ClassPathResource( "VariablesProcess.rf" ), ResourceType.DRF );
for (KnowledgeBuilderError error: kbuilder.getErrors()) {
System.out.println(error);
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int id = ksession.getId();
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("name", "John Doe");
ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess", parameters );
TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
WorkItem workItem = handler.getWorkItem();
assertNotNull( workItem );
assertEquals( "John Doe", workItem.getParameter("name"));
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
workItem = handler.getWorkItem();
assertNotNull( workItem );
assertEquals( "John Doe", workItem.getParameter("text"));
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNotNull( processInstance );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
ksession.getWorkItemManager().completeWorkItem( workItem.getId(), null );
workItem = handler.getWorkItem();
assertNull( workItem );
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
processInstance = ksession.getProcessInstance( processInstance.getId() );
assertNull( processInstance );
}
public void testSetFocus() {
String str = "";
str += "package org.drools.test\n";
str += "global java.util.List list\n";
str += "rule rule1\n";
str += "agenda-group \"badfocus\"";
str += "when\n";
str += " Integer(intValue > 0)\n";
str += "then\n";
str += " list.add( 1 );\n";
str += "end\n";
str += "\n";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
ResourceType.DRL );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
if ( kbuilder.hasErrors() ) {
fail( kbuilder.getErrors().toString() );
}
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
List<?> list = new ArrayList<Object>();
ksession.setGlobal( "list",
list );
ksession.insert( 1 );
ksession.insert( 2 );
ksession.insert( 3 );
ksession.getAgenda().getAgendaGroup("badfocus").setFocus();
ksession.fireAllRules();
assertEquals( 3,
list.size() );
}
}