[jboss-svn-commits] JBL Code SVN: r21193 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/xml/processes and 18 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jul 23 11:50:01 EDT 2008


Author: KrisVerlaenen
Date: 2008-07-23 11:50:00 -0400 (Wed, 23 Jul 2008)
New Revision: 21193

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventFilterHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventNodeHandler.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventFilter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTypeFilter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/EventListener.java
   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/instance/node/EventBasedNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/event.gif
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EventNodeEditPart.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd
   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/InputMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/WorkItemManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EndNode.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/SubProcessNode.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/WorkflowProcessInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EndNodeInstance.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/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-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
Log:
JBRULES-1691: Event Node
 - added basic event node

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -5,6 +5,8 @@
 import org.drools.xml.processes.ConnectionHandler;
 import org.drools.xml.processes.ConstraintHandler;
 import org.drools.xml.processes.EndNodeHandler;
+import org.drools.xml.processes.EventFilterHandler;
+import org.drools.xml.processes.EventNodeHandler;
 import org.drools.xml.processes.ForEachNodeHandler;
 import org.drools.xml.processes.GlobalHandler;
 import org.drools.xml.processes.HumanTaskNodeHandler;
@@ -86,5 +88,9 @@
                            new InPortHandler() );        
         addHandler( "out-port",
                            new OutPortHandler() );        
+        addHandler( "eventNode",
+                		   new EventNodeHandler() );        
+        addHandler( "eventFilter",
+                		   new EventFilterHandler() );        
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -2,7 +2,9 @@
 
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.EndNode;
-import org.drools.workflow.core.node.StartNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
 
 public class EndNodeHandler extends AbstractNodeHandler {
 
@@ -10,6 +12,17 @@
         return new EndNode();
     }
 
+    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);
+        EndNode endNode = (EndNode) node;
+        String terminate = element.getAttribute("terminate");
+        if (terminate != null && "false".equals(terminate) ) {
+            endNode.setTerminate(false);
+        }
+    }
+
     public Class generateNodeFor() {
         return EndNode.class;
     }
@@ -17,6 +30,10 @@
 	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
 		EndNode endNode = (EndNode) node;
 		writeNode("end", endNode, xmlDump, includeMeta);
+		boolean terminate = endNode.isTerminate();
+        if (!terminate) {
+            xmlDump.append("terminate=\"false\" ");
+        }
         endNode(xmlDump);
 	}
 

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventFilterHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventFilterHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventFilterHandler.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,62 @@
+package org.drools.xml.processes;
+
+import java.util.HashSet;
+
+import org.drools.process.core.event.EventFilter;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.workflow.core.node.EventNode;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class EventFilterHandler extends BaseAbstractHandler implements Handler {
+    
+    public EventFilterHandler() {
+        if ((this.validParents == null) && (this.validPeers == null)) {
+            this.validParents = new HashSet();
+            this.validParents.add(EventNode.class);
+
+            this.validPeers = new HashSet();
+            this.validPeers.add(null);
+
+            this.allowNesting = false;
+        }
+    }
+    
+    public Object start(final String uri,
+                        final String localName,
+                        final Attributes attrs,
+                        final ExtensibleXmlParser parser) throws SAXException {
+        parser.startElementBuilder( localName,
+                                    attrs );
+        return null;
+    }    
+    
+    public Object end(final String uri,
+                      final String localName,
+                      final ExtensibleXmlParser parser) throws SAXException {
+        final Element element = parser.endElementBuilder();
+        EventNode eventNode = (EventNode) parser.getParent();
+        final String type = element.getAttribute("type");
+        emptyAttributeCheck(localName, "type", type, parser);
+        if ("eventType".equals(type)) {
+            final String eventType = element.getAttribute("eventType");
+            emptyAttributeCheck(localName, "eventType", eventType, parser);
+            EventTypeFilter eventTypeFilter = new EventTypeFilter();
+            eventTypeFilter.setType(eventType);
+            eventNode.addEventFilter(eventTypeFilter);
+        } else {
+        	throw new IllegalArgumentException(
+    			"Unknown event filter type: " + type);
+        }
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return EventFilter.class;
+    }    
+
+}

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventNodeHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EventNodeHandler.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,55 @@
+package org.drools.xml.processes;
+
+import org.drools.process.core.event.EventFilter;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.EventNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+public class EventNodeHandler extends AbstractNodeHandler {
+    
+    protected Node createNode() {
+        return new EventNode();
+    }
+    
+    public Class generateNodeFor() {
+        return EventNode.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);
+        EventNode eventNode = (EventNode) node;
+        String variableName = element.getAttribute("variableName");
+        if (variableName != null && variableName.length() != 0 ) {
+            eventNode.setVariableName(variableName);
+        }
+    }
+    
+    public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		EventNode eventNode = (EventNode) node;
+		writeNode("eventNode", eventNode, xmlDump, includeMeta);
+		String variableName = eventNode.getVariableName();
+        if (variableName != null && variableName.length() != 0) {
+            xmlDump.append("variableName=\"" + variableName + "\" ");
+        }
+        xmlDump.append(">" + EOL);
+        xmlDump.append("      <eventFilters>" + EOL);
+        for (EventFilter filter: eventNode.getEventFilters()) {
+        	if (filter instanceof EventTypeFilter) {
+        		xmlDump.append("        <eventFilter "
+                    + "type=\"eventType\" "
+                    + "eventType=\"" + ((EventTypeFilter) filter).getType() + "\" />" + EOL);
+        	} else {
+        		throw new IllegalArgumentException(
+    				"Unknown filter type: " + filter);
+        	}
+        }
+        xmlDump.append("      </eventFilters>" + EOL);
+        endNode("eventNode", xmlDump);
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd	2008-07-23 15:50:00 UTC (rev 21193)
@@ -106,6 +106,7 @@
 				<xs:element ref="drools:humanTask"/>
 				<xs:element ref="drools:composite"/>
 				<xs:element ref="drools:forEach"/>
+				<xs:element ref="drools:eventNode"/>
 			</xs:choice>
 		</xs:complexType>
 	</xs:element>
@@ -127,6 +128,7 @@
 			<xs:attribute name="y" type="xs:string"/>
 			<xs:attribute name="width" type="xs:string"/>
 			<xs:attribute name="height" type="xs:string"/>
