package org.jbpm.graph.node;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Element;
import org.jbpm.AbstractJbpmTestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
public class CustomSubProcessResolverTest extends AbstractJbpmTestCase {
private JbpmContext jbpmContext;
protected void setUp() throws Exception {
super.setUp();
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString("<jbpm-configuration>"
+ " <bean name='jbpm.sub.process.resolver' class='"
+ MapBasedProcessRepository.class.getName()
+ "' singleton='true' />"
+ "</jbpm-configuration>");
jbpmContext = jbpmConfiguration.createJbpmContext();
}
protected void tearDown() throws Exception {
jbpmContext.close();
jbpmContext.getJbpmConfiguration().close();
super.tearDown();
}
public static class MapBasedProcessRepository implements SubProcessResolver {
private static final long serialVersionUID = 1L;
private Map processes = new HashMap();
public void add(ProcessDefinition processDefinition) {
processes.put(processDefinition.getName(), processDefinition);
}
public ProcessDefinition findSubProcess(Element subProcessElement) {
String processName = subProcessElement.attributeValue("name");
return (ProcessDefinition) processes.get(processName);
}
}
public void testMapBasedProcessResolving() {
ProcessDefinition subDefinition = ProcessDefinition.parseXmlString("<process-definition name='sub'>"
+ " <start-state>"
+ " <transition to='end' />"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
MapBasedProcessRepository processRepository = (MapBasedProcessRepository) jbpmContext
.getObjectFactory()
.createObject("jbpm.sub.process.resolver");
processRepository.add(subDefinition);
ProcessDefinition superDefinition = ProcessDefinition.parseXmlString("<process-definition name='super'>"
+ " <start-state>"
+ " <transition to='p' />"
+ " </start-state>"
+ " <process-state name='p'>"
+ " <sub-process name='sub' />"
+ " <transition to='end' />"
+ " </process-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessState processState = (ProcessState) superDefinition.getNode("p");
assertSame(subDefinition, processState.getSubProcessDefinition());
}
}