package org.jbpm.jbpm1755;
import org.hibernate.LockMode;
import org.jbpm.db.AbstractDbTestCase;
import org.jbpm.graph.def.Event;
import org.jbpm.graph.def.EventCallback;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.node.Join;
/**
* Allow process author to set the parent token lock mode in the join token.
*
* @see <a href="https://jira.jboss.org/jira/browse/JBPM-1755">JBPM-1755</a>
* @author Alejandro Guizar
*/
public class JBPM1755Test extends AbstractDbTestCase {
private ProcessDefinition processDefinition;
private static final int INSTANCE_COUNT = 5;
protected void setUp() throws Exception {
super.setUp();
processDefinition = ProcessDefinition.parseXmlResource("org/jbpm/jbpm1755/parallelprocess.xml");
}
protected void tearDown() throws Exception {
EventCallback.clear();
super.tearDown();
}
public void testReadLock() {
launchProcessInstances(LockMode.READ);
}
public void testUpgradeLock() {
launchProcessInstances(LockMode.UPGRADE);
}
public void testForceLock() {
launchProcessInstances(LockMode.FORCE);
}
private void launchProcessInstances(LockMode lockMode) {
Join join = (Join) processDefinition.getNode("join1");
join.setParentLockMode(lockMode.toString());
deployProcessDefinition(processDefinition);
long[] processInstanceIds = new long[INSTANCE_COUNT];
for (int i = 0; i < INSTANCE_COUNT; i++) {
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstanceIds[i] = processInstance.getId();
processInstance.getContextInstance().setVariable("eventCallback", new EventCallback());
processInstance.signal();
jbpmContext.save(processInstance);
}
processJobs();
for (int i = 0; i < INSTANCE_COUNT; i++) {
long processInstanceId = processInstanceIds[i];
assertTrue("expected process instance " + processInstanceId + " to have ended",
jbpmContext.loadProcessInstance(processInstanceId).hasEnded());
}
}
protected void waitForJobs(long timeout) {
EventCallback.waitForEvent(INSTANCE_COUNT, Event.EVENTTYPE_PROCESS_END);
}
}