[jboss-svn-commits] JBL Code SVN: r26931 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/process/builder and 31 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jun 11 19:48:18 EDT 2009


Author: KrisVerlaenen
Date: 2009-06-11 19:48:18 -0400 (Thu, 11 Jun 2009)
New Revision: 26931

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/DynamicNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessDynamicNodeTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/AbstractProcessInstanceFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/DynamicNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/DynamicNodeInstance.java
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/ResourceTypeBuilder.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/ProcessSemanticModule.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.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/main/java/org/drools/xml/processes/TimerHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessUpgradeTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/HumanTaskNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/MilestoneNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/RuleSetNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SubProcessNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/TimerNodeFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/WorkItemNodeFactory.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/ruleflow/instance/RuleFlowProcessInstanceFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/Node.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.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/NodeInstanceContainer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/RuleConstraintEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java
   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/TimerNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionDialog.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimerDialog.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
   labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
   labs/jbossrules/trunk/drools-process/drools-bpel/.project
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java
   labs/jbossrules/trunk/drools-process/drools-jpdl/
   labs/jbossrules/trunk/drools-process/drools-jpdl/.classpath
   labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/instance/JpdlProcessInstanceFactory.java
   labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/xml/StartStateHandler.java
   labs/jbossrules/trunk/drools-process/drools-osworkflow/
   labs/jbossrules/trunk/drools-process/drools-osworkflow/.classpath
   labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/instance/OSWorkflowProcessInstanceFactory.java
   labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/StepNodeHandler.java
   labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/XmlOSWorkflowProcessDumper.java
Log:
JBRULES-2119: Support more user-friendly time format in timers
 - timer delay and period now expressed as a String
JBRULES-2107: Support StateNode for Finite State Machines
 - state node now extends composite node and can handle rules for state transitions (immediate or delayed)
JBRULES-2120: Dynamic or Ah-Hoc node
 - added initial implementation

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -55,6 +55,7 @@
 import org.drools.workflow.core.node.StartNode;
 import org.drools.workflow.core.node.StateNode;
 import org.drools.workflow.core.node.Trigger;
+import org.drools.workflow.core.node.StateNode.ConnectionRef;
 import org.drools.xml.XmlProcessReader;
 import org.drools.xml.processes.RuleFlowMigrator;
 
@@ -69,9 +70,6 @@
     private PackageBuilder                packageBuilder;
     private final List<DroolsError>       errors                         = new ArrayList<DroolsError>();
     private Map<String, ProcessValidator> processValidators              = new HashMap<String, ProcessValidator>();
-    private static final String           XSL_FROM_4_TO_5                = "/org/drools/xml/processes/RuleFlowFrom4To5.xsl";
-    private static final String           PROCESS_ELEMENT_WITH_NAMESPACE = "<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";
 
     public ProcessBuilder(PackageBuilder packageBuilder) {
         this.packageBuilder = packageBuilder;
@@ -316,7 +314,7 @@
                                                      milestone ) );
             } else if ( nodes[i] instanceof StateNode ) {
                 StateNode state = (StateNode) nodes[i];
-                builder.append( createAllStateRules(process, state) );
+                builder.append( createStateRules(process, state) );
             } else if ( nodes[i] instanceof StartNode ) {
                 StartNode startNode = (StartNode) nodes[i];
                 List<Trigger> triggers = startNode.getTriggers();
@@ -337,21 +335,43 @@
     private String createSplitRule(Process process,
                                    Connection connection,
                                    String constraint) {
-        return "rule \"RuleFlow-Split-" + process.getId() + "-" + connection.getFrom().getId() + "-" + connection.getTo().getId() + "\" \n" + "      ruleflow-group \"DROOLS_SYSTEM\" \n" + "    when \n" + "      " + constraint + "\n" + "    then \n"
-               + "end \n\n";
+        return 
+        	"rule \"RuleFlow-Split-" + process.getId() + "-" +
+        		((org.drools.workflow.core.Node) connection.getFrom()).getUniqueId() + "-" + 
+        		((org.drools.workflow.core.Node) connection.getTo()).getUniqueId() + "-" +
+        		connection.getToType() + "\" \n" +
+        	"      ruleflow-group \"DROOLS_SYSTEM\" \n" + 
+        	"    when \n" + 
+        	"      " + constraint + "\n" + 
+        	"    then \n" +
+            "end \n\n";
     }
 
     private String createMilestoneRule(Process process,
                                        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";
+        return 
+        	"rule \"RuleFlow-Milestone-" + process.getId() + "-" + milestone.getUniqueId() + "\" \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 createStateRule(Process process, StateNode state, ConnectionRef key) {
+        return 
+        	"rule \"RuleFlowStateNode-" + process.getId() + "-" + state.getUniqueId() + "-" + 
+        		key.getNodeId() + "-" + key.getToType() + "\" \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){
+    
+    private String createStateRules(Process process, StateNode state){
         String result = "";
-        for(String key : state.getConstraints().keySet()){
+        for(ConnectionRef key : state.getConstraints().keySet()){
             result  += createStateRule(process, state, key);
         }
         return result;
@@ -360,16 +380,20 @@
 
     private String createStartConstraintRule(Process process,
                                              ConstraintTrigger trigger) {
-        String result = "rule \"RuleFlow-Start-" + process.getId() + "\" \n" + "    when\n" + "        " + trigger.getConstraint() + "\n" + "    then\n";
+        String result = 
+        	"rule \"RuleFlow-Start-" + process.getId() + "\" \n" + 
+        	"    when\n" + 
+        	"        " + trigger.getConstraint() + "\n" + 
+        	"    then\n";
         Map<String, String> inMappings = trigger.getInMappings();
         if ( inMappings != null && !inMappings.isEmpty() ) {
             result += "        java.util.Map params = new java.util.HashMap();\n";
             for ( Map.Entry<String, String> entry : inMappings.entrySet() ) {
                 result += "        params.put(\"" + entry.getKey() + "\", " + entry.getValue() + ");\n";
             }
-            result += "        drools.getWorkingMemory().startProcess(\"" + process.getId() + "\", params);\n" + "end\n\n";
+            result += "        kcontext.getKnowledgeRuntime().startProcess(\"" + process.getId() + "\", params);\n" + "end\n\n";
         } else {
-            result += "        drools.getWorkingMemory().startProcess(\"" + process.getId() + "\");\n" + "end\n\n";
+            result += "        kcontext.getKnowledgeRuntime().startProcess(\"" + process.getId() + "\");\n" + "end\n\n";
         }
         return result;
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ResourceTypeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ResourceTypeBuilder.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ResourceTypeBuilder.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -8,6 +8,6 @@
 	
 	void setPackageBuilder(PackageBuilder packageBuilder);
 	
-	void addKnowledgeResource(Resource resource, ResourceType type, ResourceConfiguration configuration);
+	void addKnowledgeResource(Resource resource, ResourceType type, ResourceConfiguration configuration) throws Exception;
 
 }

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ProcessNodeBuilderRegistry.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -29,8 +29,6 @@
                   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/ProcessSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -4,6 +4,7 @@
 import org.drools.xml.processes.CompositeNodeHandler;
 import org.drools.xml.processes.ConnectionHandler;
 import org.drools.xml.processes.ConstraintHandler;
+import org.drools.xml.processes.DynamicNodeHandler;
 import org.drools.xml.processes.EndNodeHandler;
 import org.drools.xml.processes.EventFilterHandler;
 import org.drools.xml.processes.EventNodeHandler;
@@ -109,6 +110,8 @@
         addHandler( "trigger",
      		               new TriggerHandler() );
         addHandler( "state",
-     		        new StateNodeHandler() );        
+     		               new StateNodeHandler() );        
+        addHandler( "dynamic",
+ 		                   new DynamicNodeHandler() );        
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -224,8 +224,11 @@
 				}
     		});
     		for (Timer timer: timerList) {
-    			xmlDump.append("        <timer id=\"" + timer.getId() + "\" delay=\"" + timer.getDelay() + "\" ");
-                if (timer.getPeriod() > 0) {
+    			xmlDump.append("        <timer id=\"" + timer.getId() + "\" ");
+				if (timer.getDelay() != null) {
+					xmlDump.append("delay=\"" + timer.getDelay() + "\" ");
+				}
+    			if (timer.getPeriod() != null) {
                     xmlDump.append("period=\"" + timer.getPeriod() + "\" ");
                 }
                 xmlDump.append(">" + EOL);

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConstraintHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -6,6 +6,7 @@
 import org.drools.workflow.core.impl.ConstraintImpl;
 import org.drools.workflow.core.node.Constrainable;
 import org.drools.workflow.core.node.Split;
+import org.drools.workflow.core.node.StateNode;
 import org.drools.xml.BaseAbstractHandler;
 import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.Handler;
@@ -20,6 +21,7 @@
         if ((this.validParents == null) && (this.validPeers == null)) {
             this.validParents = new HashSet<Class<?>>();
             this.validParents.add(Split.class);
+            this.validParents.add(StateNode.class);
             this.validParents.add(Constrainable.class);
 
             this.validPeers = new HashSet<Class<?>>();
@@ -74,11 +76,38 @@
 	            }
 	        }
 	        constraint.setConstraint(text);
-
 	        splitNode.internalSetConstraint(connectionRef, constraint);
-
-       
-            
+        } else if (parent instanceof StateNode) {
+        	StateNode stateNode = (StateNode) parser.getParent();
+	        
+	        final String toNodeIdString = element.getAttribute("toNodeId");
+	        emptyAttributeCheck(localName, "toNodeId", toNodeIdString, parser);
+	        int toNodeId = new Integer(toNodeIdString);
+	        final String toType = element.getAttribute("toType");
+	        emptyAttributeCheck(localName, "toType", toType, parser);
+	        StateNode.ConnectionRef connectionRef = new StateNode.ConnectionRef(toNodeId, toType);
+	        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();
+	            if ("".equals(text)) {
+	                text = null;
+	            }
+	        }
+	        constraint.setConstraint(text);
+	        stateNode.internalSetConstraint(connectionRef, constraint);
         } else if (parent instanceof Constrainable) {
         	Constrainable constrainable = (Constrainable) parent;
              Constraint constraint = new ConstraintImpl();

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/DynamicNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/DynamicNodeHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/DynamicNodeHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -0,0 +1,20 @@
+package org.drools.xml.processes;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.DynamicNode;
+
+public class DynamicNodeHandler extends CompositeNodeHandler {
+
+    protected Node createNode() {
+        return new DynamicNode();
+    }
+
+    public Class<?> generateNodeFor() {
+        return DynamicNode.class;
+    }
+    
+    protected String getNodeName() {
+    	return "dynamic";
+    }
+
+}

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StateNodeHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -1,14 +1,12 @@
 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.StateNode;
-import org.drools.xml.ExtensibleXmlParser;
+import org.drools.workflow.core.node.StateNode.ConnectionRef;
 import org.drools.xml.XmlDumper;
-import org.w3c.dom.Element;
-import org.xml.sax.SAXException;
 
 public class StateNodeHandler extends AbstractNodeHandler {
 
@@ -21,37 +19,37 @@
         return StateNode.class;
     }
 
-    public void handleNode(final Node node, final Element element, final String uri,
-            final String localName, final ExtensibleXmlParser parser)
-            throws SAXException {
-        super.handleNode(node, element, uri, localName, parser);
-        StateNode stateNode = (StateNode) node;
-        for (String eventType: stateNode.getActionTypes()) {
-        	handleAction(node, element, eventType);
-        }
-    }
-    
     public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
 		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);
+        xmlDump.append(">\n");
+        if (!stateNode.getConstraints().isEmpty()) {
+	        xmlDump.append("      <constraints>" + EOL);
+	        for (Map.Entry<ConnectionRef, Constraint> entry: stateNode.getConstraints().entrySet()) {
+	            ConnectionRef connection = entry.getKey();
+	            Constraint constraint = entry.getValue();
+	            xmlDump.append("        <constraint "
+	                + "toNodeId=\"" + connection.getNodeId() + "\" "
+	                + "toType=\"" + connection.getToType() + "\" ");
+	            String name = constraint.getName();
+	            if (name != null && !"".equals(name)) {
+	                xmlDump.append("name=\"" + XmlDumper.replaceIllegalChars(constraint.getName()) + "\" ");
+	            }
+	            int priority = constraint.getPriority();
+	            if (priority != 0) {
+	                xmlDump.append("priority=\"" + constraint.getPriority() + "\" ");
+	            }
+	            xmlDump.append("type=\"rule\" dialect=\"mvel\" ");
+	            String constraintString = constraint.getConstraint();
+	            if (constraintString != null) {
+	                xmlDump.append(">" + XmlDumper.replaceIllegalChars(constraintString) + "</constraint>" + EOL);
+	            } else {
+	                xmlDump.append("/>" + EOL);
+	            }
+	        }
+	        xmlDump.append("      </constraints>" + EOL);
         }
