package org.jbpm.persistence.map.impl; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.common.AbstractRuleBase; import org.drools.impl.InternalKnowledgeBase; import org.drools.process.instance.WorkItemHandler; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.process.WorkItem; import org.drools.runtime.process.WorkItemManager; import org.jbpm.process.instance.ProcessInstance; import org.jbpm.ruleflow.core.RuleFlowProcess; import org.jbpm.ruleflow.instance.RuleFlowProcessInstance; import org.junit.Assert; import org.junit.Test; public abstract class MapPersistenceTest { @Test public void startProcessInPersistentEnvironment() { String processId = "minimalProcess"; KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()) .addProcess( ProcessCreatorForHelp.newShortestProcess( processId ) ); StatefulKnowledgeSession crmPersistentSession = createSession(kbase); crmPersistentSession.startProcess(processId); crmPersistentSession.dispose(); } @Test public void createProcessStartItDisposeAndLoadItAgain() { String processId = "minimalProcess"; String workName = "MyWork"; KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()) .addProcess( ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); StatefulKnowledgeSession ksession = createSession(kbase); DummyWorkItemHandler handler = new DummyWorkItemHandler(); ksession.getWorkItemManager() .registerWorkItemHandler(workName, handler); long process1Id = ksession.startProcess(processId).getId(); ksession = disposeAndReloadSession(ksession, kbase); ksession.getWorkItemManager().registerWorkItemHandler(workName, handler); long workItemId = handler.getLatestWorkItem().getId(); ksession.getWorkItemManager().completeWorkItem(workItemId, null); Assert.assertNotNull(ksession); Assert.assertNull( ksession.getProcessInstance( process1Id ) ); } @Test public void signalEventTest() { String processId = "signalProcessTest"; String eventType = "myEvent"; RuleFlowProcess process = ProcessCreatorForHelp.newSimpleEventProcess( processId, eventType ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()).addProcess( process ); StatefulKnowledgeSession crmPersistentSession = createSession(kbase); RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) crmPersistentSession.startProcess( processId ); long processInstanceId = processInstance.getId(); Assert.assertEquals( ProcessInstance.STATE_ACTIVE, processInstance.getState() ); crmPersistentSession = createSession(kbase); crmPersistentSession.signalEvent( eventType, null ); processInstance = (RuleFlowProcessInstance) crmPersistentSession.getProcessInstance( processInstanceId ); Assert.assertNull( processInstance ); } @Test public void executeMultipleProcessTest() { String processId = "minimalProcess"; String workName = "MyWork"; KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()) .addProcess( ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); StatefulKnowledgeSession ksession1 = createSession(kbase); StatefulKnowledgeSession ksession2 = createSession(kbase); DummyWorkItemHandler handler1 = new DummyWorkItemHandler(); ksession1.getWorkItemManager() .registerWorkItemHandler( workName, handler1 ); DummyWorkItemHandler handler2 = new DummyWorkItemHandler(); ksession2.getWorkItemManager() .registerWorkItemHandler( workName, handler2 ); long process1Id = ksession1.startProcess( processId ).getId(); long workItem1Id = handler1.getLatestWorkItem().getId(); ksession1 = disposeAndReloadSession( ksession1, kbase); ksession1.getWorkItemManager().completeWorkItem( workItem1Id, null ); Assert.assertNull( ksession1.getProcessInstance( process1Id ) ); ksession2 = disposeAndReloadSession(ksession2, kbase); Assert.assertNotNull(ksession2); ksession2.getWorkItemManager() .registerWorkItemHandler( workName, handler2 ); long process2Id = ksession2.startProcess( processId ).getId(); long workItem2Id = handler2.getLatestWorkItem().getId(); ksession2.getWorkItemManager().completeWorkItem( workItem2Id, null ); Assert.assertNull( ksession2.getProcessInstance( process2Id ) ); } @Test public void multipleKSessionDifferentIdTest() { KnowledgeBase kbase1 = KnowledgeBaseFactory.newKnowledgeBase(); KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase(); StatefulKnowledgeSession ksession1 = createSession(kbase1); StatefulKnowledgeSession ksession2 = createSession(kbase2); Assert.assertNotSame(ksession1.getId(), ksession2.getId()); } @Test public void multipleSessionsWithSameProcessAndDifferentIdTest() { String processId = "signalProcessTest"; String eventType = "myEvent"; RuleFlowProcess process1 = ProcessCreatorForHelp.newSimpleEventProcess( processId, eventType ); RuleFlowProcess process2 = ProcessCreatorForHelp.newSimpleEventProcess( processId, eventType ); KnowledgeBase kbase1 = KnowledgeBaseFactory.newKnowledgeBase(); KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase1).getRuleBase()).addProcess( process1 ); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase2).getRuleBase()).addProcess( process2 ); StatefulKnowledgeSession ksession1 = createSession(kbase1); StatefulKnowledgeSession ksession2 = createSession(kbase2); Assert.assertNotSame(ksession1.getId(), ksession2.getId()); Long processInstance1Id = ksession1.startProcess(processId).getId(); Long processInstance2Id = ksession2.startProcess(processId).getId(); Assert.assertNotSame(processInstance1Id, processInstance2Id); } @Test public void multipleSessionsWithSameProcessAndSameWorkItemAndDifferentIdTest() { String processId = "minimalProcess"; String workName = "MyWork"; KnowledgeBase kbase1 = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase1).getRuleBase()) .addProcess( ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase2).getRuleBase()) .addProcess( ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); StatefulKnowledgeSession ksession1 = createSession(kbase1); StatefulKnowledgeSession ksession2 = createSession(kbase2); DummyWorkItemHandler handler1 = new DummyWorkItemHandler(); DummyWorkItemHandler handler2 = new DummyWorkItemHandler(); ksession1.getWorkItemManager().registerWorkItemHandler(workName, handler1); ksession2.getWorkItemManager().registerWorkItemHandler(workName, handler2); ksession1.startProcess(processId); ksession2.startProcess(processId); long workItem1Id = handler1.getLatestWorkItem().getId(); long workItem2Id = handler2.getLatestWorkItem().getId(); Assert.assertNotSame(workItem1Id, workItem2Id); } @Test public void crashProcessBeforePersisting() { String processId = "myProcess"; String workName = "someWork"; KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()) .addProcess( ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); StatefulKnowledgeSession crmPersistentSession = createSession( kbase ); ChrashingWorkItemHandler handler = new ChrashingWorkItemHandler(); crmPersistentSession.getWorkItemManager() .registerWorkItemHandler( workName, handler ); try { crmPersistentSession.startProcess( processId ); Assert.fail(); } catch ( RuntimeException re ) { } Assert.assertEquals( 1, getKnowledgeSessionsCount() ); Assert.assertEquals( 0, getProcessInstancesCount() ); } @Test public void processWithSubProcessThatCrashTest() { String processId = "minimalProcess"; String subProcessId = "subProcess"; String workName = "MyWork"; KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()) .addProcess( ProcessCreatorForHelp.newProcessWithOneWork(subProcessId, workName)); ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()) .addProcess( ProcessCreatorForHelp.newProcessWithOneSubProcess(processId, subProcessId)); StatefulKnowledgeSession ksession = createSession(kbase); ChrashingWorkItemHandler handler = new ChrashingWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler(workName, handler); try { ksession.startProcess(processId); Assert.fail(); } catch ( RuntimeException re ) { Assert.assertEquals( 1, getKnowledgeSessionsCount() ); Assert.assertEquals( 0, getProcessInstancesCount() ); } } protected abstract StatefulKnowledgeSession createSession(KnowledgeBase kbase); protected abstract StatefulKnowledgeSession disposeAndReloadSession(StatefulKnowledgeSession crmPersistentSession, KnowledgeBase kbase); protected abstract int getProcessInstancesCount(); protected abstract int getKnowledgeSessionsCount(); private static class DummyWorkItemHandler implements WorkItemHandler { private WorkItem latestWorkItem; public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { this.setLatestWorkItem( workItem ); } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { } public void setLatestWorkItem(WorkItem latestWorkItem) { this.latestWorkItem = latestWorkItem; } public WorkItem getLatestWorkItem() { return latestWorkItem; } } private static class ChrashingWorkItemHandler implements WorkItemHandler { public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { throw new RuntimeException( "I die" ); } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { } } }