[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