+        endNode("state", xmlDump);
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerHandler.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -47,10 +47,10 @@
         Timer timer = new Timer();
         timer.setId(new Long(id));
         if (delay != null && delay.length() != 0 ) {
-            timer.setDelay(new Long(delay));
+            timer.setDelay(delay);
         }
         if (period != null && period.length() != 0 ) {
-            timer.setPeriod(new Long(period));
+            timer.setPeriod(period);
         }
         org.w3c.dom.Node xmlNode = element.getFirstChild();
         DroolsAction action = null;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -27,10 +27,10 @@
                 timerNode.setTimer(timer);
             }
             if (delay != null && delay.length() != 0 ) {
-                timer.setDelay(new Long(delay));
+                timer.setDelay(delay);
             }
             if (period != null && period.length() != 0 ) {
-                timer.setPeriod(new Long(period));
+                timer.setPeriod(period);
             }
         }
     }
@@ -46,7 +46,7 @@
         Timer timer = timerNode.getTimer();
         if (timer != null) {
             xmlDump.append("delay=\"" + timer.getDelay() + "\" ");
-            if (timer.getPeriod() > 0) {
+            if (timer.getPeriod() != null) {
                 xmlDump.append(" period=\"" + timer.getPeriod() + "\" ");
             }
         }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd	2009-06-11 23:48:18 UTC (rev 26931)
@@ -140,6 +140,8 @@
 				<xs:element ref="drools:forEach"/>
 				<xs:element ref="drools:eventNode"/>
 				<xs:element ref="drools:fault"/>
+				<xs:element ref="drools:state"/>
+				<xs:element ref="drools:dynamic"/>
 			</xs:choice>
 		</xs:complexType>
 	</xs:element>
@@ -513,6 +515,38 @@
 			<xs:attribute name="faultVariable" type="xs:string"/>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="state">
+		<xs:complexType>
+			<xs:sequence minOccurs="0">
+				<xs:element ref="drools:constraints"/>
+			</xs:sequence>
+			<xs:attribute name="id" type="xs:string" use="required"/>
+			<xs:attribute name="name" type="xs:string"/>
+			<xs:attribute name="x" type="xs:string"/>
+			<xs:attribute name="y" type="xs:string"/>
+			<xs:attribute name="width" type="xs:string"/>
+			<xs:attribute name="height" type="xs:string"/>
+			<xs:attribute name="type" type="xs:string"/>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="dynamic">
+		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:variables"/>
+				<xs:element ref="drools:exceptionHandlers"/>
+				<xs:element ref="drools:nodes"/>
+				<xs:element ref="drools:connections"/>
+				<xs:element ref="drools:in-ports"/>
+				<xs:element ref="drools:out-ports"/>
+			</xs:choice>
+			<xs:attribute name="id" type="xs:string" use="required"/>
+			<xs:attribute name="name" type="xs:string"/>
+			<xs:attribute name="x" type="xs:string"/>
+			<xs:attribute name="y" type="xs:string"/>
+			<xs:attribute name="width" type="xs:string"/>
+			<xs:attribute name="height" type="xs:string"/>
+		</xs:complexType>
+	</xs:element>
 	<xs:element name="connections">
 		<xs:complexType>
 			<xs:sequence minOccurs="0" maxOccurs="unbounded">

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessDynamicNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessDynamicNodeTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessDynamicNodeTest.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -0,0 +1,175 @@
+package org.drools.integrationtests;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+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.process.instance.ProcessInstance;
+import org.drools.rule.Package;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+
+public class ProcessDynamicNodeTest extends TestCase {
+    
+    public void testDynamicActions() {
+        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=\"org.drools.dynamic\" package-name=\"org.drools\" >\n" +
+            "\n" +
+            "  <header>\n" +
+            "    <globals>\n" +
+            "      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+            "    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" + 
+            "    <dynamic id=\"2\" name=\"DynamicNode\" >\n" +
+            "      <nodes>\n" +
+            "        <actionNode id=\"1\" name=\"Action1\" >\n" +
+            "          <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Action1\");\n" +
+            "list.add(\"Action1\");</action>\n" +
+            "        </actionNode>\n" +
+            "        <actionNode id=\"2\" name=\"Action2\" >\n" +
+            "          <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Action2\");\n" +
+            "list.add(\"Action2\");</action>\n" +
+            "        </actionNode>\n" +
+            "        <actionNode id=\"3\" name=\"Action3\" >\n" +
+            "          <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Action3\");\n" +
+            "list.add(\"Action3\");</action>\n" +
+            "        </actionNode>\n" +
+            "      </nodes>\n" +
+            "      <connections>\n" +
+            "        <connection from=\"1\" to=\"3\" />\n" +
+            "      </connections>\n" +
+            "      <in-ports/>\n" +
+            "      <out-ports/>\n" +
+            "    </dynamic>\n" +
+            "    <actionNode id=\"3\" name=\"Action4\" >\n" +
+            "      <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Action4\");\n" +
+            "list.add(\"Action4\");</action>\n" +
+            "    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "  </connections>\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        for (DroolsError error: builder.getErrors().getErrors()) {
+        	System.err.println(error);
+        }
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = ( ProcessInstance )
+            workingMemory.startProcess("org.drools.dynamic");
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(4, list.size());
+    }
+
+    public void testDynamicAsyncActions() {
+        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=\"org.drools.dynamic\" package-name=\"org.drools\" >\n" +
+            "\n" +
+            "  <header>\n" +
+            "    <globals>\n" +
+            "      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+            "    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" + 
+            "    <dynamic id=\"2\" name=\"DynamicNode\" >\n" +
+            "      <nodes>\n" +
+            "        <workItem id=\"1\" name=\"Work\" >\n" +
+            "          <work name=\"Work\" />\n" +
+            "        </workItem>\n" +
+            "        <actionNode id=\"2\" name=\"Action2\" >\n" +
+            "          <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Action2\");\n" +
+            "list.add(\"Action2\");</action>\n" +
+            "        </actionNode>\n" +
+            "        <actionNode id=\"3\" name=\"Action3\" >\n" +
+            "          <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Action3\");\n" +
+            "list.add(\"Action3\");</action>\n" +
+            "        </actionNode>\n" +
+            "      </nodes>\n" +
+            "      <connections>\n" +
+            "        <connection from=\"1\" to=\"3\" />\n" +
+            "      </connections>\n" +
+            "      <in-ports/>\n" +
+            "      <out-ports/>\n" +
+            "    </dynamic>\n" +
+            "    <actionNode id=\"3\" name=\"Action4\" >\n" +
+            "      <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Action4\");\n" +
+            "list.add(\"Action4\");</action>\n" +
+            "    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "  </connections>\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        for (DroolsError error: builder.getErrors().getErrors()) {
+        	System.err.println(error);
+        }
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        TestWorkItemHandler testHandler = new TestWorkItemHandler();
+        workingMemory.getWorkItemManager().registerWorkItemHandler("Work", testHandler);
+        ProcessInstance processInstance = ( ProcessInstance )
+            workingMemory.startProcess("org.drools.dynamic");
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        assertEquals(1, list.size());
+        WorkItem workItem = testHandler.getWorkItem(); 
+        assertNotNull(workItem);
+        workingMemory.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(3, list.size());
+    }
+
+    private static class TestWorkItemHandler implements WorkItemHandler {
+        private WorkItem workItem;
+        public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+            this.workItem = workItem;
+        }
+        public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+        }
+        public WorkItem getWorkItem() {
+            return workItem;
+        }
+    }
+    
+}

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -2,23 +2,23 @@
 
 import java.io.Reader;
 import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
 
 import junit.framework.TestCase;
 
+import org.drools.Person;
 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 {
     
-    public void testOnEntryExit() {
+    public void testSignalState() {
         PackageBuilder builder = new PackageBuilder();
         Reader source = new StringReader(
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
@@ -55,7 +55,7 @@
     }
 
 
-    public void testNewStateNode() {
+    public void testImmediateStateConstraint1() {
         PackageBuilder builder = new PackageBuilder();
         Reader source = new StringReader(
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
@@ -65,48 +65,435 @@
             "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.state\" package-name=\"org.drools\" version=\"1\" >\n" +
             "\n" +
             "  <header>\n" +
+			"    <globals>\n" +
+			"      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+			"    </globals>\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\" >" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "            eval(true)" +
+            "        </constraint>"+
+             "       <constraint toNodeId=\"4\" toType=\"DROOLS_DEFAULT\" name=\"two\" type=\"rule\" dialect=\"mvel\" >\n" +
             "           eval(false)" +
-            "       </constraint>"+
+            "        </constraint>"+
+            "      </constraints>\n" +
             "    </state>\n" +
-            "    <end id=\"3\" name=\"End\" />\n" +
-             "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"3\" name=\"ActionNode1\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"1\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"5\" name=\"ActionNode2\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"2\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"6\" 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" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "    <connection from=\"2\" to=\"5\" />\n" +
+            "    <connection from=\"5\" to=\"6\" />\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);
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.state");
         assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(1, list.size());
+        assertEquals("1", list.get(0));
     }
-
     
+    public void testImmediateStateConstraintPriorities1() {
+        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" +
+			"    <globals>\n" +
+			"      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+			"    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "            eval(true)" +
+            "        </constraint>"+
+             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "           eval(true)" +
+            "        </constraint>"+
+            "      </constraints>\n" +
+            "    </state>\n" +
+			"    <actionNode id=\"3\" name=\"ActionNode1\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"1\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"5\" name=\"ActionNode2\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"2\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"6\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "    <connection from=\"2\" to=\"5\" />\n" +
+            "    <connection from=\"5\" to=\"6\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.state");
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(1, list.size());
+        assertEquals("1", list.get(0));
+    }
+    
+    public void testImmediateStateConstraintPriorities2() {
+        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" +
+			"    <globals>\n" +
+			"      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+			"    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "            eval(true)" +
+            "        </constraint>"+
+             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "           eval(true)" +
+            "        </constraint>"+
+            "      </constraints>\n" +
+            "    </state>\n" +
+			"    <actionNode id=\"3\" name=\"ActionNode1\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"1\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"5\" name=\"ActionNode2\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"2\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"6\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "    <connection from=\"2\" to=\"5\" />\n" +
+            "    <connection from=\"5\" to=\"6\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.state");
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(1, list.size());
+        assertEquals("2", list.get(0));
+    }
+    
+    public void testDelayedStateConstraint() {
+        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" +
+			"    <imports>\n" +
+			"      <import name=\"org.drools.Person\" />\n" +
+			"    </imports>\n" +
+			"    <globals>\n" +
+			"      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+			"    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "            Person( age &gt; 21 )" +
+            "        </constraint>"+
+             "       <constraint toNodeId=\"4\" toType=\"DROOLS_DEFAULT\" name=\"two\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "           Person( age &lt;= 21 )" +
+            "        </constraint>"+
+            "      </constraints>\n" +
+            "    </state>\n" +
+			"    <actionNode id=\"3\" name=\"ActionNode1\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"1\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"5\" name=\"ActionNode2\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"2\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"6\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "    <connection from=\"2\" to=\"5\" />\n" +
+            "    <connection from=\"5\" to=\"6\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.state");
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        assertTrue(list.isEmpty());
+        Person person = new Person("John Doe", 30);
+        workingMemory.insert(person);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(1, list.size());
+        assertEquals("1", list.get(0));
+    }
+    
+    public void testDelayedStateConstraint2() {
+        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" +
+			"    <imports>\n" +
+			"      <import name=\"org.drools.Person\" />\n" +
+			"    </imports>\n" +
+			"    <globals>\n" +
+			"      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+			"    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "            Person( age &gt; 21 )" +
+            "        </constraint>"+
+             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "           Person( age &lt;= 21 )" +
+            "        </constraint>"+
+            "      </constraints>\n" +
+            "    </state>\n" +
+			"    <actionNode id=\"3\" name=\"ActionNode1\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"1\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"5\" name=\"ActionNode2\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"2\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"6\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "    <connection from=\"2\" to=\"5\" />\n" +
+            "    <connection from=\"5\" to=\"6\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.state");
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        assertTrue(list.isEmpty());
+        Person person = new Person("John Doe", 20);
+        workingMemory.insert(person);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(1, list.size());
+        assertEquals("2", list.get(0));
+    }
+    
+    public void FIXMEtestDelayedStateConstraintPriorities1() {
+        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" +
+			"    <imports>\n" +
+			"      <import name=\"org.drools.Person\" />\n" +
+			"    </imports>\n" +
+			"    <globals>\n" +
+			"      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+			"    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "            Person( )" +
+            "        </constraint>"+
+             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "           Person( )" +
+            "        </constraint>"+
+            "      </constraints>\n" +
+            "    </state>\n" +
+			"    <actionNode id=\"3\" name=\"ActionNode1\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"1\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"5\" name=\"ActionNode2\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"2\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"6\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "    <connection from=\"2\" to=\"5\" />\n" +
+            "    <connection from=\"5\" to=\"6\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.state");
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        assertTrue(list.isEmpty());
+        Person person = new Person("John Doe", 30);
+        workingMemory.insert(person);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(1, list.size());
+        assertEquals("1", list.get(0));
+    }
+    
+    public void FIXMEtestDelayedStateConstraintPriorities2() {
+        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" +
+			"    <imports>\n" +
+			"      <import name=\"org.drools.Person\" />\n" +
+			"    </imports>\n" +
+			"    <globals>\n" +
+			"      <global identifier=\"list\" type=\"java.util.List\" />\n" +
+			"    </globals>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "            Person( )" +
+            "        </constraint>"+
+             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "           Person( )" +
+            "        </constraint>"+
+            "      </constraints>\n" +
+            "    </state>\n" +
+			"    <actionNode id=\"3\" name=\"ActionNode1\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"1\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"4\" name=\"End\" />\n" +
+			"    <actionNode id=\"5\" name=\"ActionNode2\" >\n" +
+			"      <action type=\"expression\" dialect=\"java\" >list.add(\"2\");</action>\n" +
+			"    </actionNode>\n" +
+            "    <end id=\"6\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"3\" to=\"4\" />\n" +
+            "    <connection from=\"2\" to=\"5\" />\n" +
+            "    <connection from=\"5\" to=\"6\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.state");
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        assertTrue(list.isEmpty());
+        Person person = new Person("John Doe", 30);
+        workingMemory.insert(person);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(1, list.size());
+        assertEquals("2", list.get(0));
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessTimerTest.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -42,7 +42,7 @@
 			"  <nodes>\n" +
 			"    <start id=\"1\" name=\"Start\" />\n" +
 			"    <end id=\"2\" name=\"End\" />\n" +
