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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jun 16 21:43:57 EDT 2009


Author: KrisVerlaenen
Date: 2009-06-16 21:43:57 -0400 (Tue, 16 Jun 2009)
New Revision: 26986

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConnectionRef.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateBasedNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateBasedNodeInstance.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StateNodeEditPart.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/figure/bpmn/BPMNStateFigure.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListCellEditor.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListDialog.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintsPropertyDescriptor.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventBasedNodeWrapper.java
   labs/jbossrules/trunk/drools-process/drools-gwt-graph/src/main/resources/com.sample.eventing.png
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.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/process/builder/SplitNodeBuilder.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/CompositeNodeHandler.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/MilestoneNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.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/SubProcessNodeHandler.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/WorkItemNodeHandler.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/lang/DRLContextTest.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/marshalling/impl/AbstractProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SplitFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConstraintImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.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/ActionNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EndNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Join.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/RuleSetNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StartNode.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/core/node/SubProcessNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/TimerNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Trigger.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.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/DynamicNodeInstance.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/RuleSetNodeInstance.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/SubProcessNodeInstance.java
   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/WorkItemNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/workflow/instance/node/MockNode.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/ElementContainerElementWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ForEachNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleSetNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubProcessWrapper.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/core/WorkItemWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/BPMNSkinProvider.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/DefaultSkinProvider.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/SkinProvider.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.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-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersCellEditor.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersPropertyDescriptor.java
   labs/jbossrules/trunk/drools-process/drools-gwt-console/.classpath
   labs/jbossrules/trunk/drools-process/drools-gwt-console/pom.xml
   labs/jbossrules/trunk/drools-process/drools-gwt-console/src/main/java/org/drools/integration/console/DroolsFlowTaskManagement.java
   labs/jbossrules/trunk/drools-process/drools-gwt-form/.classpath
   labs/jbossrules/trunk/drools-process/drools-gwt-form/pom.xml
   labs/jbossrules/trunk/drools-process/drools-gwt-graph/.classpath
   labs/jbossrules/trunk/drools-process/drools-gwt-graph/pom.xml
   labs/jbossrules/trunk/drools-process/drools-gwt-graph/src/main/java/org/drools/integration/console/graph/GraphViewerPluginImpl.java
Log:
JBRULES-2107: Support StateNode for Finite State Machines
 - added support for on-entry/exit actions and timers

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -47,6 +47,7 @@
 import org.drools.ruleflow.core.RuleFlowProcess;
 import org.drools.ruleflow.core.validation.RuleFlowProcessValidator;
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.impl.WorkflowProcessImpl;
 import org.drools.workflow.core.node.ConstraintTrigger;
@@ -55,7 +56,6 @@
 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;
 
@@ -358,24 +358,28 @@
         	"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 createStateRule(Process process, StateNode state, ConnectionRef key, Constraint constraint) {
+    	if (constraint.getConstraint() == null
+    			|| constraint.getConstraint().trim().length() == 0) {
+    		return "";
+    	} else {
+	        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 createStateRules(Process process, StateNode state){
+    private String createStateRules(Process process, StateNode state) {
         String result = "";
-        for(ConnectionRef key : state.getConstraints().keySet()){
-            result  += createStateRule(process, state, key);
+        for (Map.Entry<ConnectionRef, Constraint> entry: state.getConstraints().entrySet()) {
+    		result += createStateRule(process, state, entry.getKey(), entry.getValue());
         }
         return result;
-
     }
 
     private String createStartConstraintRule(Process process,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/EventBasedNodeBuilder.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -9,7 +9,7 @@
 import org.drools.rule.builder.ProcessBuildContext;
 import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.core.impl.NodeImpl;
-import org.drools.workflow.core.node.EventBasedNode;
+import org.drools.workflow.core.node.StateBasedNode;
 
 public class EventBasedNodeBuilder extends ExtendedNodeBuilder {
 
@@ -18,7 +18,7 @@
                       ProcessBuildContext context,
                       Node node) {
         super.build(process, processDescr, context, node);
-        Map<Timer, DroolsAction> timers = ((EventBasedNode) node).getTimers();
+        Map<Timer, DroolsAction> timers = ((StateBasedNode) node).getTimers();
         if (timers != null) {
 	        for (DroolsAction action: timers.values()) {
 	        	buildAction(action, context, (NodeImpl) node );

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/ProcessNodeBuilderRegistry.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -5,6 +5,7 @@
 
 import org.drools.definition.process.Node;
 import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.CompositeContextNode;
 import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.core.node.FaultNode;
 import org.drools.workflow.core.node.HumanTaskNode;
@@ -45,6 +46,10 @@
                   new ActionNodeBuilder() );
         register( Split.class,
                   new SplitNodeBuilder() );
+        register( CompositeContextNode.class,
+                  new EventBasedNodeBuilder() );
+        register( StateNode.class,
+                  new EventBasedNodeBuilder() );
     }
 
     public void register(Class< ? extends Node> cls,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -12,6 +12,7 @@
 import org.drools.lang.descr.ProcessDescr;
 import org.drools.rule.builder.ProcessBuildContext;
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.impl.ConstraintImpl;
 import org.drools.workflow.core.impl.NodeImpl;
 import org.drools.workflow.core.node.Split;
@@ -31,10 +32,10 @@
             return;
         }
         // we need to clone the map, so we can update the original while iterating.
-        Map<Split.ConnectionRef, Constraint> map = new HashMap<Split.ConnectionRef, Constraint>( splitNode.getConstraints() );
-        for ( Iterator<Map.Entry<Split.ConnectionRef, Constraint>> it = map.entrySet().iterator(); it.hasNext(); ) {
-            Map.Entry<Split.ConnectionRef, Constraint> entry = it.next();
-            Split.ConnectionRef connection = entry.getKey();
+        Map<ConnectionRef, Constraint> map = new HashMap<ConnectionRef, Constraint>( splitNode.getConstraints() );
+        for ( Iterator<Map.Entry<ConnectionRef, Constraint>> it = map.entrySet().iterator(); it.hasNext(); ) {
+            Map.Entry<ConnectionRef, Constraint> entry = it.next();
+            ConnectionRef connection = entry.getKey();
             ConstraintImpl constraint = (ConstraintImpl) entry.getValue();
             Connection outgoingConnection = null; 
             for (Connection out: splitNode.getDefaultOutgoingConnections()) {

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -118,7 +118,7 @@
         }
     }
     
-    protected void handleAction(final Node node, final Element element, String type) {
+    protected void handleAction(final ExtendedNodeImpl node, final Element element, String type) {
         NodeList nodeList = element.getChildNodes();
         for (int i = 0; i < nodeList.getLength(); i++) {
         	org.w3c.dom.Node xmlNode = nodeList.item(i);
@@ -131,7 +131,7 @@
                 	DroolsAction action = extractAction(subXmlNode);
                 	actions.add(action);
                 }
-                ((ExtendedNodeImpl) node).setActions(type, actions);
+            	node.setActions(type, actions);
         		return;
         	}
         }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -37,6 +37,10 @@
         CompositeNode compositeNode = (CompositeNode) node;
         writeAttributes(compositeNode, xmlDump, includeMeta);
         xmlDump.append(">" + EOL);
+    	for (String eventType: compositeNode.getActionTypes()) {
+        	writeActions(eventType, compositeNode.getActions(eventType), xmlDump);
+        }
+        writeTimers(compositeNode.getTimers(), xmlDump);
         if (compositeNode instanceof CompositeContextNode) {
         	VariableScope variableScope = (VariableScope)
 				((CompositeContextNode) compositeNode).getDefaultContext(VariableScope.VARIABLE_SCOPE);

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConstraintHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -3,10 +3,10 @@
 import java.util.HashSet;
 
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.impl.ConstraintImpl;
+import org.drools.workflow.core.impl.NodeImpl;
 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,8 +20,6 @@
     public ConstraintHandler() {
         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<?>>();
@@ -44,96 +42,42 @@
                       final String localName,
                       final ExtensibleXmlParser parser) throws SAXException {
         final Element element = parser.endElementBuilder();
-        Object parent = parser.getParent();
-        // TODO use Constraintable interface
-        if (parent instanceof Split) {
-	        Split splitNode = (Split) 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);
-	        Split.ConnectionRef connectionRef = new Split.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);
-	        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();
+    	Constrainable parent = (Constrainable) parser.getParent();
+        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);
-	        constrainable.addConstraint(name, constraint);
-        } else {
-        	throw new SAXException("Invalid parent node " + parent);
+        final String toNodeIdString = element.getAttribute("toNodeId");
+        String toType = element.getAttribute("toType");
+        ConnectionRef connectionRef = null;
+        if (toNodeIdString != null && toNodeIdString.trim().length() > 0) {
+        	int toNodeId = new Integer(toNodeIdString);
+        	if (toType == null || toType.trim().length() == 0) {
+        		toType = NodeImpl.CONNECTION_DEFAULT_TYPE;
+        	}
+        	connectionRef = new ConnectionRef(toNodeId, toType);
         }
+
+        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);
+        parent.addConstraint(connectionRef, constraint);
         return null;
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/MilestoneNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/MilestoneNodeHandler.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/MilestoneNodeHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -25,7 +25,7 @@
         super.handleNode(node, element, uri, localName, parser);
         MilestoneNode milestoneNode = (MilestoneNode) node;
         for (String eventType: milestoneNode.getActionTypes()) {
-        	handleAction(node, element, eventType);
+        	handleAction(milestoneNode, element, eventType);
         }
     }
     

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -4,6 +4,7 @@
 
 import org.drools.workflow.core.Constraint;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.node.Split;
 import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.XmlDumper;
@@ -44,12 +45,11 @@
         } else {
             xmlDump.append(">" + EOL);
             xmlDump.append("      <constraints>" + EOL);
-            for (Map.Entry<Split.ConnectionRef, Constraint> entry: splitNode.getConstraints().entrySet()) {
-                Split.ConnectionRef connection = entry.getKey();
+            for (Map.Entry<ConnectionRef, Constraint> entry: splitNode.getConstraints().entrySet()) {
+                ConnectionRef connection = entry.getKey();
                 Constraint constraint = entry.getValue();
                 xmlDump.append("        <constraint "
-                        + "toNodeId=\"" + connection.getNodeId() + "\" "
-                        + "toType=\"" + connection.getToType() + "\" ");
+                        + "toNodeId=\"" + connection.getNodeId() + "\" ");
                 String name = constraint.getName();
                 if (name != null && !"".equals(name)) {
                     xmlDump.append("name=\"" + XmlDumper.replaceIllegalChars(constraint.getName()) + "\" ");

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StateNodeHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -4,9 +4,12 @@
 
 import org.drools.workflow.core.Constraint;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.node.StateNode;
-import org.drools.workflow.core.node.StateNode.ConnectionRef;
+import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.XmlDumper;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
 
 public class StateNodeHandler extends AbstractNodeHandler {
 
@@ -19,18 +22,31 @@
         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(stateNode, element, eventType);
+        }
+    }
+    
     public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
 		StateNode stateNode = (StateNode) node;
 		writeNode("state", stateNode, xmlDump, includeMeta);
         xmlDump.append(">\n");
+    	for (String eventType: stateNode.getActionTypes()) {
+        	writeActions(eventType, stateNode.getActions(eventType), xmlDump);
+        }
+        writeTimers(stateNode.getTimers(), xmlDump);
         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() + "\" ");
+	                + "toNodeId=\"" + connection.getNodeId() + "\" ");
 	            String name = constraint.getName();
 	            if (name != null && !"".equals(name)) {
 	                xmlDump.append("name=\"" + XmlDumper.replaceIllegalChars(constraint.getName()) + "\" ");
@@ -39,7 +55,6 @@
 	            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);

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SubProcessNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SubProcessNodeHandler.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SubProcessNodeHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -28,7 +28,7 @@
         String independent = element.getAttribute("independent");
         subProcessNode.setIndependent(!"false".equals(independent));
         for (String eventType: subProcessNode.getActionTypes()) {
-        	handleAction(node, element, eventType);
+        	handleAction(subProcessNode, element, eventType);
         }
     }
 

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -4,8 +4,7 @@
 
 import org.drools.process.core.timer.Timer;
 import org.drools.workflow.core.DroolsAction;
-import org.drools.workflow.core.impl.ExtendedNodeImpl;
-import org.drools.workflow.core.node.EventBasedNode;
+import org.drools.workflow.core.node.StateBasedNode;
 import org.drools.xml.BaseAbstractHandler;
 import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.Handler;
@@ -18,7 +17,7 @@
     public TimerHandler() {
         if ( (this.validParents == null) && (this.validPeers == null) ) {
             this.validParents = new HashSet<Class<?>>();
-            this.validParents.add( ExtendedNodeImpl.class );
+            this.validParents.add( StateBasedNode.class );
 
             this.validPeers = new HashSet<Class<?>>();         
             this.validPeers.add( null );
@@ -39,7 +38,7 @@
                       final String localName,
                       final ExtensibleXmlParser parser) throws SAXException {
         Element element = parser.endElementBuilder();
-        EventBasedNode eventBasedNode = (EventBasedNode) parser.getParent();
+        StateBasedNode parent = (StateBasedNode) parser.getParent();
         String id = element.getAttribute("id");
         emptyAttributeCheck( localName, "id", id, parser );
         String delay = element.getAttribute("delay");
@@ -58,7 +57,7 @@
     		Element actionXml = (Element) xmlNode;
     		action = AbstractNodeHandler.extractAction(actionXml);
         }
-        eventBasedNode.addTimer(timer, action);
+        parent.addTimer(timer, action);
         return null;
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -26,7 +26,7 @@
         final String waitForCompletion = element.getAttribute("waitForCompletion");
         workItemNode.setWaitForCompletion(!"false".equals(waitForCompletion));
         for (String eventType: workItemNode.getActionTypes()) {
-        	handleAction(node, element, eventType);
+        	handleAction(workItemNode, element, eventType);
         }
     }
 

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd	2009-06-17 01:43:57 UTC (rev 26986)
@@ -413,6 +413,9 @@
 	<xs:element name="composite">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:timers"/>
+				<xs:element ref="drools:onEntry"/>
+				<xs:element ref="drools:onExit"/>
 				<xs:element ref="drools:variables"/>
 				<xs:element ref="drools:exceptionHandlers"/>
 				<xs:element ref="drools:nodes"/>
@@ -517,9 +520,12 @@
 	</xs:element>
 	<xs:element name="state">
 		<xs:complexType>
-			<xs:sequence minOccurs="0">
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:timers"/>
+				<xs:element ref="drools:onEntry"/>
+				<xs:element ref="drools:onExit"/>
 				<xs:element ref="drools:constraints"/>
-			</xs:sequence>
+			</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"/>

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -3,6 +3,7 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -10,15 +11,18 @@
 import org.drools.Person;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
 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.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.runtime.process.NodeInstance;
+import org.drools.workflow.instance.node.StateNodeInstance;
 
 public class ProcessStateTest extends TestCase {
     
-    public void testSignalState() {
+    public void testManualSignalState() {
         PackageBuilder builder = new PackageBuilder();
         Reader source = new StringReader(
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
@@ -32,13 +36,23 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" name=\"State\" />\n" +
-            "    <end id=\"3\" name=\"End\" />\n" +
+            "    <state id=\"2\" name=\"StateA\" >\n" +
+            "      <constraints>\n" +
+            "        <constraint toNodeId=\"3\" name=\"toB\" />\n" +
+             "       <constraint toNodeId=\"4\" name=\"toC\" />\n" +
+            "      </constraints>\n" +
+            "    </state>\n" +
+            "    <state id=\"3\" name=\"StateB\" />\n" +
+            "    <state id=\"4\" name=\"StateC\" />\n" +
+            "    <end id=\"5\" name=\"End\" />\n" +
             "  </nodes>\n" +
             "\n" +
             "  <connections>\n" +
             "    <connection from=\"1\" to=\"2\" />\n" +
             "    <connection from=\"2\" to=\"3\" />\n" +
+            "    <connection from=\"2\" to=\"4\" />\n" +
+            "    <connection from=\"3\" to=\"2\" />\n" +
+            "    <connection from=\"4\" to=\"5\" />\n" +
             "  </connections>\n" +
             "\n" +
             "</process>");
@@ -47,14 +61,48 @@
         RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         ruleBase.addPackage( pkg );
         WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        ProcessInstance processInstance = ( ProcessInstance )
+        // start process
+        RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance)
             workingMemory.startProcess("org.drools.state");
+        // should be in state A
         assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
-        processInstance.signalEvent("signal", null);
+        Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        StateNodeInstance stateInstance = (StateNodeInstance) nodeInstances.iterator().next();
+        assertEquals("StateA", stateInstance.getNodeName());
+        // signal "toB" so we move to state B
+        processInstance.signalEvent("signal", "toB");
+        nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        stateInstance = (StateNodeInstance) nodeInstances.iterator().next();
+        assertEquals("StateB", stateInstance.getNodeName());
+        // if no constraint specified for a connection,
+        // we default to the name of the target node
+        // signal "StateA", so we move back to state A
+        processInstance.signalEvent("signal", "StateA");
+        nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        stateInstance = (StateNodeInstance) nodeInstances.iterator().next();
+        assertEquals("StateA", stateInstance.getNodeName());
+        // signal "toC" so we move to state C
+        processInstance.signalEvent("signal", "toC");
+        nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        stateInstance = (StateNodeInstance) nodeInstances.iterator().next();
+        assertEquals("StateC", stateInstance.getNodeName());
+        // signal something completely wrong, this should simply be ignored
+        processInstance.signalEvent("signal", "Invalid");
+        nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        stateInstance = (StateNodeInstance) nodeInstances.iterator().next();
+        assertEquals("StateC", stateInstance.getNodeName());
+        // signal "End", so we move to the end
+        processInstance.signalEvent("signal", "End");
+        nodeInstances = processInstance.getNodeInstances();
+        assertEquals(0, nodeInstances.size());
         assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
     }
 
-
     public void testImmediateStateConstraint1() {
         PackageBuilder builder = new PackageBuilder();
         Reader source = new StringReader(
@@ -72,12 +120,12 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "    <state id=\"2\" >\n" +
             "      <constraints>\n" +
-            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "        <constraint toNodeId=\"3\" name=\"one\" >\n" +
             "            eval(true)" +
             "        </constraint>"+
-             "       <constraint toNodeId=\"4\" toType=\"DROOLS_DEFAULT\" name=\"two\" type=\"rule\" dialect=\"mvel\" >\n" +
+             "       <constraint toNodeId=\"4\" name=\"two\" >\n" +
             "           eval(false)" +
             "        </constraint>"+
             "      </constraints>\n" +
@@ -131,12 +179,12 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "    <state id=\"2\" >\n" +
             "      <constraints>\n" +
-            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "        <constraint toNodeId=\"3\" name=\"one\" priority=\"1\" >\n" +
             "            eval(true)" +
             "        </constraint>"+
-             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+             "       <constraint toNodeId=\"5\" name=\"two\" priority=\"2\" >\n" +
             "           eval(true)" +
             "        </constraint>"+
             "      </constraints>\n" +
@@ -190,12 +238,12 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "    <state id=\"2\" >\n" +
             "      <constraints>\n" +
-            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "        <constraint toNodeId=\"3\" name=\"one\" priority=\"2\" >\n" +
             "            eval(true)" +
             "        </constraint>"+
-             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+             "       <constraint toNodeId=\"5\" name=\"two\" priority=\"1\" >\n" +
             "           eval(true)" +
             "        </constraint>"+
             "      </constraints>\n" +
@@ -252,12 +300,12 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "    <state id=\"2\" >\n" +
             "      <constraints>\n" +
-            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "        <constraint toNodeId=\"3\" name=\"one\" >\n" +
             "            Person( age &gt; 21 )" +
             "        </constraint>"+
-             "       <constraint toNodeId=\"4\" toType=\"DROOLS_DEFAULT\" name=\"two\" type=\"rule\" dialect=\"mvel\" >\n" +
+             "       <constraint toNodeId=\"4\" name=\"two\" >\n" +
             "           Person( age &lt;= 21 )" +
             "        </constraint>"+
             "      </constraints>\n" +
@@ -318,12 +366,12 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "    <state id=\"2\" >\n" +
             "      <constraints>\n" +
-            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "        <constraint toNodeId=\"3\" name=\"age &gt; 21\" >\n" +
             "            Person( age &gt; 21 )" +
             "        </constraint>"+
-             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" type=\"rule\" dialect=\"mvel\" >\n" +
+             "       <constraint toNodeId=\"5\" name=\"age &lt;=21 \" >\n" +
             "           Person( age &lt;= 21 )" +
             "        </constraint>"+
             "      </constraints>\n" +
@@ -384,12 +432,12 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "    <state id=\"2\" >\n" +
             "      <constraints>\n" +
-            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "        <constraint toNodeId=\"3\" name=\"one\" priority=\"1\" >\n" +
             "            Person( )" +
             "        </constraint>"+
-             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+             "       <constraint toNodeId=\"5\" name=\"two\" priority=\"2\" >\n" +
             "           Person( )" +
             "        </constraint>"+
             "      </constraints>\n" +
@@ -450,12 +498,12 @@
             "\n" +
             "  <nodes>\n" +
             "    <start id=\"1\" name=\"Start\" />\n" +
-            "    <state id=\"2\" dialect=\"mvel\" >\n" +
+            "    <state id=\"2\" >\n" +
             "      <constraints>\n" +
-            "        <constraint toNodeId=\"3\" toType=\"DROOLS_DEFAULT\" name=\"one\" priority=\"2\" type=\"rule\" dialect=\"mvel\" >\n" +
+            "        <constraint toNodeId=\"3\" name=\"one\" priority=\"2\" >\n" +
             "            Person( )" +
             "        </constraint>"+
-             "       <constraint toNodeId=\"5\" toType=\"DROOLS_DEFAULT\" name=\"two\" priority=\"1\" type=\"rule\" dialect=\"mvel\" >\n" +
+             "       <constraint toNodeId=\"5\" name=\"two\" priority=\"1\" >\n" +
             "           Person( )" +
             "        </constraint>"+
             "      </constraints>\n" +
@@ -496,4 +544,158 @@
         assertEquals("2", list.get(0));
     }
     
+    public void testActionState() {
+        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" +
+            "    <variables>\n" +
+            "      <variable name=\"s\" >\n" +
+            "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "        <value>a</value>\n" +
+            "      </variable>\n" +
+            "    </variables>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" name=\"State\" >\n" +
+            "      <onEntry>" +
+            "        <action type=\"expression\" dialect=\"mvel\" >list.add(\"Action1\" + s);</action>\n" +
+            "        <action type=\"expression\" dialect=\"java\" >list.add(\"Action2\" + s);</action>\n" +
+            "      </onEntry>\n" +
+            "      <onExit>\n" +
+            "        <action type=\"expression\" dialect=\"mvel\" >list.add(\"Action3\" + s);</action>\n" +
+            "        <action type=\"expression\" dialect=\"java\" >list.add(\"Action4\" + s);</action>\n" +
+            "      </onExit>\n" +
+            "    </state>\n" +
+            "    <end id=\"3\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        // start process
+        RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance)
+            workingMemory.startProcess("org.drools.state");
+        // should be in state A
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        StateNodeInstance stateInstance = (StateNodeInstance) nodeInstances.iterator().next();
+        assertEquals("State", stateInstance.getNodeName());
+        assertEquals(2, list.size());
+        assertTrue(list.contains("Action1a"));
+        assertTrue(list.contains("Action2a"));
+        processInstance.signalEvent("signal", "End");
+        nodeInstances = processInstance.getNodeInstances();
+        assertEquals(0, nodeInstances.size());
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(4, list.size());
+        assertTrue(list.contains("Action3a"));
+        assertTrue(list.contains("Action4a"));
+    }
+    
+    public void testTimerState() {
+        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" +
+            "    <variables>\n" +
+            "      <variable name=\"s\" >\n" +
+            "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+            "        <value>a</value>\n" +
+            "      </variable>\n" +
+            "    </variables>\n" +
+            "  </header>\n" +
+            "\n" +
+            "  <nodes>\n" +
+            "    <start id=\"1\" name=\"Start\" />\n" +
+            "    <state id=\"2\" name=\"State\" >\n" +
+            "      <timers>\n" +
+            "        <timer id=\"1\" delay=\"1s\" period=\"2s\" >\n" +
+            "          <action type=\"expression\" dialect=\"mvel\" >list.add(\"Timer1\" + s);</action>\n" +
+            "        </timer>\n" +
+            "        <timer id=\"2\" delay=\"1s\" period=\"2s\" >\n" +
+            "          <action type=\"expression\" dialect=\"mvel\" >list.add(\"Timer2\" + s);</action>\n" +
+            "        </timer>\n" +
+            "      </timers>\n" +
+            "    </state>\n" +
+            "    <end id=\"3\" name=\"End\" />\n" +
+            "  </nodes>\n" +
+            "\n" +
+            "  <connections>\n" +
+            "    <connection from=\"1\" to=\"2\" />\n" +
+            "    <connection from=\"2\" to=\"3\" />\n" +
+            "  </connections>\n" +
+            "\n" +
+            "</process>");
+        builder.addRuleFlow(source);
+        Package pkg = builder.getPackage();
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( pkg );
+        final StatefulSession workingMemory = ruleBase.newStatefulSession();
+        List<String> list = new ArrayList<String>();
+        workingMemory.setGlobal("list", list);
+        new Thread(new Runnable() {
+			public void run() {
+				workingMemory.fireUntilHalt();
+			}
+        }).start();
+        // start process
+        RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance)
+            workingMemory.startProcess("org.drools.state");
+        // should be in state A
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        StateNodeInstance stateInstance = (StateNodeInstance) nodeInstances.iterator().next();
+        assertEquals("State", stateInstance.getNodeName());
+        assertEquals(0, list.size());
+        try {
+			Thread.sleep(4000);
+		} catch (InterruptedException e) {
+		}
+        assertEquals(4, list.size());
+        assertTrue(list.contains("Timer1a"));
+        assertTrue(list.contains("Timer2a"));
+        processInstance.signalEvent("signal", "End");
+        nodeInstances = processInstance.getNodeInstances();
+        assertEquals(0, nodeInstances.size());
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        assertEquals(4, list.size());
+        try {
+			Thread.sleep(2000);
+		} catch (InterruptedException e) {
+		}
+        assertEquals(4, list.size());
+        workingMemory.halt();
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/DRLContextTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/DRLContextTest.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/DRLContextTest.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -888,6 +888,10 @@
 		} catch (Exception ex) {
 		}
 
+		LinkedList list = parser.getEditorInterface().get(0).getContent();
+		for (Object o: list) {
+			System.out.println(o);
+		}
 		assertEquals(Location.LOCATION_LHS_INSIDE_CONDITION_START,
 				getLastIntegerValue(parser.getEditorInterface().get(0)
 						.getContent()));

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -479,6 +479,23 @@
         stateNode.setMetaData("y", 2);
         stateNode.setMetaData("width", 3);
         stateNode.setMetaData("height", 4);
+        timer = new Timer();
+        timer.setDelay("100");
+        timer.setPeriod("100");
+        action = new DroolsConsequenceAction("dialect", "consequence");
+        stateNode.addTimer(timer, action);
+        timer = new Timer();
+        timer.setDelay("200");
+        timer.setPeriod("200");
+        action = new DroolsConsequenceAction("dialect", "consequence");
+        stateNode.addTimer(timer, action);
+        actions = new ArrayList<DroolsAction>();
+        action1 = new DroolsConsequenceAction("java", "System.out.println(\"action1\");");
+        actions.add(action1);
+        action2 = new DroolsConsequenceAction("java", "System.out.println(\"action2\");");
+        actions.add(action2);
+        stateNode.setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, actions);
+        stateNode.setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, actions);
         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();
