I wrote a very easy groovy class to build a pvm process, it'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 == "process"){<br>
processDefinition = new ProcessDefinitionImpl(name:value)<br> return processDefinition<br> }<br> <br> if(name == "activity"){<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 == "transition"){<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 "transition"<br> }<br> <br> if(name == "initial"){<br> return "initial"<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 == "initial"){<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("helloProcess"){<br>
activity(name:"1",activityBehaviour:new TakeBehaviour()){<br> initial()<br> transition(name:"t1",to:"2")<br> transition(name:"t2",to:"3")<br>
}<br> activity(name:"2",activityBehaviour:new WaitState())<br> activity(name:"3",activityBehaviour:new WaitState()){ <br> transition(name:"t3",to:"4") <br>
}<br> activity(name:"4",activityBehaviour:new WaitState())<br> }<br> <br> def processInstance = builder.processDefinition.startProcessInstance()<br> processInstance.signal("t2");<br>
processInstance.signal();<br> processInstance.signal();<br><br><br><br>