-			"    <timerNode id=\"3\" name=\"Timer\" delay=\"800\" period=\"200\" />\n" +
+			"    <timerNode id=\"3\" name=\"Timer\" delay=\"800ms\" period=\"200ms\" />\n" +
 			"    <actionNode id=\"4\" name=\"Action\" >\n" +
 			"      <action type=\"expression\" dialect=\"java\" >System.out.println(\"Triggered\");\n" +
 			"myList.add( new Message() );\n" +
@@ -120,6 +120,37 @@
         
         session2.halt();
 	}
+	
+	public void testIncorrectTimerNode() 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=\"flow\" id=\"org.drools.timer\" package-name=\"org.drools\" version=\"1\" >\n" +
+			"\n" +
+			"  <header>\n" +
+			"  </header>\n" +
+			"\n" +
+			"  <nodes>\n" +
+			"    <start id=\"1\" name=\"Start\" />\n" +
+			"    <end id=\"2\" name=\"End\" />\n" +
+			"    <timerNode id=\"3\" name=\"Timer\" delay=\"800msdss\" period=\"200mssds\" />\n" +
+			"  </nodes>\n" +
+			"\n" +
+			"  <connections>\n" +
+			"    <connection from=\"1\" to=\"3\" />\n" +
+			"    <connection from=\"3\" to=\"2\" />\n" +
+			"  </connections>\n" +
+			"\n" +
+			"</process>");
+		builder.addRuleFlow(source);
+		assertEquals(2, builder.getErrors().size());
+		for (DroolsError error: builder.getErrors().getErrors()) {
+			System.err.println(error);
+		}
+	}
 
 	@SuppressWarnings("unchecked")
 	public void testOnEntryTimerExecuted() throws Exception {
@@ -202,6 +233,48 @@
         session2.halt();
 	}
 
