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