package org.jbpm.jpdl.exe;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.db.AbstractDbTestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
public class AvailableTransitionsDbTest extends AbstractDbTestCase {
public void testSimpleAvailableTransitions() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='conditionalavailability' initial='start'>"
+ " <state name='start'>"
+ " <transition name='high' to='theone'>"
+ " <condition expression='#{a > 0}' />"
+ " </transition>"
+ " <transition name='medium' to='theone'>"
+ " <condition expression='#{a == 0}' />"
+ " </transition>"
+ " <transition name='low' to='theother'>"
+ " <condition expression='#{a <= 0}' />"
+ " </transition>"
+ " <transition name='alwaysavailable' to='theother'/>"
+ " </state>"
+ " <state name='theone'/>"
+ " <state name='theother'/>"
+ "</process-definition>");
deployProcessDefinition(processDefinition);
ProcessInstance processInstance = jbpmContext.newProcessInstance("conditionalavailability");
processInstance = saveAndReload(processInstance);
Set availableTransitions = processInstance.getRootToken().getAvailableTransitions();
assertEquals(1, availableTransitions.size());
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable("a", new Integer(-3));
processInstance = saveAndReload(processInstance);
contextInstance = processInstance.getContextInstance();
Set expectedTransitionNames = new HashSet();
expectedTransitionNames.add("low");
expectedTransitionNames.add("alwaysavailable");
availableTransitions = processInstance.getRootToken().getAvailableTransitions();
assertEquals(expectedTransitionNames, getTransitionNames(availableTransitions));
contextInstance.setVariable("a", new Integer(0));
processInstance = saveAndReload(processInstance);
contextInstance = processInstance.getContextInstance();
expectedTransitionNames = new HashSet();
expectedTransitionNames.add("low");
expectedTransitionNames.add("medium");
expectedTransitionNames.add("alwaysavailable");
availableTransitions = processInstance.getRootToken().getAvailableTransitions();
assertEquals(expectedTransitionNames, getTransitionNames(availableTransitions));
contextInstance.setVariable("a", new Integer(4));
processInstance = saveAndReload(processInstance);
contextInstance = processInstance.getContextInstance();
expectedTransitionNames = new HashSet();
expectedTransitionNames.add("high");
expectedTransitionNames.add("alwaysavailable");
availableTransitions = processInstance.getRootToken().getAvailableTransitions();
assertEquals(expectedTransitionNames, getTransitionNames(availableTransitions));
}
public Set getTransitionNames(Set availableTransitions) {
Set transitionNames = new HashSet();
if (availableTransitions != null) {
for (Iterator iter = availableTransitions.iterator(); iter.hasNext();) {
Transition transition = (Transition) iter.next();
transitionNames.add(transition.getName());
}
}
return transitionNames;
}
public void testSuperStateAvailableTransitions() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='conditionalavailability' initial='start'>"
+ " <super-state name='start'>"
+ " <state name='go'>"
+ " <transition name='inneralwaysavailable' to='../theother' />"
+ " <transition name='five' to='../theone'>"
+ " <condition expression='#{a == 5}' />"
+ " </transition>"
+ " </state>"
+ " <transition name='high' to='theone'>"
+ " <condition expression='#{a > 0}' />"
+ " </transition>"
+ " <transition name='medium' to='theone'>"
+ " <condition expression='#{a == 0}' />"
+ " </transition>"
+ " <transition name='low' to='theother'>"
+ " <condition expression='#{a <= 0}' />"
+ " </transition>"
+ " <transition name='outeralwaysavailable' to='theother'/>"
+ " </super-state>"
+ " <state name='theone'/>"
+ " <state name='theother'/>"
+ "</process-definition>");
deployProcessDefinition(processDefinition);
ProcessInstance processInstance = jbpmContext.newProcessInstance("conditionalavailability");
Set availableTransitions = processInstance.getRootToken().getAvailableTransitions();
assertEquals(2, availableTransitions.size());
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable("a", new Integer(5));
processInstance = saveAndReload(processInstance);
contextInstance = processInstance.getContextInstance();
Set expectedTransitionNames = new HashSet();
expectedTransitionNames.add("five");
expectedTransitionNames.add("inneralwaysavailable");
expectedTransitionNames.add("outeralwaysavailable");
expectedTransitionNames.add("high");
availableTransitions = processInstance.getRootToken().getAvailableTransitions();
assertEquals(expectedTransitionNames, getTransitionNames(availableTransitions));
}
}