I wrote a very easy groovy class to build a pvm process, it's funny.
import groovy.util.BuilderSupport;
/**
* ProcessBuilder
* @author Kent Chen
*
*/
public class ProcessBuilder extends BuilderSupport {
def processDefinition
def unsuredFlows = []
def createNode(Object name) {
return createNode(name, null, null)
}
def createNode(Object name, Object value) {
return createNode(name, null, value)
}
def createNode(Object name, Map attributes) {
return createNode(name, attributes, null)
}
def createNode(Object name, Map attributes, Object value) {
if(name == "process"){
processDefinition = new ProcessDefinitionImpl(name:value)
return processDefinition
}
if(name == "activity"){
def activity = new ActivityImpl(name:attributes.name,activityBehaviour:attributes.activityBehaviour)
processDefinition.addActivity(activity)
return activity
}
if(name == "transition"){
def transition = current.createOutgoingTransition()
transition.name = attributes.name
unsuredFlows.add(new UnsuredFlow(transition:transition,to:attributes.to))
return "transition"
}
if(name == "initial"){
return "initial"
}
return name;
}
def void setParent(Object parent, Object child) {
}
def void nodeCompleted(Object parent, Object node) {
if(node == "initial"){
processDefinition.setInitial(parent)
}
if(parent == null){
for(unsuredFlow in unsuredFlows){
def activity = processDefinition.findActivity(unsuredFlow.to)
activity.addIncomingTransition(unsuredFlow.transition)
}
}
}
}
class UnsuredFlow {
TransitionImpl transition
String to
}
def builder = new ProcessBuilder()
builder.process("helloProcess"){
activity(name:"1",activityBehaviour:new TakeBehaviour()){
initial()
transition(name:"t1",to:"2")
transition(name:"t2",to:"3")
}
activity(name:"2",activityBehaviour:new WaitState())
activity(name:"3",activityBehaviour:new WaitState()){
transition(name:"t3",to:"4")
}
activity(name:"4",activityBehaviour:new WaitState())
}
def processInstance = builder.processDefinition.startProcessInstance()
processInstance.signal("t2");
processInstance.signal();
processInstance.signal();