[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