Difference between revisions of "Use of decision node"

From OpenKM Documentation
Jump to: navigation, search
 
(12 intermediate revisions by the same user not shown)
Line 4: Line 4:
  
 
* Creating a class which implements the [http://docs.jboss.com/jbpm/v3.2/javadoc-jpdl/org/jbpm/graph/node/DecisionHandler.html DecisionHandler] interface. The ''decide'' method returns the transition to follow.
 
* Creating a class which implements the [http://docs.jboss.com/jbpm/v3.2/javadoc-jpdl/org/jbpm/graph/node/DecisionHandler.html DecisionHandler] interface. The ''decide'' method returns the transition to follow.
 +
 +
{{Note|Source Eclipse project at [[File:Workflow samples.zip]].}}
  
 
Below we are going to create a process containing a decision node which implements the [http://docs.jboss.com/jbpm/v3.2/javadoc-jpdl/org/jbpm/graph/node/DecisionHandler.html DecisionHandler] interface to decide the next node in the workflow.
 
Below we are going to create a process containing a decision node which implements the [http://docs.jboss.com/jbpm/v3.2/javadoc-jpdl/org/jbpm/graph/node/DecisionHandler.html DecisionHandler] interface to decide the next node in the workflow.
  
 
[[File:Jbpm sample decision.png|center]]
 
[[File:Jbpm sample decision.png|center]]
 +
 +
This process begins at the start node and go across the transition name "initiate". This transition has an action called "createvalue" handler by the class '''ValueAction''', who set the variable "value" in the execution context.
  
 
<source lang="java">
 
<source lang="java">
public class ValorAction implements ActionHandler {
+
public class ValueAction implements ActionHandler {
 +
    private static final long serialVersionUID = 1L;
 
     public String value;
 
     public String value;
  
Line 20: Line 25:
 
</source>
 
</source>
  
 +
After that arrives to the decision node handled by the class '''Decission''', who check the existence of the "value" variable in the execution context. If exists this variable leave the node across the transition "trans1", otherwise go across "trans2".
  
 
<source lang="java">
 
<source lang="java">
 
public class MyDecision implements DecisionHandler {
 
public class MyDecision implements DecisionHandler {
 +
    private static final long serialVersionUID = 1L;
 +
 
     public MyDecision(String info) {
 
     public MyDecision(String info) {
 
         super();
 
         super();
Line 31: Line 39:
 
         String value = (String)executionContext.getContextInstance().getVariable("value");
 
         String value = (String)executionContext.getContextInstance().getVariable("value");
  
         if(valor != null) {
+
         if(value != null) {
             return "trans_1";
+
             return "trans1";
 
         } else {
 
         } else {
             return "trans_2";
+
             return "trans2";
 
         }
 
         }
 
     }
 
     }
 
}
 
}
 
</source>
 
</source>
 +
 +
Finally when arrives to any of the two end nodes, an action is executed which shows the node where the execution flow ends. This action is handled by the class '''ShowMessageAction''':
  
 
<source lang="java">
 
<source lang="java">
 
public class ShowMessageAction implements ActionHandler {
 
public class ShowMessageAction implements ActionHandler {
 +
    private static final long serialVersionUID = 1L;
 +
 
     public ShowMessageAction(String info) {
 
     public ShowMessageAction(String info) {
 
         super();
 
         super();
Line 54: Line 66:
  
 
If in the configuration you have set the "value" variable in the console you will see a message saying that has finished in node "end_1". In the other side, will end in node "end_2".
 
If in the configuration you have set the "value" variable in the console you will see a message saying that has finished in node "end_1". In the other side, will end in node "end_2".
 +
 +
<source lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="decision node">
 +
    <start-state name="start">
 +
        <transition to="decision" name="initiate">
 +
            <action name="createvalue" class="com.openkm.sample.ValueAction"></action>
 +
        </transition>
 +
    </start-state>
 +
 +
    <decision name="decision">
 +
        <handler class="com.openkm.sample.MyDecision"></handler>
 +
        <transition to="end_1" name="trans1"></transition>
 +
        <transition to="end_2" name="trans2"></transition>
 +
    </decision>
 +
 +
    <end-state name="end_1">
 +
        <event type="node-enter">
 +
            <action class="com.openkm.sample.ShowMessageAction"></action>
 +
        </event>
 +
    </end-state>
 +
 +
    <end-state name="end_2">
 +
        <event type="node-enter">
 +
            <action class="com.openkm.sample.ShowMessageAction"></action>
 +
        </event>
 +
    </end-state>
 +
</process-definition>
 +
</source>
  
 
[[Category: Workflow Guide]]
 
[[Category: Workflow Guide]]

Latest revision as of 12:47, 3 December 2012

A decision node is used to guide the process running path. This means you can tell the workflow which way should go. Decision criteria can be specified as follows:

  • Adding conditions to transitions or BeanShell script which returns a boolean. Nodes go across its transitions examining the conditions until found the first one which match a criteria.
  • Creating a class which implements the DecisionHandler interface. The decide method returns the transition to follow.

Nota clasica.png Source Eclipse project at File:Workflow samples.zip.

Below we are going to create a process containing a decision node which implements the DecisionHandler interface to decide the next node in the workflow.

Jbpm sample decision.png

This process begins at the start node and go across the transition name "initiate". This transition has an action called "createvalue" handler by the class ValueAction, who set the variable "value" in the execution context.

public class ValueAction implements ActionHandler {
    private static final long serialVersionUID = 1L;
    public String value;

    @Override
    public void execute(ExecutionContext executionContext) throws Exception {
        executionContext.getContextInstance().setVariable("value", value);
    }
}

After that arrives to the decision node handled by the class Decission, who check the existence of the "value" variable in the execution context. If exists this variable leave the node across the transition "trans1", otherwise go across "trans2".

public class MyDecision implements DecisionHandler {
    private static final long serialVersionUID = 1L;

    public MyDecision(String info) {
        super();
    }

    @Override
    public String decide(ExecutionContext executionContext) throws Exception {
        String value = (String)executionContext.getContextInstance().getVariable("value");

        if(value != null) {
            return "trans1";
        } else {
            return "trans2";
        }
    }
}

Finally when arrives to any of the two end nodes, an action is executed which shows the node where the execution flow ends. This action is handled by the class ShowMessageAction:

public class ShowMessageAction implements ActionHandler {
    private static final long serialVersionUID = 1L;

    public ShowMessageAction(String info) {
        super();
    }

    @Override
    public void execute(ExecutionContext executionContext) throws Exception {
        System.out.println("Flow go to node: " + executionContext.getNode().getName());
    }
}

If in the configuration you have set the "value" variable in the console you will see a message saying that has finished in node "end_1". In the other side, will end in node "end_2".

<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="decision node">
    <start-state name="start">
        <transition to="decision" name="initiate">
            <action name="createvalue" class="com.openkm.sample.ValueAction"></action>
        </transition>
    </start-state>

    <decision name="decision">
        <handler class="com.openkm.sample.MyDecision"></handler>
        <transition to="end_1" name="trans1"></transition>
        <transition to="end_2" name="trans2"></transition>
    </decision>

    <end-state name="end_1">
        <event type="node-enter">
            <action class="com.openkm.sample.ShowMessageAction"></action>
        </event>
    </end-state>

    <end-state name="end_2">
        <event type="node-enter">
            <action class="com.openkm.sample.ShowMessageAction"></action>
        </event>
    </end-state>
</process-definition>