[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