[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