[jboss-svn-commits] JBL Code SVN: r20429 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/xml/processes and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jun 11 20:06:59 EDT 2008


Author: KrisVerlaenen
Date: 2008-06-11 20:06:59 -0400 (Wed, 11 Jun 2008)
New Revision: 20429

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/HumanTaskNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SwimlaneHandler.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessHumanTaskTest.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
Log:
JBRULES-1641: ForEach node
 - initial core implementation of a for each node
JBRULES-1551: Workflow human tasks
 - human task node with swimlane integration

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2008-06-12 00:06:52 UTC (rev 20428)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2008-06-12 00:06:59 UTC (rev 20429)
@@ -6,6 +6,7 @@
 import org.drools.xml.processes.ConstraintHandler;
 import org.drools.xml.processes.EndNodeHandler;
 import org.drools.xml.processes.GlobalHandler;
+import org.drools.xml.processes.HumanTaskNodeHandler;
 import org.drools.xml.processes.ImportHandler;
 import org.drools.xml.processes.InPortHandler;
 import org.drools.xml.processes.JoinNodeHandler;
@@ -18,6 +19,7 @@
 import org.drools.xml.processes.SplitNodeHandler;
 import org.drools.xml.processes.StartNodeHandler;
 import org.drools.xml.processes.SubProcessNodeHandler;
+import org.drools.xml.processes.SwimlaneHandler;
 import org.drools.xml.processes.TimerNodeHandler;
 import org.drools.xml.processes.TypeHandler;
 import org.drools.xml.processes.ValueHandler;
@@ -51,6 +53,8 @@
                            new MilestoneNodeHandler() );
         addHandler( "timer",
                            new TimerNodeHandler() );
+        addHandler( "humanTask",
+                           new HumanTaskNodeHandler() );
         addHandler( "composite",
                            new CompositeNodeHandler() );
         addHandler( "connection",
@@ -61,6 +65,8 @@
                            new GlobalHandler() );        
         addHandler( "variable",
                            new VariableHandler() );        
+        addHandler( "swimlane",
+                           new SwimlaneHandler() );        
         addHandler( "type",
                            new TypeHandler() );        
         addHandler( "value",

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java	2008-06-12 00:06:52 UTC (rev 20428)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java	2008-06-12 00:06:59 UTC (rev 20429)
@@ -1,9 +1,12 @@
 package org.drools.xml;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+import org.drools.process.core.context.swimlane.Swimlane;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
 import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.core.datatype.DataType;
@@ -78,6 +81,10 @@
         if (variableScope != null) {
             visitVariables(variableScope.getVariables(), xmlDump);
         }
+        SwimlaneContext swimlaneContext = (SwimlaneContext) process.getDefaultContext(SwimlaneContext.SWIMLANE_SCOPE);
+        if (swimlaneContext != null) {
+            visitSwimlanes(swimlaneContext.getSwimlanes(), xmlDump);
+        }
         xmlDump.append("  </header>" + EOL + EOL);
     }
     
@@ -117,6 +124,16 @@
         }
     }
     
