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();