[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