@@ -529,7 +546,7 @@
         
         System.out.println(xml2);
         
-//        assertEquals(xml, xml2);
+        assertEquals(xml, xml2);
         
         // test serialization of process elements
         new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(process);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -18,7 +18,6 @@
 import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
 import org.drools.process.instance.context.variable.VariableScopeInstance;
-import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 import org.drools.runtime.process.NodeInstance;
 import org.drools.runtime.process.NodeInstanceContainer;
 import org.drools.runtime.process.ProcessInstance;
@@ -31,6 +30,7 @@
 import org.drools.workflow.instance.node.JoinInstance;
 import org.drools.workflow.instance.node.MilestoneNodeInstance;
 import org.drools.workflow.instance.node.RuleSetNodeInstance;
+import org.drools.workflow.instance.node.StateNodeInstance;
 import org.drools.workflow.instance.node.SubProcessNodeInstance;
 import org.drools.workflow.instance.node.TimerNodeInstance;
 import org.drools.workflow.instance.node.WorkItemNodeInstance;
@@ -158,6 +158,16 @@
 	        } else if ( nodeInstance instanceof CompositeContextNodeInstance ) {
 	            stream.writeShort( PersisterEnums.COMPOSITE_NODE_INSTANCE );
 	            CompositeContextNodeInstance compositeNodeInstance = (CompositeContextNodeInstance) nodeInstance;
+	            List<Long> timerInstances = 
+	            	((CompositeContextNodeInstance) nodeInstance).getTimerInstances();
+	            if (timerInstances != null) {
+	            	stream.writeInt(timerInstances.size());
+	            	for (Long id: timerInstances) {
+	            		stream.writeLong(id);
+	            	}
+	            } else {
+	            	stream.writeInt(0);
+	            }
 	            VariableScopeInstance variableScopeInstance = (VariableScopeInstance) compositeNodeInstance.getContextInstance( VariableScope.VARIABLE_SCOPE );
 	            Map<String, Object> variables = variableScopeInstance.getVariables();
 	            List<String> keys = new ArrayList<String>( variables.keySet() );
@@ -206,6 +216,18 @@
 	                }
 	            }
 	            stream.writeShort( PersisterEnums.END );
+	        } else if ( nodeInstance instanceof StateNodeInstance ) {
+	            stream.writeShort( PersisterEnums.STATE_NODE_INSTANCE );
+	            List<Long> timerInstances = 
+	            	((StateNodeInstance) nodeInstance).getTimerInstances();
+	            if (timerInstances != null) {
+	            	stream.writeInt(timerInstances.size());
+	            	for (Long id: timerInstances) {
+	            		stream.writeLong(id);
+	            	}
+	            } else {
+	            	stream.writeInt(0);
+	            }
 	        } else {
 	            throw new IllegalArgumentException( "Unknown node instance type: " + nodeInstance );
 	        }
@@ -378,10 +400,29 @@
             break;
         case PersisterEnums.COMPOSITE_NODE_INSTANCE :
             nodeInstance = new CompositeContextNodeInstance();
