conditional Fork: execute NOT all transition
hannes Apr 11, 2006 1:44 PM(jbpm:3.0.2)
Hi there,
I have following use case:
+----+ |Fork| +----+ / \ +--------+ +-------+ |State A | |State B| +--------+ +-------+ \ / +-----+ |Join | +-----+
Now I want to execute all 4 possible cases:
A B
0 0: execute none of the (task)nodes, proceed with join
0 1: execute only State B
1 0: execute only State A
1 1: execute both States
There are controller variables in the context that decide whether the state should be executed or not.
So I tried a simple conditioned transition:
<fork name="fork1> <transition name="toStateA" to="State A"> <script> <expression>isStateA.booleanValue()</expression> </script> </transition> <transition name="toStateB" to="State B"> <script> <expression>isStateB.booleanValue()</expression> </script> </transition> </fork>
But the beanshell scripts dont get considered and it forks into both transitions.
When you throw a look on the Fork class:
public void execute(ExecutionContext executionContext) { Token token = executionContext.getToken(); Node forkNode = token.getNode(); // phase one: collect all the transitionNames Collection transitionNames = null; List forkedTokens = new ArrayList(); // by default, the fork spawns a token for each leaving transition if (script==null) { transitionNames = forkNode.getLeavingTransitionsMap().keySet(); } else { // a script is specified // if a script is specified, use that script to calculate the set // of leaving transitions to be used for forking tokens. Map outputMap = script.eval(token); if (outputMap.size()==1) { Object result = outputMap.values().iterator().next(); if (result instanceof Collection) { transitionNames = (Collection) result; } } if (transitionNames==null) { throw new RuntimeException("script for fork '"+name+"' should produce one collection (in one writable variable): "+transitionNames); } } ...
You see, that there has to be directly a script under the fork-node, and that script has to have a list of the transition names as output.
Ok, I could bybas this trouble by using several decision nodes (in this case 1 with 4 leaving Transition: ->A, ->B, ->fork, ->the node after the join), but if have more than 2 childs, it would quickly get very complicated.
So, what do you recommend? Maybe its still possible with the the current (3.0.2) API/JPDL, maybe I missed some point.