[jboss-svn-commits] JBL Code SVN: r25904 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/common and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Apr 1 11:37:24 EDT 2009
Author: KrisVerlaenen
Date: 2009-04-01 11:37:24 -0400 (Wed, 01 Apr 2009)
New Revision: 25904
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessForEachTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessWorkItemTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
Log:
- fixed issue where nested invocations of fireAllRules were possible
- extended some tests
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessForEachTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessForEachTest.java 2009-04-01 10:53:07 UTC (rev 25903)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessForEachTest.java 2009-04-01 15:37:24 UTC (rev 25904)
@@ -15,11 +15,14 @@
import org.drools.compiler.PackageBuilder;
import org.drools.process.instance.ProcessInstance;
import org.drools.rule.Package;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
public class ProcessForEachTest extends TestCase {
- public void testOnEntryExit() {
+ public void testForEach() {
PackageBuilder builder = new PackageBuilder();
Reader source = new StringReader(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
@@ -82,4 +85,78 @@
assertEquals(3, myList.size());
}
+ public void testForEachLargeList() {
+ PackageBuilder builder = new PackageBuilder();
+ Reader source = new StringReader(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<process xmlns=\"http://drools.org/drools-5.0/process\"\n" +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n" +
+ " type=\"RuleFlow\" name=\"ForEach\" id=\"org.drools.ForEach\" package-name=\"org.drools\" >\n" +
+ " <header>\n" +
+ " <variables>\n" +
+ " <variable name=\"collection\" >\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=\"2\" name=\"ForEach\" variableName=\"item\" collectionExpression=\"collection\" >\n" +
+ " <nodes>\n" +
+ " <workItem id=\"1\" name=\"Log\" >\n" +
+ " <work name=\"Log\" >\n" +
+ " <parameter name=\"Message\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " </work>\n" +
+ " <mapping type=\"in\" from=\"item\" to=\"Message\" />" +
+ " </workItem>\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=\"2\" />\n" +
+ " <connection from=\"2\" to=\"3\" />\n" +
+ " </connections>\n" +
+ "</process>");
+ builder.addRuleFlow(source);
+ Package pkg = builder.getPackage();
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+ final List<String> myList = new ArrayList<String>();
+ WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ workingMemory.getWorkItemManager().registerWorkItemHandler("Log", new WorkItemHandler() {
+ public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+ String message = (String) workItem.getParameter("Message");
+// System.out.println(message);
+ myList.add(message);
+ manager.completeWorkItem(workItem.getId(), null);
+ }
+ public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+ }
+ });
+ List<String> collection = new ArrayList<String>();
+ for (int i = 0; i < 10000; i++) {
+ collection.add(i + "");
+ }
+ Map<String, Object> params = new HashMap<String, Object>();
+ params.put("collection", collection);
+ ProcessInstance processInstance = ( ProcessInstance )
+ workingMemory.startProcess("org.drools.ForEach", params);
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ assertEquals(10000, myList.size());
+ }
+
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessWorkItemTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessWorkItemTest.java 2009-04-01 10:53:07 UTC (rev 25903)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessWorkItemTest.java 2009-04-01 15:37:24 UTC (rev 25904)
@@ -2,8 +2,10 @@
import java.io.Reader;
import java.io.StringReader;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
@@ -12,12 +14,11 @@
import org.drools.KnowledgeBaseFactory;
import org.drools.Person;
import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceFactory;
-import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.process.ProcessInstance;
import org.drools.runtime.process.WorkItem;
@@ -103,19 +104,26 @@
TestWorkItemHandler handler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put("UserName", "John Doe");
+ Person person = new Person();
+ person.setName("John Doe");
+ parameters.put("Person", person);
WorkflowProcessInstance processInstance = (WorkflowProcessInstance)
- ksession.startProcess("org.drools.actions");
+ ksession.startProcess("org.drools.actions", parameters);
assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
WorkItem workItem = handler.getWorkItem();
assertNotNull(workItem);
assertEquals("John Doe", workItem.getParameter("ActorId"));
+ assertEquals("John Doe", workItem.getParameter("Content"));
+ assertEquals("John Doe", workItem.getParameter("Comment"));
ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
- Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters = new HashMap<String, Object>();
parameters.put("UserName", "Jane Doe");
parameters.put("MyObject", "SomeString");
- Person person = new Person();
+ person = new Person();
person.setName("Jane Doe");
parameters.put("Person", person);
processInstance = (WorkflowProcessInstance)
@@ -135,6 +143,93 @@
assertEquals(15, processInstance.getVariable("Number"));
}
+ public void testWorkItemImmediateCompletion() {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ Reader source = new StringReader(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<process xmlns=\"http://drools.org/drools-5.0/process\"\n" +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n" +
+ " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " <variables>\n" +
+ " <variable name=\"UserName\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>John Doe</value>\n" +
+ " </variable>\n" +
+ " <variable name=\"Person\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n" +
+ " </variable>\n" +
+ " <variable name=\"MyObject\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n" +
+ " </variable>\n" +
+ " <variable name=\"Number\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n" +
+ " </variable>\n" +
+ " </variables>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <workItem id=\"2\" name=\"HumanTask\" >\n" +
+ " <work name=\"Human Task\" >\n" +
+ " <parameter name=\"ActorId\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>#{UserName}</value>\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Content\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>#{Person.name}</value>\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=\"Priority\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Comment\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </parameter>\n" +
+ " <parameter name=\"Attachment\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n" +
+ " </parameter>\n" +
+ " </work>\n" +
+ " <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />" +
+ " <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />" +
+ " <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />" +
+ " <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />" +
+ " </workItem>\n" +
+ " <end id=\"3\" name=\"End\" />\n" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " <connection from=\"2\" to=\"3\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>");
+ kbuilder.add( ResourceFactory.newReaderResource( source ), ResourceType.DRF );
+
+ Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kpkgs );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ ImmediateTestWorkItemHandler handler = new ImmediateTestWorkItemHandler();
+ ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
+ ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put("UserName", "John Doe");
+ Person person = new Person();
+ person.setName("John Doe");
+ parameters.put("Person", person);
+ WorkflowProcessInstance processInstance = (WorkflowProcessInstance)
+ ksession.startProcess("org.drools.actions", parameters);
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ }
+
private static class TestWorkItemHandler implements WorkItemHandler {
private WorkItem workItem;
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
@@ -146,4 +241,12 @@
return workItem;
}
}
+
+ private static class ImmediateTestWorkItemHandler implements WorkItemHandler {
+ public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+ manager.completeWorkItem(workItem.getId(), null);
+ }
+ public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+ }
+ }
}
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 2009-04-01 10:53:07 UTC (rev 25903)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2009-04-01 15:37:24 UTC (rev 25904)
@@ -676,14 +676,14 @@
executeQueuedActions();
int fireCount = 0;
- try {
- if ( this.firing.compareAndSet( false,
- true ) ) {
+ if ( this.firing.compareAndSet( false,
+ true ) ) {
+ try {
fireCount = this.agenda.fireAllRules( agendaFilter,
fireLimit );
+ } finally {
+ this.firing.set( false );
}
- } finally {
- this.firing.set( false );
}
return fireCount;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java 2009-04-01 10:53:07 UTC (rev 25903)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java 2009-04-01 15:37:24 UTC (rev 25904)
@@ -232,14 +232,16 @@
}
public void workItemAborted(WorkItem workItem) {
- if ( getWorkItem().getId() == workItem.getId() ) {
+ if ( workItemId == workItem.getId()
+ || ( workItemId == -1 && getWorkItem().getId() == workItem.getId()) ) {
removeEventListeners();
triggerCompleted(workItem);
}
}
public void workItemCompleted(WorkItem workItem) {
- if ( getWorkItem().getId() == workItem.getId() ) {
+ if ( workItemId == workItem.getId()
+ || ( workItemId == -1 && getWorkItem().getId() == workItem.getId()) ) {
removeEventListeners();
triggerCompleted(workItem);
}
More information about the jboss-svn-commits
mailing list