[jbpm-commits] JBoss JBPM SVN: r6399 - in jbpm4/trunk/modules: examples/src/test/resources/org/jbpm/examples/concurrency/foreach and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Jun 10 08:36:43 EDT 2010


Author: alex.guizar at jboss.com
Date: 2010-06-10 08:36:42 -0400 (Thu, 10 Jun 2010)
New Revision: 6399

Modified:
   jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/concurrency/foreach/ForEachTest.java
   jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/concurrency/foreach/process.jpdl.xml
   jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml
Log:
JBPM-2414: document foreach activity

Modified: jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/concurrency/foreach/ForEachTest.java
===================================================================
--- jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/concurrency/foreach/ForEachTest.java	2010-06-10 11:10:39 UTC (rev 6398)
+++ jbpm4/trunk/modules/examples/src/test/java/org/jbpm/examples/concurrency/foreach/ForEachTest.java	2010-06-10 12:36:42 UTC (rev 6399)
@@ -24,6 +24,7 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.jbpm.api.ProcessInstance;
 import org.jbpm.api.task.Task;
@@ -74,14 +75,11 @@
   }
 
   public void testForEachCompleteAll() {
+    Map<String, Object> variables = new HashMap<String, Object>();
+    variables.put("departments", new String[] { "sales-dept", "hr-dept", "finance-dept" });
+    variables.put("quorum", 3);
 
-    HashMap<String, Object> variables = new HashMap<String, Object>();
-    variables.put("listOfDepartments", new String[] { "sales-dept", "hr-dept", "finance-dept" });
-    variables.put("joinAt", 3);
-
-    ProcessInstance processInstance = executionService.startProcessInstanceByKey("ForEachFork", variables);
-    String processInstanceId = processInstance.getId();
-
+    ProcessInstance processInstance = executionService.startProcessInstanceByKey("ForEach", variables);
     // there should be 3 forked executions - same as number of departments
     assertEquals(3, processInstance.getExecutions().size());
 
@@ -119,18 +117,15 @@
     taskService.completeTask(taskListFinance.get(0).getId());
 
     Date endTime = historyService.createHistoryProcessInstanceQuery().processInstanceId(processInstance.getId()).uniqueResult().getEndTime();
-
     assertNotNull(endTime);
   }
 
   public void testForEachCompleteAfterTwoJoined() {
+    Map<String, Object> variables = new HashMap<String, Object>();
+    variables.put("departments", new String[] { "sales-dept", "hr-dept", "finance-dept" });
+    variables.put("quorum", 2);
+    ProcessInstance processInstance = executionService.startProcessInstanceByKey("ForEach", variables);
 
-    HashMap<String, Object> variables = new HashMap<String, Object>();
-    variables.put("listOfDepartments", new String[] { "sales-dept", "hr-dept", "finance-dept" });
-    variables.put("joinAt", 2);
-
-    ProcessInstance processInstance = executionService.startProcessInstanceByKey("ForEachFork", variables);
-
     // there should be 3 forked executions - same as number of departme!
 nts
     assertEquals(3, processInstance.getExecutions().size());
 
@@ -160,7 +155,6 @@
     taskService.completeTask(taskListSales.get(0).getId());
 
     Date endTime = historyService.createHistoryProcessInstanceQuery().processInstanceId(processInstance.getId()).uniqueResult().getEndTime();
-
     assertNotNull(endTime);
   }
 }
Modified: jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/concurrency/foreach/process.jpdl.xml
===================================================================
--- jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/concurrency/foreach/process.jpdl.xml	2010-06-10 11:10:39 UTC (rev 6398)
+++ jbpm4/trunk/modules/examples/src/test/resources/org/jbpm/examples/concurrency/foreach/process.jpdl.xml	2010-06-10 12:36:42 UTC (rev 6399)
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<process name="ForEachFork" xmlns="http://jbpm.org/4.3/jpdl">
+<process name="ForEach" xmlns="http://jbpm.org/4.4/jpdl">
    <start g="28,61,48,48" name="start1">
       <transition to="foreach1"/>
    </start>
-   <foreach var="department" in="#{listOfDepartments}" g="111,60,48,48" name="foreach1">
+   <foreach var="department" in="#{departments}" g="111,60,48,48" name="foreach1">
       <transition to="Collect data"/>
    </foreach>
    <task candidate-groups="#{department}" g="201,58,92,52" name="Collect data">
       <transition to="join1"/>
    </task>
-   <join g="343,59,48,48" multiplicity="#{joinAt}" name="join1">
+   <join g="343,59,48,48" multiplicity="#{quorum}" name="join1">
       <transition to="end1"/>
    </join>
    <end g="433,60,48,48" name="end1"/>
Modified: jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml
===================================================================
--- jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml	2010-06-10 11:10:39 UTC (rev 6398)
+++ jbpm4/trunk/modules/userguide/src/main/docbook/en/modules/ch06-Jpdl.xml	2010-06-10 12:36:42 UTC (rev 6399)
@@ -495,9 +495,43 @@
 
     <section id="concurrency">
       <title><literal>concurrency</literal></title>
