[jboss-svn-commits] JBL Code SVN: r26823 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/process/builder and 5 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Jun 3 20:15:51 EDT 2009
Author: salaboy21
Date: 2009-06-03 20:15:51 -0400 (Wed, 03 Jun 2009)
New Revision: 26823
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ProcessNodeBuilderRegistry.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConstraintHandler.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StateNodeHandler.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java
Log:
JBRULES-2107: Support StateNode for Finite State Machines
- StateNode Supported, and tested in ProcessStateTest
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -53,6 +53,7 @@
import org.drools.workflow.core.node.MilestoneNode;
import org.drools.workflow.core.node.Split;
import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.StateNode;
import org.drools.workflow.core.node.Trigger;
import org.drools.xml.XmlProcessReader;
import org.drools.xml.processes.RuleFlowMigrator;
@@ -313,6 +314,9 @@
MilestoneNode milestone = (MilestoneNode) nodes[i];
builder.append( createMilestoneRule( process,
milestone ) );
+ } else if ( nodes[i] instanceof StateNode ) {
+ StateNode state = (StateNode) nodes[i];
+ builder.append( createAllStateRules(process, state) );
} else if ( nodes[i] instanceof StartNode ) {
StartNode startNode = (StartNode) nodes[i];
List<Trigger> triggers = startNode.getTriggers();
@@ -341,7 +345,19 @@
MilestoneNode milestone) {
return "rule \"RuleFlow-Milestone-" + process.getId() + "-" + milestone.getId() + "\" \n" + " ruleflow-group \"DROOLS_SYSTEM\" \n" + " when \n" + " " + milestone.getConstraint() + "\n" + " then \n" + "end \n\n";
}
+ private String createStateRule(Process process,
+ StateNode state, String key) {
+ return "rule \"RuleFlowStateNode-" + process.getId() + "-" + state.getId() + "-" + key + "\" \n" + " ruleflow-group \"DROOLS_SYSTEM\" \n" + " when \n" + " " + state.getConstraints().get(key).getConstraint() + "\n" + " then \n" + "end \n\n";
+ }
+ private String createAllStateRules(Process process, StateNode state){
+ String result = "";
+ for(String key : state.getConstraints().keySet()){
+ result += createStateRule(process, state, key);
+ }
+ return result;
+ }
+
private String createStartConstraintRule(Process process,
ConstraintTrigger trigger) {
String result = "rule \"RuleFlow-Start-" + process.getId() + "\" \n" + " when\n" + " " + trigger.getConstraint() + "\n" + " then\n";
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ProcessNodeBuilderRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ProcessNodeBuilderRegistry.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ProcessNodeBuilderRegistry.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -12,6 +12,7 @@
import org.drools.workflow.core.node.RuleSetNode;
import org.drools.workflow.core.node.Split;
import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.StateNode;
import org.drools.workflow.core.node.SubProcessNode;
import org.drools.workflow.core.node.TimerNode;
import org.drools.workflow.core.node.WorkItemNode;
@@ -28,6 +29,8 @@
new ExtendedNodeBuilder() );
register( MilestoneNode.class,
new EventBasedNodeBuilder() );
+ register( StateNode.class,
+ new EventBasedNodeBuilder() );
register( RuleSetNode.class,
new EventBasedNodeBuilder() );
register( SubProcessNode.class,
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConstraintHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConstraintHandler.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConstraintHandler.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -74,9 +74,25 @@
}
}
constraint.setConstraint(text);
+
splitNode.internalSetConstraint(connectionRef, constraint);
+
+
+
} else if (parent instanceof Constrainable) {
Constrainable constrainable = (Constrainable) parent;
+ Constraint constraint = new ConstraintImpl();
+
+ final String name = element.getAttribute("name");
+ constraint.setName(name);
+ final String priority = element.getAttribute("priority");
+ if (priority != null && priority.length() != 0) {
+ constraint.setPriority(new Integer(priority));
+ }
+ final String type = element.getAttribute("type");
+ constraint.setType(type);
+ final String dialect = element.getAttribute("dialect");
+ constraint.setDialect(dialect);
String text = ((Text)element.getChildNodes().item( 0 )).getWholeText();
if (text != null) {
text = text.trim();
@@ -84,7 +100,8 @@
text = null;
}
}
- constrainable.setConstraint(text);
+ constraint.setConstraint(text);
+ constrainable.addConstraint(name, constraint);
} else {
throw new SAXException("Invalid parent node " + parent);
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StateNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StateNodeHandler.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StateNodeHandler.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -1,8 +1,13 @@
package org.drools.xml.processes;
+import java.util.Map;
+import java.util.Set;
+import org.drools.workflow.core.Constraint;
import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.NewStateNode;
import org.drools.workflow.core.node.StateNode;
import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.XmlDumper;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
@@ -28,9 +33,26 @@
}
public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
- StateNode milestoneNode = (StateNode) node;
- writeNode("state", milestoneNode, xmlDump, includeMeta);
- endNode(xmlDump);
+ StateNode stateNode = (StateNode) node;
+ writeNode("state", stateNode, xmlDump, includeMeta);
+ Map<String,Constraint> constraints = stateNode.getConstraints();
+ if (constraints != null || stateNode.getTimers() != null || stateNode.containsActions()) {
+ xmlDump.append(">\n");
+ Set<String> keys = constraints.keySet();
+ for(String key : keys ){
+ if (constraints.get(key) != null) {
+ xmlDump.append(" <constraint type=\"rule\" dialect=\"mvel\" >"
+ + XmlDumper.replaceIllegalChars(constraints.get(key).getConstraint().trim()) + "</constraint>" + EOL);
+ }
+ }
+ for (String eventType: stateNode.getActionTypes()) {
+ writeActions(eventType, stateNode.getActions(eventType), xmlDump);
+ }
+ writeTimers(stateNode.getTimers(), xmlDump);
+ endNode("state", xmlDump);
+ } else {
+ endNode(xmlDump);
+ }
}
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -8,9 +8,13 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
+import org.drools.audit.WorkingMemoryConsoleLogger;
+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.ruleflow.instance.RuleFlowProcessInstance;
public class ProcessStateTest extends TestCase {
@@ -49,5 +53,60 @@
processInstance.signalEvent("signal", null);
assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
+
+
+ public void testNewStateNode() {
+ 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=\"flow\" id=\"org.drools.state\" package-name=\"org.drools\" version=\"1\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <state id=\"2\" dialect=\"mvel\" >\n" +
+ " <constraint name=\"one\" type=\"rule\" >" +
+ " eval(true)" +
+ " </constraint>"+
+ " <constraint name=\"two\" type=\"rule\" >" +
+ " eval(false)" +
+ " </constraint>"+
+ " </state>\n" +
+ " <end id=\"3\" name=\"End\" />\n" +
+ " <end id=\"4\" name=\"End\" />\n" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " <connection from=\"2\" to=\"3\" fromType=\"one\" />\n" +
+ " <connection from=\"2\" to=\"4\" fromType=\"two\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>");
+ builder.addRuleFlow(source);
+ PackageBuilderErrors errors = builder.getErrors();
+
+ for(DroolsError error: errors.getErrors()){
+ System.out.println("Error: "+error);
+ }
+ Package pkg = builder.getPackage();
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+ WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ new WorkingMemoryConsoleLogger(workingMemory);
+ ProcessInstance processInstance = ( ProcessInstance )
+ workingMemory.startProcess("org.drools.state");
+ //If the any constraint evaluates to true you can also signal the state node to continue
+ // assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+ // assertEquals(2, ((RuleFlowProcessInstance)processInstance).getNodeInstances().iterator().next().getNodeId());
+ // processInstance.signalEvent("signal", null);
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -46,6 +46,7 @@
import org.drools.workflow.core.node.SubProcessNode;
import org.drools.workflow.core.node.WorkItemNode;
import org.drools.workflow.core.node.CompositeNode.NodeAndType;
+import org.drools.workflow.core.node.StateNode;
import org.mvel2.ErrorDetail;
import org.mvel2.ParserContext;
import org.mvel2.compiler.ExpressionCompiler;
@@ -219,7 +220,17 @@
errors.add( new ProcessValidationErrorImpl(process,
"Milestone node '" + node.getName() + "' [" + node.getId() + "] has no constraint."));
}
- } else if (node instanceof SubProcessNode) {
+ }else if (node instanceof StateNode) {
+ final StateNode stateNode = (StateNode) node;
+ if (stateNode.getFrom() == null) {
+ errors.add(new ProcessValidationErrorImpl(process,
+ "State node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
+ }
+
+
+
+ }
+ else if (node instanceof SubProcessNode) {
final SubProcessNode subProcess = (SubProcessNode) node;
if (subProcess.getFrom() == null) {
errors.add(new ProcessValidationErrorImpl(process,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -1,7 +1,10 @@
package org.drools.workflow.core.node;
+import org.drools.workflow.core.Constraint;
+
public interface Constrainable {
- public void setConstraint(String constraint);
+ public void addConstraint(String name, Constraint constraint);
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -1,5 +1,7 @@
package org.drools.workflow.core.node;
+import org.drools.workflow.core.Constraint;
+
public class ConstraintTrigger extends Trigger implements Constrainable {
private String constraint;
@@ -11,5 +13,9 @@
public void setConstraint(String constraint) {
this.constraint = constraint;
}
+
+ public void addConstraint(String name, Constraint constraint) {
+ this.constraint = constraint.getConstraint();
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -1,5 +1,7 @@
package org.drools.workflow.core.node;
+import org.drools.workflow.core.Constraint;
+
/*
* Copyright 2005 JBoss Inc
*
@@ -28,12 +30,15 @@
private String constraint;
- public void setConstraint(final String constraint) {
+ public void addConstraint(String name, Constraint constraint) {
+ this.constraint = constraint.getConstraint();
+ }
+ public void setConstraint(String constraint){
this.constraint = constraint;
}
- public String getConstraint() {
+ public String getConstraint(){
return this.constraint;
}
-
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateNode.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateNode.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -1,7 +1,36 @@
package org.drools.workflow.core.node;
-public class StateNode extends EventBasedNode {
+import java.util.HashMap;
+import java.util.Map;
+import org.drools.definition.process.Connection;
+import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.Node;
+
+public class StateNode extends EventBasedNode implements Constrainable{
+
private static final long serialVersionUID = 1L;
+ private Map<String,Constraint> constraints = new HashMap<String,Constraint>();
+
+ public void setConstraints(Map<String, Constraint> constraints) {
+ this.constraints = constraints;
+ }
+
+ public void addConstraint(String name, Constraint constraint) {
+ this.constraints.put(name, constraint);
+ }
+ public Constraint getConstraint(String name){
+
+ return this.constraints.get(name);
+ }
+ public Map<String,Constraint> getConstraints(){
+ return this.constraints;
+ }
+
+ public void validateAddOutgoingConnection(final String type, final Connection connection) {
+
+ }
+
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java 2009-06-03 22:41:16 UTC (rev 26822)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java 2009-06-04 00:15:51 UTC (rev 26823)
@@ -1,14 +1,39 @@
package org.drools.workflow.instance.node;
+import java.util.Set;
+import org.drools.common.InternalAgenda;
import org.drools.runtime.process.NodeInstance;
import org.drools.workflow.core.impl.NodeImpl;
+import org.drools.workflow.core.node.StateNode;
public class StateNodeInstance extends EventBasedNodeInstance {
private static final long serialVersionUID = 4L;
+ protected StateNode getStateNode() {
+ return (StateNode) getNode();
+ }
public void internalTrigger(NodeInstance from, String type) {
- addTriggerListener();
+ super.internalTrigger(from, type);
+ StateNode stateNode = getStateNode();
+ Set<String> keys = stateNode.getConstraints().keySet();
+ int triggeredActivation = 0;
+ for(String key:keys){
+ String rule = "RuleFlowStateNode-" + getProcessInstance().getProcessId()
+ + "-" + getNode().getId() +"-"+ key ;
+
+ boolean isActive = ((InternalAgenda) getProcessInstance().getAgenda())
+ .isRuleActiveInRuleFlowGroup("DROOLS_SYSTEM", rule, getProcessInstance().getId());
+ if (isActive) {
+ triggerCompleted(key, true);
+ triggeredActivation++;
+ }
+ }
+ if(triggeredActivation == 0){
+ addTriggerListener();
+ }
+
+
}
public void signalEvent(String type, Object event) {
More information about the jboss-svn-commits
mailing list