package org.jbpm.scenarios;
import java.util.List;
import org.hibernate.criterion.Restrictions;
import org.jbpm.db.AbstractDbTestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
public class TwoSubProcessesInOneTransactionDbTest extends AbstractDbTestCase {
public void testTwoSubProcessesInOneTransaction() throws Throwable {
ProcessDefinition subProcess = ProcessDefinition.parseXmlString("<process-definition name='sub'>"
+ " <start-state>"
+ " <transition to='end' />"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
deployProcessDefinition(subProcess);
ProcessDefinition superProcess = ProcessDefinition.parseXmlString("<process-definition name='super'>"
+ " <start-state>"
+ " <transition to='subprocess one' />"
+ " </start-state>"
+ " <process-state name='subprocess one'>"
+ " <sub-process name='sub' />"
+ " <transition to='subprocess two'/>"
+ " </process-state>"
+ " <process-state name='subprocess two'>"
+ " <sub-process name='sub' />"
+ " <transition to='wait'/>"
+ " </process-state>"
+ " <state name='wait' />"
+ "</process-definition>");
deployProcessDefinition(superProcess);
ProcessInstance processInstance = jbpmContext.newProcessInstance("super");
processInstance.signal();
jbpmContext.save(processInstance);
processJobs();
ProcessInstance superInstance = (ProcessInstance) session.createCriteria(ProcessInstance.class)
.createAlias("processDefinition", "pd")
.add(Restrictions.eq("pd.name", "super"))
.uniqueResult();
assertEquals("wait", superInstance.getRootToken().getNode().getName());
List subInstances = session.createCriteria(ProcessInstance.class)
.createAlias("processDefinition", "pd")
.add(Restrictions.eq("pd.name", "sub"))
.list();
assertEquals(2, subInstances.size());
ProcessInstance subInstance = (ProcessInstance) subInstances.get(0);
assertTrue(subInstance.hasEnded());
assertEquals(superInstance.getRootToken(), subInstance.getSuperProcessToken());
subInstance = (ProcessInstance) subInstances.get(1);
assertTrue(subInstance.hasEnded());
assertEquals(superInstance.getRootToken(), subInstance.getSuperProcessToken());
}
}