[jboss-svn-commits] JBL Code SVN: r25135 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Feb 6 08:53:12 EST 2009


Author: KrisVerlaenen
Date: 2009-02-06 08:53:12 -0500 (Fri, 06 Feb 2009)
New Revision: 25135

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessForEachTest.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ForEachNodeInstance.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java
Log:
 - minor improvements to make process model more expressive

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2009-02-06 12:32:52 UTC (rev 25134)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2009-02-06 13:53:12 UTC (rev 25135)
@@ -399,7 +399,7 @@
         @end{}
 
         return @{processClassName}.@{methodName} (
-	        @foreach{identifier : globals} @{identifier}
+	        processContext at if{globals != empty}, at end{} @foreach{identifier : globals} @{identifier}
 	        @end{","} );
     }
     

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel	2009-02-06 12:32:52 UTC (rev 25134)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaRule.mvel	2009-02-06 13:53:12 UTC (rev 25135)
@@ -113,7 +113,8 @@
 @end{}
 
 @declare{"returnValueEvaluatorMethod"}
-public static Object @{methodName}(@foreach{type : globalTypes, identifier : globals}  @{type} @{identifier} @end{","} ) throws Exception {
+public static Object @{methodName}(org.drools.spi.ProcessContext context at if{globals != empty}, at end{} @foreach{type : globalTypes, identifier : globals}  @{type} @{identifier} @end{","} ) throws Exception {
+    org.drools.runtime.process.ProcessContext kcontext = context;
     @{text}
 }
 @end{}
\ No newline at end of file

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessForEachTest.java	2009-02-06 13:53:12 UTC (rev 25135)
@@ -0,0 +1,92 @@
+package org.drools.integrationtests;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.drools.Message;
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.DroolsError;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderErrors;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.rule.Package;
+import org.drools.runtime.ObjectFilter;
+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() {
+        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" +
+            "    <globals>\n" +
+            "      <global identifier=\"myList\" type=\"java.util.List\" />\n" +
+            "    </globals>\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" +
+            "    <actionNode id=\"1\" name=\"Action\" >\n" +
+            "        <action type=\"expression\" dialect=\"mvel\" >myList.add(item);</action>\n" +
+            "    </actionNode>\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 );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> myList = new ArrayList<String>();
+        workingMemory.setGlobal("myList", myList);
+        List<String> collection = new ArrayList<String>();
+        collection.add("one");
+        collection.add("two");
+        collection.add("three");
+        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(3, myList.size());
+    }
+    
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java	2009-02-06 12:32:52 UTC (rev 25134)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java	2009-02-06 13:53:12 UTC (rev 25135)
@@ -74,6 +74,8 @@
                            ProcessContext context) throws Exception {
         DroolsMVELFactory factory = (DroolsMVELFactory) this.prototype.clone();
         
+        factory.addResolver("context", new SimpleValueResolver(context));
+        factory.addResolver("kcontext", new SimpleValueResolver(context));
         if (variableNames != null) {
         	for (String variableName: variableNames) {
         		factory.addResolver(

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	2009-02-06 12:32:52 UTC (rev 25134)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/ForEachNodeInstance.java	2009-02-06 13:53:12 UTC (rev 25135)
@@ -14,6 +14,8 @@
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.NodeInstanceContainer;
 import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.drools.workflow.instance.impl.NodeInstanceResolverFactory;
+import org.mvel2.MVEL;
 
 /*
  * Copyright 2005 JBoss Inc
@@ -98,13 +100,20 @@
         
         private Collection<?> evaluateCollectionExpression(String collectionExpression) {
             // TODO: should evaluate this expression using MVEL
+        	Object collection = null;
             VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
                 resolveContextInstance(VariableScope.VARIABLE_SCOPE, collectionExpression);
-            if (variableScopeInstance == null) {
-                throw new IllegalArgumentException(
-                    "Could not find collection " + collectionExpression);
+            if (variableScopeInstance != null) {
+            	collection = variableScopeInstance.getVariable(collectionExpression);
+            } else {
+            	try {
+            		collection = MVEL.eval(collectionExpression, new NodeInstanceResolverFactory(this));
+            	} catch (Throwable t) {
+            		throw new IllegalArgumentException(
+                        "Could not find collection " + collectionExpression);
+            	}
+                
             }
-            Object collection = variableScopeInstance.getVariable(collectionExpression);
             if (collection == null) {
             	return Collections.EMPTY_LIST;
             }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2009-02-06 12:32:52 UTC (rev 25134)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2009-02-06 13:53:12 UTC (rev 25135)
@@ -324,7 +324,11 @@
 		if (!alwaysTrue.getSelection()) {
 			constraint.setConstraint(getConstraintText());
 		} else {
-			constraint.setConstraint("eval(true)");
+			if (typeCombo.getSelectionIndex() == 0) {
+				constraint.setConstraint("eval(true)");
+			} else {
+				constraint.setConstraint("return true;");
+			}
 		}
 		constraint.setName(nameText.getText());
 		try {
@@ -343,7 +347,7 @@
 	public void setConstraint(Constraint constraint) {
 		this.constraint = constraint;
 		if (constraint != null) {
-			if ("eval(true)".equals(constraint.getConstraint())) {
+			if ("eval(true)".equals(constraint.getConstraint()) || "return true;".equals(constraint.getConstraint())) {
 				alwaysTrue.setSelection(true);
 			} else {
 				setConstraintText(constraint.getConstraint() == null ? "" : constraint.getConstraint());




More information about the jboss-svn-commits mailing list