[jboss-svn-commits] JBL Code SVN: r21891 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/xml and 14 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Aug 25 18:22:21 EDT 2008
Author: KrisVerlaenen
Date: 2008-08-25 18:22:21 -0400 (Mon, 25 Aug 2008)
New Revision: 21891
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryPersistenceSessionProcessTest.java
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.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/CompositeNodeHandler.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/VariableHandler.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/integrationtests/ProcessMarchallingTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/swimlane/SwimlaneContextInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ForEachNodeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/HumanTaskNodeInstance.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java
Log:
JBRULES-1690: IDE support for ForEach
JBRULES-1616: Composite Node
-added XML persistence, binary runtime persistence and IDE integration
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -140,7 +140,7 @@
this.attributes.add( attribute );
}
- public List getAttributes() {
+ public List<AttributeDescr> getAttributes() {
return this.attributes;
}
@@ -162,7 +162,7 @@
this.functions.add( function );
}
- public List getFunctions() {
+ public List<FunctionDescr> getFunctions() {
return this.functions;
}
@@ -187,7 +187,7 @@
this.rules.add( rule );
}
- public List getRules() {
+ public List<RuleDescr> getRules() {
return this.rules;
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -134,7 +134,7 @@
return this.documentation;
}
- public List getAttributes() {
+ public List<AttributeDescr> getAttributes() {
return this.attributes;
}
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-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -109,7 +109,7 @@
}
}
- private void visitVariables(List<Variable> variables, StringBuffer xmlDump) {
+ public static void visitVariables(List<Variable> variables, StringBuffer xmlDump) {
if (variables != null && variables.size() > 0) {
xmlDump.append(" <variables>" + EOL);
for (Variable variable: variables) {
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -4,15 +4,23 @@
import java.util.List;
import java.util.Map;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.context.variable.VariableScope;
import org.drools.workflow.core.Connection;
import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeContextNode;
import org.drools.workflow.core.node.CompositeNode;
import org.drools.xml.XmlRuleFlowProcessDumper;
+import org.drools.xml.XmlWorkflowProcessDumper;
public class CompositeNodeHandler extends AbstractNodeHandler {
protected Node createNode() {
- return new CompositeNode();
+ CompositeContextNode result = new CompositeContextNode();
+ VariableScope variableScope = new VariableScope();
+ result.addContext(variableScope);
+ result.setDefaultContext(variableScope);
+ return result;
}
public Class generateNodeFor() {
@@ -28,6 +36,12 @@
CompositeNode compositeNode = (CompositeNode) node;
writeAttributes(compositeNode, xmlDump, includeMeta);
xmlDump.append(">" + EOL);
+ if (compositeNode instanceof CompositeContextNode) {
+ List<Variable> variables = ((VariableScope)
+ ((CompositeContextNode) compositeNode)
+ .getDefaultContext(VariableScope.VARIABLE_SCOPE)).getVariables();
+ XmlWorkflowProcessDumper.visitVariables(variables, xmlDump);
+ }
List<Node> subNodes = getSubNodes(compositeNode);
xmlDump.append(" <nodes>" + EOL);
for (Node subNode: subNodes) {
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/VariableHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/VariableHandler.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/VariableHandler.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -4,10 +4,9 @@
import java.util.HashSet;
import java.util.List;
-import org.drools.process.core.Process;
+import org.drools.process.core.ContextContainer;
import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
-import org.drools.workflow.core.impl.WorkflowProcessImpl;
import org.drools.xml.BaseAbstractHandler;
import org.drools.xml.ExtensibleXmlParser;
import org.drools.xml.Handler;
@@ -21,7 +20,7 @@
public VariableHandler() {
if ( (this.validParents == null) && (this.validPeers == null) ) {
this.validParents = new HashSet<Class<?>>();
- this.validParents.add( Process.class );
+ this.validParents.add( ContextContainer.class );
this.validPeers = new HashSet<Class<?>>();
this.validPeers.add( null );
@@ -38,12 +37,12 @@
final ExtensibleXmlParser parser) throws SAXException {
parser.startElementBuilder( localName,
attrs );
- WorkflowProcessImpl process = (WorkflowProcessImpl) parser.getParent();
+ ContextContainer contextContainer = (ContextContainer) parser.getParent();
final String name = attrs.getValue("name");
emptyAttributeCheck(localName, "name", name, parser);
VariableScope variableScope = (VariableScope)
- process.getDefaultContext(VariableScope.VARIABLE_SCOPE);
+ contextContainer.getDefaultContext(VariableScope.VARIABLE_SCOPE);
Variable variable = new Variable();
if (variableScope != null) {
variable.setName(name);
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-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd 2008-08-25 22:22:21 UTC (rev 21891)
@@ -329,6 +329,7 @@
<xs:element name="composite">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="drools:variables"/>
<xs:element ref="drools:nodes"/>
<xs:element ref="drools:connections"/>
<xs:element ref="drools:in-ports"/>
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMarchallingTest.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -14,7 +14,6 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
-import org.drools.audit.WorkingMemoryFileLogger;
import org.drools.compiler.PackageBuilder;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.instance.WorkItem;
@@ -145,7 +144,7 @@
session.startProcess("org.test.ruleflow", variables);
assertEquals(1, session.getProcessInstances().size());
- assertTrue(handler.getWorkItemId() != -1);
+ assertTrue(handler.getWorkItem() != null);
session = getSerialisedStatefulSession( session );
assertEquals(1, session.getProcessInstances().size());
@@ -153,7 +152,7 @@
session.getProcessInstances().iterator().next().getContextInstance(VariableScope.VARIABLE_SCOPE);
assertEquals("ThisIsMyValue", variableScopeInstance.getVariable("myVariable"));
- session.getWorkItemManager().completeWorkItem(handler.getWorkItemId(), null);
+ session.getWorkItemManager().completeWorkItem(handler.getWorkItem().getId(), null);
assertEquals(0, session.getProcessInstances().size());
}
@@ -170,6 +169,9 @@
" <imports>\n" +
" <import name=\"org.drools.Person\" />\n" +
" </imports>\n" +
+ " <swimlanes>\n" +
+ " <swimlane name=\"swimlane\" />\n" +
+ " </swimlanes>\n" +
" </header>\n" +
"\n" +
" <nodes>\n" +
@@ -194,6 +196,61 @@
" </parameter>\n" +
" </work>\n" +
" </workItem>\n" +
+ " <composite id=\"13\" name=\"CompositeNode\" >\n" +
+ " <variables>\n" +
+ " <variable name=\"x\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>x-value</value>\n" +
+ " </variable>\n" +
+ " </variables>\n" +
+ " <nodes>\n" +
+ " <humanTask id=\"1\" name=\"Human Task\" swimlane=\"swimlane\" >\n" +
+ " <work name=\"Human Task\" >\n" +
+ " <parameter name=\"ActorId\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>John Doe</value>\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Priority\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"TaskName\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>Do something !</value>\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Comment\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " </work>\n" +
+ " </humanTask>\n" +
+ " <humanTask id=\"2\" name=\"Human Task\" swimlane=\"swimlane\" >\n" +
+ " <work name=\"Human Task\" >\n" +
+ " <parameter name=\"ActorId\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Priority\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"TaskName\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>Do something else !</value>\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Comment\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " </work>\n" +
+ " <mapping type=\"in\" from=\"x\" to=\"Priority\" />\n" +
+ " </humanTask>\n" +
+ " </nodes>\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " </connections>\n" +
+ " <in-ports>\n" +
+ " <in-port type=\"DROOLS_DEFAULT\" nodeId=\"1\" nodeInType=\"DROOLS_DEFAULT\" />\n" +
+ " </in-ports>\n" +
+ " <out-ports>\n" +
+ " <out-port type=\"DROOLS_DEFAULT\" nodeId=\"2\" nodeOutType=\"DROOLS_DEFAULT\" />\n" +
+ " </out-ports>\n" +
+ " </composite>\n" +
" </nodes>\n" +
"\n" +
" <connections>\n" +
@@ -206,10 +263,12 @@
" <connection from=\"10\" to=\"8\" />\n" +
" <connection from=\"11\" to=\"8\" />\n" +
" <connection from=\"12\" to=\"8\" />\n" +
+ " <connection from=\"13\" to=\"8\" />\n" +
" <connection from=\"8\" to=\"9\" />\n" +
" <connection from=\"5\" to=\"10\" />\n" +
" <connection from=\"5\" to=\"11\" />\n" +
" <connection from=\"5\" to=\"12\" />\n" +
+ " <connection from=\"5\" to=\"13\" />\n" +
" </connections>\n" +
"\n" +
"</process>\n";
@@ -258,35 +317,150 @@
ruleBase.addPackage(pkg);
StatefulSession session = ruleBase.newStatefulSession();
- TestWorkItemHandler handler = new TestWorkItemHandler();
- session.getWorkItemManager().registerWorkItemHandler("Log", handler);
+ TestWorkItemHandler handler1 = new TestWorkItemHandler();
+ session.getWorkItemManager().registerWorkItemHandler("Log", handler1);
+ TestWorkItemHandler handler2 = new TestWorkItemHandler();
+ session.getWorkItemManager().registerWorkItemHandler("Human Task", handler2);
session.startProcess("com.sample.ruleflow");
assertEquals(2, session.getProcessInstances().size());
- assertTrue(handler.getWorkItemId() != -1);
+ assertTrue(handler1.getWorkItem() != null);
+ long workItemId = handler2.getWorkItem().getId();
+ assertTrue(workItemId != -1);
session = getSerialisedStatefulSession( session );
- WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(session);
+ session.getWorkItemManager().registerWorkItemHandler("Human Task", handler2);
assertEquals(2, session.getProcessInstances().size());
- session.getWorkItemManager().completeWorkItem(handler.getWorkItemId(), null);
+ handler2.reset();
+ session.getWorkItemManager().completeWorkItem(workItemId, null);
+ assertTrue(handler2.getWorkItem() != null);
+ assertEquals("John Doe", handler2.getWorkItem().getParameter("ActorId"));
+ assertEquals("x-value", handler2.getWorkItem().getParameter("Priority"));
+
+ session.getWorkItemManager().completeWorkItem(handler1.getWorkItem().getId(), null);
+ session.getWorkItemManager().completeWorkItem(handler2.getWorkItem().getId(), null);
session.insert(new Person());
session.fireAllRules();
- logger.writeToDisk();
assertEquals(0, session.getProcessInstances().size());
}
+ public void test4() throws Exception {
+ String process =
+ "<?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=\"ruleflow\" id=\"com.sample.ruleflow\" package-name=\"com.sample\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " <variables>\n" +
+ " <variable name=\"list\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.util.List\" />\n" +
+ " </variable>\n" +
+ " </variables>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <forEach id=\"4\" name=\"ForEach\" variableName=\"item\" collectionExpression=\"list\" >\n" +
+ " <nodes>\n" +
+ " <humanTask id=\"1\" name=\"Human Task\" >\n" +
+ " <work name=\"Human Task\" >\n" +
+ " <parameter name=\"Comment\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"ActorId\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Priority\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"TaskName\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>Do something: #{item}</value>\n" +
+ " </parameter>\n" +
+ " </work>\n" +
+ " </humanTask>\n" +
+ " </nodes>\n" +
+ " <connections>\n" +
+ " </connections>\n" +
+ " <in-ports>\n" +
+ " <in-port type=\"DROOLS_DEFAULT\" nodeId=\"1\" nodeInType=\"DROOLS_DEFAULT\" />\n" +
+ " </in-ports>\n" +
+ " <out-ports>\n" +
+ " <out-port type=\"DROOLS_DEFAULT\" nodeId=\"1\" nodeOutType=\"DROOLS_DEFAULT\" />\n" +
+ " </out-ports>\n" +
+ " </forEach>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <end id=\"3\" name=\"End\" />\n" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"4\" />\n" +
+ " <connection from=\"4\" to=\"3\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>\n";
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addProcessFromXml( new StringReader( process ));
+ final Package pkg = builder.getPackage();
+ final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage(pkg);
+
+ StatefulSession session = ruleBase.newStatefulSession();
+ TestListWorkItemHandler handler = new TestListWorkItemHandler();
+ session.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
+ List<String> list = new ArrayList<String>();
+ list.add("one");
+ list.add("two");
+ list.add("three");
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put("list", list);
+ session.startProcess("com.sample.ruleflow", parameters);
+
+ assertEquals(1, session.getProcessInstances().size());
+ assertEquals(3, handler.getWorkItems().size());
+
+ session = getSerialisedStatefulSession( session );
+
+ for (WorkItem workItem: handler.getWorkItems()) {
+ session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+ }
+
+ assertEquals(0, session.getProcessInstances().size());
+ }
+
private static class TestWorkItemHandler implements WorkItemHandler {
- private long workItemId = -1;
+ private WorkItem workItem;
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
- workItemId = workItem.getId();
+ this.workItem = workItem;
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
}
- public long getWorkItemId() {
- return workItemId;
+ public WorkItem getWorkItem() {
+ return workItem;
}
+ public void reset() {
+ workItem = null;
+ }
}
+ private static class TestListWorkItemHandler implements WorkItemHandler {
+ private List<WorkItem> workItems = new ArrayList<WorkItem>();
+ public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+ System.out.println("Executing workItem " + workItem.getParameter("TaskName"));
+ workItems.add(workItem);
+ }
+ public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+ workItems.remove(workItem);
+ }
+ public List<WorkItem> getWorkItems() {
+ return workItems;
+ }
+ public void reset() {
+ workItems.clear();
+ }
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -59,7 +59,6 @@
import org.drools.event.WorkingMemoryEventListener;
import org.drools.event.WorkingMemoryEventSupport;
import org.drools.process.core.Process;
-import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.ProcessInstanceFactory;
@@ -68,7 +67,13 @@
import org.drools.process.instance.WorkItemManager;
import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.process.instance.timer.TimerManager;
-import org.drools.reteoo.*;
+import org.drools.reteoo.EntryPointNode;
+import org.drools.reteoo.InitialFactHandle;
+import org.drools.reteoo.InitialFactHandleDummyObject;
+import org.drools.reteoo.LIANodePropagation;
+import org.drools.reteoo.LeftTuple;
+import org.drools.reteoo.ObjectTypeConf;
+import org.drools.reteoo.PartitionTaskManager;
import org.drools.rule.Declaration;
import org.drools.rule.EntryPoint;
import org.drools.rule.Rule;
@@ -1510,12 +1515,6 @@
// TODO: should be part of processInstanceImpl?
VariableScope variableScope = (VariableScope) process.getDefaultContext( VariableScope.VARIABLE_SCOPE );
VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
- if ( variableScope != null ) {
- for ( Variable variable : variableScope.getVariables() ) {
- variableScopeInstance.setVariable( variable.getName(),
- variable.getValue() );
- }
- }
// set input parameters
if ( parameters != null ) {
if ( variableScope != null ) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -23,9 +23,11 @@
import org.drools.common.RuleFlowGroupImpl;
import org.drools.common.TruthMaintenanceSystem;
import org.drools.concurrent.ExecutorService;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.process.instance.impl.WorkItemImpl;
import org.drools.reteoo.BetaMemory;
@@ -58,8 +60,12 @@
import org.drools.spi.RuleFlowGroup;
import org.drools.util.ObjectHashSet;
import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.NodeInstanceContainer;
import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
import org.drools.workflow.instance.node.EventBasedNodeInstance;
+import org.drools.workflow.instance.node.ForEachNodeInstance;
+import org.drools.workflow.instance.node.HumanTaskNodeInstance;
import org.drools.workflow.instance.node.JoinInstance;
import org.drools.workflow.instance.node.MilestoneNodeInstance;
import org.drools.workflow.instance.node.RuleSetNodeInstance;
@@ -348,7 +354,6 @@
public static void readLeftTuple(LeftTuple parentLeftTuple,
MarshallerReaderContext context) throws IOException {
ObjectInputStream stream = context.stream;
- InternalRuleBase ruleBase = context.ruleBase;
InternalWorkingMemory wm = context.wm;
Map<Integer, BaseNode> sinks = context.sinks;
@@ -547,7 +552,6 @@
public static void readPropagationContext(MarshallerReaderContext context) throws IOException {
ObjectInputStream stream = context.stream;
InternalRuleBase ruleBase = context.ruleBase;
- InternalWorkingMemory wm = context.wm;
int type = stream.readInt();
@@ -631,8 +635,19 @@
}
}
+ int nbSwimlanes = stream.readInt();
+ if ( nbSwimlanes > 0 ) {
+ SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
+ for ( int i = 0; i < nbSwimlanes; i++ ) {
+ String name = stream.readUTF();
+ String value = stream.readUTF();
+ swimlaneContextInstance.setActorId( name, value );
+ }
+ }
+
while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
readNodeInstance( context,
+ processInstance,
processInstance );
}
@@ -644,6 +659,7 @@
}
public static NodeInstance readNodeInstance(MarshallerReaderContext context,
+ NodeInstanceContainer nodeInstanceContainer,
RuleFlowProcessInstance processInstance) throws IOException {
ObjectInputStream stream = context.stream;
NodeInstanceImpl nodeInstance = null;
@@ -654,6 +670,10 @@
case PersisterEnums.RULE_SET_NODE_INSTANCE :
nodeInstance = new RuleSetNodeInstance();
break;
+ case PersisterEnums.HUMAN_TASK_NODE_INSTANCE :
+ nodeInstance = new HumanTaskNodeInstance();
+ ((HumanTaskNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
+ break;
case PersisterEnums.WORK_ITEM_NODE_INSTANCE :
nodeInstance = new WorkItemNodeInstance();
((WorkItemNodeInstance) nodeInstance).internalSetWorkItemId( stream.readLong() );
@@ -683,11 +703,44 @@
((JoinInstance) nodeInstance).internalSetTriggers( triggers );
}
break;
+ case PersisterEnums.COMPOSITE_NODE_INSTANCE :
+ nodeInstance = new CompositeContextNodeInstance();
+ int nbVariables = stream.readInt();
+ if ( nbVariables > 0 ) {
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ processInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
+ for ( int i = 0; i < nbVariables; i++ ) {
+ String name = stream.readUTF();
+ try {
+ Object value = stream.readObject();
+ variableScopeInstance.setVariable( name, value );
+ } catch ( ClassNotFoundException e ) {
+ throw new IllegalArgumentException(
+ "Could not reload variable " + name );
+ }
+ }
+ }
+ while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
+ readNodeInstance(
+ context,
+ (CompositeContextNodeInstance) nodeInstance,
+ processInstance );
+ }
+ break;
+ case PersisterEnums.FOR_EACH_NODE_INSTANCE :
+ nodeInstance = new ForEachNodeInstance();
+ while ( stream.readShort() == PersisterEnums.NODE_INSTANCE ) {
+ readNodeInstance(
+ context,
+ (ForEachNodeInstance) nodeInstance,
+ processInstance );
+ }
+ break;
default :
throw new IllegalArgumentException( "Unknown node type: " + nodeType );
}
nodeInstance.setNodeId( nodeId );
- nodeInstance.setNodeInstanceContainer( processInstance );
+ nodeInstance.setNodeInstanceContainer( nodeInstanceContainer );
nodeInstance.setProcessInstance( processInstance );
nodeInstance.setId( id );
if ( nodeInstance instanceof EventBasedNodeInstance ) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -26,9 +26,11 @@
import org.drools.common.ObjectStore;
import org.drools.common.RuleFlowGroupImpl;
import org.drools.common.WorkingMemoryAction;
+import org.drools.process.core.context.swimlane.SwimlaneContext;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.LeftTupleSink;
@@ -47,6 +49,10 @@
import org.drools.util.ObjectHashMap;
import org.drools.util.ObjectHashSet;
import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
+import org.drools.workflow.instance.node.CompositeNodeInstance;
+import org.drools.workflow.instance.node.ForEachNodeInstance;
+import org.drools.workflow.instance.node.HumanTaskNodeInstance;
import org.drools.workflow.instance.node.JoinInstance;
import org.drools.workflow.instance.node.MilestoneNodeInstance;
import org.drools.workflow.instance.node.RuleSetNodeInstance;
@@ -633,6 +639,14 @@
stream.writeUTF( entry.getKey() );
stream.writeObject( entry.getValue() );
}
+
+ SwimlaneContextInstance swimlaneContextInstance = (SwimlaneContextInstance) processInstance.getContextInstance( SwimlaneContext.SWIMLANE_SCOPE );
+ Map<String, String> swimlaneActors = swimlaneContextInstance.getSwimlaneActors();
+ stream.writeInt( swimlaneActors.size() );
+ for ( Map.Entry<String, String> entry : swimlaneActors.entrySet() ) {
+ stream.writeUTF( entry.getKey() );
+ stream.writeUTF( entry.getValue() );
+ }
for ( NodeInstance nodeInstance : processInstance.getNodeInstances() ) {
stream.writeShort( PersisterEnums.NODE_INSTANCE );
@@ -649,6 +663,9 @@
stream.writeLong( nodeInstance.getNodeId() );
if ( nodeInstance instanceof RuleSetNodeInstance ) {
stream.writeShort( PersisterEnums.RULE_SET_NODE_INSTANCE );
+ } else if ( nodeInstance instanceof HumanTaskNodeInstance ) {
+ stream.writeShort( PersisterEnums.HUMAN_TASK_NODE_INSTANCE );
+ stream.writeLong( ((HumanTaskNodeInstance) nodeInstance).getWorkItem().getId() );
} else if ( nodeInstance instanceof WorkItemNodeInstance ) {
stream.writeShort( PersisterEnums.WORK_ITEM_NODE_INSTANCE );
stream.writeLong( ((WorkItemNodeInstance) nodeInstance).getWorkItem().getId() );
@@ -668,7 +685,36 @@
stream.writeLong( entry.getKey() );
stream.writeInt( entry.getValue() );
}
+ } else if ( nodeInstance instanceof CompositeContextNodeInstance ) {
+ stream.writeShort( PersisterEnums.COMPOSITE_NODE_INSTANCE );
+ CompositeContextNodeInstance compositeNodeInstance =
+ (CompositeContextNodeInstance) nodeInstance;
+ VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+ compositeNodeInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
+ Map<String, Object> variables = variableScopeInstance.getVariables();
+ stream.writeInt( variables.size() );
+ for ( Map.Entry<String, Object> entry : variables.entrySet() ) {
+ stream.writeUTF( entry.getKey() );
+ stream.writeObject( entry.getValue() );
+ }
+ for ( NodeInstance subNodeInstance : compositeNodeInstance.getNodeInstances() ) {
+ stream.writeShort( PersisterEnums.NODE_INSTANCE );
+ writeNodeInstance( context, subNodeInstance );
+ }
+ stream.writeShort( PersisterEnums.END );
+ } else if ( nodeInstance instanceof ForEachNodeInstance ) {
+ stream.writeShort( PersisterEnums.FOR_EACH_NODE_INSTANCE );
+ ForEachNodeInstance forEachNodeInstance = (ForEachNodeInstance) nodeInstance;
+ for ( NodeInstance subNodeInstance : forEachNodeInstance.getNodeInstances() ) {
+ if (subNodeInstance instanceof CompositeContextNodeInstance) {
+ stream.writeShort( PersisterEnums.NODE_INSTANCE );
+ writeNodeInstance( context, subNodeInstance );
+ }
+ }
+ stream.writeShort( PersisterEnums.END );
} else {
+ // TODO ForEachNodeInstance
+ // TODO timer manager
throw new IllegalArgumentException( "Unknown node instance type: " + nodeInstance );
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/PersisterEnums.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -35,5 +35,8 @@
public static final short MILESTONE_NODE_INSTANCE = 23;
public static final short TIMER_NODE_INSTANCE = 24;
public static final short JOIN_NODE_INSTANCE = 25;
+ public static final short COMPOSITE_NODE_INSTANCE = 26;
+ public static final short HUMAN_TASK_NODE_INSTANCE = 27;
+ public static final short FOR_EACH_NODE_INSTANCE = 28;
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -0,0 +1,34 @@
+package org.drools.process.command;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.WorkingMemory;
+
+public class CompleteWorkItemCommand implements Command {
+
+ private long workItemId;
+ private Map<String, Object> results = new HashMap<String, Object>();
+
+ public long getWorkItemId() {
+ return workItemId;
+ }
+
+ public void setWorkItemId(long workItemId) {
+ this.workItemId = workItemId;
+ }
+
+ public Map<String, Object> getResults() {
+ return results;
+ }
+
+ public void setResults(Map<String, Object> results) {
+ this.results = results;
+ }
+
+ public Object execute(WorkingMemory workingMemory) {
+ workingMemory.getWorkItemManager().completeWorkItem(workItemId, results);
+ return null;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -0,0 +1,44 @@
+package org.drools.process.command;
+
+import org.drools.WorkingMemory;
+import org.drools.process.instance.ProcessInstance;
+
+public class SignalEventCommand implements Command {
+
+ private long processInstanceId;
+ private String eventType;
+ private Object event;
+
+ public long getProcessInstanceId() {
+ return processInstanceId;
+ }
+
+ public void setProcessInstanceId(long processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ }
+
+ public String getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(String eventType) {
+ this.eventType = eventType;
+ }
+
+ public Object getEvent() {
+ return event;
+ }
+
+ public void setEvent(Object event) {
+ this.event = event;
+ }
+
+ public Object execute(WorkingMemory workingMemory) {
+ ProcessInstance processInstance = workingMemory.getProcessInstance(processInstanceId);
+ if (processInstance != null) {
+ processInstance.signalEvent(eventType, processInstance);
+ }
+ return null;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -0,0 +1,40 @@
+package org.drools.process.command.impl;
+
+import javax.transaction.xa.XAException;
+
+import org.drools.StatefulSession;
+import org.drools.persistence.PersistenceManager;
+import org.drools.persistence.StatefulSessionSnapshotter;
+import org.drools.persistence.Transaction;
+import org.drools.persistence.memory.MemoryPersistenceManager;
+import org.drools.process.command.Command;
+import org.drools.process.command.CommandService;
+
+public class StatefulSessionCommandService implements CommandService {
+
+ private StatefulSession session;
+
+ public StatefulSessionCommandService(StatefulSession session) {
+ this.session = session;
+ }
+
+ public Object execute(Command command) {
+ PersistenceManager persistenceManager =
+ new MemoryPersistenceManager(new StatefulSessionSnapshotter(session));
+ persistenceManager.save();
+ Transaction transaction = persistenceManager.getTransaction();
+ try {
+ Object result = command.execute(session);
+ transaction.commit();
+ return result;
+ } catch (Throwable t) {
+ try {
+ transaction.rollback();
+ throw new RuntimeException("Could not execute command", t);
+ } catch (XAException e) {
+ throw new RuntimeException("Could not rollback transaction", e);
+ }
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/swimlane/SwimlaneContextInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/swimlane/SwimlaneContextInstance.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/swimlane/SwimlaneContextInstance.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -3,7 +3,6 @@
import java.util.HashMap;
import java.util.Map;
-import org.drools.process.core.context.swimlane.Swimlane;
import org.drools.process.core.context.swimlane.SwimlaneContext;
import org.drools.process.instance.context.AbstractContextInstance;
@@ -29,4 +28,8 @@
swimlaneActors.put(swimlane, actorId);
}
+ public Map<String, String> getSwimlaneActors() {
+ return swimlaneActors;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/variable/VariableScopeInstance.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -4,7 +4,9 @@
import java.util.HashMap;
import java.util.Map;
+import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.ContextInstanceContainer;
import org.drools.process.instance.context.AbstractContextInstance;
/**
@@ -36,5 +38,16 @@
}
variables.put(name, value);
}
+
+ public VariableScope getVariableScope() {
+ return (VariableScope) getContext();
+ }
+
+ public void setContextInstanceContainer(ContextInstanceContainer contextInstanceContainer) {
+ super.setContextInstanceContainer(contextInstanceContainer);
+ for (Variable variable : getVariableScope().getVariables()) {
+ setVariable(variable.getName(), variable.getValue());
+ }
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -24,4 +24,14 @@
return variableScope.getVariable(variableName);
}
+ public void setVariable(String variableName, Object value) {
+ VariableScopeInstance variableScope = (VariableScopeInstance) nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, variableName);
+ if (variableScope == null) {
+ System.err.println("Could not find variable " + variableName);
+ System.err.println("Continuing without setting value");
+ return;
+ }
+ variableScope.setVariable(variableName, value);
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -57,8 +57,7 @@
compositeNode.setMetaData("hidden", true);
super.addNode(compositeNode);
VariableScope variableScope = new VariableScope();
- variableScope.setContextContainer(compositeNode);
- compositeNode.setContext(VariableScope.VARIABLE_SCOPE, variableScope);
+ compositeNode.addContext(variableScope);
compositeNode.setDefaultContext(variableScope);
// Join
ForEachJoinNode join = new ForEachJoinNode();
@@ -82,8 +81,8 @@
return variableName;
}
- public CompositeNode getCompositeNode() {
- return (CompositeNode) super.getNode(2);
+ public CompositeContextNode getCompositeNode() {
+ return (CompositeContextNode) super.getNode(2);
}
public void addNode(Node node) {
@@ -145,7 +144,7 @@
variable.setName(variableName);
variable.setType(type);
variables.add(variable);
- ((VariableScope) getCompositeNode().getContext(VariableScope.VARIABLE_SCOPE)).setVariables(variables);
+ ((VariableScope) getCompositeNode().getDefaultContext(VariableScope.VARIABLE_SCOPE)).setVariables(variables);
}
public String getCollectionExpression() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/FaultNodeInstance.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -46,6 +46,7 @@
}
String faultName = getFaultName();
ExceptionScopeInstance exceptionScopeInstance = getExceptionScopeInstance(faultName);
+ getNodeInstanceContainer().removeNodeInstance(this);
if (exceptionScopeInstance != null) {
handleException(faultName, exceptionScopeInstance);
} else {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ForEachNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ForEachNodeInstance.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ForEachNodeInstance.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -1,7 +1,6 @@
package org.drools.workflow.instance.node;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/HumanTaskNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/HumanTaskNodeInstance.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/HumanTaskNodeInstance.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -19,31 +19,30 @@
protected WorkItem createWorkItem(WorkItemNode workItemNode) {
WorkItem workItem = super.createWorkItem(workItemNode);
- String actorId = assignWorkItem();
+ String actorId = assignWorkItem(workItem);
if (actorId != null) {
((WorkItemImpl) workItem).setParameter("ActorId", actorId);
}
return workItem;
}
- protected String assignWorkItem() {
+ protected String assignWorkItem(WorkItem workItem) {
String actorId = null;
- // if this human task node is part of a swim lane, check whether an actor
- // has already been assigned to this swim lane
+ // if this human task node is part of a swimlane, check whether an actor
+ // has already been assigned to this swimlane
String swimlaneName = getHumanTaskNode().getSwimlane();
SwimlaneContextInstance swimlaneContextInstance = getSwimlaneContextInstance(swimlaneName);
if (swimlaneContextInstance != null) {
actorId = swimlaneContextInstance.getActorId(swimlaneName);
}
+ // if no actor can be assigned based on the swimlane, check whether an
+ // actor is specified for this human task
if (actorId == null) {
- // if the actorId has not yet been assigned, check whether assigners are
- // defined for this human task node
- // TODO
+ actorId = (String) workItem.getParameter("ActorId");
+ if (actorId != null) {
+ swimlaneContextInstance.setActorId(swimlaneName, actorId);
+ }
}
- if (actorId == null) {
- // if the actorId has not yet been assigned, check whether assigners are
- // defined for this swim lane
- }
return actorId;
}
Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryPersistenceSessionProcessTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryPersistenceSessionProcessTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/persistence/memory/MemoryPersistenceSessionProcessTest.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -0,0 +1,151 @@
+package org.drools.persistence.memory;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.WorkingMemory;
+import org.drools.persistence.StatefulSessionSnapshotter;
+import org.drools.persistence.Transaction;
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+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 org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.spi.Action;
+import org.drools.spi.KnowledgeHelper;
+import org.drools.spi.ProcessContext;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+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.StartNode;
+import org.drools.workflow.core.node.WorkItemNode;
+
+public class MemoryPersistenceSessionProcessTest extends TestCase {
+
+ private WorkItem workItem;
+
+ public void testSave() throws Exception {
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ Package pkg = new Package( "org.drools.test" );
+ pkg.addProcess( getProcess() );
+ ruleBase.addPackage( pkg );
+
+ StatefulSession session = ruleBase.newStatefulSession();
+ session.getWorkItemManager().registerWorkItemHandler("MyWork", new WorkItemHandler() {
+ public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+ MemoryPersistenceSessionProcessTest.this.workItem = workItem;
+ }
+ public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+ }
+ });
+ ProcessInstance processInstance = session.startProcess("org.drools.test.TestProcess");
+ assertNotNull(workItem);
+
+ MemoryPersistenceManager pm = new MemoryPersistenceManager( new StatefulSessionSnapshotter( session ) );
+ pm.save();
+
+ session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+
+ pm.load();
+ processInstance = session.getProcessInstance(processInstance.getId());
+ assertNotNull(processInstance);
+ assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+
+ session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ }
+
+ public void testTransactionWithRollback() throws Exception {
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ Package pkg = new Package( "org.drools.test" );
+ pkg.addProcess( getProcess() );
+ ruleBase.addPackage( pkg );
+
+ StatefulSession session = ruleBase.newStatefulSession();
+ session.getWorkItemManager().registerWorkItemHandler("MyWork", new WorkItemHandler() {
+ public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+ MemoryPersistenceSessionProcessTest.this.workItem = workItem;
+ }
+ public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+ }
+ });
+ ProcessInstance processInstance = session.startProcess("org.drools.test.TestProcess");
+
+ MemoryPersistenceManager pm = new MemoryPersistenceManager( new StatefulSessionSnapshotter( session ) );
+ Transaction t = pm.getTransaction();
+ t.start();
+
+ session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+
+ t.rollback();
+
+ processInstance = session.getProcessInstance(processInstance.getId());
+ assertNotNull(processInstance);
+ assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+
+ session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ }
+
+ private RuleFlowProcess getProcess() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("org.drools.test.TestProcess");
+ process.setName("TestProcess");
+ process.setPackageName("org.drools.test");
+ StartNode start = new StartNode();
+ start.setId(1);
+ start.setName("Start");
+ process.addNode(start);
+ ActionNode actionNode = new ActionNode();
+ actionNode.setId(2);
+ actionNode.setName("Action");
+ DroolsConsequenceAction action = new DroolsConsequenceAction();
+ action.setMetaData("Action", new Action() {
+ public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
+ System.out.println("Executed action");
+ }
+ });
+ actionNode.setAction(action);
+ process.addNode(actionNode);
+ new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
+ WorkItemNode workItemNode = new WorkItemNode();
+ workItemNode.setId(3);
+ workItemNode.setName("WorkItem");
+ Work work = new WorkImpl();
+ work.setName("MyWork");
+ workItemNode.setWork(work);
+ process.addNode(workItemNode);
+ new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
+ EndNode end = new EndNode();
+ end.setId(4);
+ end.setName("End");
+ process.addNode(end);
+ new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+ return process;
+ }
+
+ public boolean assertEquals(byte[] bytes1,
+ byte[] bytes2) {
+ if ( bytes1.length != bytes2.length ) {
+ return false;
+ }
+
+ for ( int i = 0; i < bytes1.length; i++ ) {
+ if ( bytes1[i] != bytes2[i] ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java 2008-08-25 19:56:03 UTC (rev 21890)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/ForEachTest.java 2008-08-25 22:22:21 UTC (rev 21891)
@@ -18,8 +18,8 @@
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.ruleflow.core.RuleFlowProcess;
import org.drools.spi.Action;
+import org.drools.spi.KnowledgeHelper;
import org.drools.spi.ProcessContext;
-import org.drools.spi.KnowledgeHelper;
import org.drools.workflow.core.DroolsAction;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.impl.ConnectionImpl;
More information about the jboss-svn-commits
mailing list