[jboss-svn-commits] JBL Code SVN: r21161 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/xml/processes and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Jul 22 08:32:20 EDT 2008
Author: KrisVerlaenen
Date: 2008-07-22 08:32:20 -0400 (Tue, 22 Jul 2008)
New Revision: 21161
Added:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ForEachNodeHandler.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/CompositeNodeHandler.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
Log:
JBRULES-1690: IDE support for ForEach
- extended for each in compiler
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-22 12:30:50 UTC (rev 21160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java 2008-07-22 12:32:20 UTC (rev 21161)
@@ -5,6 +5,7 @@
import org.drools.xml.processes.ConnectionHandler;
import org.drools.xml.processes.ConstraintHandler;
import org.drools.xml.processes.EndNodeHandler;
+import org.drools.xml.processes.ForEachNodeHandler;
import org.drools.xml.processes.GlobalHandler;
import org.drools.xml.processes.HumanTaskNodeHandler;
import org.drools.xml.processes.ImportHandler;
@@ -55,6 +56,8 @@
new TimerNodeHandler() );
addHandler( "humanTask",
new HumanTaskNodeHandler() );
+ addHandler( "forEach",
+ new ForEachNodeHandler() );
addHandler( "composite",
new CompositeNodeHandler() );
addHandler( "connection",
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java 2008-07-22 12:30:50 UTC (rev 21160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java 2008-07-22 12:32:20 UTC (rev 21161)
@@ -18,21 +18,60 @@
public Class generateNodeFor() {
return CompositeNode.class;
}
+
+ protected String getNodeName() {
+ return "composite";
+ }
public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+ super.writeNode(getNodeName(), node, xmlDump, includeMeta);
CompositeNode compositeNode = (CompositeNode) node;
- writeNode("composite", compositeNode, xmlDump, includeMeta);
+ writeAttributes(compositeNode, xmlDump, includeMeta);
xmlDump.append(">" + EOL);
+ List<Node> subNodes = getSubNodes(compositeNode);
xmlDump.append(" <nodes>" + EOL);
+ for (Node subNode: subNodes) {
+ XmlRuleFlowProcessDumper.INSTANCE.visitNode(subNode, xmlDump, includeMeta);
+ }
+ xmlDump.append(" </nodes>" + EOL);
+ List<Connection> connections = getSubConnections(compositeNode);
+ xmlDump.append(" <connections>" + EOL);
+ for (Connection connection: connections) {
+ XmlRuleFlowProcessDumper.INSTANCE.visitConnection(connection, xmlDump, includeMeta);
+ }
+ xmlDump.append(" </connections>" + EOL);
+ Map<String, CompositeNode.NodeAndType> inPorts = getInPorts(compositeNode);
+ xmlDump.append(" <in-ports>" + EOL);
+ for (Map.Entry<String, CompositeNode.NodeAndType> entry: inPorts.entrySet()) {
+ xmlDump.append(" <in-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeInType=\"" + entry.getValue().getType() + "\" />" + EOL);
+ }
+ xmlDump.append(" </in-ports>" + EOL);
+ Map<String, CompositeNode.NodeAndType> outPorts = getOutPorts(compositeNode);
+ xmlDump.append(" <out-ports>" + EOL);
+ for (Map.Entry<String, CompositeNode.NodeAndType> entry: outPorts.entrySet()) {
+ xmlDump.append(" <out-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeOutType=\"" + entry.getValue().getType() + "\" />" + EOL);
+ }
+ xmlDump.append(" </out-ports>" + EOL);
+ endNode(getNodeName(), xmlDump);
+ }
+
+ protected void writeAttributes(CompositeNode compositeNode, StringBuffer xmlDump, boolean includeMeta) {
+ }
+
+ protected List<Node> getSubNodes(CompositeNode compositeNode) {
+ List<Node> subNodes = new ArrayList<Node>();
for (Node subNode: compositeNode.getNodes()) {
// filter out composite start and end nodes as they can be regenerated
if ((!(subNode instanceof CompositeNode.CompositeNodeStart)) &&
(!(subNode instanceof CompositeNode.CompositeNodeEnd))) {
- XmlRuleFlowProcessDumper.INSTANCE.visitNode(subNode, xmlDump, includeMeta);
+ subNodes.add(subNode);
}
}
- xmlDump.append(" </nodes>" + EOL);
- List<Connection> connections = new ArrayList<Connection>();
+ return subNodes;
+ }
+
+ protected List<Connection> getSubConnections(CompositeNode compositeNode) {
+ List<Connection> connections = new ArrayList<Connection>();
for (Node subNode: compositeNode.getNodes()) {
// filter out composite start and end nodes as they can be regenerated
if (!(subNode instanceof CompositeNode.CompositeNodeEnd)) {
@@ -43,21 +82,15 @@
}
}
}
- xmlDump.append(" <connections>" + EOL);
- for (Connection connection: connections) {
- XmlRuleFlowProcessDumper.INSTANCE.visitConnection(connection, xmlDump, includeMeta);
- }
- xmlDump.append(" </connections>" + EOL);
- xmlDump.append(" <in-ports>" + EOL);
- for (Map.Entry<String, CompositeNode.NodeAndType> entry: compositeNode.getLinkedIncomingNodes().entrySet()) {
- xmlDump.append(" <in-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeInType=\"" + entry.getValue().getType() + "\" />" + EOL);
- }
- xmlDump.append(" </in-ports>" + EOL);
- xmlDump.append(" <out-ports>" + EOL);
- for (Map.Entry<String, CompositeNode.NodeAndType> entry: compositeNode.getLinkedOutgoingNodes().entrySet()) {
- xmlDump.append(" <out-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeOutType=\"" + entry.getValue().getType() + "\" />" + EOL);
- }
- xmlDump.append(" </out-ports>" + EOL);
- endNode("composite", xmlDump);
+ return connections;
}
+
+ protected Map<String, CompositeNode.NodeAndType> getInPorts(CompositeNode compositeNode) {
+ return compositeNode.getLinkedIncomingNodes();
+ }
+
+ protected Map<String, CompositeNode.NodeAndType> getOutPorts(CompositeNode compositeNode) {
+ return compositeNode.getLinkedOutgoingNodes();
+ }
+
}
Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ForEachNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ForEachNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ForEachNodeHandler.java 2008-07-22 12:32:20 UTC (rev 21161)
@@ -0,0 +1,79 @@
+package org.drools.xml.processes;
+
+import java.util.List;
+import java.util.Map;
+
+import org.drools.process.core.datatype.impl.type.ObjectDataType;
+import org.drools.workflow.core.Connection;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.ForEachNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+public class ForEachNodeHandler extends CompositeNodeHandler {
+
+ protected Node createNode() {
+ return new ForEachNode();
+ }
+
+ public Class generateNodeFor() {
+ return ForEachNode.class;
+ }
+
+ protected String getNodeName() {
+ return "forEach";
+ }
+
+ protected void writeAttributes(CompositeNode compositeNode, StringBuffer xmlDump, boolean includeMeta) {
+ ForEachNode forEachNode = (ForEachNode) compositeNode;
+ String variableName = forEachNode.getVariableName();
+ if (variableName != null) {
+ xmlDump.append("variableName=\"" + variableName + "\" ");
+ }
+ String collectionExpression = forEachNode.getCollectionExpression();
+ if (collectionExpression != null) {
+ xmlDump.append("collectionExpression=\"" + collectionExpression + "\" ");
+ }
+ boolean waitForCompletion = forEachNode.isWaitForCompletion();
+ if (!waitForCompletion) {
+ xmlDump.append("waitForCompletion=\"false\" ");
+ }
+ }
+
+ protected List<Node> getSubNodes(CompositeNode compositeNode) {
+ return super.getSubNodes(((ForEachNode) compositeNode).getCompositeNode());
+ }
+
+ protected List<Connection> getSubConnections(CompositeNode compositeNode) {
+ return super.getSubConnections(((ForEachNode) compositeNode).getCompositeNode());
+ }
+
+ protected Map<String, CompositeNode.NodeAndType> getInPorts(CompositeNode compositeNode) {
+ return ((ForEachNode) compositeNode).getCompositeNode().getLinkedIncomingNodes();
+ }
+
+ protected Map<String, CompositeNode.NodeAndType> getOutPorts(CompositeNode compositeNode) {
+ return ((ForEachNode) compositeNode).getCompositeNode().getLinkedOutgoingNodes();
+ }
+
+ protected 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);
+ ForEachNode forEachNode = (ForEachNode) node;
+ final String variableName = element.getAttribute("variableName");
+ if (variableName != null && variableName.length() != 0) {
+ forEachNode.setVariable(variableName, new ObjectDataType());
+ }
+ final String collectionExpression = element.getAttribute("collectionExpression");
+ if (collectionExpression != null && collectionExpression.length() != 0) {
+ forEachNode.setCollectionExpression(collectionExpression);
+ }
+ final String waitForCompletion = element.getAttribute("waitForCompletion");
+ if ("false".equals(waitForCompletion)) {
+ forEachNode.setWaitForCompletion(false);
+ }
+ }
+
+}
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-22 12:30:50 UTC (rev 21160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd 2008-07-22 12:32:20 UTC (rev 21161)
@@ -105,6 +105,7 @@
<xs:element ref="drools:timer"/>
<xs:element ref="drools:humanTask"/>
<xs:element ref="drools:composite"/>
+ <xs:element ref="drools:forEach"/>
</xs:choice>
</xs:complexType>
</xs:element>
@@ -294,7 +295,8 @@
<xs:element ref="drools:action"/>
</xs:choice>
</xs:complexType>
- </xs:element> <xs:element name="timer">
+ </xs:element>
+ <xs:element name="timer">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="name" type="xs:string"/>
@@ -338,6 +340,24 @@
<xs:attribute name="height" type="xs:string"/>
</xs:complexType>
</xs:element>
+ <xs:element name="forEach">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="drools:nodes"/>
+ <xs:element ref="drools:connections"/>
+ <xs:element ref="drools:in-ports"/>
+ <xs:element ref="drools:out-ports"/>
+ </xs:choice>
+ <xs:attribute name="id" type="xs:string" use="required"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="x" type="xs:string"/>
+ <xs:attribute name="y" type="xs:string"/>
+ <xs:attribute name="width" type="xs:string"/>
+ <xs:attribute name="height" type="xs:string"/>
+ <xs:attribute name="variableName" type="xs:string"/>
+ <xs:attribute name="collectionExpression" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
<xs:element name="in-ports">
<xs:complexType>
<xs:choice 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-22 12:30:50 UTC (rev 21160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java 2008-07-22 12:32:20 UTC (rev 21161)
@@ -16,6 +16,7 @@
import org.drools.process.core.context.swimlane.Swimlane;
import org.drools.process.core.context.variable.Variable;
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.impl.ParameterDefinitionImpl;
import org.drools.process.core.impl.WorkImpl;
@@ -29,6 +30,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.ForEachNode;
import org.drools.workflow.core.node.HumanTaskNode;
import org.drools.workflow.core.node.Join;
import org.drools.workflow.core.node.MilestoneNode;
@@ -63,6 +65,7 @@
process.addNode(new WorkItemNode());
process.addNode(new TimerNode());
process.addNode(new HumanTaskNode());
+ process.addNode(new ForEachNode());
String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
if (xml == null) {
@@ -79,7 +82,7 @@
throw new IllegalArgumentException("Failed to reload process!");
}
- assertEquals(11, process.getNodes().length);
+ assertEquals(12, process.getNodes().length);
// System.out.println("************************************");
@@ -274,6 +277,20 @@
process.addNode(timerNode);
new ConnectionImpl(humanTaskNode, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
+ ForEachNode forEachNode = new ForEachNode();
+ forEachNode.setCollectionExpression("collection");
+ forEachNode.setVariable("variableName", new ObjectDataType());
+ forEachNode.setWaitForCompletion(false);
+ ActionNode subActionNode1 = new ActionNode();
+ forEachNode.getCompositeNode().addNode(subActionNode1);
+ ActionNode subActionNode2 = new ActionNode();
+ forEachNode.getCompositeNode().addNode(subActionNode2);
+ new ConnectionImpl(subActionNode1, Node.CONNECTION_DEFAULT_TYPE, subActionNode2, Node.CONNECTION_DEFAULT_TYPE);
+ forEachNode.getCompositeNode().linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, subActionNode1.getId(), Node.CONNECTION_DEFAULT_TYPE);
+ forEachNode.getCompositeNode().linkOutgoingConnections(subActionNode2.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
+ process.addNode(forEachNode);
+ new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, forEachNode, Node.CONNECTION_DEFAULT_TYPE);
+
EndNode endNode = new EndNode();
endNode.setName("end");
endNode.setMetaData("x", 1);
@@ -281,11 +298,11 @@
endNode.setMetaData("width", 3);
endNode.setMetaData("height", 4);
process.addNode(endNode);
- new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(forEachNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE);
String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true);
if (xml == null) {
- throw new IllegalArgumentException("Failed to persist empty nodes!");
+ throw new IllegalArgumentException("Failed to persist full nodes!");
}
// System.out.println(xml);
@@ -297,7 +314,7 @@
throw new IllegalArgumentException("Failed to reload process!");
}
- assertEquals(11, process.getNodes().length);
+ assertEquals(12, process.getNodes().length);
// System.out.println("************************************");
More information about the jboss-svn-commits
mailing list