+    private void visitSwimlanes(Collection<Swimlane> swimlanes, StringBuffer xmlDump) {
+        if (swimlanes != null && swimlanes.size() > 0) {
+            xmlDump.append("    <swimlanes>" + EOL);
+            for (Swimlane swimlane: swimlanes) {
+                xmlDump.append("      <swimlane name=\"" + swimlane.getName() + "\" />" + EOL);
+            }
+            xmlDump.append("    </swimlanes>" + EOL);
+        }
+    }
+    
     private void visitDataType(DataType dataType, StringBuffer xmlDump) {
         xmlDump.append("        <type name=\"" + dataType.getClass().getName() + "\" />" + EOL);
     }

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/HumanTaskNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/HumanTaskNodeHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/HumanTaskNodeHandler.java	2008-06-12 00:06:59 UTC (rev 20429)
@@ -0,0 +1,53 @@
+package org.drools.xml.processes;
+
+import org.drools.process.core.Work;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.HumanTaskNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+public class HumanTaskNodeHandler extends WorkItemNodeHandler {
+
+    public void handleNode(final Node node, final Element element, final String uri,
+            final String localName, final ExtensibleXmlParser parser)
+            throws SAXException {
+        super.handleNode(node, element, uri, localName, parser);
+        HumanTaskNode humanTaskNode = (HumanTaskNode) node;
+        final String swimlane = element.getAttribute("swimlane");
+        if (swimlane != null && !"".equals(swimlane)) {
+            humanTaskNode.setSwimlane(swimlane);
+        }
+    }
+
+    protected Node createNode() {
+        return new HumanTaskNode();
+    }
+
+    public Class generateNodeFor() {
+        return HumanTaskNode.class;
+    }
+
+    public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+        WorkItemNode workItemNode = (WorkItemNode) node;
+        writeNode("humanTask", workItemNode, xmlDump, includeMeta);
+        visitParameters(workItemNode, xmlDump);
+        xmlDump.append(">" + EOL);
+        Work work = workItemNode.getWork();
+        visitWork(work, xmlDump, includeMeta);
+        visitInMappings(workItemNode.getInMappings(), xmlDump);
+        visitOutMappings(workItemNode.getOutMappings(), xmlDump);
+        endNode("humanTask", xmlDump);
+    }
+    
+	protected void visitParameters(WorkItemNode workItemNode, StringBuffer xmlDump) {
+	    super.visitParameters(workItemNode, xmlDump);
+	    HumanTaskNode humanTaskNode = (HumanTaskNode) workItemNode;
+	    String swimlane = humanTaskNode.getSwimlane();
+	    if (swimlane != null) {
+	        xmlDump.append("swimlane=\"" + swimlane + "\" ");
+	    }
+	}
+    
+}

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SwimlaneHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SwimlaneHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SwimlaneHandler.java	2008-06-12 00:06:59 UTC (rev 20429)
@@ -0,0 +1,67 @@
+package org.drools.xml.processes;
+
+import java.util.HashSet;
+
+import org.drools.process.core.Process;
+import org.drools.process.core.context.swimlane.Swimlane;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
+import org.drools.workflow.core.impl.WorkflowProcessImpl;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class SwimlaneHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    public SwimlaneHandler() {
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( Process.class );
+
+            this.validPeers = new HashSet();         
+            this.validPeers.add( null );            
+
+            this.allowNesting = false;
+        }
+    }
+    
+
+    
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs,
+                        final ExtensibleXmlParser parser) throws SAXException {
+        parser.startElementBuilder( localName,
+                                    attrs );
+        WorkflowProcessImpl process = (WorkflowProcessImpl) parser.getParent();
+        final String name = attrs.getValue("name");
+        emptyAttributeCheck(localName, "name", name, parser);
+        
+        SwimlaneContext swimlaneContext = (SwimlaneContext) 
+            process.getDefaultContext(SwimlaneContext.SWIMLANE_SCOPE);
+        if (swimlaneContext != null) {
+            Swimlane swimlane = new Swimlane(name);
+            swimlaneContext.addSwimlane(swimlane);
+        } else {
+            throw new SAXParseException(
+                "Could not find default swimlane context.", parser.getLocator());
+        }
+        
+        return null;
+    }    
+    
+    public Object end(final String uri,
+                      final String localName,
+                      final ExtensibleXmlParser parser) throws SAXException {
+        parser.endElementBuilder();
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return Swimlane.class;
+    }    
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java	2008-06-12 00:06:52 UTC (rev 20428)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java	2008-06-12 00:06:59 UTC (rev 20429)
@@ -32,48 +32,58 @@
 	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
 		WorkItemNode workItemNode = (WorkItemNode) node;
 		writeNode("workItem", workItemNode, xmlDump, includeMeta);
-        if (!workItemNode.isWaitForCompletion()) {
-            xmlDump.append("waitForCompletion=\"false\" ");
-        }
+        visitParameters(workItemNode, xmlDump);
         xmlDump.append(">" + EOL);
         Work work = workItemNode.getWork();