+            nbTimerInstances = stream.readInt();
+            if (nbTimerInstances > 0) {
+            	List<Long> timerInstances = new ArrayList<Long>();
+            	for (int i = 0; i < nbTimerInstances; i++) {
+            		timerInstances.add(stream.readLong());
+            	}
+            	((CompositeContextNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
+            }
             break;
         case PersisterEnums.FOR_EACH_NODE_INSTANCE :
             nodeInstance = new ForEachNodeInstance();
             break;
+        case PersisterEnums.STATE_NODE_INSTANCE :
+            nodeInstance = new StateNodeInstance();
+            nbTimerInstances = stream.readInt();
+            if (nbTimerInstances > 0) {
+            	List<Long> timerInstances = new ArrayList<Long>();
+            	for (int i = 0; i < nbTimerInstances; i++) {
+            		timerInstances.add(stream.readLong());
+            	}
+            	((CompositeContextNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
+            }
+            break;
         default :
             throw new IllegalArgumentException( "Unknown node type: " + nodeType );
 		}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterEnums.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -39,5 +39,6 @@
     public static final short HUMAN_TASK_NODE_INSTANCE  = 27;
     public static final short FOR_EACH_NODE_INSTANCE    = 28;
     public static final short TIMER                     = 29;
+    public static final short STATE_NODE_INSTANCE       = 30;
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/ProcessMarshallerRegistry.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -3,36 +3,29 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.drools.process.instance.impl.ProcessInstanceImpl;
 import org.drools.ruleflow.core.RuleFlowProcess;
-import org.drools.ruleflow.instance.RuleFlowProcessInstance;
 
 /**
-* Registry for Process/ProcessMarshaller
-*/
+ * Registry for Process/ProcessMarshaller
+ */
 public class ProcessMarshallerRegistry {
 
 	public static ProcessMarshallerRegistry INSTANCE = new ProcessMarshallerRegistry();
 
-	private Map<String , ProcessInstanceMarshaller> registry;
+	private Map<String, ProcessInstanceMarshaller> registry;
 
 	private ProcessMarshallerRegistry() {
-		 this.registry = new HashMap<String, ProcessInstanceMarshaller >();
-
-	        // default logic that used to be in OutPutMarshaller:
-	        register( RuleFlowProcess.RULEFLOW_TYPE,
-	                  RuleFlowProcessInstanceMarshaller.INSTANCE );
+		this.registry = new HashMap<String, ProcessInstanceMarshaller>();
+		register(RuleFlowProcess.RULEFLOW_TYPE,
+                 RuleFlowProcessInstanceMarshaller.INSTANCE);
 	}
 
-	public void register(String cls,
-			ProcessInstanceMarshaller marchaller) {
-		this.registry.put(cls, marchaller);
+	public void register(String type, ProcessInstanceMarshaller marchaller) {
+		this.registry.put(type, marchaller);
 	}
 	
-	@SuppressWarnings("unchecked")
 	public ProcessInstanceMarshaller getMarshaller(String type) {
 		return this.registry.get(type);
 	}
-	
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SplitFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SplitFactory.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/factory/SplitFactory.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -18,9 +18,9 @@
 import org.drools.ruleflow.core.RuleFlowNodeContainerFactory;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.impl.ConstraintImpl;
 import org.drools.workflow.core.node.Split;
-import org.drools.workflow.core.node.Split.ConnectionRef;
 
 /**
  *
@@ -61,7 +61,7 @@
         constraintImpl.setDialect(dialect);
         constraintImpl.setConstraint(constraint);
         constraintImpl.setPriority(priority);
-        getSplit().internalSetConstraint(
+        getSplit().addConstraint(
     		new ConnectionRef(toNodeId, Node.CONNECTION_DEFAULT_TYPE), constraintImpl);
         return this;
     }

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -237,7 +237,7 @@
                 }
             } else if (node instanceof StateNode) {
                 final StateNode stateNode = (StateNode) node;
-                if (stateNode.getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0 && !acceptsNoIncomingConnections(node)) {
+                if (stateNode.getDefaultIncomingConnections().size() == 0 && !acceptsNoIncomingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "State node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection"));
                 }
@@ -340,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 && !acceptsNoIncomingConnections(node)) {
+                if (forEachNode.getDefaultIncomingConnections().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 && !acceptsNoOutgoingConnections(node)) {
+                if (forEachNode.getDefaultOutgoingConnections().size() == 0 && !acceptsNoOutgoingConnections(node)) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
                 }
@@ -359,11 +359,11 @@
                 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) {
+                if (dynamicNode.getDefaultIncomingConnections().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) {
+                if (dynamicNode.getDefaultOutgoingConnections().size() == 0) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Dynamic node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
                 }
@@ -397,7 +397,7 @@
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Event node '" + node.getName() + "' [" + node.getId() + "] should specify an event type"));
                 }
-                if (eventNode.getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).size() == 0) {
+                if (eventNode.getDefaultOutgoingConnections().size() == 0) {
                     errors.add(new ProcessValidationErrorImpl(process,
                         "Event node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
                 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConnectionRef.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConnectionRef.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConnectionRef.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,37 @@
+package org.drools.workflow.core.impl;
+
+import java.io.Serializable;
+
+public 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;
+    }
+    
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConstraintImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConstraintImpl.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ConstraintImpl.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -36,8 +36,8 @@
     private String             name;
     private String             constraint;
     private int                priority;
-    private String             dialect;
-    private String             type;
+    private String             dialect = "mvel";
+    private String             type = "rule";
 
     public String getConstraint() {
         return this.constraint;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/ExtendedNodeImpl.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -8,9 +8,6 @@
 
 public class ExtendedNodeImpl extends NodeImpl {
 	
-	// TODO: not all sequence nodes need entry/exit actions or timers,
-	// could this be added in a more modular way ?
-
 	public static final String EVENT_NODE_ENTER = "onEntry";
 	public static final String EVENT_NODE_EXIT = "onExit";
 	

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -183,6 +183,44 @@
         }
     }
     
+    /** Helper method for nodes that have at most one default incoming connection */
+	public Connection getFrom() {
+        final List<Connection> list =
+            getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
+        if (list.size() == 0) {
+            return null;
+        }
+        if (list.size() == 1) {
+        	return list.get(0);
+        }
+        throw new IllegalArgumentException(
+    		"Trying to retrieve the from connection but multiple connections are present");
+    }
+
+    /** Helper method for nodes that have at most one default outgoing connection */
+    public Connection getTo() {
+        final List<Connection> list =
+            getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
+        if (list.size() == 0) {
+            return null;
+        }
+        if (list.size() == 1) {
+        	return list.get(0);
+        }
+        throw new IllegalArgumentException(
+    		"Trying to retrieve the to connection but multiple connections are present");
+    }
+
+    /** Helper method for nodes that have multiple default incoming connections */
+    public List<Connection> getDefaultIncomingConnections() {
+        return getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
+    }
+
+    /** Helper method for nodes that have multiple default outgoing connections */
+    public List<Connection> getDefaultOutgoingConnections() {
+        return getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
+    }
+
     public NodeContainer getNodeContainer() {
         return nodeContainer;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ActionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ActionNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ActionNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,6 +1,8 @@
 package org.drools.workflow.core.node;
 
+import org.drools.definition.process.Connection;
 import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
 /*
  * Copyright 2005 JBoss Inc
@@ -24,7 +26,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class ActionNode extends SequenceNode {
+public class ActionNode extends ExtendedNodeImpl {
 
 	private static final long serialVersionUID = 400L;
 	
@@ -38,4 +40,28 @@
 		this.action = action;
 	}
 
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getTo() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -17,7 +17,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class CompositeNode extends NodeImpl implements NodeContainer, EventNodeInterface {
+public class CompositeNode extends StateBasedNode implements NodeContainer, EventNodeInterface {
 
     private static final long serialVersionUID = 400L;
     
@@ -323,7 +323,9 @@
     
     public class NodeAndType implements Serializable {
 
-        private long nodeId;
+		private static final long serialVersionUID = 1L;
+		
+		private long nodeId;
         private String type;
         private transient Node node;
         
@@ -410,15 +412,6 @@
             return inType;
         }
         
-        public Connection getTo() {
-            final List<Connection> list =
-                getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
-            if (list.size() > 0) {
-                return (Connection) list.get(0);
-            }
-            return null;
-        }
-        
     }
     
     public class CompositeNodeEnd extends NodeImpl {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Constrainable.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,10 +1,19 @@
 package org.drools.workflow.core.node;
 
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionRef;
 
 public interface Constrainable {
 	
-	public void addConstraint(String name, Constraint constraint);
+	/**
+	 * Adds the given constraint.
+	 * In cases where the constraint is associated with a specific connection,
+	 * this connection will be identified using a ConnectionRef.  In other cases
+	 * the ConnectionRef will be null and can be ignored.
+	 * @param connection
+	 * @param constraint
+	 */
+	public void addConstraint(ConnectionRef connection, Constraint constraint);
 
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ConstraintTrigger.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,9 +1,12 @@
 package org.drools.workflow.core.node;
 
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionRef;
 
 public class ConstraintTrigger extends Trigger implements Constrainable {
 
+	private static final long serialVersionUID = 4L;
+
 	private String constraint;
 
 	public String getConstraint() {
@@ -14,7 +17,11 @@
 		this.constraint = constraint;
 	}
 
-    public void addConstraint(String name, Constraint constraint) {
+    public void addConstraint(ConnectionRef connection, Constraint constraint) {
+    	if (connection != null) {
+    		throw new IllegalArgumentException(
+				"A constraint trigger only accepts one simple constraint");
+    	}
         this.constraint =  constraint.getConstraint();
     }
 	

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EndNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EndNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EndNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -17,14 +17,18 @@
  */
 
 import org.drools.definition.process.Connection;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
 /**
  * Default implementation of an end node.
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class EndNode extends SequenceNode {
+public class EndNode extends ExtendedNodeImpl {
 
+	private static final String[] EVENT_TYPES =
+		new String[] { EVENT_NODE_ENTER };
+	
     private static final long serialVersionUID = 400L;
     
     private boolean terminate = true;
@@ -37,6 +41,22 @@
 		this.terminate = terminate;
 	}
 
+	public String[] getActionTypes() {
+		return EVENT_TYPES;
+	}
+	
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
 	public void validateAddOutgoingConnection(final String type, final Connection connection) {
         throw new UnsupportedOperationException(
             "An end node does not have an outgoing connection!");

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,39 +0,0 @@
-package org.drools.workflow.core.node;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.process.core.timer.Timer;
-import org.drools.workflow.core.DroolsAction;
-
-public class EventBasedNode extends SequenceNode {
-
-    private static final long serialVersionUID = 400L;
-
-	private Map<Timer, DroolsAction> timers;
-	
-	public Map<Timer, DroolsAction> getTimers() {
-		return timers;
-	}
-	
-	public void addTimer(Timer timer, DroolsAction action) {
-		if (timers == null) {
-			timers = new HashMap<Timer, DroolsAction>();
-		}
-		if (timer.getId() == 0) {
-			long id = 0;
-	        for (Timer t: timers.keySet()) {
-	            if (t.getId() > id) {
-	                id = t.getId();
-	            }
-	        }
-	        timer.setId(++id);
-		}
-		timers.put(timer, action);
-	}
-	
-	public void internalSetTimers(Map<Timer, DroolsAction> timers) {
-		this.timers = timers;
-	}
-
-}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,6 +1,7 @@
 package org.drools.workflow.core.node;
 
 import org.drools.definition.process.Connection;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
 
 /*
@@ -25,8 +26,11 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class FaultNode extends SequenceNode {
+public class FaultNode extends ExtendedNodeImpl {
 
+	private static final String[] EVENT_TYPES =
+		new String[] { EVENT_NODE_ENTER };
+	
 	private static final long serialVersionUID = 400L;
 	
 	private String faultName;
@@ -48,9 +52,29 @@
 		this.faultName = faultName;
 	}
 	
+	public String[] getActionTypes() {
+		return EVENT_TYPES;
+	}
+	
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
 	public void validateAddOutgoingConnection(final String type, final Connection connection) {
         throw new UnsupportedOperationException(
             "A fault node does not have an outgoing connection!");
     }
 
+    public void validateRemoveOutgoingConnection(final String type, final Connection connection) {
+        throw new UnsupportedOperationException(
+            "A fault node does not have an outgoing connection!");
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -8,6 +8,7 @@
 import org.drools.process.core.context.variable.VariableScope;
 import org.drools.process.core.datatype.DataType;
 import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
 /*
  * Copyright 2005 JBoss Inc
@@ -163,11 +164,11 @@
         this.waitForCompletion = waitForCompletion;
     }
 
-   public class ForEachSplitNode extends SequenceNode {
+   public class ForEachSplitNode extends ExtendedNodeImpl {
         private static final long serialVersionUID = 4L;
     }
 
-    public class ForEachJoinNode extends SequenceNode {
+    public class ForEachJoinNode extends ExtendedNodeImpl {
         private static final long serialVersionUID = 4L;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Join.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Join.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Join.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -77,21 +77,7 @@
     	return n;
     }
 
-    public Connection getTo() {
-        final List<Connection> list =
-            getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
-        if (list.size() > 0) {
-            return (Connection) list.get(0);
-        }
-        return null;
-    }
-    
-    public List<Connection> getDefaultIncomingConnections() {
-        return getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
-    }
-
-    public void validateAddIncomingConnection(final String type,
-            final Connection connection) {
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
         super.validateAddIncomingConnection(type, connection);
         if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
             throw new IllegalArgumentException(
@@ -105,7 +91,7 @@
             throw new IllegalArgumentException(
                 "This type of node only accepts default outgoing connection type!");
         }
-        if (!getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
+        if (getTo() != null) {
             throw new IllegalArgumentException(
                 "This type of node cannot have more than one outgoing connection");
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,6 +1,8 @@
 package org.drools.workflow.core.node;
 
+import org.drools.definition.process.Connection;
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionRef;
 
 /*
  * Copyright 2005 JBoss Inc
@@ -24,15 +26,20 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class MilestoneNode extends EventBasedNode implements Constrainable {
+public class MilestoneNode extends StateBasedNode implements Constrainable {
 
-	private static final long serialVersionUID = 8552568488755348247L;
+	private static final long serialVersionUID = 4L;
 
-	private String            constraint;
+	private String constraint;
 
-    public void addConstraint(String name, Constraint constraint) {
+    public void addConstraint(ConnectionRef connection, Constraint constraint) {
+    	if (connection != null) {
+    		throw new IllegalArgumentException(
+				"A Milestone node only accepts one simple constraint");
+    	}
         this.constraint = constraint.getConstraint();
     }
+    
     public void setConstraint(String constraint){
         this.constraint = constraint;
     }
@@ -41,4 +48,28 @@
         return this.constraint;
     }
     
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getTo() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/RuleSetNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/RuleSetNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/RuleSetNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,5 +1,7 @@
 package org.drools.workflow.core.node;
 
+import org.drools.definition.process.Connection;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -22,7 +24,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleSetNode extends EventBasedNode {
+public class RuleSetNode extends StateBasedNode {
 
     private static final long serialVersionUID = 400L;
 
@@ -36,4 +38,28 @@
         return this.ruleFlowGroup;
     }
 
-}
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getTo() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SequenceNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,60 +0,0 @@
-package org.drools.workflow.core.node;
-
-import java.util.List;
-
-import org.drools.definition.process.Connection;
-import org.drools.workflow.core.impl.ExtendedNodeImpl;
-
-/**
- * 
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public abstract class SequenceNode extends ExtendedNodeImpl {
-
-	private static final long serialVersionUID = 4L;
-
-	public Connection getFrom() {
-        final List<Connection> list =
-            getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
-        if (list.size() > 0) {
-            return (Connection) list.get(0);
-        }
-        return null;
-    }
-
-    public Connection getTo() {
-        final List<Connection> list =
-            getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
-        if (list.size() > 0) {
-            return (Connection) list.get(0);
-        }
-        return null;
-    }
-
-    public void validateAddIncomingConnection(final String type,
-            final Connection connection) {
-        super.validateAddIncomingConnection(type, connection);
-        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
-            throw new IllegalArgumentException(
-                "This type of node only accepts default incoming connection type!");
-        }
-        if (getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE) != null
-                && !getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
-            throw new IllegalArgumentException(
-                "This type of node cannot have more than one incoming connection!");
-        }
-    }
-
-    public void validateAddOutgoingConnection(final String type, final Connection connection) {
-        super.validateAddOutgoingConnection(type, connection);
-        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
-            throw new IllegalArgumentException(
-                "This type of node only accepts default outgoing connection type!");
-        }
-        if (getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE) != null
-                && !getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
-            throw new IllegalArgumentException(
-                "This type of node cannot have more than one outgoing connection!");
-        }
-    }
-}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-import java.io.Serializable;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -24,6 +23,7 @@
 
 import org.drools.definition.process.Connection;
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.impl.NodeImpl;
 
 /**
@@ -31,7 +31,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class Split extends NodeImpl {
+public class Split extends NodeImpl implements Constrainable {
 
     public static final int TYPE_UNDEFINED = 0;
     /**
@@ -101,11 +101,10 @@
             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)) {
+            if (!getDefaultOutgoingConnections().contains(connection)) {
                 throw new IllegalArgumentException("connection is unknown:" + connection);
             }
-            internalSetConstraint(
+            addConstraint(
                 new ConnectionRef(connection.getTo().getId(), connection.getToType()),
                 constraint);
         } else {
@@ -113,7 +112,11 @@
         }
     }
 
-    public void internalSetConstraint(ConnectionRef connectionRef, Constraint constraint) {
+    public void addConstraint(ConnectionRef connectionRef, Constraint constraint) {
+    	if (connectionRef == null) {
+    		throw new IllegalArgumentException(
+				"A split node only accepts constraints linked to a connection");
+    	}
         this.constraints.put(connectionRef, constraint);
     }
 
@@ -121,21 +124,7 @@
         return Collections.unmodifiableMap( this.constraints );
     }
 
-    public Connection getFrom() {
-        final List<Connection> list =
-            getIncomingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
-        if (list.size() > 0) {
-            return (Connection) list.get(0);
-        }
-        return null;
-    }
-    
-    public List<Connection> getDefaultOutgoingConnections() {
-        return getOutgoingConnections(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE);
-    }
-
-    public void validateAddIncomingConnection(final String type,
-            final Connection connection) {
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
         super.validateAddIncomingConnection(type, connection);
         if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
             throw new IllegalArgumentException(
@@ -169,37 +158,4 @@
     	this.constraints.remove(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/core/node/StartNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StartNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StartNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -20,14 +20,18 @@
 import java.util.List;
 
 import org.drools.definition.process.Connection;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
 /**
  * Default implementation of a start node.
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class StartNode extends SequenceNode {
+public class StartNode extends ExtendedNodeImpl {
 
+	private static final String[] EVENT_TYPES =
+		new String[] { EVENT_NODE_EXIT };
+	
     private static final long serialVersionUID = 400L;
     
     private List<Trigger> triggers;
@@ -53,6 +57,10 @@
 		this.triggers = triggers;
 	}
 		
+	public String[] getActionTypes() {
+		return EVENT_TYPES;
+	}
+	
     public void validateAddIncomingConnection(final String type, final Connection connection) {
         throw new UnsupportedOperationException(
             "A start node does not have an incoming connection!");
@@ -63,4 +71,16 @@
             "A start node does not have an incoming connection!");
     }
     
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getTo() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateBasedNode.java (from rev 26918, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateBasedNode.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateBasedNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,42 @@
+package org.drools.workflow.core.node;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.process.core.timer.Timer;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
+
+public class StateBasedNode extends ExtendedNodeImpl {
+
+    private static final long serialVersionUID = 400L;
+
+	private Map<Timer, DroolsAction> timers;
+	
+	public Map<Timer, DroolsAction> getTimers() {
+		return timers;
+	}
+	
+	public void addTimer(Timer timer, DroolsAction action) {
+		if (timers == null) {
+			timers = new HashMap<Timer, DroolsAction>();
+		}
+		if (timer.getId() == 0) {
+			long id = 0;
+	        for (Timer t: timers.keySet()) {
+	            if (t.getId() > id) {
+	                id = t.getId();
+	            }
+	        }
+	        timer.setId(++id);
+		}
+		timers.put(timer, action);
+	}
+	
+	public void removeAllTimers() {
+		if (timers != null) {
+			timers.clear();
+		}
+	}
+	
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateBasedNode.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/StateNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,37 +1,38 @@
 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.impl.ConnectionRef;
 
-public class StateNode extends CompositeContextNode {
+public class StateNode extends CompositeContextNode implements Constrainable {
 
 	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<ConnectionRef, Constraint> constraints) {
         this.constraints = constraints;
     }
 
-    public void setConstraint(final Connection connection,
-			final Constraint 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)) {
+		if (!getDefaultOutgoingConnections().contains(connection)) {
 			throw new IllegalArgumentException("connection is unknown:"	+ connection);
 		}
-		internalSetConstraint(
-			new ConnectionRef(connection.getTo().getId(), connection.getToType()), constraint);
+		addConstraint(new ConnectionRef(
+			connection.getTo().getId(), connection.getToType()), constraint);
 	}
 
-    public void internalSetConstraint(ConnectionRef connectionRef, Constraint constraint) {
+    public void addConstraint(ConnectionRef connectionRef, Constraint constraint) {
+    	if (connectionRef == null) {
+    		throw new IllegalArgumentException(
+				"A state node only accepts constraints linked to a connection");
+    	}
         constraints.put(connectionRef, constraint);
     }
     
@@ -51,37 +52,4 @@
         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/core/node/SubProcessNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SubProcessNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SubProcessNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -4,6 +4,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.drools.definition.process.Connection;
 import org.drools.process.core.context.variable.Mappable;
 
 /*
@@ -28,7 +29,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class SubProcessNode extends EventBasedNode implements Mappable {
+public class SubProcessNode extends StateBasedNode implements Mappable {
 
 	private static final long serialVersionUID = 400L;
 	
@@ -94,4 +95,28 @@
         this.independent = independent;
     }
 
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getTo() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/TimerNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/TimerNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/TimerNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,8 +1,10 @@
 package org.drools.workflow.core.node;
 
+import org.drools.definition.process.Connection;
 import org.drools.process.core.timer.Timer;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
-public class TimerNode extends SequenceNode {
+public class TimerNode extends ExtendedNodeImpl {
 
     private static final long serialVersionUID = 400L;
     
@@ -16,4 +18,28 @@
         return this.timer;
     }
 
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getTo() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Trigger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Trigger.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Trigger.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -9,7 +9,9 @@
 
 public class Trigger implements Mappable, Serializable {
 	
-    private Map<String, String> inMapping = new HashMap<String, String>();
+	private static final long serialVersionUID = 4L;
+	
+	private Map<String, String> inMapping = new HashMap<String, String>();
 
     public void addInMapping(String subVariableName, String variableName) {
         inMapping.put(subVariableName, variableName);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -20,6 +20,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.drools.definition.process.Connection;
 import org.drools.process.core.Work;
 import org.drools.process.core.context.variable.Mappable;
 
@@ -28,7 +29,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class WorkItemNode extends EventBasedNode implements Mappable {
+public class WorkItemNode extends StateBasedNode implements Mappable {
 
 	private static final long serialVersionUID = 400L;
 	
@@ -86,4 +87,28 @@
         this.waitForCompletion = waitForCompletion;
     }
 
+    public void validateAddIncomingConnection(final String type, final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getFrom() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
+
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getTo() != null) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
 }

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -42,7 +42,7 @@
 import org.drools.workflow.core.node.EventNodeInterface;
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.WorkflowProcessInstance;
-import org.drools.workflow.instance.node.EventBasedNodeInstance;
+import org.drools.workflow.instance.node.StateBasedNodeInstance;
 import org.drools.workflow.instance.node.EventBasedNodeInstanceInterface;
 import org.drools.workflow.instance.node.EventNodeInstance;
 import org.drools.workflow.instance.node.EventNodeInstanceInterface;
@@ -195,8 +195,8 @@
 	public void disconnect() {
 		removeEventListeners();
 		for (NodeInstance nodeInstance : nodeInstances) {
-			if (nodeInstance instanceof EventBasedNodeInstance) {
-				((EventBasedNodeInstance) nodeInstance).removeEventListeners();
+			if (nodeInstance instanceof StateBasedNodeInstance) {
+				((StateBasedNodeInstance) nodeInstance).removeEventListeners();
 			}
 		}
 		super.disconnect();

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -34,6 +34,7 @@
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.NodeInstanceContainer;
 import org.drools.workflow.instance.WorkflowProcessInstance;
+import org.drools.workflow.instance.impl.ExtendedNodeInstanceImpl;
 import org.drools.workflow.instance.impl.NodeInstanceFactory;
 import org.drools.workflow.instance.impl.NodeInstanceFactoryRegistry;
 import org.drools.workflow.instance.impl.NodeInstanceImpl;
@@ -43,7 +44,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class CompositeNodeInstance extends NodeInstanceImpl implements NodeInstanceContainer, EventNodeInstanceInterface, EventBasedNodeInstanceInterface {
+public class CompositeNodeInstance extends StateBasedNodeInstance implements NodeInstanceContainer, EventNodeInstanceInterface, EventBasedNodeInstanceInterface {
 
     private static final long serialVersionUID = 400L;
     
@@ -81,21 +82,30 @@
     }
     
     public void internalTrigger(final org.drools.runtime.process.NodeInstance from, String type) {
+    	super.internalTrigger(from, type);
         CompositeNode.NodeAndType nodeAndType = getCompositeNode().internalGetLinkedIncomingNode(type);
-        List<Connection> connections = nodeAndType.getNode().getIncomingConnections(nodeAndType.getType());
-        for (Iterator<Connection> iterator = connections.iterator(); iterator.hasNext(); ) {
-            Connection connection = iterator.next();
-            if ((connection.getFrom() instanceof CompositeNode.CompositeNodeStart) &&
-            		(from == null || 
-    				((CompositeNode.CompositeNodeStart) connection.getFrom()).getInNode().getId() == from.getNodeId())) {
-                NodeInstance nodeInstance = getNodeInstance(connection.getFrom());
-                ((org.drools.workflow.instance.NodeInstance) nodeInstance).trigger(null, nodeAndType.getType());
-                return;
-            }
+        if (nodeAndType != null) {
+	        List<Connection> connections = nodeAndType.getNode().getIncomingConnections(nodeAndType.getType());
+	        for (Iterator<Connection> iterator = connections.iterator(); iterator.hasNext(); ) {
+	            Connection connection = iterator.next();
+	            if ((connection.getFrom() instanceof CompositeNode.CompositeNodeStart) &&
+	            		(from == null || 
+	    				((CompositeNode.CompositeNodeStart) connection.getFrom()).getInNode().getId() == from.getNodeId())) {
+	                NodeInstance nodeInstance = getNodeInstance(connection.getFrom());
+	                ((org.drools.workflow.instance.NodeInstance) nodeInstance).trigger(null, nodeAndType.getType());
+	                return;
+	            }
+	        }
         }
-        throw new IllegalArgumentException(
-            "Could not find start for composite node: " + type);
+        if (isLinkedIncomingNodeRequired()) {
+	        throw new IllegalArgumentException(
+	            "Could not find start for composite node: " + type);
+        }
     }
+    
+    protected boolean isLinkedIncomingNodeRequired() {
+    	return true;
+    }
 
     public void triggerCompleted(String outType) {
         triggerCompleted(outType, true);
@@ -182,6 +192,7 @@
     }
 
 	public void signalEvent(String type, Object event) {
+		super.signalEvent(type, event);
 		for (Node node: getCompositeNode().getNodes()) {
 			if (node instanceof EventNodeInterface) {
 				if (((EventNodeInterface) node).acceptsEvent(type, event)) {

Modified: 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	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/DynamicNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -35,6 +35,8 @@
     }
 
 	public void nodeInstanceCompleted(org.drools.workflow.instance.NodeInstance nodeInstance, String outType) {
+		// TODO what if we reach the end of one branch but others might still need to be created ?
+		// TODO are we sure there will always be node instances left if we are not done yet?
 		if (!executing && getNodeInstances(false).isEmpty()) {
     		triggerCompleted(NodeImpl.CONNECTION_DEFAULT_TYPE);
     	}

Deleted: 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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,128 +0,0 @@
-package org.drools.workflow.instance.node;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.drools.process.core.timer.Timer;
-import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.timer.TimerInstance;
-import org.drools.process.instance.timer.TimerManager;
-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;
-import org.drools.workflow.instance.impl.ExtendedNodeInstanceImpl;
-
-public abstract class EventBasedNodeInstance extends ExtendedNodeInstanceImpl implements EventBasedNodeInstanceInterface, EventListener {
-	
-	private static final long serialVersionUID = 4L;
-
-	private List<Long> timerInstances;
-
-	public EventBasedNode getEventBasedNode() {
-        return (EventBasedNode) getNode();
-    }
-    
-	public void internalTrigger(NodeInstance from, String type) {
-		super.internalTrigger(from, type);
-		// activate timers
-		Map<Timer, DroolsAction> timers = getEventBasedNode().getTimers();
-		if (timers != null) {
-			addTimerListener();
-			timerInstances = new ArrayList<Long>(timers.size());
-			TimerManager timerManager = ((ProcessInstance) getProcessInstance()).getWorkingMemory().getTimerManager();
-			for (Timer timer: timers.keySet()) {
-				TimerInstance timerInstance = createTimerInstance(timer); 
-				timerManager.registerTimer(timerInstance, (ProcessInstance) getProcessInstance());
-				timerInstances.add(timerInstance.getId());
-			}
-		}
-	}
-	
-    protected TimerInstance createTimerInstance(Timer timer) {
-    	TimerInstance timerInstance = new TimerInstance();
-    	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;
-    }
-
-    public void signalEvent(String type, Object event) {
-    	if ("timerTriggered".equals(type)) {
-    		TimerInstance timerInstance = (TimerInstance) event;
-            if (timerInstances.contains(timerInstance.getId())) {
-                triggerTimer(timerInstance);
-            }
-    	}
-    }
-    
-    private void triggerTimer(TimerInstance timerInstance) {
-    	for (Map.Entry<Timer, DroolsAction> entry: getEventBasedNode().getTimers().entrySet()) {
-    		if (entry.getKey().getId() == timerInstance.getTimerId()) {
-    			KnowledgeHelper knowledgeHelper = createKnowledgeHelper();
-    			executeAction(entry.getValue(), knowledgeHelper);
-    			return;
-    		}
-    	}
-    }
-    
-    public String[] getEventTypes() {
-    	return new String[] { "timerTriggered" };
-    }
-    
-    public void triggerCompleted() {
-        triggerCompleted(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE, true);
-    }
-    
-    public void addEventListeners() {
-    	if (timerInstances != null && timerInstances.size() > 0) {
-    		addTimerListener();
-    	}
-    }
-    
-    protected void addTimerListener() {
-    	((WorkflowProcessInstance) getProcessInstance()).addEventListener("timerTriggered", this, false);
-    }
-    
-    public void removeEventListeners() {
-    	((WorkflowProcessInstance) getProcessInstance()).removeEventListener("timerTriggered", this, false);
-    }
-
-	protected void triggerCompleted(String type, boolean remove) {
-		cancelTimers();
-		super.triggerCompleted(type, remove);
-	}
-	
-	public List<Long> getTimerInstances() {
-		return timerInstances;
-	}
-	
-	public void internalSetTimerInstances(List<Long> timerInstances) {
-		this.timerInstances = timerInstances;
-	}
-
-    public void cancel() {
-        cancelTimers();
-        removeEventListeners();
-        super.cancel();
-    }
-    
-	private void cancelTimers() {
-		// deactivate still active timers
-		if (timerInstances != null) {
-			TimerManager timerManager = ((ProcessInstance) getProcessInstance()).getWorkingMemory().getTimerManager();
-			for (Long id: timerInstances) {
-				timerManager.cancelTimer(id);
-			}
-		}
-	}
-	
-}

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -41,7 +41,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class MilestoneNodeInstance extends EventBasedNodeInstance implements AgendaEventListener {
+public class MilestoneNodeInstance extends StateBasedNodeInstance implements AgendaEventListener {
 
     private static final long serialVersionUID = 400L;
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -27,7 +27,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleSetNodeInstance extends EventBasedNodeInstance
+public class RuleSetNodeInstance extends StateBasedNodeInstance
     implements
     RuleFlowGroupListener {
 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateBasedNodeInstance.java (from rev 26931, 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/StateBasedNodeInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateBasedNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,128 @@
+package org.drools.workflow.instance.node;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.process.core.timer.Timer;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.timer.TimerInstance;
+import org.drools.process.instance.timer.TimerManager;
+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.StateBasedNode;
+import org.drools.workflow.instance.WorkflowProcessInstance;
+import org.drools.workflow.instance.impl.ExtendedNodeInstanceImpl;
+
+public abstract class StateBasedNodeInstance extends ExtendedNodeInstanceImpl implements EventBasedNodeInstanceInterface, EventListener {
+	
+	private static final long serialVersionUID = 4L;
+
+	private List<Long> timerInstances;
+
+	public StateBasedNode getEventBasedNode() {
+        return (StateBasedNode) getNode();
+    }
+    
+	public void internalTrigger(NodeInstance from, String type) {
+		super.internalTrigger(from, type);
+		// activate timers
+		Map<Timer, DroolsAction> timers = getEventBasedNode().getTimers();
+		if (timers != null) {
+			addTimerListener();
+			timerInstances = new ArrayList<Long>(timers.size());
+			TimerManager timerManager = ((ProcessInstance) getProcessInstance()).getWorkingMemory().getTimerManager();
+			for (Timer timer: timers.keySet()) {
+				TimerInstance timerInstance = createTimerInstance(timer); 
+				timerManager.registerTimer(timerInstance, (ProcessInstance) getProcessInstance());
+				timerInstances.add(timerInstance.getId());
+			}
+		}
+	}
+	
+    protected TimerInstance createTimerInstance(Timer timer) {
+    	TimerInstance timerInstance = new TimerInstance();
+    	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;
+    }
+
+    public void signalEvent(String type, Object event) {
+    	if ("timerTriggered".equals(type)) {
+    		TimerInstance timerInstance = (TimerInstance) event;
+            if (timerInstances.contains(timerInstance.getId())) {
+                triggerTimer(timerInstance);
+            }
+    	}
+    }
+    
+    private void triggerTimer(TimerInstance timerInstance) {
+    	for (Map.Entry<Timer, DroolsAction> entry: getEventBasedNode().getTimers().entrySet()) {
+    		if (entry.getKey().getId() == timerInstance.getTimerId()) {
+    			KnowledgeHelper knowledgeHelper = createKnowledgeHelper();
+    			executeAction(entry.getValue(), knowledgeHelper);
+    			return;
+    		}
+    	}
+    }
+    
+    public String[] getEventTypes() {
+    	return new String[] { "timerTriggered" };
+    }
+    
+    public void triggerCompleted() {
+        triggerCompleted(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE, true);
+    }
+    
+    public void addEventListeners() {
+    	if (timerInstances != null && timerInstances.size() > 0) {
+    		addTimerListener();
+    	}
+    }
+    
+    protected void addTimerListener() {
+    	((WorkflowProcessInstance) getProcessInstance()).addEventListener("timerTriggered", this, false);
+    }
+    
+    public void removeEventListeners() {
+    	((WorkflowProcessInstance) getProcessInstance()).removeEventListener("timerTriggered", this, false);
+    }
+
+	protected void triggerCompleted(String type, boolean remove) {
+		cancelTimers();
+		super.triggerCompleted(type, remove);
+	}
+	
+	public List<Long> getTimerInstances() {
+		return timerInstances;
+	}
+	
+	public void internalSetTimerInstances(List<Long> timerInstances) {
+		this.timerInstances = timerInstances;
+	}
+
+    public void cancel() {
+        cancelTimers();
+        removeEventListeners();
+        super.cancel();
+    }
+    
+	private void cancelTimers() {
+		// deactivate still active timers
+		if (timerInstances != null) {
+			TimerManager timerManager = ((ProcessInstance) getProcessInstance()).getWorkingMemory().getTimerManager();
+			for (Long id: timerInstances) {
+				timerManager.cancelTimer(id);
+			}
+		}
+	}
+	
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateBasedNodeInstance.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -21,6 +21,7 @@
 import org.drools.runtime.process.NodeInstance;
 import org.drools.spi.Activation;
 import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 import org.drools.workflow.core.impl.NodeImpl;
 import org.drools.workflow.core.node.StateNode;
 import org.drools.workflow.instance.NodeInstanceContainer;
@@ -34,6 +35,7 @@
     }
     
 	public void internalTrigger(NodeInstance from, String type) {
+		super.internalTrigger(from, type);
         // TODO: composite states trigger
         StateNode stateNode = getStateNode();
         Connection selected = null;
@@ -62,14 +64,33 @@
         }
 	}
 	
+    protected boolean isLinkedIncomingNodeRequired() {
+    	return false;
+    }
+    
 	public void signalEvent(String type, Object event) {
 		if ("signal".equals(type)) {
-			String connectionType = NodeImpl.CONNECTION_DEFAULT_TYPE;
 			if (event instanceof String) {
-				connectionType = (String) event;
+				for (Connection connection: getStateNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
+					boolean selected = false;
+					Constraint constraint = getStateNode().getConstraint(connection);
+					if (constraint == null) {
+						if (((String) event).equals(connection.getTo().getName())) {
+							selected = true;
+						}
+					} else if (((String) event).equals(constraint.getName())) {
+						selected = true;
+					}
+					if (selected) {
+						triggerEvent(ExtendedNodeImpl.EVENT_NODE_EXIT);
+						removeEventListeners();
+						((org.drools.workflow.instance.NodeInstanceContainer) getNodeInstanceContainer())
+		            		.removeNodeInstance(this);
+						triggerConnection(connection);
+						return;
+					}
+				}
 			}
-			removeEventListeners();
-			triggerCompleted(connectionType, true);
 		} else {
 			super.signalEvent(type, event);
 		}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -38,7 +38,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class SubProcessNodeInstance extends EventBasedNodeInstance implements EventListener {
+public class SubProcessNodeInstance extends StateBasedNodeInstance implements EventListener {
 
     private static final long serialVersionUID = 400L;
     private static final Pattern PARAMETER_MATCHER = Pattern.compile("#\\{(\\S+)\\}", Pattern.DOTALL);

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -9,7 +9,7 @@
 import org.drools.workflow.core.node.TimerNode;
 import org.drools.workflow.instance.WorkflowProcessInstance;
 
-public class TimerNodeInstance extends EventBasedNodeInstance implements EventListener {
+public class TimerNodeInstance extends StateBasedNodeInstance implements EventListener {
 
     private static final long serialVersionUID = 400L;
     

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -43,7 +43,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class WorkItemNodeInstance extends EventBasedNodeInstance implements EventListener {
+public class WorkItemNodeInstance extends StateBasedNodeInstance implements EventListener {
 
     private static final long serialVersionUID = 400L;
     private static final Pattern PARAMETER_MATCHER = Pattern.compile("#\\{(\\S+)\\}", Pattern.DOTALL);

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/workflow/instance/node/MockNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/workflow/instance/node/MockNode.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/workflow/instance/node/MockNode.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,8 +1,8 @@
 package org.drools.workflow.instance.node;
 
-import org.drools.workflow.core.node.SequenceNode;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 
-public class MockNode extends SequenceNode {
+public class MockNode extends ExtendedNodeImpl {
 
     private static final long serialVersionUID = 400L;
 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -41,17 +41,20 @@
  */
 public abstract class DefaultElementWrapper implements ElementWrapper, IPropertySource, Serializable {
 
+	private static final long serialVersionUID = 4L;
+
 	private static boolean allowNodeCustomization =
-		DroolsEclipsePlugin.getDefault().getPreferenceStore().getBoolean(IDroolsConstants.ALLOW_NODE_CUSTOMIZATION);
+		DroolsEclipsePlugin.getDefault().getPreferenceStore().getBoolean(
+			IDroolsConstants.ALLOW_NODE_CUSTOMIZATION);
 
-	protected static IPropertyDescriptor[] descriptors;
+	protected static IPropertyDescriptor[] DESCRIPTORS;
 
     public static final String NAME = "Name";
     public static final String ID = "Id";
     public static final String COLOR = "Color";
     static {
     	if (allowNodeCustomization) {
-	        descriptors = new IPropertyDescriptor[] {
+	        DESCRIPTORS = new IPropertyDescriptor[] {
 	            new TextPropertyDescriptor(NAME, "Name"),
 	            new TextPropertyDescriptor(ID, "Id") {
 	            	public CellEditor createPropertyEditor(Composite parent) {
@@ -61,7 +64,7 @@
 	            new ColorPropertyDescriptor(COLOR, "Color"),
 	        };
     	} else {
-    		descriptors = new IPropertyDescriptor[] {
+    		DESCRIPTORS = new IPropertyDescriptor[] {
 	            new TextPropertyDescriptor(NAME, "Name"),
 	            new TextPropertyDescriptor(ID, "Id") {
 	            	public CellEditor createPropertyEditor(Composite parent) {
@@ -215,7 +218,7 @@
 	}
 
 	public IPropertyDescriptor[] getPropertyDescriptors() {
-		return descriptors;
+		return DESCRIPTORS;
 	}
 
 	public Object getEditableValue() {

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/ElementContainerElementWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/ElementContainerElementWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/common/editor/core/ElementContainerElementWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -5,9 +5,11 @@
 
 public abstract class ElementContainerElementWrapper extends DefaultElementWrapper implements ElementContainer {
 
-    public static final int ADD_ELEMENT = 5;
+	public static final int ADD_ELEMENT = 5;
     public static final int REMOVE_ELEMENT = 6;
     
+    private static final long serialVersionUID = 4L;
+    
     List<ElementWrapper> elements = new ArrayList<ElementWrapper>();
     
     public void addElement(ElementWrapper element) {

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -43,8 +43,8 @@
     }
     
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ActionPropertyDescriptor(ACTION, "Action", getActionNode(), (WorkflowProcess) getParent().getProcessWrapper().getProcess());
     }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -48,8 +48,8 @@
 	}
 
     private void initPropertyDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 4];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 4];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 4] = 
             new TextPropertyDescriptor(START_NODE, "StartNodeId");
         descriptors[descriptors.length - 3] = 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,17 +1,35 @@
 package org.drools.eclipse.flow.ruleflow.core;
 
+import java.util.List;
+import java.util.Map;
+
+import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
 import org.drools.eclipse.flow.common.editor.core.ElementConnection;
 import org.drools.eclipse.flow.common.editor.core.ElementContainerElementWrapper;
 import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
+import org.drools.eclipse.flow.ruleflow.view.property.action.OnEntryActionsPropertyDescriptor;
+import org.drools.eclipse.flow.ruleflow.view.property.action.OnExitActionsPropertyDescriptor;
+import org.drools.eclipse.flow.ruleflow.view.property.timers.TimersPropertyDescriptor;
+import org.drools.process.core.timer.Timer;
+import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 import org.drools.workflow.core.node.CompositeNode;
 import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
 
 public abstract class CompositeNodeWrapper extends ElementContainerElementWrapper implements NodeWrapper {
 
-    private static final long serialVersionUID = 400L;
+	public static final String ON_ENTRY_ACTIONS = "OnEntryActions";
+	public static final String ON_EXIT_ACTIONS = "OnExitActions";
+    public static final String TIMERS = "Timers";
+	
+    protected IPropertyDescriptor[] descriptors;
     
-    public void setNode(Node node) {
+	private static final long serialVersionUID = 4L;
+
+	public void setNode(Node node) {
         setElement(node);
     }
     
@@ -80,4 +98,68 @@
         getCompositeNode().removeNode(((NodeWrapper) element).getNode());
     }
  
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+    	if (descriptors == null) {
+    		initDescriptors();
+    	}
+        return descriptors;
+    }
+
+    protected void initDescriptors() {
+    	IPropertyDescriptor[] oldDescriptors = DefaultElementWrapper.DESCRIPTORS; 
+        descriptors = new IPropertyDescriptor[oldDescriptors.length + 3];
+        System.arraycopy(oldDescriptors, 0, descriptors, 0, oldDescriptors.length);
+        descriptors[descriptors.length - 3] = new OnEntryActionsPropertyDescriptor(
+    			ON_ENTRY_ACTIONS, "On Entry Actions", getCompositeNode(),
+    			(WorkflowProcess) getParent().getProcessWrapper().getProcess());
+        descriptors[descriptors.length - 2] = new OnExitActionsPropertyDescriptor(
+    			ON_EXIT_ACTIONS, "On Exit Actions", getCompositeNode(),
+    			(WorkflowProcess) getParent().getProcessWrapper().getProcess());
+        descriptors[descriptors.length - 1] = 
+            new TimersPropertyDescriptor(TIMERS, "Timers", getCompositeNode(),
+        		(WorkflowProcess) getParent().getProcessWrapper().getProcess());
+    }
+    
+    public Object getPropertyValue(Object id) {
+        if (ON_ENTRY_ACTIONS.equals(id)) {
+            return getCompositeNode().getActions(ExtendedNodeImpl.EVENT_NODE_ENTER);
+        }
+        if (ON_EXIT_ACTIONS.equals(id)) {
+            return getCompositeNode().getActions(ExtendedNodeImpl.EVENT_NODE_EXIT);
+        }
+        if (TIMERS.equals(id)) {
+            return getCompositeNode().getTimers();
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (ON_ENTRY_ACTIONS.equals(id)) {
+        	getCompositeNode().setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, null);
+        } else if (ON_EXIT_ACTIONS.equals(id)) {
+        	getCompositeNode().setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, null);
+        } else if (TIMERS.equals(id)) {
+        	getCompositeNode().removeAllTimers();
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+	public void setPropertyValue(Object id, Object value) {
+        if (ON_ENTRY_ACTIONS.equals(id)) {
+        	getCompositeNode().setActions(ExtendedNodeImpl.EVENT_NODE_ENTER, (List<DroolsAction>) value);
+        } else if (ON_EXIT_ACTIONS.equals(id)) {
+        	getCompositeNode().setActions(ExtendedNodeImpl.EVENT_NODE_EXIT, (List<DroolsAction>) value);
+        } else if (TIMERS.equals(id)) {
+        	getCompositeNode().removeAllTimers();
+        	// adding one by one so the ids are set correctly
+        	for (Map.Entry<Timer, DroolsAction> entry: ((Map<Timer, DroolsAction>) value).entrySet()) {
+        		getCompositeNode().addTimer(entry.getKey(), entry.getValue());
+        	}
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -35,8 +35,8 @@
     private static IPropertyDescriptor[] descriptors;
 
     static {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ComboBoxPropertyDescriptor(TERMINATE, "Terminate", new String[] { "true", "false" });
     }

Deleted: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventBasedNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventBasedNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventBasedNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,64 +0,0 @@
-package org.drools.eclipse.flow.ruleflow.core;
-
-import java.util.Map;
-
-import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
-import org.drools.eclipse.flow.ruleflow.view.property.timers.TimersPropertyDescriptor;
-import org.drools.process.core.timer.Timer;
-import org.drools.workflow.core.DroolsAction;
-import org.drools.workflow.core.WorkflowProcess;
-import org.drools.workflow.core.node.EventBasedNode;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-
-public class EventBasedNodeWrapper extends ExtendedNodeWrapper {
-
-    public static final String TIMERS = "Timers";
-
-	private static final long serialVersionUID = 1L;
-	
-    protected IPropertyDescriptor[] descriptors;
-    
-    public EventBasedNode getEventBasedNode() {
-    	return (EventBasedNode) getNode();
-    }
-
-    protected void initDescriptors() {
-    	descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
-        descriptors[descriptors.length - 1] = 
-            new TimersPropertyDescriptor(TIMERS, "Timers", getEventBasedNode(),
-        		(WorkflowProcess) getParent().getProcessWrapper().getProcess());
-    }
-
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-    	if (descriptors == null) {
-    		initDescriptors();
-    	}
-        return descriptors;
-    }
-
-    public Object getPropertyValue(Object id) {
-        if (TIMERS.equals(id)) {
-            return getEventBasedNode().getTimers();
-        }
-        return super.getPropertyValue(id);
-    }
-
-    public void resetPropertyValue(Object id) {
-        if (TIMERS.equals(id)) {
-        	getEventBasedNode().internalSetTimers(null);
-        } else {
-            super.resetPropertyValue(id);
-        }
-    }
-
-	@SuppressWarnings("unchecked")
-	public void setPropertyValue(Object id, Object value) {
-        if (TIMERS.equals(id)) {
-        	getEventBasedNode().internalSetTimers((Map<Timer, DroolsAction>) value);
-        } else {
-            super.setPropertyValue(id, value);
-        }
-    }
-    
-}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -42,8 +42,8 @@
     public static final String EVENT_TYPE = "eventType";
     public static final String SCOPE = "scope";
     static {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 3];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 3];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 3] = 
             new ComboBoxPropertyDescriptor(SCOPE, "Scope", new String[] { "internal", "external" });
         descriptors[descriptors.length - 2] = 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -35,8 +35,8 @@
 	private static final long serialVersionUID = 4L;
 	private static IPropertyDescriptor[] descriptors;
 	static {
-		descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 2];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+		descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 2];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 2] = 
             new TextPropertyDescriptor(FAULT_NAME, "FaultName");
         descriptors[descriptors.length - 1] = 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ForEachNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ForEachNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ForEachNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -21,8 +21,8 @@
     private static IPropertyDescriptor[] descriptors;
 
     static {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 4];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 4];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 4] = 
             new TextPropertyDescriptor(VARIABLE_NAME, "Variable Name");
         descriptors[descriptors.length - 3] = 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -54,8 +54,8 @@
     }
 
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ComboBoxPropertyDescriptor(TYPE, "Type", new String[] { "", "AND", "XOR", "Discriminator", "n-of-m" });
     }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -27,7 +27,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class MilestoneWrapper extends EventBasedNodeWrapper {
+public class MilestoneWrapper extends StateBasedNodeWrapper {
 
     public static final String CONSTRAINT = "Constraint";
 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -7,13 +7,13 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.drools.definition.process.Connection;
+import org.drools.definition.process.Node;
+import org.drools.definition.process.Process;
 import org.drools.eclipse.WorkItemDefinitions;
 import org.drools.eclipse.flow.common.editor.core.ElementContainer;
 import org.drools.eclipse.flow.common.editor.core.ProcessWrapper;
 import org.drools.eclipse.flow.common.editor.core.ProcessWrapperBuilder;
-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.WorkDefinition;
 import org.drools.process.core.impl.WorkDefinitionImpl;
@@ -31,11 +31,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.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.dialogs.MessageDialog;
 
 public class RuleFlowWrapperBuilder implements ProcessWrapperBuilder {
     
@@ -76,7 +76,9 @@
             	for (Node subNode: ((CompositeNode) node).getNodes()) {
             		subNodes.add(subNode);
             	}
-            	processNodes(subNodes, new HashSet<Connection>(), (CompositeNodeWrapper) nodeWrapper, project);
+            	if (subNodes.size() > 0) {
+            		processNodes(subNodes, new HashSet<Connection>(), (CompositeNodeWrapper) nodeWrapper, project);
+            	}
             }
         }
         for (Connection connection: connections) {
@@ -107,6 +109,8 @@
             return new SubProcessWrapper();
         } else if (node instanceof ForEachNode) {
             return new ForEachNodeWrapper();
+        } else if (node instanceof StateNode) {
+        	return new StateNodeWrapper();
         } else if (node instanceof CompositeContextNode) {
             return new CompositeContextNodeWrapper();
         } else if (node instanceof Join) {

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleSetNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleSetNodeWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleSetNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -26,7 +26,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleSetNodeWrapper extends EventBasedNodeWrapper {
+public class RuleSetNodeWrapper extends StateBasedNodeWrapper {
 
     private static final long serialVersionUID = 400L;
 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -21,16 +21,16 @@
 import java.util.Iterator;
 import java.util.Map;
 
+import org.drools.definition.process.Connection;
 import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
 import org.drools.eclipse.flow.common.editor.core.ElementConnection;
 import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
 import org.drools.eclipse.flow.ruleflow.view.property.constraint.ConstraintsPropertyDescriptor;
-import org.drools.definition.process.Connection;
 import org.drools.workflow.core.Constraint;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.node.Split;
-import org.drools.workflow.core.node.Split.ConnectionRef;
 import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 
@@ -88,8 +88,8 @@
     }
      
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ComboBoxPropertyDescriptor(TYPE, "Type", 
                 new String[] { "", "AND", "XOR", "OR" });
@@ -123,8 +123,8 @@
         if (CONSTRAINTS.equals(id)) {
         	return getSplit().getType() == Split.TYPE_XOR
         		|| getSplit().getType() == Split.TYPE_OR
-        		? new MyHashMap<Split.ConnectionRef, Constraint>(getSplit().getConstraints())
-	            : new MyHashMap<Split.ConnectionRef, Constraint>();
+        		? new MyHashMap<ConnectionRef, Constraint>(getSplit().getConstraints())
+	            : new MyHashMap<ConnectionRef, Constraint>();
         }
         return super.getPropertyValue(id);
     }
@@ -151,10 +151,10 @@
             notifyListeners(CHANGE_TYPE);
             updateConnectionLabels();
         } else if (CONSTRAINTS.equals(id)) {
-        	Iterator<Map.Entry<Split.ConnectionRef, Constraint>> iterator = ((Map<Split.ConnectionRef, Constraint>) value).entrySet().iterator();
+        	Iterator<Map.Entry<ConnectionRef, Constraint>> iterator = ((Map<ConnectionRef, Constraint>) value).entrySet().iterator();
         	while (iterator.hasNext()) {
-				Map.Entry<Split.ConnectionRef, Constraint> element = iterator.next();
-				Split.ConnectionRef connectionRef = element.getKey();
+				Map.Entry<ConnectionRef, Constraint> element = iterator.next();
+				ConnectionRef connectionRef = element.getKey();
 				Connection outgoingConnection = null; 
 				for (Connection out: getSplit().getDefaultOutgoingConnections()) {
 				    if (out.getToType().equals(connectionRef.getToType())

Copied: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java (from rev 26936, labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventBasedNodeWrapper.java)
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,68 @@
+package org.drools.eclipse.flow.ruleflow.core;
+
+import java.util.Map;
+
+import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
+import org.drools.eclipse.flow.ruleflow.view.property.timers.TimersPropertyDescriptor;
+import org.drools.process.core.timer.Timer;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.node.StateBasedNode;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+public class StateBasedNodeWrapper extends ExtendedNodeWrapper {
+
+    public static final String TIMERS = "Timers";
+
+	private static final long serialVersionUID = 4L;
+	
+    protected IPropertyDescriptor[] descriptors;
+    
+    public StateBasedNode getStateBasedNode() {
+    	return (StateBasedNode) getNode();
+    }
+
+    protected void initDescriptors() {
+    	descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        descriptors[descriptors.length - 1] = 
+            new TimersPropertyDescriptor(TIMERS, "Timers", getStateBasedNode(),
+        		(WorkflowProcess) getParent().getProcessWrapper().getProcess());
+    }
+
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+    	if (descriptors == null) {
+    		initDescriptors();
+    	}
+        return descriptors;
+    }
+
+    public Object getPropertyValue(Object id) {
+        if (TIMERS.equals(id)) {
+            return getStateBasedNode().getTimers();
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (TIMERS.equals(id)) {
+        	getStateBasedNode().removeAllTimers();
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+	@SuppressWarnings("unchecked")
+	public void setPropertyValue(Object id, Object value) {
+        if (TIMERS.equals(id)) {
+        	getStateBasedNode().removeAllTimers();
+        	// adding one by one so the ids are set correctly
+        	for (Map.Entry<Timer, DroolsAction> entry: ((Map<Timer, DroolsAction>) value).entrySet()) {
+        		getStateBasedNode().addTimer(entry.getKey(), entry.getValue());
+        	}
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateNodeWrapper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateNodeWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,165 @@
+package org.drools.eclipse.flow.ruleflow.core;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.drools.definition.process.Connection;
+import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
+import org.drools.eclipse.flow.common.editor.core.ElementConnection;
+import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
+import org.drools.eclipse.flow.ruleflow.view.property.constraint.StateConstraintsPropertyDescriptor;
+import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.ConnectionRef;
+import org.drools.workflow.core.impl.NodeImpl;
+import org.drools.workflow.core.node.StateNode;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * Wrapper for a milestone node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class StateNodeWrapper extends StateBasedNodeWrapper {
+
+    public static final String CONSTRAINTS = "constraints";
+
+	private static final long serialVersionUID = 4L;
+
+    public StateNodeWrapper() {
+        setNode(new StateNode());
+        getStateNode().setName("State");
+    }
+    
+    protected void initDescriptors() {
+    	super.initDescriptors();
+    	IPropertyDescriptor[] oldDescriptors = descriptors; 
+        descriptors = new IPropertyDescriptor[oldDescriptors.length + 3];
+    	System.arraycopy(oldDescriptors, 0, descriptors, 0, oldDescriptors.length);
+    	descriptors[descriptors.length - 3] = getOnEntryPropertyDescriptor();
+    	descriptors[descriptors.length - 2] = getOnExitPropertyDescriptor();
+        descriptors[descriptors.length - 1] = 
+            new StateConstraintsPropertyDescriptor(CONSTRAINTS, "Constraints",
+        		getStateNode(), (WorkflowProcess) getParent().getProcessWrapper().getProcess());
+    }
+
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+    	if (descriptors == null) {
+    		initDescriptors();
+    	}
+        return descriptors;
+    }
+
+    public void setNode(Node node) {
+    	super.setNode(node);
+    	for (Connection connection: getStateNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
+    		String label = null;
+    		Constraint constraint = getStateNode().getConstraint(connection);
+			if (constraint != null) {
+				label = constraint.getName();
+			}
+			((org.drools.workflow.core.Connection) connection).setMetaData("label", label);
+    	}
+    }
+    
+    public StateNode getStateNode() {
+        return (StateNode) getNode();
+    }
+    
+    private void updateConnectionLabels() {
+    	for (ElementConnection connection: getOutgoingConnections()) {
+    		updateConnectionLabel(connection);
+    	}
+    }
+    
+    private void updateConnectionLabel(ElementConnection connection) {
+    	ConnectionWrapper connectionWrapper = (ConnectionWrapper) connection;
+		String label = null;
+		Constraint constraint = getStateNode().getConstraint(
+			connectionWrapper.getConnection());
+		if (constraint != null) {
+			label = constraint.getName();
+		}
+		connectionWrapper.getConnection().setMetaData("label", label);
+		connectionWrapper.notifyListeners(ElementConnection.CHANGE_LABEL);
+    }
+     
+    public boolean acceptsIncomingConnection(ElementConnection connection, ElementWrapper source) {
+        return super.acceptsIncomingConnection(connection, source)
+        	&& getIncomingConnections().isEmpty();
+    }
+
+    public Object getPropertyValue(Object id) {
+        if (CONSTRAINTS.equals(id)) {
+    		return new MyHashMap<ConnectionRef, Constraint>(
+				getStateNode().getConstraints());
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (CONSTRAINTS.equals(id)) {
+        	for (Connection connection: getStateNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
+        		getStateNode().setConstraint(connection, null);
+        	}
+            updateConnectionLabels();
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+	public void setPropertyValue(Object id, Object value) {
+    	if (CONSTRAINTS.equals(id)) {
+        	Iterator<Map.Entry<ConnectionRef, Constraint>> iterator = ((Map<ConnectionRef, Constraint>) value).entrySet().iterator();
+        	while (iterator.hasNext()) {
+				Map.Entry<ConnectionRef, Constraint> element = iterator.next();
+				ConnectionRef connectionRef = element.getKey();
+				Connection outgoingConnection = null; 
+				for (Connection out: getStateNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
+				    if (out.getToType().equals(connectionRef.getToType())
+			            && out.getTo().getId() == connectionRef.getNodeId()) {
+				        outgoingConnection = out;
+				    }
+				}
+				if (outgoingConnection == null) {
+				    throw new IllegalArgumentException("Could not find outgoing connection");
+				}
+				getStateNode().setConstraint(outgoingConnection, (Constraint) element.getValue()); 
+			}
+        	updateConnectionLabels();
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+    
+    public class MyHashMap<K, V> extends HashMap<K, V> {
+		private static final long serialVersionUID = -1748055291307174539L;
+		public MyHashMap() {
+    	}
+    	public MyHashMap(Map<K, V> map) {
+    		super(map);
+    	}
+		public String toString() {
+    		return "";
+    	}
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubProcessWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubProcessWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubProcessWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -32,7 +32,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class SubProcessWrapper extends EventBasedNodeWrapper {
+public class SubProcessWrapper extends StateBasedNodeWrapper {
 
 	private static final long serialVersionUID = 3668348577732020324L;
     

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -44,8 +44,8 @@
     }
     
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 2];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 2];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 2] = 
             new TextPropertyDescriptor(TIMER_DELAY, "Timer Delay");
         descriptors[descriptors.length - 1] = 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/WorkItemWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/WorkItemWrapper.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/WorkItemWrapper.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -39,7 +39,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class WorkItemWrapper extends EventBasedNodeWrapper {
+public class WorkItemWrapper extends StateBasedNodeWrapper {
 
     public static final String WAIT_FOR_COMPLETION = "WaitForCompletion";
     public static final String RESULT_MAPPING = "ResultMapping";

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -31,6 +31,7 @@
 import org.drools.eclipse.flow.ruleflow.core.RuleSetNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SplitWrapper;
 import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.StateNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SubProcessWrapper;
 import org.drools.eclipse.flow.ruleflow.core.TimerWrapper;
 import org.drools.eclipse.flow.ruleflow.core.WorkItemWrapper;
@@ -85,6 +86,8 @@
             result = new ElementContainerEditPart();
         } else if (model instanceof EventNodeWrapper) {
             result = new EventNodeEditPart();
+        } else if (model instanceof StateNodeWrapper) {
+            result = new StateNodeEditPart();
         } else {
             throw new IllegalArgumentException(
                 "Unknown model object " + model);

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StateNodeEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StateNodeEditPart.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StateNodeEditPart.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,78 @@
+package org.drools.eclipse.flow.ruleflow.editor.editpart;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.flow.common.editor.editpart.ElementEditPart;
+import org.drools.eclipse.flow.common.editor.editpart.figure.AbstractElementFigure;
+import org.drools.eclipse.flow.ruleflow.skin.SkinManager;
+import org.drools.eclipse.flow.ruleflow.skin.SkinProvider;
+import org.drools.eclipse.preferences.IDroolsConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * EditPart for a RuleSet node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class StateNodeEditPart extends ElementEditPart {
+
+	private String SKIN =
+		DroolsEclipsePlugin.getDefault().getPreferenceStore().getString(IDroolsConstants.SKIN);
+
+	private static final Color color = new Color(Display.getCurrent(), 255, 250, 205);
+    
+    protected IFigure createFigure() {
+    	SkinProvider skinProvider = SkinManager.getInstance().getSkinProvider(SKIN);
+    	return skinProvider.createStateFigure();
+    }
+    
+    public static class StateFigure extends AbstractElementFigure {
+        
+        private static final Image ICON = ImageDescriptor.createFromURL(
+    		DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/question.gif")).createImage();
+            
+        private RoundedRectangle rectangle;
+        
+        protected void customizeFigure() {
+            rectangle = new RoundedRectangle();
+            rectangle.setCornerDimensions(new Dimension(25, 25));
+            add(rectangle, 0);
+            rectangle.setBackgroundColor(color);
+            rectangle.setBounds(getBounds());
+            setSelected(false);
+            setIcon(ICON);
+        }
+        
+        public void setBounds(Rectangle rectangle) {
+            super.setBounds(rectangle);
+            this.rectangle.setBounds(rectangle);
+        }
+        
+        public void setSelected(boolean b) {
+            super.setSelected(b);
+            rectangle.setLineWidth(b ? 3 : 1);
+            repaint();
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/figure/bpmn/BPMNStateFigure.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/figure/bpmn/BPMNStateFigure.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/figure/bpmn/BPMNStateFigure.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,41 @@
+package org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn;
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.flow.common.editor.editpart.figure.AbstractElementFigure;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+
+public class BPMNStateFigure extends AbstractElementFigure {
+    
+    private static final Image ICON = ImageDescriptor.createFromURL(
+		DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/question.gif")).createImage();
+        
+    private RoundedRectangle rectangle;
+    
+    public BPMNStateFigure() {
+    	setSize(80, 48);
+    }
+    
+    protected void customizeFigure() {
+        rectangle = new RoundedRectangle();
+        rectangle.setCornerDimensions(new Dimension(25, 25));
+        add(rectangle, 0);
+        rectangle.setBounds(getBounds());
+        setSelected(false);
+        setIcon(ICON);
+    }
+    
+    public void setBounds(Rectangle rectangle) {
+        super.setBounds(rectangle);
+        this.rectangle.setBounds(rectangle);
+    }
+    
+    public void setSelected(boolean b) {
+        super.setSelected(b);
+        rectangle.setLineWidth(b ? 3 : 1);
+        repaint();
+    }
+}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/BPMNSkinProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/BPMNSkinProvider.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/BPMNSkinProvider.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -15,10 +15,10 @@
 import org.drools.eclipse.flow.ruleflow.core.ForEachNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.HumanTaskNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.JoinWrapper;
-import org.drools.eclipse.flow.ruleflow.core.MilestoneWrapper;
 import org.drools.eclipse.flow.ruleflow.core.RuleSetNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SplitWrapper;
 import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.StateNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SubProcessWrapper;
 import org.drools.eclipse.flow.ruleflow.core.TimerWrapper;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.JoinEditPart.JoinFigureInterface;
@@ -34,9 +34,11 @@
 import org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn.BPMNRuleSetNodeFigure;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn.BPMNSplitFigure;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn.BPMNStartNodeFigure;
+import org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn.BPMNStateFigure;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn.BPMNSubFlowFigure;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn.BPMNTimerNodeFigure;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.figure.bpmn.BPMNWorkItemNodeFigure;
+import org.drools.eclipse.preferences.IDroolsConstants;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
 import org.eclipse.gef.palette.ConnectionCreationToolEntry;
@@ -51,13 +53,15 @@
 
     public PaletteContainer createComponentsDrawer() {
 
-        PaletteDrawer drawer = new PaletteDrawer("Components", null);
+    	String flowNodes = DroolsEclipsePlugin.getDefault().getPluginPreferences().getString(IDroolsConstants.FLOW_NODES);
 
+    	PaletteDrawer drawer = new PaletteDrawer("Components", null);
+
         List<PaletteEntry> entries = new ArrayList<PaletteEntry>();
 
         CombinedTemplateCreationEntry combined = new CombinedTemplateCreationEntry(
             "Start Event",
-            "Create a new Start",
+            "Create a new Start Event",
             StartNodeWrapper.class,
             new SimpleFactory(StartNodeWrapper.class),
             ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/start_empty.png")),
@@ -67,7 +71,7 @@
         
         combined = new CombinedTemplateCreationEntry(
             "End Event",
-            "Create a new End",
+            "Create a new End Event",
             EndNodeWrapper.class,
             new SimpleFactory(EndNodeWrapper.class),
             ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/end_terminate.png")), 
@@ -75,125 +79,149 @@
         );
         entries.add(combined);
                 
-        combined = new CombinedTemplateCreationEntry(
-            "Rule Task",
-            "Create a new RuleFlowGroup",
-            RuleSetNodeWrapper.class,
-            new SimpleFactory(RuleSetNodeWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif"))
-        );
-        entries.add(combined);
-            
-        combined = new CombinedTemplateCreationEntry(
-            "Gateway [diverge]",
-            "Create a new Split",
-            SplitWrapper.class,
-            new SimpleFactory(SplitWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(0) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "Rule Task",
+	            "Create a new Rule Task",
+	            RuleSetNodeWrapper.class,
+	            new SimpleFactory(RuleSetNodeWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif"))
+	        );
+	        entries.add(combined);
+        }
+        
+        if (flowNodes.charAt(1) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "Gateway [diverge]",
+	            "Create a new Gateway [diverge]",
+	            SplitWrapper.class,
+	            new SimpleFactory(SplitWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png"))
+	        );
+	        entries.add(combined);
+        }
                     
-        combined = new CombinedTemplateCreationEntry(
-            "Gateway [converge]",
-            "Create a new Join",
-            JoinWrapper.class,
-            new SimpleFactory(JoinWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(2) == '1') {
+        	combined = new CombinedTemplateCreationEntry(
+	            "Gateway [converge]",
+	            "Create a new Gateway [converge]",
+	            JoinWrapper.class,
+	            new SimpleFactory(JoinWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/gateway_complex.png"))
+	        );
+	        entries.add(combined);
+        }
                         
-        combined = new CombinedTemplateCreationEntry(
-            "Wait Task",
-            "Create a new Event Wait",
-            MilestoneWrapper.class,
-            new SimpleFactory(MilestoneWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(3) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "Wait Task",
+	            "Create a new Wait Task",
+	            StateNodeWrapper.class,
+	            new SimpleFactory(StateNodeWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif"))
+	        );
+	        entries.add(combined);
+        }
                             
-        combined = new CombinedTemplateCreationEntry(
-            "Reusable Sub-Process",
-            "Create a new SubFlow",
-            SubProcessWrapper.class,
-            new SimpleFactory(SubProcessWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process.png")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process.png"))
-        );
-        entries.add(combined);
-                                
-        combined = new CombinedTemplateCreationEntry(
-            "Script Task",
-            "Create a new Action",
-            ActionWrapper.class,
-            new SimpleFactory(ActionWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(4) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "Reusable Sub-Process",
+	            "Create a new Reusable Sub-Process",
+	            SubProcessWrapper.class,
+	            new SimpleFactory(SubProcessWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process.png")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process.png"))
+	        );
+	        entries.add(combined);
+        }
+        
+        if (flowNodes.charAt(5) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "Script Task",
+	            "Create a new Script Task",
+	            ActionWrapper.class,
+	            new SimpleFactory(ActionWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/Activity.gif"))
+	        );
+	        entries.add(combined);
+        }
                       
-        combined = new CombinedTemplateCreationEntry(
-            "Timer Event",
-            "Create a new Timer",
-            TimerWrapper.class,
-            new SimpleFactory(TimerWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_timer.png")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_timer.png"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(6) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "Timer Event",
+	            "Create a new Timer Event",
+	            TimerWrapper.class,
+	            new SimpleFactory(TimerWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_timer.png")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_timer.png"))
+	        );
+	        entries.add(combined);
+        }
                       
-        combined = new CombinedTemplateCreationEntry(
-            "Error Event",
-            "Create a new Fault",
-            FaultNodeWrapper.class,
-            new SimpleFactory(FaultNodeWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_error_10.png")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_error_10.png"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(7) == '1') {
+	    	combined = new CombinedTemplateCreationEntry(
+	            "Error Event",
+	            "Create a new Error Event",
+	            FaultNodeWrapper.class,
+	            new SimpleFactory(FaultNodeWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_error_10.png")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_error_10.png"))
+	        );
+	        entries.add(combined);
+        }
                           
-        combined = new CombinedTemplateCreationEntry(
-		    "Message Event",
-		    "Create a new Event Node",
-		    EventNodeWrapper.class,
-		    new SimpleFactory(EventNodeWrapper.class),
-		    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_message.png")), 
-		    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_empty.png"))
-		);
-		entries.add(combined);
+        if (flowNodes.charAt(8) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+			    "Message Event",
+			    "Create a new Message Event",
+			    EventNodeWrapper.class,
+			    new SimpleFactory(EventNodeWrapper.class),
+			    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_message.png")), 
+			    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/intermediate_empty.png"))
+			);
+			entries.add(combined);
+        }
 	                    
-        combined = new CombinedTemplateCreationEntry(
-            "User Task",
-            "Create a new Human Task",
-            HumanTaskNodeWrapper.class,
-            new SimpleFactory(HumanTaskNodeWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/task.png")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/task.png"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(9) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "User Task",
+	            "Create a new User Task",
+	            HumanTaskNodeWrapper.class,
+	            new SimpleFactory(HumanTaskNodeWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/task.png")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/task.png"))
+	        );
+	        entries.add(combined);
+        }
                               
-        combined = new CombinedTemplateCreationEntry(
-            "Embedded Sub-Process",
-            "Create a new Composite Node",
-            CompositeContextNodeWrapper.class,
-            new SimpleFactory(CompositeContextNodeWrapper.class),
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png")), 
-            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png"))
-        );
-        entries.add(combined);
+        if (flowNodes.charAt(10) == '1') {
+	        combined = new CombinedTemplateCreationEntry(
+	            "Embedded Sub-Process",
+	            "Create a new Embedded Sub-Process",
+	            CompositeContextNodeWrapper.class,
+	            new SimpleFactory(CompositeContextNodeWrapper.class),
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png")), 
+	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png"))
+	        );
+	        entries.add(combined);
+        }
                           
-	    combined = new CombinedTemplateCreationEntry(
-		    "Multiple Instances",
-		    "Create a new ForEach Node",
-		    ForEachNodeWrapper.class,
-		    new SimpleFactory(ForEachNodeWrapper.class),
-		    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png")), 
-		    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png"))
-		);
-		entries.add(combined);
+        if (flowNodes.charAt(11) == '1') {
+		    combined = new CombinedTemplateCreationEntry(
+			    "Multiple Instances",
+			    "Create a new Multiple Instances",
+			    ForEachNodeWrapper.class,
+			    new SimpleFactory(ForEachNodeWrapper.class),
+			    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png")), 
+			    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/bpmn/sub_process_expanded.png"))
+			);
+			entries.add(combined);
+        }
                     
         drawer.addAll(entries);
         return drawer;
@@ -262,6 +290,10 @@
 		return new BPMNSubFlowFigure();
 	}
 
+	public IFigure createStateFigure() {
+		return new BPMNStateFigure();
+	}
+
 	public WorkItemFigureInterface createWorkItemFigure() {
 		return new BPMNWorkItemNodeFigure();
 	}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/DefaultSkinProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/DefaultSkinProvider.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/DefaultSkinProvider.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -19,6 +19,7 @@
 import org.drools.eclipse.flow.ruleflow.core.RuleSetNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SplitWrapper;
 import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.StateNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SubProcessWrapper;
 import org.drools.eclipse.flow.ruleflow.core.TimerWrapper;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.ActionEditPart;
@@ -31,6 +32,7 @@
 import org.drools.eclipse.flow.ruleflow.editor.editpart.RuleSetNodeEditPart;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.SplitEditPart;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.StartNodeEditPart;
+import org.drools.eclipse.flow.ruleflow.editor.editpart.StateNodeEditPart;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.SubFlowEditPart;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.TimerEditPart;
 import org.drools.eclipse.flow.ruleflow.editor.editpart.WorkItemEditPart;
@@ -54,7 +56,7 @@
     	
     	String flowNodes = DroolsEclipsePlugin.getDefault().getPluginPreferences().getString(IDroolsConstants.FLOW_NODES);
 
-        PaletteDrawer drawer = new PaletteDrawer("Components", null);
+    	PaletteDrawer drawer = new PaletteDrawer("Components", null);
 
         List<PaletteEntry> entries = new ArrayList<PaletteEntry>();
 
@@ -116,10 +118,10 @@
                         
         if (flowNodes.charAt(3) == '1') {
 	        combined = new CombinedTemplateCreationEntry(
-	            "Event Wait",
-	            "Create a new Event Wait",
-	            MilestoneWrapper.class,
-	            new SimpleFactory(MilestoneWrapper.class),
+	            "Wait State",
+	            "Create a new Wait State",
+	            StateNodeWrapper.class,
+	            new SimpleFactory(StateNodeWrapper.class),
 	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/question.gif")), 
 	            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/question.gif"))
 	        );
@@ -289,6 +291,10 @@
 		return new SubFlowEditPart.SubFlowNodeFigure();
 	}
 
+	public IFigure createStateFigure() {
+		return new StateNodeEditPart.StateFigure();
+	}
+
 	public WorkItemFigureInterface createWorkItemFigure() {
 		return new WorkItemEditPart.WorkItemFigure();
 	}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/SkinProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/SkinProvider.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/skin/SkinProvider.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -35,6 +35,8 @@
 
 	IFigure createSubFlowFigure();
 
+	IFigure createStateFigure();
+
 	WorkItemFigureInterface createWorkItemFigure();
 
 	IFigure createCompositeNodeFigure();

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -19,10 +19,11 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.definition.process.Connection;
 import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
-import org.drools.definition.process.Connection;
 import org.drools.workflow.core.Constraint;
 import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.ConnectionRef;
 import org.drools.workflow.core.node.Split;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -41,11 +42,11 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class ConstraintListDialog extends EditBeanDialog {
+public class ConstraintListDialog extends EditBeanDialog<Map<ConnectionRef, Constraint>> {
 
 	private WorkflowProcess process;
 	private Split split;
-	private Map<Split.ConnectionRef, Constraint> newMap;
+	private Map<ConnectionRef, Constraint> newMap;
 	private Map<Connection, Label> labels = new HashMap<Connection, Label>();
 
 	protected ConstraintListDialog(Shell parentShell, WorkflowProcess process,
@@ -74,7 +75,7 @@
 			gridData.horizontalAlignment = GridData.FILL;
 			label2.setLayoutData(gridData);
 			Constraint constraint = newMap.get(
-		        new Split.ConnectionRef(outgoingConnection.getTo().getId(), outgoingConnection.getToType()));
+		        new ConnectionRef(outgoingConnection.getTo().getId(), outgoingConnection.getToType()));
 			if (constraint != null) {
 				label2.setText(constraint.getName());
 			}
@@ -87,12 +88,12 @@
 		return composite;
 	}
 
-	public void setValue(Object value) {
+	public void setValue(Map<ConnectionRef, Constraint> value) {
 		super.setValue(value);
-		this.newMap = new HashMap<Split.ConnectionRef, Constraint>((Map<Split.ConnectionRef, Constraint>) value);
+		this.newMap = new HashMap<ConnectionRef, Constraint>(value);
 	}
 
-	protected Object updateValue(Object value) {
+	protected Map<ConnectionRef, Constraint> updateValue(Map<ConnectionRef, Constraint> value) {
 		return newMap;
 	}
 
@@ -103,7 +104,7 @@
 				RuleFlowConstraintDialog dialog = new RuleFlowConstraintDialog(
 						getShell(), process);
 				dialog.create();
-				Split.ConnectionRef connectionRef = new Split.ConnectionRef(connection.getTo().getId(), connection.getToType());
+				ConnectionRef connectionRef = new ConnectionRef(connection.getTo().getId(), connection.getToType());
 				Constraint constraint = newMap.get(connectionRef);
 				dialog.setConstraint(constraint);
 				int code = dialog.open();

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -290,7 +290,17 @@
 		};
 		r.run();
 	}
+	
+	public void fixType(int index) {
+		typeCombo.select(index);
+		typeCombo.setEnabled(false);
+	}
 
+	public void fixDialect(int index) {
+		typeCombo.select(index);
+		typeCombo.setEnabled(false);
+	}
+
 	protected void okPressed() {
 		int selectionIndex = tabFolder.getSelectionIndex();
 		if (selectionIndex == 1) {

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListCellEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListCellEditor.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,52 @@
+package org.drools.eclipse.flow.ruleflow.view.property.constraint;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Map;
+
+import org.drools.eclipse.flow.common.view.property.BeanDialogCellEditor;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.ConnectionRef;
+import org.drools.workflow.core.node.StateNode;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Cell editor for state constraints.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class StateConstraintListCellEditor extends BeanDialogCellEditor<Map<ConnectionRef, Constraint>> {
+
+    private WorkflowProcess process;
+    private StateNode stateNode;
+    
+    public StateConstraintListCellEditor(Composite parent, WorkflowProcess process, StateNode stateNode) {
+        super(parent);
+        this.process = process;
+        this.stateNode = stateNode;
+    }
+
+    protected EditBeanDialog<Map<ConnectionRef, Constraint>> createDialog(Shell shell) {
+        return new StateConstraintListDialog(shell, process, stateNode);
+    }
+    
+    protected String getLabelText(Object value) {
+        return "";
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintListDialog.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,147 @@
+package org.drools.eclipse.flow.ruleflow.view.property.constraint;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.definition.process.Connection;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.ConnectionRef;
+import org.drools.workflow.core.impl.NodeImpl;
+import org.drools.workflow.core.node.StateNode;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Dialog for editing constraints.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class StateConstraintListDialog extends EditBeanDialog<Map<ConnectionRef, Constraint>> {
+
+	private WorkflowProcess process;
+	private StateNode stateNode;
+	private Map<ConnectionRef, Constraint> newMap;
+	private Map<Connection, Label> labels = new HashMap<Connection, Label>();
+
+	protected StateConstraintListDialog(Shell parentShell, WorkflowProcess process,
+			StateNode stateNode) {
+		super(parentShell, "Edit Constraints");
+		this.process = process;
+		this.stateNode = stateNode;
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite composite = (Composite) super.createDialogArea(parent);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 3;
+		composite.setLayout(gridLayout);
+
+		List<Connection> outgoingConnections = stateNode.getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE);
+		labels.clear();
+		for (Connection outgoingConnection: outgoingConnections) {
+			Label label1 = new Label(composite, SWT.NONE);
+			label1.setText("To node "
+		        + outgoingConnection.getTo().getName() + ": ");
+			Label label2 = new Label(composite, SWT.NONE);
+			labels.put(outgoingConnection, label2);
+			GridData gridData = new GridData();
+			gridData.grabExcessHorizontalSpace = true;
+			gridData.horizontalAlignment = GridData.FILL;
+			label2.setLayoutData(gridData);
+			Constraint constraint = newMap.get(
+		        new ConnectionRef(outgoingConnection.getTo().getId(), outgoingConnection.getToType()));
+			if (constraint != null) {
+				label2.setText(constraint.getName());
+			}
+			Button editButton = new Button(composite, SWT.NONE);
+			editButton.setText("Edit");
+			editButton.addSelectionListener(new EditButtonListener(
+					outgoingConnection));
+		}
+
+		return composite;
+	}
+
+	public void setValue(Map<ConnectionRef, Constraint> value) {
+		super.setValue(value);
+		this.newMap = new HashMap<ConnectionRef, Constraint>((Map<ConnectionRef, Constraint>) value);
+	}
+
+	protected Map<ConnectionRef, Constraint> updateValue(Map<ConnectionRef, Constraint> value) {
+		return newMap;
+	}
+
+	private void editItem(final Connection connection) {
+
+		final Runnable r = new Runnable() {
+			public void run() {
+				RuleFlowConstraintDialog dialog = new RuleFlowConstraintDialog(
+						getShell(), process);
+				dialog.create();
+				ConnectionRef connectionRef = new ConnectionRef(connection.getTo().getId(), connection.getToType());
+				Constraint constraint = newMap.get(connectionRef);
+				dialog.setConstraint(constraint);
+				dialog.fixType(0);
+				dialog.fixDialect(0);
+				int code = dialog.open();
+				if (code != CANCEL) {
+					constraint = dialog.getConstraint();
+					newMap.put(
+				        connectionRef,
+				        constraint);
+					setConnectionText(
+				        (Label) labels.get(connection), constraint.getName());
+				}
+			}
+
+		};
+		r.run();
+	}
+
+	private void setConnectionText(final Label connection, final String name) {
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				connection.setText(name);
+			}
+		});
+	}
+
+	private class EditButtonListener extends SelectionAdapter {
+		private Connection connection;
+
+		public EditButtonListener(Connection connection) {
+			this.connection = connection;
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			editItem(connection);
+		}
+	}
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintsPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintsPropertyDescriptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/StateConstraintsPropertyDescriptor.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -0,0 +1,51 @@
+package org.drools.eclipse.flow.ruleflow.view.property.constraint;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.node.StateNode;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * Property descriptor for state constraints.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class StateConstraintsPropertyDescriptor extends PropertyDescriptor {
+    
+    private WorkflowProcess process;
+    private StateNode stateNode;
+    
+    public StateConstraintsPropertyDescriptor(Object id, String displayName, StateNode stateNode, WorkflowProcess process) {
+        super(id, displayName);
+        this.stateNode = stateNode;
+        this.process = process;
+    }
+    
+    public WorkflowProcess getProcess() {
+        return process;
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent) {
+        StateConstraintListCellEditor editor = new StateConstraintListCellEditor(parent, process, stateNode);
+        if (getValidator() != null) {
+            editor.setValidator(getValidator());
+        }
+        return editor;
+    }
+}

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-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimerDialog.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -69,7 +69,7 @@
     
     private static final String[] DIALECTS = new String[] { "mvel", "java" };
     
-    private Timer key;
+    private Timer timer;
     private Text delayText;
     private Text periodText;
 	private WorkflowProcess process;
@@ -100,8 +100,8 @@
         gridData.grabExcessHorizontalSpace = true;
         gridData.horizontalAlignment = GridData.FILL;
         delayText.setLayoutData(gridData);
-        if (key != null) {
-        	delayText.setText(key.getDelay() + "");
+        if (timer != null && timer.getDelay() != null) {
+        	delayText.setText(timer.getDelay());
         }
         label = new Label(composite, SWT.NONE);
         label.setText("Timer period: ");
@@ -110,11 +110,11 @@
         gridData.grabExcessHorizontalSpace = true;
         gridData.horizontalAlignment = GridData.FILL;
         periodText.setLayoutData(gridData);
-        if (key != null) {
-        	periodText.setText(key.getPeriod() + "");
+        if (timer != null && timer.getPeriod() != null) {
+        	periodText.setText(timer.getPeriod());
         }
         
-        		Composite top = new Composite(composite, SWT.NONE);
+        Composite top = new Composite(composite, SWT.NONE);
 		GridData gd = new GridData();
 		gd.horizontalSpan = 2;
 		gd.grabExcessHorizontalSpace = true;
@@ -273,20 +273,20 @@
 	}
 
 	protected DroolsAction updateValue(DroolsAction value) {
-		if (key == null) {
-			key = new Timer();
+		if (timer == null) {
+			timer = new Timer();
 		}
 		String delay = delayText.getText().trim();
 		if (delay.length() == 0) {
-			key.setDelay(null);
+			timer.setDelay(null);
 		} else {
-			key.setDelay(delay);
+			timer.setDelay(delay);
 		}
 		String period = periodText.getText().trim();
 		if (period.length() == 0) {
-			key.setPeriod(null);
+			timer.setPeriod(null);
 		} else {
-			key.setPeriod(period);
+			timer.setPeriod(period);
 		}
         if (tabFolder.getSelectionIndex() == 0) {
             return getAction();
@@ -295,11 +295,11 @@
     }
     
     public void setKey(Timer key) {
-    	this.key = key;
+    	this.timer = key;
     }
 
 	public Timer getKey() {
-		return key;
+		return timer;
 	}
     
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersCellEditor.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersCellEditor.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -22,7 +22,7 @@
 import org.drools.process.core.timer.Timer;
 import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.core.WorkflowProcess;
-import org.drools.workflow.core.node.EventBasedNode;
+import org.drools.workflow.core.node.StateBasedNode;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Shell;
 
@@ -34,17 +34,17 @@
 public class TimersCellEditor extends BeanDialogCellEditor<Map<Timer, DroolsAction>> {
 
     private WorkflowProcess process;
-    private EventBasedNode eventBasedNode;
+    private StateBasedNode stateBasedNode;
     
-    public TimersCellEditor(Composite parent, WorkflowProcess process, EventBasedNode eventBasedNode) {
+    public TimersCellEditor(Composite parent, WorkflowProcess process, StateBasedNode stateBasedNode) {
         super(parent);
         this.process = process;
-        this.eventBasedNode = eventBasedNode;
+        this.stateBasedNode = stateBasedNode;
     }
 
     protected EditBeanDialog<Map<Timer, DroolsAction>> createDialog(Shell shell) {
         TimersDialog dialog = new TimersDialog(shell, process);
-        dialog.setValue(eventBasedNode.getTimers());
+        dialog.setValue(stateBasedNode.getTimers());
         return dialog;
     }
     

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersPropertyDescriptor.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/timers/TimersPropertyDescriptor.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -1,7 +1,7 @@
 package org.drools.eclipse.flow.ruleflow.view.property.timers;
 
 import org.drools.workflow.core.WorkflowProcess;
-import org.drools.workflow.core.node.EventBasedNode;
+import org.drools.workflow.core.node.StateBasedNode;
 import org.eclipse.jface.viewers.CellEditor;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.PropertyDescriptor;
@@ -9,16 +9,16 @@
 public class TimersPropertyDescriptor extends PropertyDescriptor {
 	
 	private WorkflowProcess process;
-	private EventBasedNode eventBasedNode;
+	private StateBasedNode stateBasedNode;
 
-	public TimersPropertyDescriptor(Object id, String displayName, EventBasedNode eventBasedNode, WorkflowProcess process) {
+	public TimersPropertyDescriptor(Object id, String displayName, StateBasedNode stateBasedNode, WorkflowProcess process) {
         super(id, displayName);
-        this.eventBasedNode = eventBasedNode;
+        this.stateBasedNode = stateBasedNode;
         this.process = process;
     }
 
     public CellEditor createPropertyEditor(Composite parent) {
-    	TimersCellEditor editor = new TimersCellEditor(parent, process, eventBasedNode);
+    	TimersCellEditor editor = new TimersCellEditor(parent, process, stateBasedNode);
         if (getValidator() != null) {
             editor.setValidator(getValidator());
         }

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-console/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-console/.classpath	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-console/.classpath	2009-06-17 01:43:57 UTC (rev 26986)
@@ -28,8 +28,8 @@
   <classpathentry kind="var" path="M2_REPO/com/google/gdata/gdata-client/1.0/gdata-client-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/google/gdata/gdata-core/1.0/gdata-core-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/google/code/gson/gson/1.2.2/gson-1.2.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0-SNAPSHOT/gwt-console-rpc-1.0.0-SNAPSHOT.jar" sourcepath="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0-SNAPSHOT/gwt-console-rpc-1.0.0-SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0-SNAPSHOT/gwt-console-server-integration-1.0.0-SNAPSHOT.jar" sourcepath="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0-SNAPSHOT/gwt-console-server-integration-1.0.0-SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0.CR1/gwt-console-rpc-1.0.0.CR1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0.CR1/gwt-console-server-integration-1.0.0.CR1.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.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"/>

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-console/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-console/pom.xml	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-console/pom.xml	2009-06-17 01:43:57 UTC (rev 26986)
@@ -42,7 +42,7 @@
     <dependency>
       <groupId>org.jboss.bpm</groupId>
       <artifactId>gwt-console-server-integration</artifactId>
-      <version>1.0.0-SNAPSHOT</version>
+      <version>1.0.0.CR1</version>
     </dependency>
     
    	<dependency>

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-console/src/main/java/org/drools/integration/console/DroolsFlowTaskManagement.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-console/src/main/java/org/drools/integration/console/DroolsFlowTaskManagement.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-console/src/main/java/org/drools/integration/console/DroolsFlowTaskManagement.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -26,6 +26,7 @@
 
 public class DroolsFlowTaskManagement implements TaskManagement {
 	
+	// TODO: make this configurable
 	private String ipAddress = "127.0.0.1";
 	private int port = 9123;
 	private MinaTaskClient client;

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-form/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-form/.classpath	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-form/.classpath	2009-06-17 01:43:57 UTC (rev 26986)
@@ -28,8 +28,8 @@
   <classpathentry kind="var" path="M2_REPO/com/google/gdata/gdata-client/1.0/gdata-client-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/google/gdata/gdata-core/1.0/gdata-core-1.0.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/google/code/gson/gson/1.2.2/gson-1.2.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0-SNAPSHOT/gwt-console-rpc-1.0.0-SNAPSHOT.jar" sourcepath="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0-SNAPSHOT/gwt-console-rpc-1.0.0-SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0-SNAPSHOT/gwt-console-server-integration-1.0.0-SNAPSHOT.jar" sourcepath="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0-SNAPSHOT/gwt-console-server-integration-1.0.0-SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0.CR1/gwt-console-rpc-1.0.0.CR1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0.CR1/gwt-console-server-integration-1.0.0.CR1.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.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"/>

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-form/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-form/pom.xml	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-form/pom.xml	2009-06-17 01:43:57 UTC (rev 26986)
@@ -22,7 +22,7 @@
     <dependency>
       <groupId>org.jboss.bpm</groupId>
       <artifactId>gwt-console-server-integration</artifactId>
-      <version>1.0.0-SNAPSHOT</version>
+      <version>1.0.0.CR1</version>
     </dependency>
     
     <dependency>

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-graph/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-graph/.classpath	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-graph/.classpath	2009-06-17 01:43:57 UTC (rev 26986)
@@ -12,8 +12,8 @@
   <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/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar"/>
   <classpathentry kind="var" path="M2_REPO/com/google/code/gson/gson/1.2.2/gson-1.2.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0-SNAPSHOT/gwt-console-rpc-1.0.0-SNAPSHOT.jar" sourcepath="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0-SNAPSHOT/gwt-console-rpc-1.0.0-SNAPSHOT-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0-SNAPSHOT/gwt-console-server-integration-1.0.0-SNAPSHOT.jar" sourcepath="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0-SNAPSHOT/gwt-console-server-integration-1.0.0-SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-rpc/1.0.0.CR1/gwt-console-rpc-1.0.0.CR1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jboss/bpm/gwt-console-server-integration/1.0.0.CR1/gwt-console-server-integration-1.0.0.CR1.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/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar"/>

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-graph/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-graph/pom.xml	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-graph/pom.xml	2009-06-17 01:43:57 UTC (rev 26986)
@@ -27,7 +27,7 @@
     <dependency>
       <groupId>org.jboss.bpm</groupId>
       <artifactId>gwt-console-server-integration</artifactId>
-      <version>1.0.0-SNAPSHOT</version>
+      <version>1.0.0.CR1</version>
     </dependency>
     
   </dependencies>

Modified: labs/jbossrules/trunk/drools-process/drools-gwt-graph/src/main/java/org/drools/integration/console/graph/GraphViewerPluginImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-gwt-graph/src/main/java/org/drools/integration/console/graph/GraphViewerPluginImpl.java	2009-06-16 17:01:57 UTC (rev 26985)
+++ labs/jbossrules/trunk/drools-process/drools-gwt-graph/src/main/java/org/drools/integration/console/graph/GraphViewerPluginImpl.java	2009-06-17 01:43:57 UTC (rev 26986)
@@ -69,6 +69,7 @@
 		}
 
 		DiagramInfo result = new DiagramInfo();
+		// TODO: diagram width and height?
 		result.setWidth(932);
 		result.setHeight(541);
 		List<DiagramNodeInfo> nodeList = new ArrayList<DiagramNodeInfo>();

Deleted: labs/jbossrules/trunk/drools-process/drools-gwt-graph/src/main/resources/com.sample.eventing.png
===================================================================
(Binary files differ)




More information about the jboss-svn-commits mailing list