[jboss-svn-commits] JBL Code SVN: r26837 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/base and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jun 4 19:03:00 EDT 2009


Author: KrisVerlaenen
Date: 2009-06-04 19:03:00 -0400 (Thu, 04 Jun 2009)
New Revision: 26837

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessSubProcessTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java
Log:
 - adding support for dynamic process id in subflows

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessSubProcessTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessSubProcessTest.java	2009-06-04 21:28:00 UTC (rev 26836)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessSubProcessTest.java	2009-06-04 23:03:00 UTC (rev 26837)
@@ -174,4 +174,83 @@
 		return ruleBase;
 	}
 	
+    public void testDynamicSubProcess() throws Exception {
+        RuleBase ruleBase = readDynamicSubProcess();
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("x", "subflow");
+        ProcessInstance processInstance = ( ProcessInstance )
+    		workingMemory.startProcess("com.sample.ruleflow", params);
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        assertEquals(2, workingMemory.getProcessInstances().size());
+        workingMemory.insert(new Person());
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(0, workingMemory.getProcessInstances().size());
+    }
+
+	private static RuleBase readDynamicSubProcess() throws Exception {
+		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=\"ruleflow\" id=\"com.sample.ruleflow\" package-name=\"com.sample\" >\n" +
+			"\n" +
+			"  <header>\n" +
+			"    <variables>\n" +
+			"      <variable name=\"x\" >\n" +
+			"        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+			"        <value></value>\n" +
+			"      </variable>\n" +
+			"    </variables>\n" + 
+			"  </header>\n" +
+			"\n" +
+			"  <nodes>\n" +
+			"    <start id=\"1\" name=\"Start\" />\n" +
+			"    <subProcess id=\"2\" name=\"SubProcess\" processId=\"com.sample.#{x}\" />\n" +
+			"    <end id=\"3\" name=\"End\" />\n" +
+			"  </nodes>\n" +
+			"\n" +
+			"  <connections>\n" +
+			"    <connection from=\"1\" to=\"2\" />\n" +
+			"    <connection from=\"2\" to=\"3\" />\n" +
+			"  </connections>\n" +
+			"\n" +
+			"</process>");
+		builder.addRuleFlow(source);
+		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=\"com.sample.subflow\" package-name=\"com.sample\" >\n" +
+			"\n" +
+			"  <header>\n" +
+			"    <imports>\n" +
+			"      <import name=\"org.drools.Person\" />\n" +
+			"    </imports>\n" +
+			"  </header>\n" +
+			"\n" +
+			"  <nodes>\n" +
+			"    <start id=\"1\" name=\"Start\" />\n" +
+			"    <milestone id=\"2\" name=\"Event Wait\" >\n" +
+            "      <constraint type=\"rule\" dialect=\"mvel\" >Person( )</constraint>" +
+            "    </milestone>\n" +
+			"    <end id=\"3\" name=\"End\" />\n" +
+			"  </nodes>\n" +
+			"\n" +
+			"  <connections>\n" +
+			"    <connection from=\"1\" to=\"2\" />\n" +
+			"    <connection from=\"2\" to=\"3\" />\n" +
+			"  </connections>\n" +
+			"\n" +
+			"</process>");
+		builder.addRuleFlow(source);
+		Package pkg = builder.getPackage();
+		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+		ruleBase.addPackage( pkg );
+		return ruleBase;
+	}
+	
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java	2009-06-04 21:28:00 UTC (rev 26836)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java	2009-06-04 23:03:00 UTC (rev 26837)
@@ -21,6 +21,9 @@
 public class ClassFieldAccessorStore
     implements
     Externalizable {
+	
+    private static final long serialVersionUID = 400L;
+    
     private Map<AccessorKey, BaseLookupEntry> lookup;
 
     private ClassFieldAccessorCache           cache;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java	2009-06-04 21:28:00 UTC (rev 26836)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java	2009-06-04 23:03:00 UTC (rev 26837)
@@ -18,6 +18,8 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.drools.common.InternalRuleBase;
 import org.drools.definition.process.Process;
@@ -39,6 +41,7 @@
 public class SubProcessNodeInstance extends EventBasedNodeInstance implements EventListener {
 
     private static final long serialVersionUID = 400L;
+    private static final Pattern PARAMETER_MATCHER = Pattern.compile("#\\{(\\S+)\\}", Pattern.DOTALL);
     
     private long processInstanceId;
 	
@@ -73,6 +76,35 @@
             }
         }
         String processId = getSubProcessNode().getProcessId();
+        // resolve processId if necessary
+        Map<String, String> replacements = new HashMap<String, String>();
+		Matcher matcher = PARAMETER_MATCHER.matcher(processId);
+        while (matcher.find()) {
+        	String paramName = matcher.group(1);
+        	if (replacements.get(paramName) == null) {
+            	VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+                	resolveContextInstance(VariableScope.VARIABLE_SCOPE, paramName);
+                if (variableScopeInstance != null) {
+                    Object variableValue = variableScopeInstance.getVariable(paramName);
+                	String variableValueString = variableValue == null ? "" : variableValue.toString(); 
+	                replacements.put(paramName, variableValueString);
+                } else {
+                	try {
+                		Object variableValue = MVEL.eval(paramName, new NodeInstanceResolverFactory(this));
+	                	String variableValueString = variableValue == null ? "" : variableValue.toString();
+	                	replacements.put(paramName, variableValueString);
+                	} catch (Throwable t) {
+	                    System.err.println("Could not find variable scope for variable " + paramName);
+	                    System.err.println("when trying to replace variable in processId for sub process " + getNodeName());
+	                    System.err.println("Continuing without setting process id.");
+                	}
+                }
+        	}
+        }
+        for (Map.Entry<String, String> replacement: replacements.entrySet()) {
+        	processId = processId.replace("#{" + replacement.getKey() + "}", replacement.getValue());
+        }
+        // start process instance
         Process process = ((InternalRuleBase) ((ProcessInstance) getProcessInstance())
     		.getWorkingMemory().getRuleBase()).getProcess(processId);
         if (process == null) {




More information about the jboss-svn-commits mailing list