[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