-        if (work != null) {
-            visitWork(work, xmlDump, includeMeta);
+        visitWork(work, xmlDump, includeMeta);
+        visitInMappings(workItemNode.getInMappings(), xmlDump);
+        visitOutMappings(workItemNode.getOutMappings(), xmlDump);
+        endNode("workItem", xmlDump);
+	}
+	
+	protected void visitParameters(WorkItemNode workItemNode, StringBuffer xmlDump) {
+	    if (!workItemNode.isWaitForCompletion()) {
+            xmlDump.append("waitForCompletion=\"false\" ");
         }
-        Map<String, String> inMappings = workItemNode.getInMappings();
+	}
+	
+	protected void visitInMappings(Map<String, String> inMappings, StringBuffer xmlDump) {
         for (Map.Entry<String, String> inMapping: inMappings.entrySet()) {
             xmlDump.append(
                 "      <mapping type=\"in\" "
                              + "from=\"" + inMapping.getValue() + "\" "
                              + "to=\"" + inMapping.getKey() + "\" />" + EOL);
         }
-        Map<String, String> outMappings = workItemNode.getOutMappings();
+	}
+	
+	protected void visitOutMappings(Map<String, String> outMappings, StringBuffer xmlDump) {
         for (Map.Entry<String, String> outMapping: outMappings.entrySet()) {
             xmlDump.append(
                 "      <mapping type=\"out\" "
                              + "from=\"" + outMapping.getKey() + "\" "
                              + "to=\"" + outMapping.getValue() + "\" />" + EOL);
         }
-        endNode("workItem", xmlDump);
     }
     