+	public void testIncorrectOnEntryTimer() 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=\"flow\" id=\"org.drools.timer\" package-name=\"org.drools\" version=\"1\" >\n" +
+			"\n" +
+			"  <header>\n" +
+			"    <globals>\n" +
+			"      <global identifier=\"myList\" type=\"java.util.List\" />\n" +
+			"    </globals>\n" +
+			"  </header>\n" +
+			"\n" +
+			"  <nodes>\n" +
+			"    <start id=\"1\" name=\"Start\" />\n" +
+			"    <milestone id=\"2\" name=\"Wait\" >\n" +
+			"      <timers>\n" +
+			"        <timer id=\"1\" delay=\"300asdf\" period=\"asfd\" >\n" +
+			"          <action type=\"expression\" dialect=\"java\" >myList.add(\"Executing timer\");</action>\n" +
+			"        </timer>\n" +
+			"      </timers>\n" +
+			"      <constraint type=\"rule\" dialect=\"mvel\" >eval(false)</constraint>\n" +
+			"    </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);
+		
+		assertEquals(2, builder.getErrors().size());
+		for (DroolsError error: builder.getErrors().getErrors()) {
+			System.err.println(error);
+		}
+	}
+
 	@SuppressWarnings("unchecked")
 	public void testOnEntryTimerExecutedMultipleTimes() throws Exception {
 		PackageBuilder builder = new PackageBuilder();

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessUpgradeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessUpgradeTest.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessUpgradeTest.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -87,7 +87,7 @@
             "    <ruleSet id=\"2\" name=\"Hello\" ruleFlowGroup=\"hello\" />\n" +
             "    <actionNode id=\"4\" name=\"Action\" >" +
             "      <action type=\"expression\" dialect=\"java\">System.out.println();\n" +
-            "list.add(\"Executed\");</action>/n" +
+            "list.add(\"Executed\");</action>\n" +
             "    </actionNode>\n" + 
             "    <end id=\"3\" name=\"End\" />\n" +
             "  </nodes>\n" +

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -41,6 +41,7 @@
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.CompositeContextNode;
 import org.drools.workflow.core.node.ConstraintTrigger;
+import org.drools.workflow.core.node.DynamicNode;
 import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.EventTrigger;
@@ -52,6 +53,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;
@@ -84,6 +86,8 @@
         process.addNode(new CompositeContextNode());
         process.addNode(new EventNode());
         process.addNode(new FaultNode());
+        process.addNode(new StateNode());
+        process.addNode(new DynamicNode());
         
         String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
         if (xml == null) {
@@ -100,7 +104,7 @@
             throw new IllegalArgumentException("Failed to reload process!");
         }
         
-        assertEquals(15, process.getNodes().length);
+        assertEquals(17, process.getNodes().length);
         
         String xml2 = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
         if (xml2 == null) {
@@ -223,13 +227,13 @@
         ruleSetNode.setMetaData("height", 4);
         ruleSetNode.setRuleFlowGroup("ruleFlowGroup");
         Timer timer = new Timer();
-        timer.setDelay(100);
-        timer.setPeriod(100);
+        timer.setDelay("100");
+        timer.setPeriod("100");
         action = new DroolsConsequenceAction("dialect", "consequence");
         ruleSetNode.addTimer(timer, action);
         timer = new Timer();
-        timer.setDelay(200);
-        timer.setPeriod(200);
+        timer.setDelay("200");
+        timer.setPeriod("200");
         action = new DroolsConsequenceAction("dialect", "consequence");
         ruleSetNode.addTimer(timer, action);
         process.addNode(ruleSetNode);
@@ -303,13 +307,13 @@
         milestone.setMetaData("height", 4);
         milestone.setConstraint("constraint");
         timer = new Timer();
-        timer.setDelay(100);
-        timer.setPeriod(100);
+        timer.setDelay("100");
+        timer.setPeriod("100");
         action = new DroolsConsequenceAction("dialect", "consequence");
         milestone.addTimer(timer, action);
         timer = new Timer();
-        timer.setDelay(200);
-        timer.setPeriod(200);
+        timer.setDelay("200");
+        timer.setPeriod("200");
         action = new DroolsConsequenceAction("dialect", "consequence");
         milestone.addTimer(timer, action);
         List<DroolsAction> actions = new ArrayList<DroolsAction>();
@@ -335,13 +339,13 @@
         subProcess.addInMapping("subvar1", "var1");
         subProcess.addOutMapping("subvar2", "var2");
         timer = new Timer();
-        timer.setDelay(100);
-        timer.setPeriod(100);
+        timer.setDelay("100");
+        timer.setPeriod("100");
         action = new DroolsConsequenceAction("dialect", "consequence");
         subProcess.addTimer(timer, action);
         timer = new Timer();
-        timer.setDelay(200);
-        timer.setPeriod(200);
+        timer.setDelay("200");
+        timer.setPeriod("200");
         action = new DroolsConsequenceAction("dialect", "consequence");
         subProcess.addTimer(timer, action);
         subProcess.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
@@ -367,13 +371,13 @@
         workItemNode.addInMapping("param1", "var1");
         workItemNode.addOutMapping("param2", "var2");
         timer = new Timer();
-        timer.setDelay(100);
-        timer.setPeriod(100);
+        timer.setDelay("100");
+        timer.setPeriod("100");
         action = new DroolsConsequenceAction("dialect", "consequence");
         workItemNode.addTimer(timer, action);
         timer = new Timer();
-        timer.setDelay(200);
-        timer.setPeriod(200);
+        timer.setDelay("200");
+        timer.setPeriod("200");
         action = new DroolsConsequenceAction("dialect", "consequence");
         workItemNode.addTimer(timer, action);
         workItemNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
@@ -410,8 +414,8 @@
         timerNode.setMetaData("width", 3);
         timerNode.setMetaData("height", 4);
         timer = new Timer();
-        timer.setDelay(1000);
-        timer.setPeriod(1000);
+        timer.setDelay("1000");
+        timer.setPeriod("1000");
         timerNode.setTimer(timer);
         process.addNode(timerNode);
         new ConnectionImpl(humanTaskNode, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
@@ -468,8 +472,32 @@
         endNode.setMetaData("width", 3);
         endNode.setMetaData("height", 4);
         process.addNode(endNode);
-        new ConnectionImpl(compositeNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE);
         
+        StateNode stateNode = new StateNode();
+        stateNode.setName("state");
+        stateNode.setMetaData("x", 1);
+        stateNode.setMetaData("y", 2);
+        stateNode.setMetaData("width", 3);
+        stateNode.setMetaData("height", 4);
+        new ConnectionImpl(compositeNode, Node.CONNECTION_DEFAULT_TYPE, stateNode, Node.CONNECTION_DEFAULT_TYPE);
+        connection = new ConnectionImpl(stateNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
+        constraint = new ConstraintImpl();
+        constraint.setName("constraint1 ><&&");
+        constraint.setPriority(1);
+        constraint.setDialect("dialect1");
+        constraint.setType("type1");
+        constraint.setConstraint("constraint-text1 %&<>");
+        stateNode.setConstraint(connection, constraint);
+        connection = new ConnectionImpl(stateNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE);
+        constraint = new ConstraintImpl();
+        constraint.setName("constraint2");
+        constraint.setPriority(2);
+        constraint.setDialect("dialect2");
+        constraint.setType("type2");
+        constraint.setConstraint("constraint-text2");
+        stateNode.setConstraint(connection, constraint);
+        process.addNode(stateNode);
+        
         String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true);
         if (xml == null) {
             throw new IllegalArgumentException("Failed to persist full nodes!");
@@ -484,7 +512,7 @@
             throw new IllegalArgumentException("Failed to reload process!");
         }
         
-        assertEquals(15, process.getNodes().length);
+        assertEquals(16, process.getNodes().length);
         
         assertEquals(2, process.getImports().size());
         assertEquals(2, process.getGlobals().size());

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -60,8 +60,6 @@
 import org.drools.event.RuleFlowEventSupport;
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.event.WorkingMemoryEventSupport;
-import org.drools.process.core.ContextContainer;
-import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.core.event.EventFilter;
 import org.drools.process.core.event.EventTypeFilter;
 import org.drools.process.instance.ProcessInstance;
@@ -69,7 +67,6 @@
 import org.drools.process.instance.ProcessInstanceFactoryRegistry;
 import org.drools.process.instance.ProcessInstanceManager;
 import org.drools.process.instance.WorkItemManager;
-import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.process.instance.event.SignalManager;
 import org.drools.process.instance.timer.TimerManager;
 import org.drools.reteoo.EntryPointNode;
@@ -1625,46 +1622,24 @@
         if ( process == null ) {
             throw new IllegalArgumentException( "Unknown process ID: " + processId );
         }
-        ProcessInstance processInstance = (ProcessInstance) getProcessInstance( process );
-        processInstance.setWorkingMemory( this );
-        processInstance.setProcess( process );
-        processInstanceManager.addProcessInstance( processInstance );
-        // set variable default values
-        // TODO: should be part of processInstanceImpl?
-        VariableScope variableScope = (VariableScope) ((ContextContainer) process).getDefaultContext( VariableScope.VARIABLE_SCOPE );
-        VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
-        // set input parameters
-        if ( parameters != null ) {
-            if ( variableScope != null ) {
-                for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
-                    variableScopeInstance.setVariable( entry.getKey(),
-                                                       entry.getValue() );
-                }
-            } else {
-                throw new IllegalArgumentException( "This process does not support parameters!" );
-            }
+        ProcessInstance processInstance = startProcess( process, parameters );
+        
+        if (processInstance != null) { 
+	        // start process instance
+	        getRuleFlowEventSupport().fireBeforeRuleFlowProcessStarted( processInstance, this );
+	        processInstance.start();
+	        getRuleFlowEventSupport().fireAfterRuleFlowProcessStarted( processInstance, this );
         }
-        // start
-        getRuleFlowEventSupport().fireBeforeRuleFlowProcessStarted( processInstance,
-                                                                    this );
-        processInstance.start();
-        getRuleFlowEventSupport().fireAfterRuleFlowProcessStarted( processInstance,
-                                                                   this );
-
         return processInstance;
     }
 
-    public ProcessInstance getProcessInstance(final Process process) {
+    private ProcessInstance startProcess(final Process process, Map<String, Object> parameters) {
         ProcessInstanceFactoryRegistry processRegistry = ((InternalRuleBase) getRuleBase()).getConfiguration().getProcessInstanceFactoryRegistry();
         ProcessInstanceFactory conf = processRegistry.getProcessInstanceFactory( process );
         if ( conf == null ) {
             throw new IllegalArgumentException( "Illegal process type: " + process.getClass() );
         }
-        ProcessInstance processInstance = conf.createProcessInstance();
-        if ( processInstance == null ) {
-            throw new IllegalArgumentException( "Illegal process type: " + process.getClass() );
-        }
-        return processInstance;
+        return conf.createProcessInstance(process, this, parameters);
     }
 
     public ProcessInstanceManager getProcessInstanceManager() {
@@ -1784,6 +1759,27 @@
         }
         return result;
     }
+    
+    public List iterateNonDefaultEntryPointObjectsToList() {
+    	List result = new ArrayList();
+    	for (Map.Entry<String, WorkingMemoryEntryPoint> entry: getEntryPoints().entrySet()) {
+    		WorkingMemoryEntryPoint entryPoint = entry.getValue();
+    		if (entryPoint instanceof NamedEntryPoint) {
+			    result.add(new EntryPointObjects(
+		    		entry.getKey(), new ArrayList(entry.getValue().getObjects())));
+    		}
+    	}
+        return result;
+    }
+    
+    private class EntryPointObjects {
+    	private String name;
+    	private List objects;
+    	public EntryPointObjects(String name, List objects) {
+    		this.name = name;
+    		this.objects = objects;
+    	}
+    }
 
     public Entry[] getActivationParameters(long activationId) {
         Activation[] activations = getAgenda().getActivations();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -9,8 +9,8 @@
 public class Timer implements Serializable {
 
     private long id;
-    private long delay;
-    private long period;
+    private String delay;
+    private String period;
     
     public long getId() {
         return id;
@@ -20,33 +20,33 @@
         this.id = id;
     }
     
-    public long getDelay() {
+    public String getDelay() {
         return delay;
     }
     
-    public void setDelay(long delay) {
+    public void setDelay(String delay) {
         this.delay = delay;
     }
     
-    public long getPeriod() {
+    public String getPeriod() {
         return period;
     }
     
-    public void setPeriod(long period) {
+    public void setPeriod(String period) {
         this.period = period;
     }
     
     public String toString() {
     	String result =  "Timer";
-    	if (delay != 0 || period != 0) {
+    	if (delay != null || period != null) {
     		result += "[";
-    		if (delay != 0) {
+    		if (delay != null) {
     			result += "delay=" + delay;
-    			if (period != 0) {
+    			if (period != null) {
     				result += ", ";
     			}
     		}
-    		if (period != 0) {
+    		if (period != null) {
     			result += "period=" + period;
     		}
     		result += "]";

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/AbstractProcessInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/AbstractProcessInstanceFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/AbstractProcessInstanceFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -0,0 +1,44 @@
+package org.drools.process.instance;
+
+import java.util.Map;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.definition.process.Process;
+import org.drools.process.core.ContextContainer;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+
+public abstract class AbstractProcessInstanceFactory implements ProcessInstanceFactory {
+	
+	public ProcessInstance createProcessInstance(Process process,
+			                                     WorkingMemory workingMemory,
+			                                     Map<String, Object> parameters) {
+		ProcessInstance processInstance = (ProcessInstance) createProcessInstance();
+		processInstance.setWorkingMemory( (InternalWorkingMemory) workingMemory );
+        processInstance.setProcess( process );
+        
+        // set variable default values
+        // TODO: should be part of processInstanceImpl?
+        VariableScope variableScope = (VariableScope) ((ContextContainer) process).getDefaultContext( VariableScope.VARIABLE_SCOPE );
+        VariableScopeInstance variableScopeInstance = (VariableScopeInstance) processInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
+        // set input parameters
+        if ( parameters != null ) {
+            if ( variableScope != null ) {
+                for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
+                    variableScopeInstance.setVariable( entry.getKey(),
+                                                       entry.getValue() );
+                }
+            } else {
+                throw new IllegalArgumentException( "This process does not support parameters!" );
+            }
+        }
+        
+        ((InternalWorkingMemory) workingMemory).getProcessInstanceManager()
+        	.addProcessInstance( processInstance );
+        return processInstance;
+	}
+	
+	public abstract ProcessInstance createProcessInstance();
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstanceFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -1,11 +1,16 @@
 package org.drools.process.instance;
 
+import java.util.Map;
+
+import org.drools.WorkingMemory;
+import org.drools.definition.process.Process;
+
 /**
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
 public interface ProcessInstanceFactory {
     
-    ProcessInstance createProcessInstance();
+    ProcessInstance createProcessInstance(Process process, WorkingMemory workingMemory, Map<String, Object> parameters);
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/HumanTaskNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/HumanTaskNodeFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/HumanTaskNodeFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -154,7 +154,7 @@
         return this;
     }
 
-    public HumanTaskNodeFactory timer(long delay, long period, String dialect, String action) {
+    public HumanTaskNodeFactory timer(String delay, String period, String dialect, String action) {
     	Timer timer = new Timer();
     	timer.setDelay(delay);
     	timer.setPeriod(period);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/MilestoneNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/MilestoneNodeFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/MilestoneNodeFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -76,7 +76,7 @@
         return this;
     }
 
-    public MilestoneNodeFactory timer(long delay, long period, String dialect, String action) {
+    public MilestoneNodeFactory timer(String delay, String period, String dialect, String action) {
     	Timer timer = new Timer();
     	timer.setDelay(delay);
     	timer.setPeriod(period);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/RuleSetNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/RuleSetNodeFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/RuleSetNodeFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -50,7 +50,7 @@
         return this;
     }
     
-    public RuleSetNodeFactory timer(long delay, long period, String dialect, String action) {
+    public RuleSetNodeFactory timer(String delay, String period, String dialect, String action) {
     	Timer timer = new Timer();
     	timer.setDelay(delay);
     	timer.setPeriod(period);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SubProcessNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SubProcessNodeFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SubProcessNodeFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -97,7 +97,7 @@
         return this;
     }
 
-    public SubProcessNodeFactory timer(long delay, long period, String dialect, String action) {
+    public SubProcessNodeFactory timer(String delay, String period, String dialect, String action) {
     	Timer timer = new Timer();
     	timer.setDelay(delay);
     	timer.setPeriod(period);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/TimerNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/TimerNodeFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/TimerNodeFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -44,7 +44,7 @@
         return this;
     }
     
-    public TimerNodeFactory delay(long delay) {
+    public TimerNodeFactory delay(String delay) {
     	Timer timer = getTimerNode().getTimer();
     	if (timer == null) {
     		timer = new Timer();
@@ -54,7 +54,7 @@
     	return this;
     }
     
-    public TimerNodeFactory period(long period) {
+    public TimerNodeFactory period(String period) {
     	Timer timer = getTimerNode().getTimer();
     	if (timer == null) {
     		timer = new Timer();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/WorkItemNodeFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/WorkItemNodeFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/WorkItemNodeFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -126,7 +126,7 @@
         return this;
     }
 
-    public WorkItemNodeFactory timer(long delay, long period, String dialect, String action) {
+    public WorkItemNodeFactory timer(String delay, String period, String dialect, String action) {
     	Timer timer = new Timer();
     	timer.setDelay(delay);
     	timer.setPeriod(period);

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -22,18 +22,22 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.definition.process.Connection;
 import org.drools.definition.process.Node;
 import org.drools.definition.process.Process;
 import org.drools.process.core.Work;
 import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.timer.Timer;
 import org.drools.process.core.validation.ProcessValidationError;
 import org.drools.process.core.validation.ProcessValidator;
 import org.drools.process.core.validation.impl.ProcessValidationErrorImpl;
 import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.time.TimeUtils;
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.DynamicNode;
 import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.FaultNode;
@@ -43,10 +47,11 @@
 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;
 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;
@@ -144,11 +149,11 @@
                 }
             } else if (node instanceof RuleSetNode) {
                 final RuleSetNode ruleSetNode = (RuleSetNode) node;
-                if (ruleSetNode.getFrom() == null) {
+                if (ruleSetNode.getFrom() == null && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "RuleSet node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
                 }
-                if (ruleSetNode.getTo() == null) {
+                if (ruleSetNode.getTo() == null && !acceptsNoOutgoingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "RuleSet node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection."));
                 }
@@ -157,13 +162,18 @@
                     errors.add( new ProcessValidationErrorImpl(process,
                         "RuleSet node '" + node.getName() + "' [" + node.getId() + "] has no ruleflow-group."));
                 }
+                if (ruleSetNode.getTimers() != null) {
+	                for (Timer timer: ruleSetNode.getTimers().keySet()) {
+	                	validateTimer(timer, node, process, errors);
+	                }
+                }
             } else if (node instanceof Split) {
                 final Split split = (Split) node;
                 if (split.getType() == Split.TYPE_UNDEFINED) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Split node '" + node.getName() + "' [" + node.getId() + "] has no type."));
                 }
-                if (split.getFrom() == null) {
+                if (split.getFrom() == null && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Split node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
                 }
@@ -180,7 +190,7 @@
                         }
                     }
                 }
-            } else if ( node instanceof Join ) {
+            } else if (node instanceof Join) {
                 final Join join = (Join) node;
                 if (join.getType() == Join.TYPE_UNDEFINED) {
                     errors.add(new ProcessValidationErrorImpl(process,
@@ -190,7 +200,7 @@
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Join node '" + node.getName() + "' [" + node.getId() + "] does not have more than one incoming connection: " + join.getIncomingConnections().size() + "."));
                 }
-                if (join.getTo() == null) {
+                if (join.getTo() == null && !acceptsNoOutgoingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Join node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection."));
                 }
@@ -207,12 +217,12 @@
                 }
             } else if (node instanceof MilestoneNode) {
                 final MilestoneNode milestone = (MilestoneNode) node;
-                if (milestone.getFrom() == null) {
+                if (milestone.getFrom() == null && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Milestone node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
                 }
 
-                if (milestone.getTo() == null) {
+                if (milestone.getTo() == null && !acceptsNoOutgoingConnections(node)) {
                     errors.add( new ProcessValidationErrorImpl(process,
                         "Milestone node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection."));
                 }
@@ -220,23 +230,25 @@
                     errors.add( new ProcessValidationErrorImpl(process,
                         "Milestone node '" + node.getName() + "' [" + node.getId() + "] has no constraint."));
                 }
-            }else if (node instanceof StateNode) {
+                if (milestone.getTimers() != null) {
+	                for (Timer timer: milestone.getTimers().keySet()) {
+	                	validateTimer(timer, node, process, errors);
+	                }
+                }
+            } else if (node instanceof StateNode) {
                 final StateNode stateNode = (StateNode) node;
-                if (stateNode.getFrom() == null) {
+                if (stateNode.getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0 && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
-                        "State node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
+                        "State node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection"));
                 }
-
-               
-               
             }
             else if (node instanceof SubProcessNode) {
                 final SubProcessNode subProcess = (SubProcessNode) node;
-                if (subProcess.getFrom() == null) {
+                if (subProcess.getFrom() == null && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "SubProcess node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
                 }
-                if (subProcess.getTo() == null) {
+                if (subProcess.getTo() == null && !acceptsNoOutgoingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "SubProcess node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection."));
                 }
@@ -244,13 +256,18 @@
                     errors.add(new ProcessValidationErrorImpl(process,
                         "SubProcess node '" + node.getName() + "' [" + node.getId() + "] has no process id."));
                 }
+                if (subProcess.getTimers() != null) {
+	                for (Timer timer: subProcess.getTimers().keySet()) {
+	                	validateTimer(timer, node, process, errors);
+	                }
+                }
             } else if (node instanceof ActionNode) {
                 final ActionNode actionNode = (ActionNode) node;
-                if (actionNode.getFrom() == null) {
+                if (actionNode.getFrom() == null && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Action node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
                 }
-                if (actionNode.getTo() == null) {
+                if (actionNode.getTo() == null && !acceptsNoOutgoingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Action node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection."));
                 }
@@ -288,11 +305,11 @@
                 }
             } else if (node instanceof WorkItemNode) {
                 final WorkItemNode workItemNode = (WorkItemNode) node;
-                if (workItemNode.getFrom() == null) {
+                if (workItemNode.getFrom() == null && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "WorkItem node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
                 }
-                if (workItemNode.getTo() == null) {
+                if (workItemNode.getTo() == null && !acceptsNoOutgoingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "WorkItem node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection."));
                 }
@@ -306,6 +323,11 @@
                             "WorkItem node '" + node.getName() + "' [" + node.getId() + "] has no work name."));
                     }
                 }
+                if (workItemNode.getTimers() != null) {
+	                for (Timer timer: workItemNode.getTimers().keySet()) {
+	                	validateTimer(timer, node, process, errors);
+	                }
+                }
             } else if (node instanceof ForEachNode) {
                 final ForEachNode forEachNode = (ForEachNode) node;
                 String variableName = forEachNode.getVariableName();
@@ -318,11 +340,11 @@
                     errors.add(new ProcessValidationErrorImpl(process,
                         "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no collection expression"));
                 }
-                if (forEachNode.getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0) {
+                if (forEachNode.getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0 && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection"));
                 }
-                if (forEachNode.getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0) {
+                if (forEachNode.getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0 && !acceptsNoOutgoingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
                 }
@@ -335,14 +357,25 @@
                         "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no linked end node"));
                 }
                 validateNodes(forEachNode.getNodes(), errors, process);
+            } else if (node instanceof DynamicNode) {
+                final DynamicNode dynamicNode = (DynamicNode) node;
+                if (dynamicNode.getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0) {
+                    errors.add(new ProcessValidationErrorImpl(process,
+                        "Dynamic node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection"));
+                }
+                if (dynamicNode.getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0) {
+                    errors.add(new ProcessValidationErrorImpl(process,
+                        "Dynamic node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
+                }
+                validateNodes(dynamicNode.getNodes(), errors, process);
             } else if (node instanceof CompositeNode) {
                 final CompositeNode compositeNode = (CompositeNode) node;
                 for (Map.Entry<String, NodeAndType> inType: compositeNode.getLinkedIncomingNodes().entrySet()) {
-                    if (compositeNode.getIncomingConnections(inType.getKey()).size() == 0) {
+                    if (compositeNode.getIncomingConnections(inType.getKey()).size() == 0  && !acceptsNoIncomingConnections(node)) {
                         errors.add(new ProcessValidationErrorImpl(process,
                             "Composite node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection for type " + inType.getKey()));
                     }
-                	if (inType.getValue().getNode() == null) {
+                	if (inType.getValue().getNode() == null && !acceptsNoOutgoingConnections(node)) {
                         errors.add(new ProcessValidationErrorImpl(process,
                             "Composite node '" + node.getName() + "' [" + node.getId() + "] has invalid linked incoming node for type " + inType.getKey()));
                 	}
@@ -371,7 +404,7 @@
             } else if (node instanceof FaultNode) {
             	endNodeFound = true;
                 final FaultNode faultNode = (FaultNode) node;
-            	if (faultNode.getFrom() == null) {
+            	if (faultNode.getFrom() == null && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Fault node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
                 }
@@ -379,7 +412,26 @@
             		errors.add(new ProcessValidationErrorImpl(process,
                         "Fault node '" + node.getName() + "' [" + node.getId() + "] has no fault name."));
             	}
-            } 
+            } else if (node instanceof TimerNode) {
+            	TimerNode timerNode = (TimerNode) node;
+                if (timerNode.getFrom() == null && !acceptsNoIncomingConnections(node)) {
+                    errors.add(new ProcessValidationErrorImpl(process,
+                        "Timer node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
+                }
+                if (timerNode.getTo() == null && !acceptsNoOutgoingConnections(node)) {
+                    errors.add(new ProcessValidationErrorImpl(process,
+                        "Timer node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection."));
+                }
+                if (timerNode.getTimer() == null) {
+                    errors.add(new ProcessValidationErrorImpl(process,
+                        "Timer node '" + node.getName() + "' [" + node.getId() + "] has no timer specified."));
+                } else {
+                	validateTimer(timerNode.getTimer(), node, process, errors);
+                }
+            } else {
+            	errors.add(new ProcessValidationErrorImpl(process,
+                    "Unknown node type '" + node.getClass().getName() + "'"));
+            }
         }
 
     }
@@ -426,7 +478,38 @@
             }
         }
     }
+    
+    private boolean acceptsNoIncomingConnections(Node node) {
+    	return node.getNodeContainer() instanceof DynamicNode;
+    }
 
+    private boolean acceptsNoOutgoingConnections(Node node) {
+    	return node.getNodeContainer() instanceof DynamicNode;
+    }
+    
+    private void validateTimer(final Timer timer, final Node node,
+    		final RuleFlowProcess process, final List<ProcessValidationError> errors) {
+    	if (timer.getDelay() == null) {
+    		errors.add(new ProcessValidationErrorImpl(process,
+                "Node '" + node.getName() + "' [" + node.getId() + "] has timer with no delay specified."));
+    	} else {
+    		try {
+    			TimeUtils.parseTimeString(timer.getDelay());
+    		} catch (RuntimeDroolsException e) {
+    			errors.add(new ProcessValidationErrorImpl(process,
+                    "Could not parse delay '" + timer.getDelay() + "' of node '" + node.getName() + "': " + e.getMessage()));
+    		}
+    	}
+    	if (timer.getPeriod() != null) {
+    		try {
+    			TimeUtils.parseTimeString(timer.getPeriod());
+    		} catch (RuntimeDroolsException e) {
+    			errors.add(new ProcessValidationErrorImpl(process,
+                    "Could not parse period '" + timer.getPeriod() + "' of node '" + node.getName() + "': " + e.getMessage()));
+    		}
+    	}
+    }
+
     public ProcessValidationError[] validateProcess(Process process) {
         if (!(process instanceof RuleFlowProcess)) {
             throw new IllegalArgumentException(

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/RuleFlowProcessInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/RuleFlowProcessInstanceFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/RuleFlowProcessInstanceFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -5,10 +5,10 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.drools.process.instance.AbstractProcessInstanceFactory;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.ProcessInstanceFactory;
 
-public class RuleFlowProcessInstanceFactory implements ProcessInstanceFactory, Externalizable {
+public class RuleFlowProcessInstanceFactory extends AbstractProcessInstanceFactory implements Externalizable {
 
     private static final long serialVersionUID = 400L;
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/Node.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/Node.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/Node.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -44,6 +44,8 @@
      * @param name 	the name of the node
      */
     void setName(String name);
+    
+    String getUniqueId();
 
     void addIncomingConnection(String type, Connection connection);
     

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -28,6 +28,7 @@
 import org.drools.process.core.Context;
 import org.drools.process.core.ContextResolver;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeNode;
 
 /**
  * Default implementation of a node.
@@ -58,6 +59,17 @@
     public long getId() {
         return this.id;
     }
+    
+    public String getUniqueId() {
+    	String result = id + "";
+    	NodeContainer nodeContainer = getNodeContainer();
+    	while (nodeContainer instanceof CompositeNode) {
+    		CompositeNode composite = (CompositeNode) nodeContainer;
+    		result = composite.getId() + ":" + result;
+    		nodeContainer = composite.getNodeContainer();
+    	}
+    	return result;
+    }
 
     public void setId(final long id) {
         this.id = id;

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/DynamicNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/DynamicNode.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/DynamicNode.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -0,0 +1,17 @@
+package org.drools.workflow.core.node;
+
+public class DynamicNode extends CompositeContextNode {
+
+	private static final long serialVersionUID = 400L;
+	
+	private String ruleFlowGroup;
+	
+	public String getRuleFlowGroup() {
+		return ruleFlowGroup;
+	}
+	
+	public void setRuleFlowGroup(String ruleFlowGroup) {
+		this.ruleFlowGroup = ruleFlowGroup;
+	}
+	
+}

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateNode.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -1,36 +1,87 @@
 package org.drools.workflow.core.node;
 
+import java.io.Serializable;
 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{
+public class StateNode extends CompositeContextNode {
 
-	private static final long serialVersionUID = 1L;
-    private Map<String,Constraint>            constraints = new HashMap<String,Constraint>();
-
+	private static final long serialVersionUID = 4L;
+	
+    private Map<ConnectionRef, Constraint> constraints = new HashMap<ConnectionRef, Constraint>();
+    // TODO timers, on-entry / on-exit actions ?
    
-    public void setConstraints(Map<String, Constraint> constraints) {
+    public void setConstraints(Map<ConnectionRef, Constraint> constraints) {
         this.constraints = constraints;
     }
 
-    public void addConstraint(String name, Constraint constraint) {
-        this.constraints.put(name, constraint);
+    public void setConstraint(final Connection connection,
+			final Constraint constraint) {
+		if (connection == null) {
+			throw new IllegalArgumentException("connection is null");
+		}
+		if (getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE) != null
+				&& !getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).contains(connection)) {
+			throw new IllegalArgumentException("connection is unknown:"	+ connection);
+		}
+		internalSetConstraint(
+			new ConnectionRef(connection.getTo().getId(), connection.getToType()), constraint);
+	}
+
+    public void internalSetConstraint(ConnectionRef connectionRef, Constraint constraint) {
+        constraints.put(connectionRef, constraint);
     }
+    
     public Constraint getConstraint(String name){
-
-        return this.constraints.get(name);
+        return constraints.get(name);
     }
-    public Map<String,Constraint> getConstraints(){
-        return this.constraints;
+    
+    public Map<ConnectionRef, Constraint> getConstraints(){
+        return constraints;
     }
 
-    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+    public Constraint getConstraint(final Connection connection) {
+        if (connection == null) {
+            throw new IllegalArgumentException("connection is null");
+        }
+        ConnectionRef ref = new ConnectionRef(connection.getTo().getId(), connection.getToType());
+        return this.constraints.get(ref);
+    }
 
+    public static class ConnectionRef implements Serializable {
+        
+        private static final long serialVersionUID = 4L;
+		
+		private String toType;
+        private long nodeId;
+        
+        public ConnectionRef(long nodeId, String toType) {
+            this.nodeId = nodeId;
+            this.toType = toType;
+        }
+        
+        public String getToType() {
+            return toType;
+        }
+        
+        public long getNodeId() {
+            return nodeId;
+        }
+        
+        public boolean equals(Object o) {
+            if (o instanceof ConnectionRef) {
+                ConnectionRef c = (ConnectionRef) o;
+                return toType.equals(c.toType) && nodeId == c.nodeId;
+            }
+            return false;
+        }
+        
+        public int hashCode() {
+            return 7*toType.hashCode() + (int) nodeId;
+        }
     }
-    
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/NodeInstanceContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/NodeInstanceContainer.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/NodeInstanceContainer.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -22,5 +22,7 @@
     void removeNodeInstance(NodeInstance nodeInstance);
     
     NodeContainer getNodeContainer();
+    
+    void nodeInstanceCompleted(NodeInstance nodeInstance, String outType);
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -7,6 +7,7 @@
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.CompositeContextNode;
 import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.DynamicNode;
 import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.FaultNode;
@@ -26,6 +27,7 @@
 import org.drools.workflow.instance.node.ActionNodeInstance;
 import org.drools.workflow.instance.node.CompositeContextNodeInstance;
 import org.drools.workflow.instance.node.CompositeNodeInstance;
+import org.drools.workflow.instance.node.DynamicNodeInstance;
 import org.drools.workflow.instance.node.EndNodeInstance;
 import org.drools.workflow.instance.node.EventNodeInstance;
 import org.drools.workflow.instance.node.FaultNodeInstance;
@@ -84,6 +86,8 @@
                   new CreateNewNodeFactory( EventNodeInstance.class ) );
         register( StateNode.class,
                   new CreateNewNodeFactory( StateNodeInstance.class ) );
+        register( DynamicNode.class,
+                  new CreateNewNodeFactory( DynamicNodeInstance.class ) );
     }
 
     public void register(Class< ? extends Node> cls,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceImpl.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -17,6 +17,7 @@
  */
 
 import java.io.Serializable;
+import java.util.List;
 
 import org.drools.WorkingMemory;
 import org.drools.common.EventSupport;
@@ -118,9 +119,15 @@
     
     protected void triggerCompleted(String type, boolean remove) {
         if (remove) {
-            ((org.drools.workflow.instance.NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
+            ((org.drools.workflow.instance.NodeInstanceContainer) getNodeInstanceContainer())
+            	.removeNodeInstance(this);
         }
-        for (Connection connection: getNode().getOutgoingConnections(type)) {
+        List<Connection> connections = getNode().getOutgoingConnections(type);
+        if (connections == null || connections.isEmpty()) {
+        	((org.drools.workflow.instance.NodeInstanceContainer) getNodeInstanceContainer())
+        		.nodeInstanceCompleted(this, type);
+        }
+        for (Connection connection: connections) {
         	// stop if this process instance has been aborted / completed
         	if (getProcessInstance().getState() != ProcessInstance.STATE_ACTIVE) {
         		return;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/RuleConstraintEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/RuleConstraintEvaluator.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/RuleConstraintEvaluator.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -23,6 +23,7 @@
 import org.drools.process.instance.ProcessInstance;
 import org.drools.runtime.process.WorkflowProcessInstance;
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.Node;
 import org.drools.workflow.instance.node.SplitInstance;
 
 /**
@@ -90,7 +91,9 @@
                             Constraint constraint) {
         WorkflowProcessInstance processInstance = instance.getProcessInstance();
         InternalAgenda agenda = (InternalAgenda) ((ProcessInstance) processInstance).getAgenda();
-        String rule = "RuleFlow-Split-" + processInstance.getProcessId() + "-" + instance.getNode().getId() + "-" + connection.getTo().getId();
+        String rule = "RuleFlow-Split-" + processInstance.getProcessId() + "-" + 
+        	((Node) instance.getNode()).getUniqueId() + "-" + 
+        	((Node) connection.getTo()).getId() + "-" + connection.getToType();
 
         boolean isActive = agenda.isRuleActiveInRuleFlowGroup( "DROOLS_SYSTEM", rule, processInstance.getId() );
         return isActive;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -334,5 +334,10 @@
 		return externalEventListeners.keySet().toArray(
 				new String[externalEventListeners.size()]);
 	}
+	
+	public void nodeInstanceCompleted(NodeInstance nodeInstance, String outType) {
+		throw new IllegalArgumentException(
+			"Completing a node instance that has no outgoing connection not suppoerted.");
+	}
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -245,4 +245,9 @@
         }
 	}
 
+	public void nodeInstanceCompleted(NodeInstance nodeInstance, String outType) {
+		throw new IllegalArgumentException(
+			"Completing a node instance that has no outgoing connection not supported.");
+	}
+
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/DynamicNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/DynamicNodeInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/DynamicNodeInstance.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -0,0 +1,43 @@
+package org.drools.workflow.instance.node;
+
+import java.util.List;
+import java.util.Map;
+
+import org.drools.definition.process.Connection;
+import org.drools.definition.process.Node;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.workflow.core.impl.NodeImpl;
+
+public class DynamicNodeInstance extends CompositeContextNodeInstance {
+
+	private static final long serialVersionUID = 4L;
+	
+	private transient boolean executing = false;
+	
+    public void internalTrigger(NodeInstance from, String type) {
+    	executing = true;
+    	createNodeInstances();
+    	executing = false;
+    	if (getNodeInstances(false).isEmpty()) {
+    		triggerCompleted(NodeImpl.CONNECTION_DEFAULT_TYPE);
+    	}
+    }
+    
+    private void createNodeInstances() {
+    	for (Node node: getCompositeNode().getNodes()) {
+    		Map<String, List<Connection>> incomingConnections = node.getIncomingConnections();
+    		if (incomingConnections.isEmpty()) {
+    			NodeInstance nodeInstance = getNodeInstance(node);
+                ((org.drools.workflow.instance.NodeInstance) nodeInstance)
+                	.trigger(null, NodeImpl.CONNECTION_DEFAULT_TYPE);
+    		}
+    	}
+    }
+
+	public void nodeInstanceCompleted(org.drools.workflow.instance.NodeInstance nodeInstance, String outType) {
+		if (!executing && getNodeInstances(false).isEmpty()) {
+    		triggerCompleted(NodeImpl.CONNECTION_DEFAULT_TYPE);
+    	}
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -11,6 +11,7 @@
 import org.drools.runtime.process.EventListener;
 import org.drools.runtime.process.NodeInstance;
 import org.drools.spi.KnowledgeHelper;
+import org.drools.time.TimeUtils;
 import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.core.node.EventBasedNode;
 import org.drools.workflow.instance.WorkflowProcessInstance;
@@ -44,8 +45,12 @@
 	
     protected TimerInstance createTimerInstance(Timer timer) {
     	TimerInstance timerInstance = new TimerInstance();
-    	timerInstance.setDelay(timer.getDelay());
-    	timerInstance.setPeriod(timer.getPeriod());
+    	timerInstance.setDelay(TimeUtils.parseTimeString(timer.getDelay()));
+    	if (timer.getPeriod() == null) {
+    		timerInstance.setPeriod(0);
+    	} else {
+    		timerInstance.setPeriod(TimeUtils.parseTimeString(timer.getPeriod()));
+    	}
     	timerInstance.setTimerId(timer.getId());
     	return timerInstance;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -56,7 +56,7 @@
                 "A MilestoneNode only accepts default incoming connections!");
         }
         String rule = "RuleFlow-Milestone-" + getProcessInstance().getProcessId()
-        	+ "-" + getNode().getId();
+        	+ "-" + getMilestoneNode().getUniqueId();
         boolean isActive = ((InternalAgenda) getProcessInstance().getAgenda())
 			.isRuleActiveInRuleFlowGroup("DROOLS_SYSTEM", rule, getProcessInstance().getId());
         if (isActive) {

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-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -1,39 +1,65 @@
 package org.drools.workflow.instance.node;
 
-import java.util.Set;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.drools.WorkingMemory;
 import org.drools.common.InternalAgenda;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.definition.process.Connection;
+import org.drools.event.ActivationCancelledEvent;
+import org.drools.event.ActivationCreatedEvent;
+import org.drools.event.AfterActivationFiredEvent;
+import org.drools.event.AgendaEventListener;
+import org.drools.event.AgendaGroupPoppedEvent;
+import org.drools.event.AgendaGroupPushedEvent;
+import org.drools.event.BeforeActivationFiredEvent;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.rule.Declaration;
+import org.drools.runtime.process.EventListener;
 import org.drools.runtime.process.NodeInstance;
+import org.drools.spi.Activation;
+import org.drools.workflow.core.Constraint;
 import org.drools.workflow.core.impl.NodeImpl;
 import org.drools.workflow.core.node.StateNode;
+import org.drools.workflow.instance.NodeInstanceContainer;
 
-public class StateNodeInstance extends EventBasedNodeInstance {
+public class StateNodeInstance extends CompositeContextNodeInstance implements EventListener, AgendaEventListener {
 
 	private static final long serialVersionUID = 4L;
 
     protected StateNode getStateNode() {
         return (StateNode) getNode();
     }
+    
 	public void internalTrigger(NodeInstance from, String type) {
-        super.internalTrigger(from, type);
+        // TODO: composite states trigger
         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++;
+        Connection selected = null;
+        int priority = Integer.MAX_VALUE;
+        for (Connection connection: stateNode.getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
+            Constraint constraint = stateNode.getConstraint(connection);
+            if (constraint != null && constraint.getPriority() < priority) {
+	            String rule = "RuleFlowStateNode-" + getProcessInstance().getProcessId() + "-" + 
+	            	getStateNode().getUniqueId() + "-" + 
+	            	connection.getTo().getId() + "-" + 
+	            	connection.getToType();
+		        boolean isActive = ((InternalAgenda) getProcessInstance().getAgenda())
+		            .isRuleActiveInRuleFlowGroup("DROOLS_SYSTEM", rule, getProcessInstance().getId());
+		        if (isActive) {
+		            selected = connection;
+	                priority = constraint.getPriority();
+	            }
             }
         }
-        if(triggeredActivation == 0){
-             addTriggerListener();
+        if (selected != null) {
+            ((NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
+            triggerConnection(selected);
+        } else {
+            addTriggerListener();
+            addActivationListener();
         }
-
-
 	}
 	
 	public void signalEvent(String type, Object event) {
@@ -53,14 +79,98 @@
 		getProcessInstance().addEventListener("signal", this, false);
 	}
 
+    private void addActivationListener() {
+    	((ProcessInstance) getProcessInstance()).getWorkingMemory().addEventListener(this);
+    }
+
     public void addEventListeners() {
         super.addEventListeners();
         addTriggerListener();
+        addActivationListener();
     }
     
     public void removeEventListeners() {
         super.removeEventListeners();
         getProcessInstance().removeEventListener("signal", this, false);
+        ((ProcessInstance) getProcessInstance()).getWorkingMemory().removeEventListener(this);
     }
 
+    public String[] getEventTypes() {
+    	return new String[] { "signal" };
+    }
+    
+    private boolean checkProcessInstance(Activation activation) {
+    	final Map<?, ?> declarations = activation.getSubRule().getOuterDeclarations();
+        for ( Iterator<?> it = declarations.values().iterator(); it.hasNext(); ) {
+            Declaration declaration = (Declaration) it.next();
+            if ("processInstance".equals(declaration.getIdentifier())) {
+            	Object value = declaration.getValue(
+        			(InternalWorkingMemory) getProcessInstance().getWorkingMemory(),
+        			((InternalFactHandle) activation.getTuple().get(declaration)).getObject());
+            	if (value instanceof ProcessInstance) {
+            		return ((ProcessInstance) value).getId() == getProcessInstance().getId();
+            	}
+        	}
+        }
+        return true;
+    }
+    
+    public void activationCancelled(ActivationCancelledEvent event, WorkingMemory workingMemory) {
+        // Do nothing
+    }
+
+    public void activationCreated(ActivationCreatedEvent event, WorkingMemory workingMemory) {
+        // check whether this activation is from the DROOLS_SYSTEM agenda group
+        String ruleFlowGroup = event.getActivation().getRule().getRuleFlowGroup();
+        if ("DROOLS_SYSTEM".equals(ruleFlowGroup)) {
+            // new activations of the rule associate with a milestone node
+            // trigger node instances of that milestone node
+            String ruleName = event.getActivation().getRule().getName();
+            String constraintNameStart = "RuleFlowStateNode-"
+            	+ getProcessInstance().getProcessId() + "-" + getNode().getId();
+            if (ruleName.startsWith(constraintNameStart)) {
+                Connection selected = null;
+                int priority = Integer.MAX_VALUE;
+	            for (Connection connection: getNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
+	                Constraint constraint = getStateNode().getConstraint(connection);
+	                if (constraint != null && constraint.getPriority() < priority) {
+			            String constraintName =  constraintNameStart + "-"
+			            	+ connection.getTo().getId() + "-" + connection.getToType();
+			            if (constraintName.equals(ruleName) && checkProcessInstance(event.getActivation())) {
+			            	selected = connection;
+			            	priority = constraint.getPriority();
+			            }
+	                }
+	            }
+	            if (selected != null) {
+	            	synchronized(getProcessInstance()) {
+		            	removeEventListeners();
+		            	((NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
+		                triggerConnection(selected);
+	            	}
+	            }
+            }
+        }
+    }
+
+    public void afterActivationFired(AfterActivationFiredEvent event,
+            WorkingMemory workingMemory) {
+        // Do nothing
+    }
+
+    public void agendaGroupPopped(AgendaGroupPoppedEvent event,
+            WorkingMemory workingMemory) {
+        // Do nothing
+    }
+
+    public void agendaGroupPushed(AgendaGroupPushedEvent event,
+            WorkingMemory workingMemory) {
+        // Do nothing
+    }
+
+    public void beforeActivationFired(BeforeActivationFiredEvent event,
+            WorkingMemory workingMemory) {
+        // Do nothing
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -5,6 +5,7 @@
 import org.drools.process.instance.timer.TimerInstance;
 import org.drools.runtime.process.EventListener;
 import org.drools.runtime.process.NodeInstance;
+import org.drools.time.TimeUtils;
 import org.drools.workflow.core.node.TimerNode;
 import org.drools.workflow.instance.WorkflowProcessInstance;
 
@@ -43,8 +44,12 @@
     protected TimerInstance createTimerInstance() {
     	Timer timer = getTimerNode().getTimer(); 
     	TimerInstance timerInstance = new TimerInstance();
-    	timerInstance.setDelay(timer.getDelay());
-    	timerInstance.setPeriod(timer.getPeriod());
+    	timerInstance.setDelay(TimeUtils.parseTimeString(timer.getDelay()));
+    	if (timer.getPeriod() == null) {
+    		timerInstance.setPeriod(0);
+    	} else {
+    		timerInstance.setPeriod(TimeUtils.parseTimeString(timer.getPeriod()));
+    	}
     	timerInstance.setTimerId(timer.getId());
     	return timerInstance;
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/RuleFlowGroupTest.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -497,7 +497,7 @@
         process.addNode( end );
 
         // rules for split
-        final Rule splitRule1 = new Rule( "RuleFlow-Split-1-" + split.getId() + "-" + ruleSet1.getId() );
+        final Rule splitRule1 = new Rule( "RuleFlow-Split-1-" + split.getUniqueId() + "-" + ruleSet1.getUniqueId() + "-" + Node.CONNECTION_DEFAULT_TYPE );
         splitRule1.setRuleFlowGroup( "DROOLS_SYSTEM" );
         splitRule1.setConsequence( consequence );
 
@@ -507,7 +507,7 @@
                                                                   splitRule1.getLhs(),
                                                                   buildContext );
 
-        final Rule splitRule2 = new Rule( "RuleFlow-Split-1-" + split.getId() + "-" + ruleSet2.getId() );
+        final Rule splitRule2 = new Rule( "RuleFlow-Split-1-" + split.getUniqueId() + "-" + ruleSet2.getUniqueId() + "-" + Node.CONNECTION_DEFAULT_TYPE );
         splitRule2.setRuleFlowGroup( "DROOLS_SYSTEM" );
         splitRule2.setConsequence( consequence );
 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -76,10 +76,12 @@
     public Object getPropertyValue(Object id) {
         Timer timer = getTimerNode().getTimer();
         if (TIMER_DELAY.equals(id)) {
-        	return timer == null ? "" : timer.getDelay() + "";
+        	return timer == null ? "" : 
+        		(timer.getDelay() == null? "" : timer.getDelay());
         }
         if (TIMER_PERIOD.equals(id)) {
-            return timer == null ? "" : timer.getPeriod() + "";
+            return timer == null ? "" :
+            	(timer.getPeriod() == null ? "" : timer.getPeriod());
         }
         return super.getPropertyValue(id);
     }
@@ -91,14 +93,14 @@
                 timer = new Timer();
                 getTimerNode().setTimer(timer);
             } else {
-                timer.setDelay(0);
+                timer.setDelay(null);
             }
         } else if (TIMER_PERIOD.equals(id)) {
             if (timer == null) {
                 timer = new Timer();
                 getTimerNode().setTimer(timer);
             } else {
-                timer.setPeriod(0);
+                timer.setPeriod(null);
             }
         } else {
             super.resetPropertyValue(id);
@@ -107,14 +109,22 @@
 
     public void setPropertyValue(Object id, Object value) {
         Timer timer = getTimerNode().getTimer();
+        if (timer == null) {
+            timer = new Timer();
+            getTimerNode().setTimer(timer);
+        }
         if (TIMER_DELAY.equals(id)) {
-            if (timer == null) {
-                timer = new Timer();
-                getTimerNode().setTimer(timer);
-            }
-            timer.setDelay(new Long((String) value));
+        	String s = ((String) value).trim();
+        	if (s.length() == 0) {
+        		s = null;
+        	}
+            timer.setDelay(s);
         } else if (TIMER_PERIOD.equals(id)) {
-            timer.setPeriod(new Long((String) value));
+        	String s = ((String) value).trim();
+        	if (s.length() == 0) {
+        		s = null;
+        	}
+            timer.setPeriod(s);
         } else {
             super.setPropertyValue(id, value);
         }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionDialog.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionDialog.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -222,7 +222,7 @@
 				int code = dialog.open();
 				if (code != CANCEL) {
 					List<String> imports = dialog.getImports();
-					((Process) process).setImports(imports);
+					process.setImports(imports);
 					List<String> functionImports = dialog.getFunctionImports();
 					process.setFunctionImports(functionImports);
 					completionProcessor.reset();
@@ -241,7 +241,7 @@
 				int code = dialog.open();
 				if (code != CANCEL) {
 					Map<String, String> globals = dialog.getGlobals();
-					((Process) process).setGlobals(globals);
+					process.setGlobals(globals);
 					completionProcessor.reset();
 				}
 			}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -53,7 +53,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class MilestoneConstraintDialog extends EditBeanDialog {
+public class MilestoneConstraintDialog extends EditBeanDialog<String> {
 
 	private WorkflowProcess process;
 	private TabFolder tabFolder;
@@ -66,7 +66,7 @@
 		setValue(milestone.getConstraint());
 	}
 
-	protected Object updateValue(Object value) {
+	protected String updateValue(String value) {
 		if (tabFolder.getSelectionIndex() == 0) {
 			return getConstraintText();
 		}
@@ -180,8 +180,10 @@
 				dialog.create();
 				int code = dialog.open();
 				if (code != CANCEL) {
-					List imports = dialog.getImports();
-					((org.drools.process.core.Process) process).setImports(imports);
+					List<String> imports = dialog.getImports();
+					process.setImports(imports);
+					List<String> functionImports = dialog.getFunctionImports();
+					process.setFunctionImports(functionImports);
 					completionProcessor.reset();
 				}
 			}
@@ -197,8 +199,8 @@
 				dialog.create();
 				int code = dialog.open();
 				if (code != CANCEL) {
-					Map globals = dialog.getGlobals();
-					((org.drools.process.core.Process) process).setGlobals(globals);
+					Map<String, String> globals = dialog.getGlobals();
+					process.setGlobals(globals);
 					completionProcessor.reset();
 				}
 			}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimerDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimerDialog.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimerDialog.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -276,25 +276,17 @@
 		if (key == null) {
 			key = new Timer();
 		}
-		try {
-			String delayString = delayText.getText().trim();
-			long delay = 0;
-			if (delayString.length() > 0) {
-				delay = new Long(delayString);
-			}
+		String delay = delayText.getText().trim();
+		if (delay.length() == 0) {
+			key.setDelay(null);
+		} else {
 			key.setDelay(delay);
-		} catch (NumberFormatException e) {
-			throw new IllegalArgumentException("Delay should be a long value");
 		}
-		try {
-			String periodString = periodText.getText().trim();
-			long period = 0;
-			if (periodString.length() > 0) {
-				period = new Long(periodString);
-			}
+		String period = periodText.getText().trim();
+		if (period.length() == 0) {
+			key.setPeriod(null);
+		} else {
 			key.setPeriod(period);
-		} catch (NumberFormatException e) {
-			throw new IllegalArgumentException("Period should be a long value");
 		}
         if (tabFolder.getSelectionIndex() == 0) {
             return getAction();

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -17,19 +17,16 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.SessionConfiguration;
-import org.drools.audit.WorkingMemoryConsoleLogger;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.ProcessBuilder;
 import org.drools.definition.KnowledgePackage;
 import org.drools.definitions.impl.KnowledgePackageImp;
-import org.drools.event.RuleFlowEventListener;
 import org.drools.process.command.CompleteWorkItemCommand;
 import org.drools.process.command.GetProcessInstanceCommand;
 import org.drools.process.command.StartProcessCommand;
 import org.drools.process.core.Work;
 import org.drools.process.core.impl.WorkImpl;
 import org.drools.process.core.timer.Timer;
-import org.drools.process.instance.impl.demo.SystemOutWorkItemHandler;
 import org.drools.rule.Package;
 import org.drools.ruleflow.core.RuleFlowProcess;
 import org.drools.ruleflow.instance.RuleFlowProcessInstance;
@@ -634,7 +631,7 @@
         timerNode.setId( 2 );
         timerNode.setName( "Timer" );
         Timer timer = new Timer();
-        timer.setDelay( 2000 );
+        timer.setDelay( "2000" );
         timerNode.setTimer( timer );
         process.addNode( timerNode );
         new ConnectionImpl( start,
@@ -727,7 +724,7 @@
         timerNode.setId( 2 );
         timerNode.setName( "Timer" );
         Timer timer = new Timer();
-        timer.setDelay( 0 );
+        timer.setDelay( "0" );
         timerNode.setTimer( timer );
         process.addNode( timerNode );
         new ConnectionImpl( start,

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	2009-06-11 23:48:18 UTC (rev 26931)
@@ -5,29 +5,33 @@
   <classpathentry kind="src" path="src/test/resources" output="target/test-classes" including="**" excluding="**/*.java"/>
   <classpathentry kind="output" path="target/classes"/>
   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.1.1/antlr-runtime-3.1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.4.2.v_883_R34x/core-3.4.2.v_883_R34x.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-api/5.1.0.SNAPSHOT/drools-api-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-api/5.1.0.SNAPSHOT/drools-api-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-compiler/5.1.0.SNAPSHOT/drools-compiler-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-compiler/5.1.0.SNAPSHOT/drools-compiler-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-core/5.1.0.SNAPSHOT/drools-core-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-core/5.1.0.SNAPSHOT/drools-core-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.15/janino-2.5.15.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.6/joda-time-1.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar"/>
   <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/net/sf/saxon/saxon/8.7/saxon-8.7.jar"/>
-  <classpathentry kind="var" path="M2_REPO/net/sf/saxon/saxon-xpath/8.7/saxon-xpath-8.7.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.10/mvel2-2.0.10.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/ode/ode-bpel-compiler/1.2/ode-bpel-compiler-1.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/ode/ode-bpel-schemas/1.2/ode-bpel-schemas-1.2.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/ode/ode-utils/1.2/ode-utils-1.2.jar"/>
-  <classpathentry kind="src" path="/drools-api"/>
-  <classpathentry kind="src" path="/drools-compiler"/>
-  <classpathentry kind="src" path="/drools-core"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.1-SNAPSHOT/mvel2-2.0.1-SNAPSHOT.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.4.2.v_883_R34x/core-3.4.2.v_883_R34x.jar"/>
-  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.15/janino-2.5.15.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/net/sf/saxon/saxon/8.7/saxon-8.7.jar"/>
+  <classpathentry kind="var" path="M2_REPO/net/sf/saxon/saxon-xpath/8.7/saxon-xpath-8.7.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
   <classpathentry kind="var" path="M2_REPO/wsdl4j/wsdl4j/1.6.1/wsdl4j-1.6.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/xalan/xalan/2.7.0/xalan-2.7.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.8.0/xercesImpl-2.8.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/2.0.2/xml-apis-2.0.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.8.0/xercesImpl-2.8.0.jar"/>
 </classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/.project
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/.project	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/.project	2009-06-11 23:48:18 UTC (rev 26931)
@@ -1,11 +1,7 @@
 <projectDescription>
   <name>drools-bpel</name>
   <comment>A rule production system</comment>
-  <projects>
-    <project>drools-api</project>
-    <project>drools-compiler</project>
-    <project>drools-core</project>
-  </projects>
+  <projects/>
   <buildSpec>
     <buildCommand>
       <name>org.eclipse.jdt.core.javabuilder</name>

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstanceFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -5,10 +5,10 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.drools.process.instance.AbstractProcessInstanceFactory;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.ProcessInstanceFactory;
 
-public class BPELProcessInstanceFactory implements ProcessInstanceFactory, Externalizable {
+public class BPELProcessInstanceFactory extends AbstractProcessInstanceFactory implements Externalizable {
 
     private static final long serialVersionUID = 400L;
 

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELWaitInstance.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -42,11 +42,11 @@
         } else if (wait.getUntilExpression() != null) {
             timer.setDelay(getTimerDelayUntil(wait.getUntilExpression()));
         }
-    	timer.setPeriod(0);
+    	timer.setPeriod("0");
     	return timer;
     }
 
-    private long getTimerDelayFor(String forExpression) {
+    private String getTimerDelayFor(String forExpression) {
     	try {
 	    	XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
 	        evaluator.setExpression(forExpression);
@@ -62,20 +62,20 @@
 	        if (delay < 0) {
 	        	delay = 0;
 	        }
-	        return delay;
+	        return delay + "";
     	} catch (Throwable t) {
     		throw new IllegalArgumentException(
 				"Could not get timer delay for", t);
     	}
     }
     
-    private long getTimerDelayUntil(String untilExpression) {
+    private String getTimerDelayUntil(String untilExpression) {
     	try {
 			XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
 		    evaluator.setExpression(untilExpression);
 		    ProcessContext processContext = new ProcessContext();
 		    processContext.setNodeInstance(this);
-		    List literal = (List) evaluator.evaluate(
+		    List<?> literal = (List<?>) evaluator.evaluate(
 	    		((ProcessInstance) getProcessInstance()).getWorkingMemory(), processContext, XPathConstants.NODESET);
 			Calendar calendar = null;
 		    if (literal.size() == 0) {
@@ -98,7 +98,7 @@
 		    if (delay < 0) {
 		    	delay = 0;
 		    }
-		    return delay;
+		    return delay + "";
     	} catch (Throwable t) {
     		throw new IllegalArgumentException(
 				"Could not get timer delay until", t);


Property changes on: labs/jbossrules/trunk/drools-process/drools-jpdl
___________________________________________________________________
Name: svn:ignore
   - target
local

.metadata
.settings
.wtpmodules

nbproject

*.ipr
*.iws
*.iml

   + target
local
.metadata
.settings
.wtpmodules
nbproject
*.ipr
*.iws
*.iml
bin


Modified: labs/jbossrules/trunk/drools-process/drools-jpdl/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-jpdl/.classpath	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-jpdl/.classpath	2009-06-11 23:48:18 UTC (rev 26931)
@@ -13,15 +13,16 @@
   <classpathentry kind="var" path="M2_REPO/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar"/>
   <classpathentry kind="var" path="M2_REPO/bsh/bsh/1.3.0/bsh-1.3.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/cglib/cglib/2.1_3/cglib-2.1_3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.4.2.v_883_R34x/core-3.4.2.v_883_R34x.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/derby/derby/10.2.1.6/derby-10.2.1.6.jar"/>
   <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-api/5.0.0/drools-api-5.0.0.jar" sourcepath="M2_REPO/org/drools/drools-api/5.0.0/drools-api-5.0.0-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-compiler/5.0.0/drools-compiler-5.0.0.jar" sourcepath="M2_REPO/org/drools/drools-compiler/5.0.0/drools-compiler-5.0.0-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-core/5.0.0/drools-core-5.0.0.jar" sourcepath="M2_REPO/org/drools/drools-core/5.0.0/drools-core-5.0.0-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-api/5.1.0.SNAPSHOT/drools-api-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-api/5.1.0.SNAPSHOT/drools-api-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-compiler/5.1.0.SNAPSHOT/drools-compiler-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-compiler/5.1.0.SNAPSHOT/drools-compiler-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-core/5.1.0.SNAPSHOT/drools-core-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-core/5.1.0.SNAPSHOT/drools-core-5.1.0.SNAPSHOT-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
@@ -34,16 +35,18 @@
   <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-text-extractors/1.4/jackrabbit-text-extractors-1.4.jar"/>
   <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.15/janino-2.5.15.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/jbpm/jbpm3/jbpm-jpdl/3.3.0.GA/jbpm-jpdl-3.3.0.GA.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.0.1/jmock-2.5.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.5.2/joda-time-1.5.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jmock/jmock-legacy/2.5.1/jmock-legacy-2.5.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/joda-time/joda-time/1.6/joda-time-1.6.jar"/>
   <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar"/>
   <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/lucene/lucene-core/2.2.0/lucene-core-2.2.0.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.4-SNAPSHOT/mvel2-2.0.4-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.10/mvel2-2.0.10.jar"/>
   <classpathentry kind="var" path="M2_REPO/nekohtml/nekohtml/0.9.4/nekohtml-0.9.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/pdfbox/pdfbox/0.6.4/pdfbox-0.6.4.jar"/>
   <classpathentry kind="var" path="M2_REPO/poi/poi/2.5.1-final-20040804/poi-2.5.1-final-20040804.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/textmining/tm-extractors/0.4/tm-extractors-0.4.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.8.0/xercesImpl-2.8.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/2.0.2/xml-apis-2.0.2.jar"/>
-</classpath>
+</classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/instance/JpdlProcessInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/instance/JpdlProcessInstanceFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/instance/JpdlProcessInstanceFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -1,16 +1,16 @@
 package org.drools.jpdl.instance;
 
 import java.io.Externalizable;
-import java.io.ObjectOutput;
 import java.io.IOException;
 import java.io.ObjectInput;
+import java.io.ObjectOutput;
 
+import org.drools.process.instance.AbstractProcessInstanceFactory;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.ProcessInstanceFactory;
 
-public class JpdlProcessInstanceFactory implements ProcessInstanceFactory, Externalizable {
+public class JpdlProcessInstanceFactory extends AbstractProcessInstanceFactory implements Externalizable {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 4L;
 
     public ProcessInstance createProcessInstance() {
         return new JpdlProcessInstance();
@@ -22,5 +22,4 @@
     public void writeExternal(ObjectOutput out) throws IOException {
     }
 
-
 }

Modified: labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/xml/StartStateHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/xml/StartStateHandler.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-jpdl/src/main/java/org/drools/jpdl/xml/StartStateHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -14,7 +14,7 @@
         return StartState.class;
     }
 
-	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+	public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
 		StartState startNode = (StartState) node;
 		writeNode("start", startNode, xmlDump, includeMeta);
         endNode(xmlDump);


Property changes on: labs/jbossrules/trunk/drools-process/drools-osworkflow
___________________________________________________________________
Name: svn:ignore
   - target
local

.metadata
.settings
.wtpmodules

nbproject

*.ipr
*.iws
*.iml

   + target
local
.metadata
.settings
.wtpmodules
nbproject
*.ipr
*.iws
*.iml
bin


Modified: labs/jbossrules/trunk/drools-process/drools-osworkflow/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-osworkflow/.classpath	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-osworkflow/.classpath	2009-06-11 23:48:18 UTC (rev 26931)
@@ -15,10 +15,10 @@
   <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.4.2.v_883_R34x/core-3.4.2.v_883_R34x.jar"/>
   <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-api/5.0.1.SNAPSHOT/drools-api-5.0.1.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-api/5.0.1.SNAPSHOT/drools-api-5.0.1.SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-compiler/5.0.1.SNAPSHOT/drools-compiler-5.0.1.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-compiler/5.0.1.SNAPSHOT/drools-compiler-5.0.1.SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-core/5.0.1.SNAPSHOT/drools-core-5.0.1.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-core/5.0.1.SNAPSHOT/drools-core-5.0.1.SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/drools/drools-persistence-jpa/5.0.1.SNAPSHOT/drools-persistence-jpa-5.0.1.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-persistence-jpa/5.0.1.SNAPSHOT/drools-persistence-jpa-5.0.1.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-api/5.1.0.SNAPSHOT/drools-api-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-api/5.1.0.SNAPSHOT/drools-api-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-compiler/5.1.0.SNAPSHOT/drools-compiler-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-compiler/5.1.0.SNAPSHOT/drools-compiler-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-core/5.1.0.SNAPSHOT/drools-core-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-core/5.1.0.SNAPSHOT/drools-core-5.1.0.SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/drools/drools-persistence-jpa/5.1.0.SNAPSHOT/drools-persistence-jpa-5.1.0.SNAPSHOT.jar" sourcepath="M2_REPO/org/drools/drools-persistence-jpa/5.1.0.SNAPSHOT/drools-persistence-jpa-5.1.0.SNAPSHOT-sources.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jms_1.1_spec/1.0.1/geronimo-jms_1.1_spec-1.0.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-jta_1.0.1B_spec/1.0.1/geronimo-jta_1.0.1B_spec-1.0.1.jar"/>
@@ -38,7 +38,7 @@
   <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
   <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar"/>
   <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.9pre2/mvel2-2.0.9pre2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.10/mvel2-2.0.10.jar"/>
   <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/opensymphony/oscore/2.2.5/oscore-2.2.5.jar"/>
   <classpathentry kind="var" path="M2_REPO/opensymphony/osworkflow/2.8.0/osworkflow-2.8.0.jar"/>

Modified: labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/instance/OSWorkflowProcessInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/instance/OSWorkflowProcessInstanceFactory.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/instance/OSWorkflowProcessInstanceFactory.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -1,9 +1,9 @@
 package org.drools.osworkflow.instance;
 
+import org.drools.process.instance.AbstractProcessInstanceFactory;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.ProcessInstanceFactory;
 
-public class OSWorkflowProcessInstanceFactory implements ProcessInstanceFactory {
+public class OSWorkflowProcessInstanceFactory extends AbstractProcessInstanceFactory {
 
     public ProcessInstance createProcessInstance() {
         return new OSWorkflowProcessInstance();

Modified: labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/StepNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/StepNodeHandler.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/StepNodeHandler.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -36,7 +36,7 @@
         }
     }
     
-    public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+    public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
         StepNode stepNode = (StepNode) node;
         writeNode("step", stepNode, xmlDump, includeMeta);
         xmlDump.append(">" + EOL);
@@ -51,7 +51,7 @@
         endNode("step", xmlDump);
     }
 
-    public Class generateNodeFor() {
+    public Class<?> generateNodeFor() {
         return StepNode.class;
     }
 

Modified: labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/XmlOSWorkflowProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/XmlOSWorkflowProcessDumper.java	2009-06-11 23:41:46 UTC (rev 26930)
+++ labs/jbossrules/trunk/drools-process/drools-osworkflow/src/main/java/org/drools/osworkflow/xml/XmlOSWorkflowProcessDumper.java	2009-06-11 23:48:18 UTC (rev 26931)
@@ -3,13 +3,9 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.Collection;
-import java.util.List;
 
 import org.drools.definition.process.WorkflowProcess;
 import org.drools.osworkflow.core.OSWorkflowProcess;
-import org.drools.process.core.context.exception.ExceptionScope;
-import org.drools.process.core.context.swimlane.SwimlaneContext;
-import org.drools.process.core.context.variable.VariableScope;
 import org.drools.xml.XmlWorkflowProcessDumper;
 
 import com.opensymphony.workflow.loader.ActionDescriptor;
@@ -27,13 +23,13 @@
         );
     }
     @Override
-    protected void visitHeader(WorkflowProcess process, StringBuffer xmlDump, boolean includeMeta) {
+    protected void visitHeader(WorkflowProcess process, StringBuilder xmlDump, boolean includeMeta) {
         xmlDump.append("  <header>" + EOL);
         visitInitialActions(((OSWorkflowProcess) process).getInitialActions(), xmlDump);
         
         xmlDump.append("  </header>" + EOL + EOL);
     }
-    private void visitInitialActions(Collection<ActionDescriptor> initialActions, StringBuffer xmlDump) {
+    private void visitInitialActions(Collection<ActionDescriptor> initialActions, StringBuilder xmlDump) {
         if (initialActions != null && initialActions.size() > 0) {
             xmlDump.append("<initial-actions>" + EOL);
             for (ActionDescriptor action: initialActions) {




More information about the jboss-svn-commits mailing list