+			<xs:attribute name="terminate" type="xs:string"/>
 		</xs:complexType>
 	</xs:element>
 	<xs:element name="actionNode">
@@ -356,6 +358,7 @@
 			<xs:attribute name="height" type="xs:string"/>
 			<xs:attribute name="variableName" type="xs:string"/>
 			<xs:attribute name="collectionExpression" type="xs:string"/>
+			<xs:attribute name="waitForCompletion" type="xs:string"/>
 		</xs:complexType>
 	</xs:element>
 	<xs:element name="in-ports">
@@ -386,6 +389,33 @@
 			<xs:attribute name="nodeOutType" type="xs:string" use="required"/>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="eventNode">
+		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="1">
+				<xs:element ref="drools:eventFilters"/>
+			</xs:choice>
+			<xs:attribute name="id" type="xs:string" use="required"/>
+			<xs:attribute name="name" type="xs:string"/>
+			<xs:attribute name="x" type="xs:string"/>
+			<xs:attribute name="y" type="xs:string"/>
+			<xs:attribute name="width" type="xs:string"/>
+			<xs:attribute name="height" type="xs:string"/>
+			<xs:attribute name="variableName" type="xs:string"/>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="eventFilters">
+		<xs:complexType>
+			<xs:sequence minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:eventFilter"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="eventFilter">
+		<xs:complexType>
+			<xs:attribute name="type" type="xs:string" use="required"/>
+			<xs:attribute name="eventType" type="xs:string" use="required"/>
+		</xs:complexType>
+	</xs:element>
 	<xs:element name="connections">
 		<xs:complexType>
 			<xs:sequence minOccurs="0" maxOccurs="unbounded">

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -18,6 +18,7 @@
 import org.drools.process.core.datatype.impl.type.IntegerDataType;
 import org.drools.process.core.datatype.impl.type.ObjectDataType;
 import org.drools.process.core.datatype.impl.type.StringDataType;
+import org.drools.process.core.event.EventTypeFilter;
 import org.drools.process.core.impl.ParameterDefinitionImpl;
 import org.drools.process.core.impl.WorkImpl;
 import org.drools.process.core.timer.Timer;
@@ -30,6 +31,7 @@
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.ForEachNode;
 import org.drools.workflow.core.node.HumanTaskNode;
 import org.drools.workflow.core.node.Join;
@@ -66,6 +68,7 @@
         process.addNode(new TimerNode());
         process.addNode(new HumanTaskNode());
         process.addNode(new ForEachNode());
+        process.addNode(new EventNode());
         
         String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
         if (xml == null) {
@@ -82,7 +85,7 @@
             throw new IllegalArgumentException("Failed to reload process!");
         }
         
-        assertEquals(12, process.getNodes().length);
+        assertEquals(13, process.getNodes().length);
         
 //        System.out.println("************************************");
         
@@ -190,6 +193,18 @@
         process.addNode(split);
         new ConnectionImpl(startNode, Node.CONNECTION_DEFAULT_TYPE, split, Node.CONNECTION_DEFAULT_TYPE);
         
+        EventNode eventNode = new EventNode();
+        eventNode.setName("action");
+        eventNode.setMetaData("x", 1);
+        eventNode.setMetaData("y", 2);
+        eventNode.setMetaData("width", 3);
+        eventNode.setMetaData("height", 4);
+        eventNode.setVariableName("eventVariable");
+        EventTypeFilter eventFilter = new EventTypeFilter();
+        eventFilter.setType("eventType");
+        eventNode.addEventFilter(eventFilter);
+        process.addNode(eventNode);
+        
         Join join = new Join();
         join.setName("join");
         join.setMetaData("x", 1);
@@ -200,6 +215,7 @@
         process.addNode(join);
         new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
         new ConnectionImpl(ruleSetNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
+        new ConnectionImpl(eventNode, Node.CONNECTION_DEFAULT_TYPE, join, Node.CONNECTION_DEFAULT_TYPE);
         
         MilestoneNode milestone = new MilestoneNode();
         milestone.setName("milestone");
@@ -293,6 +309,7 @@
         
         EndNode endNode = new EndNode();
         endNode.setName("end");
+        endNode.setTerminate(false);
         endNode.setMetaData("x", 1);
         endNode.setMetaData("y", 2);
         endNode.setMetaData("width", 3);
@@ -314,7 +331,7 @@
             throw new IllegalArgumentException("Failed to reload process!");
         }
         
-        assertEquals(12, process.getNodes().length);
+        assertEquals(13, process.getNodes().length);
         
 //        System.out.println("************************************");
         

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -59,7 +59,7 @@
 import org.drools.util.ObjectHashSet;
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.impl.NodeInstanceImpl;
-import org.drools.workflow.instance.node.EventNodeInstance;
+import org.drools.workflow.instance.node.EventBasedNodeInstance;
 import org.drools.workflow.instance.node.JoinInstance;
 import org.drools.workflow.instance.node.MilestoneNodeInstance;
 import org.drools.workflow.instance.node.RuleSetNodeInstance;
@@ -636,8 +636,8 @@
         nodeInstance.setNodeInstanceContainer( processInstance );
         nodeInstance.setProcessInstance( processInstance );
         nodeInstance.setId( id );
-        if ( nodeInstance instanceof EventNodeInstance ) {
-            ((EventNodeInstance) nodeInstance).addEventListeners();
+        if ( nodeInstance instanceof EventBasedNodeInstance ) {
+            ((EventBasedNodeInstance) nodeInstance).addEventListeners();
         }
         return nodeInstance;
     }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventFilter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventFilter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventFilter.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,7 @@