-    private void visitWork(Work work, StringBuffer xmlDump, boolean includeMeta) {
-        xmlDump.append("      <work name=\"" + work.getName() + "\" >" + EOL);
-        for (ParameterDefinition paramDefinition: work.getParameterDefinitions()) {
-            if (paramDefinition == null) {
-                throw new IllegalArgumentException(
-                    "Could not find parameter definition " + paramDefinition.getName()
-                        + " for work " + work.getName());
+    protected void visitWork(Work work, StringBuffer xmlDump, boolean includeMeta) {
+        if (work != null) {
+            xmlDump.append("      <work name=\"" + work.getName() + "\" >" + EOL);
+            for (ParameterDefinition paramDefinition: work.getParameterDefinitions()) {
+                if (paramDefinition == null) {
+                    throw new IllegalArgumentException(
+                        "Could not find parameter definition " + paramDefinition.getName()
+                            + " for work " + work.getName());
+                }
+                xmlDump.append("        <parameter name=\"" + paramDefinition.getName() + "\" " + 
+                                                  "type=\"" + paramDefinition.getType().getClass().getName() + "\" ");
+                Object value = work.getParameter(paramDefinition.getName());
+                if (value == null) {
+                    xmlDump.append("/>" + EOL);
+                } else {
+                    xmlDump.append(">" + value + "</parameter>" + EOL);
+                }
             }
-            xmlDump.append("        <parameter name=\"" + paramDefinition.getName() + "\" " + 
-                                              "type=\"" + paramDefinition.getType().getClass().getName() + "\" ");
-            Object value = work.getParameter(paramDefinition.getName());
-            if (value == null) {
-                xmlDump.append("/>" + EOL);
-            } else {
-                xmlDump.append(">" + value + "</parameter>" + EOL);
-            }
+            xmlDump.append("      </work>" + EOL);
         }
-        xmlDump.append("      </work>" + EOL);
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd	2008-06-12 00:06:52 UTC (rev 20428)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd	2008-06-12 00:06:59 UTC (rev 20429)
@@ -21,6 +21,7 @@
 				<xs:element ref="drools:imports"/>
 				<xs:element ref="drools:globals"/>
 				<xs:element ref="drools:variables"/>
+				<xs:element ref="drools:swimlanes"/>
 			</xs:choice>
 		</xs:complexType>
 	</xs:element>
@@ -77,6 +78,18 @@
 			</xs:simpleContent>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="swimlanes">
+		<xs:complexType>
+			<xs:sequence minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:swimlane"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="swimlane">
+		<xs:complexType>
+			<xs:attribute name="name" type="xs:string" use="required"/>
+		</xs:complexType>
+	</xs:element>
 	<xs:element name="nodes">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
@@ -90,6 +103,7 @@
 				<xs:element ref="drools:subProcess"/>
 				<xs:element ref="drools:workItem"/>
 				<xs:element ref="drools:timer"/>
+				<xs:element ref="drools:humanTask"/>
 				<xs:element ref="drools:composite"/>
 			</xs:choice>
 		</xs:complexType>
@@ -268,6 +282,22 @@
 			<xs:attribute name="period" type="xs:string"/>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="humanTask">
+		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:work"/>
+				<xs:element ref="drools:mapping"/>
+			</xs:choice>
+			<xs:attribute name="id" type="xs:string" use="required"/>
+			<xs:attribute name="name" type="xs:string"/>
+			<xs:attribute name="x" type="xs:string"/>
+			<xs:attribute name="y" type="xs:string"/>
+			<xs:attribute name="width" type="xs:string"/>
+			<xs:attribute name="height" type="xs:string"/>
+			<xs:attribute name="waitForCompletion" type="xs:string"/>
+			<xs:attribute name="swimlane" type="xs:string"/>
+		</xs:complexType>
+	</xs:element>
 	<xs:element name="composite">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessHumanTaskTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessHumanTaskTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessHumanTaskTest.java	2008-06-12 00:06:59 UTC (rev 20429)
@@ -0,0 +1,150 @@
+package org.drools.integrationtests;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.rule.Package;
+
+import junit.framework.TestCase;
+
+public class ProcessHumanTaskTest extends TestCase {
+    
+    public void testHumanTask() {
+        PackageBuilder builder = new PackageBuilder();
+        Reader source = new StringReader(
+            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+            "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" +
+            "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+            "         xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n" +
+            "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.humantask\" package-name=\"org.drools\" version=\"1\" >\n" +
+            "\n" +
+            "  <header>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <humanTask id=\"2\" name=\"HumanTask\" >\n" +
+            "      <work name=\"Human Task\" >\n" +
+            "        <parameter name=\"ActorId\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" >John Doe</parameter>\n" +
+            "        <parameter name=\"TaskName\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" >Do something</parameter>\n" +
+            "        <parameter name=\"Priority\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "        <parameter name=\"Comment\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "      </work>\n" +
+            "    </humanTask>\n" +
+            "    <end id=\"3\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        TestWorkItemHandler handler = new TestWorkItemHandler();
+        workingMemory.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
+        ProcessInstance processInstance =
+            workingMemory.startProcess("org.drools.humantask");
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+    }
+    
+    public void testSwimlane() {
+        PackageBuilder builder = new PackageBuilder();
+        Reader source = new StringReader(
+            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+            "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" +
+            "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+            "         xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n" +
+            "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.humantask\" package-name=\"org.drools\" version=\"1\" >\n" +
+            "\n" +
+            "  <header>\n" +
+            "    <swimlanes>\n" +
+            "      <swimlane name=\"actor1\" />\n" +
+            "    </swimlanes>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <humanTask id=\"2\" name=\"HumanTask\" swimlane=\"actor1\" >\n" +
+            "      <work name=\"Human Task\" >\n" +
+            "        <parameter name=\"ActorId\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" >John Doe</parameter>\n" +
+            "        <parameter name=\"TaskName\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" >Do something</parameter>\n" +
+            "        <parameter name=\"Priority\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "        <parameter name=\"Comment\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "      </work>\n" +
+            "    </humanTask>\n" +
+            "    <humanTask id=\"3\" name=\"HumanTask\" swimlane=\"actor1\" >\n" +
+            "      <work name=\"Human Task\" >\n" +
+            "        <parameter name=\"ActorId\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "        <parameter name=\"TaskName\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" >Do something else</parameter>\n" +
+            "        <parameter name=\"Priority\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "        <parameter name=\"Comment\" type=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "      </work>\n" +
+            "    </humanTask>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        TestWorkItemHandler handler = new TestWorkItemHandler();
+        workingMemory.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
+        ProcessInstance processInstance =
+            workingMemory.startProcess("org.drools.humantask");
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        assertEquals("Do something", workItem.getParameter("TaskName"));
+        assertEquals("John Doe", workItem.getParameter("ActorId"));
+        Map<String, Object> results = new HashMap<String, Object>();
+        results.put("ActorId", "Jane Doe");
+        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), results);
+        workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        assertEquals("Do something else", workItem.getParameter("TaskName"));
+        assertEquals("Jane Doe", workItem.getParameter("ActorId"));
+        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+    }
+
+    private static class TestWorkItemHandler implements WorkItemHandler {
+        private WorkItem workItem;
+        public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+            this.workItem = workItem;
+        }
+        public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+        }
+        public WorkItem getWorkItem() {
+            return workItem;
+        }
+    }
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2008-06-12 00:06:52 UTC (rev 20428)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2008-06-12 00:06:59 UTC (rev 20429)
@@ -13,6 +13,7 @@
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.process.core.ParameterDefinition;
 import org.drools.process.core.Work;
+import org.drools.process.core.context.swimlane.Swimlane;
 import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.datatype.impl.type.IntegerDataType;
 import org.drools.process.core.datatype.impl.type.StringDataType;
@@ -28,6 +29,7 @@
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.HumanTaskNode;
 import org.drools.workflow.core.node.Join;
 import org.drools.workflow.core.node.MilestoneNode;
 import org.drools.workflow.core.node.RuleSetNode;
@@ -60,6 +62,7 @@
         process.addNode(new SubProcessNode());
         process.addNode(new WorkItemNode());
         process.addNode(new TimerNode());
+        process.addNode(new HumanTaskNode());
         
         String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
         if (xml == null) {
@@ -76,7 +79,7 @@
             throw new IllegalArgumentException("Failed to reload process!");
         }
         
-        assertEquals(10, process.getNodes().length);
+        assertEquals(11, process.getNodes().length);
         
 //        System.out.println("************************************");
         
@@ -124,6 +127,9 @@
         variables.add(variable);
         process.getVariableScope().setVariables(variables);
         
+        process.getSwimlaneContext().addSwimlane(new Swimlane("actor1"));
+        process.getSwimlaneContext().addSwimlane(new Swimlane("actor2"));
+        
         StartNode startNode = new StartNode();
         startNode.setName("start");
         startNode.setMetaData("x", 1);
@@ -187,7 +193,6 @@
         process.addNode(join);
         new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
         new ConnectionImpl(ruleSetNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
-
         
         MilestoneNode milestone = new MilestoneNode();
         milestone.setName("milestone");
@@ -234,6 +239,24 @@
         connection = new ConnectionImpl(subProcess, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
         connection.setMetaData("bendpoints", "[]");
         
+        HumanTaskNode humanTaskNode = new HumanTaskNode();
+        work = humanTaskNode.getWork();
+        parameterDefinitions = new HashSet<ParameterDefinition>();
+        parameterDefinition = new ParameterDefinitionImpl("TaskName", new StringDataType());
+        parameterDefinitions.add(parameterDefinition);
+        parameterDefinition = new ParameterDefinitionImpl("ActorId", new StringDataType());
+        parameterDefinitions.add(parameterDefinition);
+        parameterDefinition = new ParameterDefinitionImpl("Priority", new StringDataType());
+        parameterDefinitions.add(parameterDefinition);
+        parameterDefinition = new ParameterDefinitionImpl("Comment", new StringDataType());
+        parameterDefinitions.add(parameterDefinition);
+        work.setParameterDefinitions(parameterDefinitions);
+        work.setParameter("TaskName", "Do something");
+        work.setParameter("ActorId", "John Doe");
+        workItemNode.setWaitForCompletion(false);
+        process.addNode(humanTaskNode);
+        connection = new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, humanTaskNode, Node.CONNECTION_DEFAULT_TYPE);
+        
         TimerNode timerNode = new TimerNode();
         timerNode.setName("timer");
         timerNode.setMetaData("x", 1);
@@ -245,7 +268,7 @@
         timer.setPeriod(1000);
         timerNode.setTimer(timer);
         process.addNode(timerNode);
-        new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
+        new ConnectionImpl(humanTaskNode, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
         
         EndNode endNode = new EndNode();
         endNode.setName("end");
@@ -270,7 +293,7 @@
             throw new IllegalArgumentException("Failed to reload process!");
         }
         
-        assertEquals(10, process.getNodes().length);
+        assertEquals(11, process.getNodes().length);
         
 //        System.out.println("************************************");
         




More information about the jboss-svn-commits mailing list