package org.jbpm.examples;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Collection;
import java.util.List;
import org.jbpm.examples.ProcessEngineService;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.manager.RuntimeManager;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.task.TaskService;
import org.kie.api.task.model.TaskSummary;
import org.kie.internal.runtime.manager.context.EmptyContext;
import bitronix.tm.resource.jdbc.PoolingDataSource;
/**
* This test case illustrates how to use jBPM RuntimeManager.
* <ul>
* <li>ProcessEngineService - this is the primary entry point for application business logic</li>
* </ul>
*
* Test case has regular JUnit life cycle phases
* <ul>
* <li>BeforeClass - configures data source to processes/tasks can be persisted</li>
* <li>Before - cleans up singleton session id as it is singleton so it must persist session id that was used - not relevant in tests</li>
* <li>After - disposes process engine instance</li>
* <li>AfterClass - shuts down data source</li>
* </ul>
* Test itself is very simple as it aims at presenting:
* <ul>
* <li>hot to list processes available</li>
* <li>how to get hold of RuntimeManager and RuntimeEngine</li>
* <li>how to start process</li>
* <li>work with task (start, complete, etc)</li>
* </ul>
*/
public class ProcessEngineServiceTest {
private static PoolingDataSource pds;
@BeforeClass
public static void setupOnce() {
pds = new PoolingDataSource();
pds.setUniqueName("jdbc/jbpm-ds");
pds.setClassName("bitronix.tm.resource.jdbc.lrc.LrcXADataSource");
pds.setMaxPoolSize(5);
pds.setAllowLocalTransactions(true);
pds.getDriverProperties().put("user", "sa");
pds.getDriverProperties().put("password", "");
pds.getDriverProperties().put("url", "jdbc:h2:mem:jbpm-db;MVCC=true");
pds.getDriverProperties().put("driverClassName", "org.h2.Driver");
pds.init();
}
@AfterClass
public static void cleanup() {
if (pds != null) {
pds.close();
}
}
@Before
public void prepare() {
cleanupSingletonSessionId();
processService = new ProcessEngineService();
processService.init();
}
@After
public void dispose() {
processService.dispose();
}
private ProcessEngineService processService;
@Test
public void testStartSimpleProcess() {
assertNotNull(processService);
Collection<org.kie.api.definition.process.Process> processes = processService.getProcesses();
assertNotNull(processes);
assertEquals(2, processes.size());
RuntimeManager manager = processService.getRuntimeManager();
assertNotNull(manager);
RuntimeEngine engine = manager.getRuntimeEngine(EmptyContext.get());
assertNotNull(engine);
KieSession ksession = engine.getKieSession();
assertNotNull(ksession);
ksession.startProcess("customtask");
}
@Test
public void testStartUserTaskProcess() {
assertNotNull(processService);
Collection<org.kie.api.definition.process.Process> processes = processService.getProcesses();
assertNotNull(processes);
assertEquals(2, processes.size());
RuntimeManager manager = processService.getRuntimeManager();
assertNotNull(manager);
RuntimeEngine engine = manager.getRuntimeEngine(EmptyContext.get());
assertNotNull(engine);
KieSession ksession = engine.getKieSession();
assertNotNull(ksession);
ProcessInstance processInstance = ksession.startProcess("org.jbpm.writedocument");
// check the state of process instance
processInstance = ksession.getProcessInstance(processInstance.getId());
assertNotNull(processInstance);
assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
TaskService taskService = engine.getTaskService();
List<TaskSummary> tasks = taskService.getTasksAssignedAsPotentialOwner("salaboy", "en-UK");
assertNotNull(tasks);
assertEquals(1, tasks.size());
long taskId = tasks.get(0).getId();
taskService.start(taskId, "salaboy");
taskService.complete(taskId, "salaboy", null);
// check the state of process instance
processInstance = ksession.getProcessInstance(processInstance.getId());
assertNotNull(processInstance);
assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
tasks = taskService.getTasksAssignedAsPotentialOwner("translator", "en-UK");
assertNotNull(tasks);
assertEquals(1, tasks.size());
taskId = tasks.get(0).getId();
taskService.start(taskId, "translator");
taskService.complete(taskId, "translator", null);
// check the state of process instance
processInstance = ksession.getProcessInstance(processInstance.getId());
assertNotNull(processInstance);
assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
tasks = taskService.getTasksAssignedAsPotentialOwner("reviewer", "en-UK");
assertNotNull(tasks);
assertEquals(1, tasks.size());
taskId = tasks.get(0).getId();
taskService.start(taskId, "reviewer");
taskService.complete(taskId, "reviewer", null);
// check the state of process instance
processInstance = ksession.getProcessInstance(processInstance.getId());
assertNull(processInstance);
}
/*
* helper methods
*/
protected void cleanupSingletonSessionId() {
File tempDir = new File(System.getProperty("java.io.tmpdir"));
if (tempDir.exists()) {
String[] jbpmSerFiles = tempDir.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith("-jbpmSessionId.ser");
}
});
for (String file : jbpmSerFiles) {
new File(tempDir, file).delete();
}
}
}
}