+package org.drools.process.core.event;
+
+public interface EventFilter {
+	
+	boolean acceptsEvent(String type, Object event);
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTypeFilter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTypeFilter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/event/EventTypeFilter.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,22 @@
+package org.drools.process.core.event;
+
+public class EventTypeFilter implements EventFilter {
+
+	private String type;
+	
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public boolean acceptsEvent(String type, Object event) {
+		if (this.type != null && this.type.equals(type)) {
+			return true;
+		}
+		return false;
+	}
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/EventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/EventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/EventListener.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,7 @@
+package org.drools.process.instance;
+
+public interface EventListener {
+	
+	void signalEvent(String type, Object event);
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstance.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ProcessInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -20,7 +20,6 @@
 import org.drools.WorkingMemory;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.process.core.Process;
-import org.drools.process.instance.timer.TimerListener;
 
 /**
  * A process instance is the representation of a process during its execution.
@@ -29,7 +28,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public interface ProcessInstance extends ContextInstanceContainer, ContextableInstance, WorkItemListener, TimerListener {
+public interface ProcessInstance extends ContextInstanceContainer, ContextableInstance, EventListener {
 
     int STATE_PENDING   = 0;
     int STATE_ACTIVE    = 1;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/WorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/WorkItemManager.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/WorkItemManager.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -91,7 +91,7 @@
             workItem.setState(WorkItem.COMPLETED);
             // process instance may have finished already
             if (processInstance != null) {
-                processInstance.workItemCompleted(workItem);
+                processInstance.signalEvent("workItemCompleted", workItem);
             }
             workItems.remove(new Long(id));
             workingMemory.fireAllRules();
@@ -106,7 +106,7 @@
             workItem.setState(WorkItem.ABORTED);
             // process instance may have finished already
             if (processInstance != null) {
-                processInstance.workItemAborted(workItem);
+                processInstance.signalEvent("workItemAborted", workItem);
             }
             workItems.remove(new Long(id));
             workingMemory.fireAllRules();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -28,10 +28,8 @@
 import org.drools.process.core.Context;
 import org.drools.process.core.ContextContainer;
 import org.drools.process.core.Process;
-import org.drools.process.core.timer.Timer;
 import org.drools.process.instance.ContextInstance;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.WorkItem;
 
 /**
  * Default implementation of a process instance.
@@ -156,16 +154,10 @@
         }
         return contextInstance;
     }
-
-    public void workItemCompleted(WorkItem taskInstance) {
+    
+    public void signalEvent(String type, Object event) {
     }
 
-    public void workItemAborted(WorkItem taskInstance) {
-    }
-
-    public void timerTriggered(Timer timer) {
-    }
-
     public void start() {
         if ( getState() != ProcessInstanceImpl.STATE_PENDING ) {
             throw new IllegalArgumentException( "A process instance can only be started once" );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -66,7 +66,7 @@
             ProcessInstance processInstance = workingMemory.getProcessInstance( processInstanceId );
             // process instance may have finished already
             if ( processInstance != null ) {
-                processInstance.timerTriggered( ctx.getTimer() );
+                processInstance.signalEvent( "timerTriggered", ctx.getTimer() );
             }
         }
 

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -35,6 +35,7 @@
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.CompositeNode;
 import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.ForEachNode;
 import org.drools.workflow.core.node.Join;
 import org.drools.workflow.core.node.MilestoneNode;
@@ -325,6 +326,16 @@
                     }
                 }
                 validateNodes(compositeNode.getNodes(), errors, process);
+            } else if (node instanceof EventNode) {
+                final EventNode eventNode = (EventNode) node;
+                if (eventNode.getEventFilters().size() == 0) {
+                    errors.add(new ProcessValidationErrorImpl(process,
+                        "Event node '" + node.getName() + "' [" + node.getId() + "] should specify an event type"));
+                }
+                if (eventNode.getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE).size() == 0) {
+                    errors.add(new ProcessValidationErrorImpl(process,
+                        "Event node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
+                }
             } 
         }
 
@@ -334,14 +345,21 @@
                                                final List<ProcessValidationError> errors) {
         final Map<Node, Boolean> processNodes = new HashMap<Node, Boolean>();
         final Node[] nodes = process.getNodes();
+        List<Node> eventNodes = new ArrayList<Node>();
         for (int i = 0; i < nodes.length; i++) {
             final Node node = nodes[i];
             processNodes.put(node, Boolean.FALSE);
+            if (node instanceof EventNode) {
+            	eventNodes.add(node);
+            }
         }
         final Node start = process.getStart();
         if (start != null) {
             processNode(start, processNodes);
         }
+        for (Node eventNode: eventNodes) {
+            processNode(eventNode, processNodes);
+        }
         for ( final Iterator<Node> it = processNodes.keySet().iterator(); it.hasNext(); ) {
             final Node node = it.next();
             if (Boolean.FALSE.equals(processNodes.get(node))) {

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EndNode.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -27,9 +27,17 @@
 
     private static final long serialVersionUID = 400L;
     
-    // TODO: boolean terminate (should all other node instances be cancelled?)
+    private boolean terminate = true;
 
-    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+    public boolean isTerminate() {
+		return terminate;
+	}
+
+	public void setTerminate(boolean terminate) {
+		this.terminate = terminate;
+	}
+
+	public void validateAddOutgoingConnection(final String type, final Connection connection) {
         throw new UnsupportedOperationException(
             "An end node does not have an outgoing connection!");
     }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java (from rev 21186, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventBasedNode.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,7 @@
+package org.drools.workflow.core.node;
+
+public class EventBasedNode extends SequenceNode {
+
+    private static final long serialVersionUID = 400L;
+
+}

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/MilestoneNode.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -22,7 +22,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class MilestoneNode extends EventNode {
+public class MilestoneNode extends EventBasedNode {
 
 	private static final long serialVersionUID = 8552568488755348247L;
 

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/RuleSetNode.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -22,7 +22,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleSetNode extends EventNode {
+public class RuleSetNode extends EventBasedNode {
 
     private static final long serialVersionUID = 400L;
 

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/SubProcessNode.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -28,7 +28,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class SubProcessNode extends EventNode implements Mappable {
+public class SubProcessNode extends EventBasedNode implements Mappable {
 
 	private static final long serialVersionUID = 400L;
 	

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/WorkItemNode.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -28,7 +28,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class WorkItemNode extends EventNode implements Mappable {
+public class WorkItemNode extends EventBasedNode implements Mappable {
 
 	private static final long serialVersionUID = 400L;
 	

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/WorkflowProcessInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/WorkflowProcessInstance.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/WorkflowProcessInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -16,9 +16,8 @@
  * limitations under the License.
  */
 
+import org.drools.process.instance.EventListener;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.WorkItemListener;
-import org.drools.process.instance.timer.TimerListener;
 import org.drools.workflow.core.WorkflowProcess;
 
 /**
@@ -31,13 +30,9 @@
 public interface WorkflowProcessInstance extends ProcessInstance, NodeInstanceContainer {
 
     WorkflowProcess getWorkflowProcess();
+    
+    void addEventListener(String type, EventListener eventListener);
+    
+    void removeEventListener(String type, EventListener eventListener);
 
-    void addWorkItemListener(WorkItemListener listener);
-
-    void removeWorkItemListener(WorkItemListener listener);
-
-    void addTimerListener(TimerListener listener);
-
-    void removeTimerListener(TimerListener listener);
-
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/NodeInstanceFactoryRegistry.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -8,6 +8,7 @@
 import org.drools.workflow.core.node.CompositeContextNode;
 import org.drools.workflow.core.node.CompositeNode;
 import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.FaultNode;
 import org.drools.workflow.core.node.ForEachNode;
 import org.drools.workflow.core.node.HumanTaskNode;
@@ -25,6 +26,7 @@
 import org.drools.workflow.instance.node.CompositeContextNodeInstance;
 import org.drools.workflow.instance.node.CompositeNodeInstance;
 import org.drools.workflow.instance.node.EndNodeInstance;
+import org.drools.workflow.instance.node.EventNodeInstance;
 import org.drools.workflow.instance.node.FaultNodeInstance;
 import org.drools.workflow.instance.node.ForEachNodeInstance;
 import org.drools.workflow.instance.node.HumanTaskNodeInstance;
@@ -76,6 +78,8 @@
                   new CreateNewNodeFactory( HumanTaskNodeInstance.class ) );
         register( ForEachNode.class,
                   new CreateNewNodeFactory( ForEachNodeInstance.class ) );
+        register( EventNode.class,
+                  new CreateNewNodeFactory( EventNodeInstance.class ) );
     }
 
     public void register(Class< ? extends Node> cls,

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -19,26 +19,28 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.drools.Agenda;
 import org.drools.common.EventSupport;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.process.core.timer.Timer;
+import org.drools.process.core.event.EventFilter;
+import org.drools.process.instance.EventListener;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.WorkItem;
-import org.drools.process.instance.WorkItemListener;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
-import org.drools.process.instance.timer.TimerListener;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.NodeContainer;
 import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.NodeInstanceContainer;
 import org.drools.workflow.instance.WorkflowProcessInstance;
+import org.drools.workflow.instance.node.EventBasedNodeInstance;
 import org.drools.workflow.instance.node.EventNodeInstance;
 
 /**
@@ -53,8 +55,7 @@
 
     private final List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>();;
     private long nodeInstanceCounter = 0;
-    private List<WorkItemListener> workItemListeners = new CopyOnWriteArrayList<WorkItemListener>();
-    private List<TimerListener> timerListeners = new CopyOnWriteArrayList<TimerListener>();
+    private Map<String, List<EventListener>> eventListeners = new HashMap<String, List<EventListener>>();
 
     public NodeContainer getNodeContainer() {
         return getWorkflowProcess();
@@ -158,8 +159,8 @@
 
     public void disconnect() {
         for (NodeInstance nodeInstance: nodeInstances) {
-            if (nodeInstance instanceof EventNodeInstance) {
-                ((EventNodeInstance) nodeInstance).removeEventListeners();
+            if (nodeInstance instanceof EventBasedNodeInstance) {
+                ((EventBasedNodeInstance) nodeInstance).removeEventListeners();
             }
         }
         super.disconnect();
@@ -168,8 +169,8 @@
     public void reconnect() {
         super.reconnect();
         for (NodeInstance nodeInstance: nodeInstances) {
-            if (nodeInstance instanceof EventNodeInstance) {
-                ((EventNodeInstance) nodeInstance).addEventListeners();
+            if (nodeInstance instanceof EventBasedNodeInstance) {
+                ((EventBasedNodeInstance) nodeInstance).addEventListeners();
             }
         }
     }
@@ -184,39 +185,50 @@
         sb.append( "]" );
         return sb.toString();
     }
-
-    public void workItemCompleted(WorkItem workItem) {
-        for (WorkItemListener listener: workItemListeners) {
-            listener.workItemCompleted(workItem);
-        }
+    
+    public void signalEvent(String type, Object event) {
+    	List<EventListener> listeners = eventListeners.get(type);
+    	if (listeners != null) {
+    		for (EventListener listener: listeners) {
+    			listener.signalEvent(type, event);
+    		}
+    	} else {
+    		for (Node node: getWorkflowProcess().getNodes()) {
+    			if (node instanceof EventNode) {
+    				if (acceptsEvent((EventNode) node, type, event)) {
+    					EventNodeInstance eventNodeInstance = (EventNodeInstance) getNodeInstance(node);
+    					eventNodeInstance.setEvent(type, event);
+    					eventNodeInstance.trigger(null, null);
+    				}
+    			}
+    		}
+    	}
     }
 
-    public void workItemAborted(WorkItem workItem) {
-        for (WorkItemListener listener: workItemListeners) {
-            listener.workItemCompleted(workItem);
-        }
+    public boolean acceptsEvent(EventNode eventNode, String type, Object event) {
+    	List<EventFilter> eventFilters = eventNode.getEventFilters();
+    	for (EventFilter filter: eventFilters) {
+    		if (!filter.acceptsEvent(type, event)) {
+    			return false;
+    		}
+    	}
+    	return true;
     }
     
-    public void addWorkItemListener(WorkItemListener listener) {
-        workItemListeners.add(listener);
+    public void addEventListener(String type, EventListener listener) {
+    	List<EventListener> listeners = eventListeners.get(type);
+    	if (listeners == null) {
+    		listeners = new CopyOnWriteArrayList<EventListener>();
+    		eventListeners.put(type, listeners);
+    	}
+        listeners.add(listener);
     }
     
-    public void removeWorkItemListener(WorkItemListener listener) {
-        workItemListeners.remove(listener);
+    public void removeEventListener(String type, EventListener listener) {
+    	List<EventListener> listeners = eventListeners.get(type);
+    	if (listeners != null) {
+    		listeners.remove(listener);
+    	}
     }
     
-    public void timerTriggered(Timer timer) {
-        for (TimerListener listener: timerListeners) {
-            listener.timerTriggered(timer);
-        }
-    }
-
-    public void addTimerListener(TimerListener listener) {
-        timerListeners.add(listener);
-    }
-    
-    public void removeTimerListener(TimerListener listener) {
-        timerListeners.remove(listener);
-    }
-    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EndNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EndNodeInstance.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EndNodeInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -18,6 +18,7 @@
 
 import org.drools.process.instance.ProcessInstance;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.impl.NodeInstanceImpl;
 
@@ -30,13 +31,19 @@
 
     private static final long serialVersionUID = 400L;
 
+    public EndNode getEndNode() {
+    	return (EndNode) getNode();
+    }
+    
     public void internalTrigger(final NodeInstance from, String type) {
         if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
             throw new IllegalArgumentException(
                 "An EndNode only accepts default incoming connections!");
         }
         getNodeInstanceContainer().removeNodeInstance(this);
-        getProcessInstance().setState( ProcessInstance.STATE_COMPLETED );
+        if (getEndNode().isTerminate()) {
+        	getProcessInstance().setState( ProcessInstance.STATE_COMPLETED );
+        }
     }
 
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java (from rev 21186, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventBasedNodeInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,28 @@
+package org.drools.workflow.instance.node;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.EventBasedNode;
+import org.drools.workflow.instance.impl.ExtendedNodeInstanceImpl;
+
+public abstract class EventBasedNodeInstance extends ExtendedNodeInstanceImpl {
+
+    public EventBasedNode getEventNode() {
+        return (EventBasedNode) getNode();
+    }
+    
+    public void triggerCompleted() {
+        triggerCompleted(Node.CONNECTION_DEFAULT_TYPE, true);
+    }
+    
+    public void cancel() {
+        super.cancel();
+        removeEventListeners();
+    }
+    
+    public void addEventListeners() {
+    }
+    
+    public void removeEventListeners() {
+    }
+    
+}

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -38,7 +38,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class MilestoneNodeInstance extends EventNodeInstance implements AgendaEventListener {
+public class MilestoneNodeInstance extends EventBasedNodeInstance 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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -27,7 +27,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleSetNodeInstance extends EventNodeInstance implements RuleFlowGroupListener {
+public class RuleSetNodeInstance extends EventBasedNodeInstance implements RuleFlowGroupListener {
 
     private static final long serialVersionUID = 400L;
     

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/SubProcessNodeInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -38,7 +38,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class SubProcessNodeInstance extends EventNodeInstance implements RuleFlowEventListener {
+public class SubProcessNodeInstance extends EventBasedNodeInstance implements RuleFlowEventListener {
 
     private static final long serialVersionUID = 400L;
     

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/TimerNodeInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -1,12 +1,12 @@
 package org.drools.workflow.instance.node;
 
 import org.drools.process.core.timer.Timer;
-import org.drools.process.instance.timer.TimerListener;
+import org.drools.process.instance.EventListener;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.TimerNode;
 import org.drools.workflow.instance.NodeInstance;
 
-public class TimerNodeInstance extends EventNodeInstance implements TimerListener {
+public class TimerNodeInstance extends EventBasedNodeInstance implements EventListener {
 
     private static final long serialVersionUID = 400L;
     
@@ -36,10 +36,13 @@
         timerId = timer.getId();
     }
 
-    public void timerTriggered(Timer timer) {
-        if (timer.getId() == timerId) {
-            triggerCompleted();
-        }
+    public void signalEvent(String type, Object event) {
+    	if ("timerTriggered".equals(type)) {
+    		Timer timer = (Timer) event;
+            if (timer.getId() == timerId) {
+                triggerCompleted();
+            }
+    	}
     }
     
     public void triggerCompleted() {
@@ -55,12 +58,12 @@
     
     public void addEventListeners() {
         super.addEventListeners();
-        getProcessInstance().addTimerListener(this);
+        getProcessInstance().addEventListener("timerTriggered", this);
     }
     
     public void removeEventListeners() {
         super.removeEventListeners();
-        getProcessInstance().removeTimerListener(this);
+        getProcessInstance().removeEventListener("timerTriggered", this);
     }
 
 }

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	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -26,8 +26,8 @@
 import org.drools.common.InternalRuleBase;
 import org.drools.process.core.Work;
 import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.EventListener;
 import org.drools.process.instance.WorkItem;
-import org.drools.process.instance.WorkItemListener;
 import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.process.instance.impl.WorkItemImpl;
 import org.drools.workflow.core.node.WorkItemNode;
@@ -38,7 +38,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class WorkItemNodeInstance extends EventNodeInstance implements WorkItemListener {
+public class WorkItemNodeInstance extends EventBasedNodeInstance implements EventListener {
 
     private static final long serialVersionUID = 400L;
     private static final Pattern PARAMETER_MATCHER = Pattern.compile("#\\{(\\S+)\\}", Pattern.DOTALL);
@@ -170,13 +170,23 @@
     
     public void addEventListeners() {
         super.addEventListeners();
-        getProcessInstance().addWorkItemListener(this);
+        getProcessInstance().addEventListener("workItemCompleted", this);
+        getProcessInstance().addEventListener("workItemAborted", this);
     }
     
     public void removeEventListeners() {
         super.removeEventListeners();
-        getProcessInstance().removeWorkItemListener(this);
+        getProcessInstance().removeEventListener("workItemCompleted", this);
+        getProcessInstance().removeEventListener("workItemAborted", this);
     }
+    
+    public void signalEvent(String type, Object event) {
+    	if ("workItemCompleted".equals(type)) {
+    		workItemCompleted((WorkItem) event);
+    	} else if ("workItemAborted".equals(type)) {
+    		workItemAborted((WorkItem) event);
+    	} 
+    }
 
     public void workItemAborted(WorkItem workItem) {
         if ( getWorkItem().getId() == workItem.getId() ) {

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,434 @@
+package org.drools.process;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.Person;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.common.AbstractRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.datatype.impl.type.ObjectDataType;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.spi.Action;
+import org.drools.spi.ActionContext;
+import org.drools.spi.KnowledgeHelper;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.MilestoneNode;
+import org.drools.workflow.core.node.StartNode;
+
+public class EventTest extends TestCase {
+    
+    public void testEvent1() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId("org.drools.process.event");
+        process.setName("Event Process");
+        
+        List<Variable> variables = new ArrayList<Variable>();
+        Variable variable = new Variable();
+        variable.setName("event");
+        ObjectDataType personDataType = new ObjectDataType();
+        personDataType.setClassName("org.drools.Person");
+        variable.setType(personDataType);
+        variables.add(variable);
+        process.getVariableScope().setVariables(variables);
+
+        StartNode startNode = new StartNode();
+        startNode.setName("Start");
+        startNode.setId(1);
+        process.addNode(startNode);
+        
+        MilestoneNode milestoneNode = new MilestoneNode();
+        milestoneNode.setName("Milestone");
+        milestoneNode.setConstraint("eval(false)");
+        milestoneNode.setId(2);
+        process.addNode(milestoneNode);
+        new ConnectionImpl(
+            startNode, Node.CONNECTION_DEFAULT_TYPE,
+            milestoneNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        EventNode eventNode = new EventNode();
+        EventTypeFilter eventFilter = new EventTypeFilter();
+        eventFilter.setType("myEvent");
+        eventNode.addEventFilter(eventFilter);
+        eventNode.setVariableName("event");
+        eventNode.setId(3);
+        process.addNode(eventNode);
+        
+        final List<String> myList = new ArrayList<String>();
+        ActionNode actionNode = new ActionNode();
+        actionNode.setName("Print");
+        DroolsAction action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+            	System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
+                myList.add("Executed action");
+            }
+        });
+        actionNode.setAction(action);
+        actionNode.setId(4);
+        process.addNode(actionNode);
+        new ConnectionImpl(
+            eventNode, Node.CONNECTION_DEFAULT_TYPE,
+            actionNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        Join join = new Join();
+        join.setName("XOR Join");
+        join.setType(Join.TYPE_XOR);
+        join.setId(5);
+        process.addNode(join);
+        new ConnectionImpl(
+            milestoneNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+        new ConnectionImpl(
+            actionNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+    
+        EndNode endNode = new EndNode();
+        endNode.setName("EndNode");
+        endNode.setId(6);
+        process.addNode(endNode);
+        new ConnectionImpl(
+            join, Node.CONNECTION_DEFAULT_TYPE,
+            endNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase();
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.process.event");
+        assertEquals(0, myList.size());
+        Person jack = new Person();
+        jack.setName("Jack");
+        processInstance.signalEvent("myEvent", jack);
+        assertEquals(1, myList.size());
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+    }
+    
+    public void testEvent2() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId("org.drools.process.event");
+        process.setName("Event Process");
+        
+        List<Variable> variables = new ArrayList<Variable>();
+        Variable variable = new Variable();
+        variable.setName("event");
+        ObjectDataType personDataType = new ObjectDataType();
+        personDataType.setClassName("org.drools.Person");
+        variable.setType(personDataType);
+        variables.add(variable);
+        process.getVariableScope().setVariables(variables);
+
+        StartNode startNode = new StartNode();
+        startNode.setName("Start");
+        startNode.setId(1);
+        process.addNode(startNode);
+        
+        MilestoneNode milestoneNode = new MilestoneNode();
+        milestoneNode.setName("Milestone");
+        milestoneNode.setConstraint("eval(false)");
+        milestoneNode.setId(2);
+        process.addNode(milestoneNode);
+        new ConnectionImpl(
+            startNode, Node.CONNECTION_DEFAULT_TYPE,
+            milestoneNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        EndNode endNode = new EndNode();
+        endNode.setName("EndNode");
+        endNode.setId(3);
+        process.addNode(endNode);
+        new ConnectionImpl(
+            milestoneNode, Node.CONNECTION_DEFAULT_TYPE,
+            endNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        EventNode eventNode = new EventNode();
+        EventTypeFilter eventFilter = new EventTypeFilter();
+        eventFilter.setType("myEvent");
+        eventNode.addEventFilter(eventFilter);
+        eventNode.setVariableName("event");
+        eventNode.setId(4);
+        process.addNode(eventNode);
+        
+        final List<String> myList = new ArrayList<String>();
+        ActionNode actionNode = new ActionNode();
+        actionNode.setName("Print");
+        DroolsAction action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+            	System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
+                myList.add("Executed action");
+            }
+        });
+        actionNode.setAction(action);
+        actionNode.setId(5);
+        process.addNode(actionNode);
+        new ConnectionImpl(
+            eventNode, Node.CONNECTION_DEFAULT_TYPE,
+            actionNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        EndNode endNode2 = new EndNode();
+        endNode2.setName("EndNode");
+        endNode2.setTerminate(false);
+        endNode2.setId(6);
+        process.addNode(endNode2);
+        new ConnectionImpl(
+            actionNode, Node.CONNECTION_DEFAULT_TYPE,
+            endNode2, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase();
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.process.event");
+        assertEquals(0, myList.size());
+        Person jack = new Person();
+        jack.setName("Jack");
+        processInstance.signalEvent("myEvent", jack);
+        assertEquals(1, myList.size());
+        Person john = new Person();
+        john.setName("John");
+        processInstance.signalEvent("myEvent", john);
+        assertEquals(2, myList.size());
+    }
+
+    public void testEvent3() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId("org.drools.process.event");
+        process.setName("Event Process");
+        
+        List<Variable> variables = new ArrayList<Variable>();
+        Variable variable = new Variable();
+        variable.setName("event");
+        ObjectDataType personDataType = new ObjectDataType();
+        personDataType.setClassName("org.drools.Person");
+        variable.setType(personDataType);
+        variables.add(variable);
+        process.getVariableScope().setVariables(variables);
+
+        StartNode startNode = new StartNode();
+        startNode.setName("Start");
+        startNode.setId(1);
+        process.addNode(startNode);
+        
+        EventNode eventNode = new EventNode();
+        EventTypeFilter eventFilter = new EventTypeFilter();
+        eventFilter.setType("myEvent");
+        eventNode.addEventFilter(eventFilter);
+        eventNode.setVariableName("event");
+        eventNode.setId(3);
+        process.addNode(eventNode);
+        
+        final List<String> myList = new ArrayList<String>();
+        ActionNode actionNode = new ActionNode();
+        actionNode.setName("Print");
+        DroolsAction action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+            	System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
+                myList.add("Executed action");
+            }
+        });
+        actionNode.setAction(action);
+        actionNode.setId(4);
+        process.addNode(actionNode);
+        new ConnectionImpl(
+            eventNode, Node.CONNECTION_DEFAULT_TYPE,
+            actionNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        EventNode eventNode2 = new EventNode();
+        eventFilter = new EventTypeFilter();
+        eventFilter.setType("myOtherEvent");
+        eventNode2.addEventFilter(eventFilter);
+        eventNode2.setVariableName("event");
+        eventNode2.setId(5);
+        process.addNode(eventNode2);
+        
+        ActionNode actionNode2 = new ActionNode();
+        actionNode2.setName("Print");
+        action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+            	System.out.println("Detected other event for person " + ((Person) context.getVariable("event")).getName());
+                myList.add("Executed action");
+            }
+        });
+        actionNode2.setAction(action);
+        actionNode2.setId(6);
+        process.addNode(actionNode2);
+        new ConnectionImpl(
+            eventNode2, Node.CONNECTION_DEFAULT_TYPE,
+            actionNode2, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        Join join = new Join();
+        join.setName("AND Join");
+        join.setType(Join.TYPE_AND);
+        join.setId(7);
+        process.addNode(join);
+        new ConnectionImpl(
+            startNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+        new ConnectionImpl(
+            actionNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+        new ConnectionImpl(
+            actionNode2, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+    
+        EndNode endNode = new EndNode();
+        endNode.setName("EndNode");
+        endNode.setId(8);
+        process.addNode(endNode);
+        new ConnectionImpl(
+            join, Node.CONNECTION_DEFAULT_TYPE,
+            endNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase();
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.process.event");
+        assertEquals(0, myList.size());
+        Person jack = new Person();
+        jack.setName("Jack");
+        processInstance.signalEvent("myEvent", jack);
+        assertEquals(1, myList.size());
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        processInstance.signalEvent("myEvent", jack);
+        assertEquals(2, myList.size());
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        Person john = new Person();
+        john.setName("John");
+        processInstance.signalEvent("myOtherEvent", john);
+        assertEquals(3, myList.size());
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+    }
+    
+    public void testEvent4() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId("org.drools.process.event");
+        process.setName("Event Process");
+        
+        List<Variable> variables = new ArrayList<Variable>();
+        Variable variable = new Variable();
+        variable.setName("event");
+        ObjectDataType personDataType = new ObjectDataType();
+        personDataType.setClassName("org.drools.Person");
+        variable.setType(personDataType);
+        variables.add(variable);
+        process.getVariableScope().setVariables(variables);
+
+        StartNode startNode = new StartNode();
+        startNode.setName("Start");
+        startNode.setId(1);
+        process.addNode(startNode);
+        
+        EventNode eventNode = new EventNode();
+        EventTypeFilter eventFilter = new EventTypeFilter();
+        eventFilter.setType("myEvent");
+        eventNode.addEventFilter(eventFilter);
+        eventNode.setId(3);
+        process.addNode(eventNode);
+        
+        final List<String> myList = new ArrayList<String>();
+        ActionNode actionNode = new ActionNode();
+        actionNode.setName("Print");
+        DroolsAction action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+                myList.add("Executed action");
+            }
+        });
+        actionNode.setAction(action);
+        actionNode.setId(4);
+        process.addNode(actionNode);
+        new ConnectionImpl(
+            eventNode, Node.CONNECTION_DEFAULT_TYPE,
+            actionNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        EventNode eventNode2 = new EventNode();
+        eventFilter = new EventTypeFilter();
+        eventFilter.setType("myEvent");
+        eventNode2.addEventFilter(eventFilter);
+        eventNode2.setId(5);
+        process.addNode(eventNode2);
+        
+        ActionNode actionNode2 = new ActionNode();
+        actionNode2.setName("Print");
+        action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+                myList.add("Executed action");
+            }
+        });
+        actionNode2.setAction(action);
+        actionNode2.setId(6);
+        process.addNode(actionNode2);
+        new ConnectionImpl(
+            eventNode2, Node.CONNECTION_DEFAULT_TYPE,
+            actionNode2, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        Join join = new Join();
+        join.setName("AND Join");
+        join.setType(Join.TYPE_AND);
+        join.setId(7);
+        process.addNode(join);
+        new ConnectionImpl(
+            startNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+        new ConnectionImpl(
+            actionNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+        new ConnectionImpl(
+            actionNode2, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+    
+        EndNode endNode = new EndNode();
+        endNode.setName("EndNode");
+        endNode.setId(8);
+        process.addNode(endNode);
+        new ConnectionImpl(
+            join, Node.CONNECTION_DEFAULT_TYPE,
+            endNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase();
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.process.event");
+        assertEquals(0, myList.size());
+        processInstance.signalEvent("myEvent", null);
+        assertEquals(2, myList.size());
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/event.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/event.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -15,9 +15,12 @@
  * limitations under the License.
  */
 
+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.workflow.core.node.EndNode;
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
 
 /**
  * Wrapper for an end node.
@@ -26,8 +29,18 @@
  */
 public class EndNodeWrapper extends AbstractNodeWrapper {
 
+    public static final String TERMINATE = "terminate";
+
     private static final long serialVersionUID = 400L;
+    private static IPropertyDescriptor[] descriptors;
 
+    static {
+        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" });
+    }
+    
     public EndNodeWrapper() {
         setNode(new EndNode());
         getEndNode().setName("End");
@@ -37,6 +50,33 @@
         return (EndNode) getNode();
     }
     
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+        return descriptors;
+    }
+
+    public Object getPropertyValue(Object id) {
+        if (TERMINATE.equals(id)) {
+            return getEndNode().isTerminate() ? new Integer(0) : new Integer(1);
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (TERMINATE.equals(id)) {
+            getEndNode().setTerminate(true);
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+    public void setPropertyValue(Object id, Object value) {
+        if (TERMINATE.equals(id)) {
+            getEndNode().setTerminate(((Integer) value).intValue() == 0);
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+
     public boolean acceptsIncomingConnection(ElementConnection connection, ElementWrapper source) {
         return super.acceptsIncomingConnection(connection, source)
         	&& getIncomingConnections().isEmpty();

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,111 @@
+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.ArrayList;
+import java.util.List;
+
+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.process.core.event.EventFilter;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.workflow.core.node.EventNode;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * Wrapper for a start node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class EventNodeWrapper extends AbstractNodeWrapper {
+
+    private static final long serialVersionUID = 400L;
+    private static IPropertyDescriptor[] descriptors;
+
+    public static final String VARIABLE_NAME = "variableName";
+    public static final String EVENT_TYPE = "eventType";
+    static {
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 2];
+        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors[descriptors.length - 2] = 
+            new TextPropertyDescriptor(VARIABLE_NAME, "VariableName");
+        descriptors[descriptors.length - 1] = 
+            new TextPropertyDescriptor(EVENT_TYPE, "EventType");
+    }
+
+    public EventNodeWrapper() {
+        setNode(new EventNode());
+        setName("Event");
+    }
+    
+    public EventNode getEventNode() {
+        return (EventNode) getNode();
+    }
+    
+    public boolean acceptsIncomingConnection(ElementConnection connection, ElementWrapper source) {
+        return false;
+    }
+
+    public boolean acceptsOutgoingConnection(ElementConnection connection, ElementWrapper target) {
+        return super.acceptsOutgoingConnection(connection, target)
+        	&& getOutgoingConnections().isEmpty();
+    }
+    
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+        return descriptors;
+    }
+
+    public Object getPropertyValue(Object id) {
+        if (VARIABLE_NAME.equals(id)) {
+        	String variableName = getEventNode().getVariableName();
+            return variableName == null ? "" : variableName;
+        }
+        if (EVENT_TYPE.equals(id)) {
+        	if (getEventNode().getEventFilters().isEmpty()) {
+        		return "";
+        	}
+        	return ((EventTypeFilter) getEventNode().getEventFilters().get(0)).getType();
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (VARIABLE_NAME.equals(id)) {
+            getEventNode().setVariableName(null);
+        } else if (EVENT_TYPE.equals(id)) {
+            getEventNode().setEventFilters(new ArrayList<EventFilter>());
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+    public void setPropertyValue(Object id, Object value) {
+        if (VARIABLE_NAME.equals(id)) {
+            getEventNode().setVariableName((String) value);
+        } else if (EVENT_TYPE.equals(id)) {
+        	List<EventFilter> eventFilters = new ArrayList<EventFilter>();
+        	EventTypeFilter eventFilter = new EventTypeFilter();
+        	eventFilter.setType((String) value);
+        	eventFilters.add(eventFilter);
+            getEventNode().setEventFilters(eventFilters);
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -21,6 +21,7 @@
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.workflow.core.node.CompositeNode;
 import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.ForEachNode;
 import org.drools.workflow.core.node.HumanTaskNode;
 import org.drools.workflow.core.node.Join;
@@ -131,6 +132,8 @@
                 workItemWrapper.setWorkDefinition(workDefinition);
             }
             return workItemWrapper;
+        } else if (node instanceof EventNode) {
+            return new EventNodeWrapper();
         }
         throw new IllegalArgumentException(
             "Could not find node wrapper for node " + node);

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -21,10 +21,10 @@
 import org.drools.eclipse.DroolsEclipsePlugin;
 import org.drools.eclipse.flow.common.editor.core.ElementConnectionFactory;
 import org.drools.eclipse.flow.ruleflow.core.ActionWrapper;
-import org.drools.eclipse.flow.ruleflow.core.CompositeNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.ConnectionWrapper;
 import org.drools.eclipse.flow.ruleflow.core.ConnectionWrapperFactory;
 import org.drools.eclipse.flow.ruleflow.core.EndNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.EventNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.ForEachNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.HumanTaskNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.JoinWrapper;
@@ -163,8 +163,18 @@
             ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/timer.gif"))
         );
         entries.add(combined);
-                          
+                      
         combined = new CombinedTemplateCreationEntry(
+		    "Event",
+		    "Create a new Event Node",
+		    EventNodeWrapper.class,
+		    new SimpleFactory(EventNodeWrapper.class),
+		    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/event.gif")), 
+		    ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/event.gif"))
+		);
+		entries.add(combined);
+	                    
+        combined = new CombinedTemplateCreationEntry(
             "Human Task",
             "Create a new Human Task",
             HumanTaskNodeWrapper.class,

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EventNodeEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EventNodeEditPart.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EventNodeEditPart.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -0,0 +1,53 @@
+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.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * EditPart for a start node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class EventNodeEditPart extends ElementEditPart {
+
+    protected IFigure createFigure() {
+        return new EventNodeFigure();
+    }
+
+    public static class EventNodeFigure extends AbstractElementFigure {
+        
+        private static final Image icon = ImageDescriptor.createFromURL(
+    		DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/event.gif")).createImage();
+        
+        protected void customizeFigure() {
+            setIcon(icon);
+            setBorder(new LineBorder(1));
+        }
+        
+        public void setSelected(boolean b) {
+            super.setSelected(b);
+            ((LineBorder) getBorder()).setWidth(b ? 3 : 1);
+            repaint();
+        }
+    }
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java	2008-07-23 15:15:48 UTC (rev 21192)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java	2008-07-23 15:50:00 UTC (rev 21193)
@@ -22,6 +22,7 @@
 import org.drools.eclipse.flow.ruleflow.core.CompositeNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.ConnectionWrapper;
 import org.drools.eclipse.flow.ruleflow.core.EndNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.EventNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.ForEachNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.JoinWrapper;
 import org.drools.eclipse.flow.ruleflow.core.MilestoneWrapper;
@@ -79,6 +80,8 @@
             result = new ForEachNodeEditPart();
         } else if (model instanceof CompositeNodeWrapper) {
             result = new ElementContainerEditPart();
+        } else if (model instanceof EventNodeWrapper) {
+            result = new EventNodeEditPart();
         } else {
             throw new IllegalArgumentException(
                 "Unknown model object " + model);




More information about the jboss-svn-commits mailing list