-      <para>With the <literal>fork</literal> and <literal>join</literal> activities, 
-      concurrent paths of executions can be modeled.
-      </para>
+      <para>With the <literal>fork</literal>, <literal>foreach</literal> and 
+      <literal>join</literal> activities, concurrent paths of executions can be modeled.
+      The next two tables describe the <literal>foreach</literal>  and <literal>join</literal>
+      attributes; <literal>fork</literal> has no specific attributes.</para>
+      <table><title><literal>foreach</literal> attributes:</title>
+        <tgroup cols="5" rowsep="1" colsep="1">
+          <thead>
+            <row>
+              <entry>Attribute</entry>
+              <entry>Type</entry>
+              <entry>Default</entry>
+              <entry>Required?</entry>
+              <entry>Description</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry><literal>in</literal></entry>
+              <entry>expression or text</entry>
+              <entry></entry>
+              <entry>required</entry>
+              <entry>The collection to be iterated. Each item in the collection spawns a new
+              concurrent execution leaving over the default transition. <literal>in</literal>
+              supports collections of any kind, arrays and comma separated strings.</entry>
+            </row>
+            <row>
+              <entry><literal>var</literal></entry>
+              <entry>text</entry>
+              <entry></entry>
+              <entry>required</entry>
+              <entry>The variable where the current item of the collection is stored.
+              This variable is set in the concurrent execution and is visible only to that
+              execution.</entry>
+            </row>
+          </tbody>
+        </tgroup>
+      </table>
       <table><title><literal>join</literal> attributes:</title>
         <tgroup cols="5" rowsep="1" colsep="1">
           <thead>
@@ -512,7 +546,7 @@
           <tbody>
             <row>
               <entry><literal>multiplicity</literal></entry>
-              <entry>integer</entry>
+              <entry>integer or expression</entry>
               <entry>nbr of incoming transitions</entry>
               <entry>optional</entry>
               <entry>The number of executions that should arrive in this join 
@@ -533,14 +567,17 @@
           </tbody>
         </tgroup>
       </table>
-      <para>For example:</para>
-      <figure id="process.concurrency">
-        <title>The concurrency example process</title>
-        <mediaobject><imageobject><imagedata align="center" fileref="images/process.concurrency.png"/></imageobject></mediaobject>
-      </figure>
-      
-      <programlisting>&lt;process name=&quot;ConcurrencyGraphBased&quot; xmlns=&quot;http://jbpm.org/4.3/jpdl&quot;&gt;
 
+      <section>
+        <title>Parallel split with <literal>fork</literal></title>
+        <para>The <literal>fork</literal> activity allows a single path of execution to be
+        split into two or more branches which can execute activities concurrently.</para>
+        <figure id="process.concurrency">
+          <title>Parallel split example process</title>
+          <mediaobject><imageobject><imagedata align="center" fileref="images/process.concurrency.png"/></imageobject></mediaobject>
+        </figure>
+        <programlisting>&lt;process name=&quot;ConcurrencyGraphBased&quot; xmlns=&quot;http://jbpm.org/4.3/jpdl&quot;&gt;
+
    &lt;start&gt;
       &lt;transition to=&quot;fork&quot;/&gt;
    &lt;/start&gt;
@@ -578,6 +615,50 @@
    &lt;end name=&quot;end&quot; /&gt;
 
 &lt;/process&gt;</programlisting>
+      </section>
+
+      <section>
+        <title>Iterative split with <literal>foreach</literal></title>
+        <para>At a given point in a process, several paths of execution can be initiated
+        in a single branch of the same process instance. In the example, there is a need
+        to collect time sheet reports (called data) from different departments. With 
+        <literal>foreach</literal> this can be quite easily achieved. The same task
+        is to be performed by different groups. Process variable <literal>departments</literal>
+        provides the group names, whereas the variable <literal>quota</literal> indicates
+        how many tasks must be completed before execution will leave the <literal>join</literal>
+        activity.</para>
+        <programlisting><![CDATA[<process name="ForEach" xmlns="http://jbpm.org/4.4/jpdl">
+
+   <start g="28,61,48,48" name="start1">
+      <transition to="foreach1"/>
+   </start>
+
+   <foreach var="department" in="#{departments}" g="111,60,48,48" name="foreach1">
+      <transition to="Collect data"/>
+   </foreach>
+
+   <task candidate-groups="#{department}" g="201,58,92,52" name="Collect data">
+      <transition to="join1"/>
+   </task>
+
+   <join g="343,59,48,48" multiplicity="#{quorum}" name="join1">
+      <transition to="end1"/>
+   </join>
+
+   <end g="433,60,48,48" name="end1"/>
+
+</process>]]></programlisting>
+        <important><para>When using foreach, the corresponding join must have the
+        multiplicity attribute set. In general, join continues execution based on its
+        incoming transitions. When using foreach, join has a single incoming transition.
+        If multiplicity is not specified, the first execution that reaches the join
+        activity will trigger continuation.</para></important>
+        <para>Here is how to initialize the iterative process variables.</para>
+        <programlisting><![CDATA[Map<String, Object> variables = new HashMap<String, Object>();
+variables.put("departments", new String[] { "sales-dept", "hr-dept", "finance-dept" });
+variables.put("quorum", 3);
+ProcessInstance processInstance = executionService.startProcessInstanceByKey("ForEach", variables);]]></programlisting>
+      </section>
     </section>
 
     <!-- ### END ########################################################### -->



More information about the jbpm-commits mailing list