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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed May 21 20:13:05 EDT 2008


Author: KrisVerlaenen
Date: 2008-05-21 20:13:05 -0400 (Wed, 21 May 2008)
New Revision: 20106

Added:
   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/InPortHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/OutPortHandler.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/XmlRuleFlowProcessDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConnectionHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd
Log:
JBRULES-1616: Composite Node
 - added xml persistence and validation for composite nodes

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-05-21 16:10:32 UTC (rev 20105)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2008-05-22 00:13:05 UTC (rev 20106)
@@ -1,14 +1,17 @@
 package org.drools.xml;
 
 import org.drools.xml.processes.ActionNodeHandler;
+import org.drools.xml.processes.CompositeNodeHandler;
 import org.drools.xml.processes.ConnectionHandler;
 import org.drools.xml.processes.ConstraintHandler;
 import org.drools.xml.processes.EndNodeHandler;
 import org.drools.xml.processes.GlobalHandler;
 import org.drools.xml.processes.ImportHandler;
+import org.drools.xml.processes.InPortHandler;
 import org.drools.xml.processes.JoinNodeHandler;
 import org.drools.xml.processes.MappingHandler;
 import org.drools.xml.processes.MilestoneNodeHandler;
+import org.drools.xml.processes.OutPortHandler;
 import org.drools.xml.processes.ParameterHandler;
 import org.drools.xml.processes.ProcessHandler;
 import org.drools.xml.processes.RuleSetNodeHandler;
@@ -48,6 +51,8 @@
                            new MilestoneNodeHandler() );
         addHandler( "timer",
                            new TimerNodeHandler() );
+        addHandler( "composite",
+                           new CompositeNodeHandler() );
         addHandler( "connection",
                            new ConnectionHandler() );
         addHandler( "import",
@@ -68,5 +73,9 @@
                            new MappingHandler() );        
         addHandler( "constraint",
                            new ConstraintHandler() );        
+        addHandler( "in-port",
+                           new InPortHandler() );        
+        addHandler( "out-port",
+                           new OutPortHandler() );        
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlRuleFlowProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlRuleFlowProcessDumper.java	2008-05-21 16:10:32 UTC (rev 20105)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlRuleFlowProcessDumper.java	2008-05-22 00:13:05 UTC (rev 20106)
@@ -16,6 +16,7 @@
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.impl.NodeImpl;
 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.Join;
 import org.drools.workflow.core.node.MilestoneNode;
@@ -71,7 +72,7 @@
         xmlDump.append(">" + EOL + EOL);
         visitHeader(process, includeMeta);
         visitNodes(process, includeMeta);
-        visitConnections(process, includeMeta);
+        visitConnections(process.getNodes(), includeMeta);
         xmlDump.append("</process>");
     }
     
@@ -134,34 +135,46 @@
             visitStartNode(startNode, includeMeta);
         }
         for (Node node: process.getNodes()) {
-            if (node instanceof StartNode) {
-                // Do nothing, start node already added
-            } else if (node instanceof EndNode) {
-                visitEndNode((EndNode) node, includeMeta);
-            } else if (node instanceof ActionNode) {
-                visitActionNode((ActionNode) node, includeMeta);
-            } else if (node instanceof RuleSetNode) {
-                visitRuleSetNode((RuleSetNode) node, includeMeta);
-            } else if (node instanceof SubProcessNode) {
-                visitSubProcessNode((SubProcessNode) node, includeMeta);
-            } else if (node instanceof WorkItemNode) {
-                visitWorkItemNode((WorkItemNode) node, includeMeta);
-            } else if (node instanceof Join) {
-                visitJoinNode((Join) node, includeMeta);
-            } else if (node instanceof Split) {
-                visitSplitNode((Split) node, includeMeta);
-            } else if (node instanceof MilestoneNode) {
-                visitMileStoneNode((MilestoneNode) node, includeMeta);
-            } else if (node instanceof TimerNode) {
-                visitTimerNode((TimerNode) node, includeMeta);
-            } else {
-                throw new IllegalArgumentException(
-                    "Unknown node type: " + node);
-            }
+            visitNode(node, includeMeta);
         }
         xmlDump.append("  </nodes>" + EOL + EOL);
     }
     
+    private void visitNode(Node node, boolean includeMeta) {
+        if (node instanceof StartNode) {
+            // Do nothing, start node already added
+        } else if (node instanceof EndNode) {
+            visitEndNode((EndNode) node, includeMeta);
+        } else if (node instanceof ActionNode) {
+            visitActionNode((ActionNode) node, includeMeta);
+        } else if (node instanceof RuleSetNode) {
+            visitRuleSetNode((RuleSetNode) node, includeMeta);
+        } else if (node instanceof SubProcessNode) {
+            visitSubProcessNode((SubProcessNode) node, includeMeta);
+        } else if (node instanceof WorkItemNode) {
+            visitWorkItemNode((WorkItemNode) node, includeMeta);
+        } else if (node instanceof Join) {
+            visitJoinNode((Join) node, includeMeta);
+        } else if (node instanceof Split) {
+            visitSplitNode((Split) node, includeMeta);
+        } else if (node instanceof MilestoneNode) {
+            visitMileStoneNode((MilestoneNode) node, includeMeta);
+        } else if (node instanceof TimerNode) {
+            visitTimerNode((TimerNode) node, includeMeta);
+        } else if (node instanceof CompositeNode) {
+            visitCompositeNode((CompositeNode) node, includeMeta);
+        } else if (node instanceof CompositeNode.CompositeNodeStart) {
+            // do nothing, can be recreated
+        } else if (node instanceof CompositeNode.CompositeNodeEnd) {
+            // do nothing, can be recreated
+        } else if (node instanceof CompositeNode) {
+            visitCompositeNode((CompositeNode) node, includeMeta);
+        } else {
+            throw new IllegalArgumentException(
+                "Unknown node type: " + node);
+        }
+    }
+    
     private void visitNode(String name, Node node, boolean includeMeta) {
         xmlDump.append("    <" + name + " id=\"" + node.getId() + "\" "); 
         if (node.getName() != null) {
@@ -365,30 +378,82 @@
         endElement();
     }
     
-    private void visitConnections(RuleFlowProcess process, boolean includeMeta) {
+    private void visitCompositeNode(CompositeNode compositeNode, boolean includeMeta) {
+        visitNode("composite", compositeNode, includeMeta);
+        xmlDump.append(">" + EOL);
+        xmlDump.append("      <nodes>" + EOL);
+        for (Node subNode: compositeNode.getNodes()) {
+            visitNode(subNode, includeMeta);
+        }
+        xmlDump.append("      </nodes>" + EOL);
         List<Connection> connections = new ArrayList<Connection>();
-        for (Node node: process.getNodes()) {
+        for (Node node: compositeNode.getNodes()) {
+            if (!(node instanceof CompositeNode.CompositeNodeEnd)) {
+                for (Connection connection: node.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE)) {
+                    if (!(connection.getFrom() instanceof CompositeNode.CompositeNodeStart)) {
+                        connections.add(connection);
+                    }
+                }
+            }
+        }
+        xmlDump.append("      <connections>" + EOL);
+        for (Connection connection: connections) {
+            visitConnection(connection, 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);
+        endElement("composite");
+    }
+    
+//    private void visitCompositeNodeStart(CompositeNode.CompositeNodeStart compositeNodeStart, boolean includeMeta) {
+//        visitNode("composite-start", compositeNodeStart, includeMeta);
+//        xmlDump.append("in-nodeId=\"" + compositeNodeStart.getInNodeId() + "\" in-type=\"" + compositeNodeStart.getInType() + "\" />" + EOL);
+//        endElement();
+//    }
+//    
+//    private void visitCompositeNodeEnd(CompositeNode.CompositeNodeEnd compositeNodeEnd, boolean includeMeta) {
+//        visitNode("composite-end", compositeNodeEnd, includeMeta);
+//        xmlDump.append("out-nodeId=\"" + compositeNodeEnd.getOutNodeId() + "\" in-type=\"" + compositeNodeEnd.getOutType() + "\" />" + EOL);
+//        endElement();
+//    }
+    
+    private void visitConnections(Node[] nodes, boolean includeMeta) {
+        List<Connection> connections = new ArrayList<Connection>();
+        for (Node node: nodes) {
             connections.addAll(node.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE));
         }
         xmlDump.append("  <connections>" + EOL);
         for (Connection connection: connections) {
-            xmlDump.append("    <connection from=\"" + connection.getFrom().getId() + "\" ");
-            if (!NodeImpl.CONNECTION_DEFAULT_TYPE.equals(connection.getFromType())) {
-                xmlDump.append("fromType=\"" + connection.getFromType() + "\" ");
-            }
-            xmlDump.append("to=\"" + connection.getTo().getId() + "\" ");
-            if (!NodeImpl.CONNECTION_DEFAULT_TYPE.equals(connection.getToType())) {
-                xmlDump.append("toType=\"" + connection.getToType() + "\" ");
-            }
-            if (includeMeta) {
-                String bendpoints = (String) connection.getMetaData("bendpoints");
-                if (bendpoints != null) {
-                    xmlDump.append("bendpoints=\"" + bendpoints + "\" ");
-                }
-            }
-            xmlDump.append("/>" + EOL);
+            visitConnection(connection, includeMeta);
         }
         xmlDump.append("  </connections>" + EOL + EOL);
     }
     
+    private void visitConnection(Connection connection, boolean includeMeta) {
+        xmlDump.append("    <connection from=\"" + connection.getFrom().getId() + "\" ");
+        if (!NodeImpl.CONNECTION_DEFAULT_TYPE.equals(connection.getFromType())) {
+            xmlDump.append("fromType=\"" + connection.getFromType() + "\" ");
+        }
+        xmlDump.append("to=\"" + connection.getTo().getId() + "\" ");
+        if (!NodeImpl.CONNECTION_DEFAULT_TYPE.equals(connection.getToType())) {
+            xmlDump.append("toType=\"" + connection.getToType() + "\" ");
+        }
+        if (includeMeta) {
+            String bendpoints = (String) connection.getMetaData("bendpoints");
+            if (bendpoints != null) {
+                xmlDump.append("bendpoints=\"" + bendpoints + "\" ");
+            }
+        }
+        xmlDump.append("/>" + EOL);
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java	2008-05-21 16:10:32 UTC (rev 20105)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java	2008-05-22 00:13:05 UTC (rev 20106)
@@ -29,6 +29,7 @@
     
     protected void initValidPeers() {
         this.validPeers = new HashSet();
+        this.validPeers.add(null);
         this.validPeers.add(Node.class);
     }
 

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java	2008-05-22 00:13:05 UTC (rev 20106)
@@ -0,0 +1,16 @@
+package org.drools.xml.processes;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeNode;
+
+public class CompositeNodeHandler extends AbstractNodeHandler {
+
+    protected Node createNode() {
+        return new CompositeNode();
+    }
+
+    public Class generateNodeFor() {
+        return CompositeNode.class;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConnectionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConnectionHandler.java	2008-05-21 16:10:32 UTC (rev 20105)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ConnectionHandler.java	2008-05-22 00:13:05 UTC (rev 20106)
@@ -2,9 +2,9 @@
 
 import java.util.HashSet;
 
-import org.drools.process.core.Process;
 import org.drools.workflow.core.Connection;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
 import org.drools.workflow.core.impl.ConnectionImpl;
 import org.drools.xml.BaseAbstractHandler;
 import org.drools.xml.Configuration;
@@ -21,7 +21,7 @@
     public ConnectionHandler() {
         if ( (this.validParents == null) && (this.validPeers == null) ) {
             this.validParents = new HashSet();
-            this.validParents.add( Process.class );
+            this.validParents.add( NodeContainer.class );
 
             this.validPeers = new HashSet();
             this.validPeers.add( null );
@@ -46,9 +46,9 @@
         emptyAttributeCheck( localName, "to", toId, parser );
         String bendpoints = attrs.getValue( "bendpoints" );
         
-        ProcessBuildData buildData = (ProcessBuildData) parser.getData();
-        Node fromNode = buildData.getNode( new Long(fromId) );
-        Node toNode = buildData.getNode( new Long(toId) );
+        NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+        Node fromNode = nodeContainer.getNode( new Long(fromId) );
+        Node toNode = nodeContainer.getNode( new Long(toId) );
         
         if ( fromNode == null ) {
                 throw new SAXParseException( "Node '" + fromId + "' cannot be found",

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/InPortHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/InPortHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/InPortHandler.java	2008-05-22 00:13:05 UTC (rev 20106)
@@ -0,0 +1,54 @@
+package org.drools.xml.processes;
+
+import java.util.HashSet;
+
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class InPortHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    public InPortHandler() {
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( CompositeNode.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.startConfiguration(localName, attrs);
+        CompositeNode compositeNode = (CompositeNode) parser.getParent();
+        final String type = attrs.getValue("type");
+        emptyAttributeCheck(localName, "type", type, parser);
+        final String nodeId = attrs.getValue("nodeId");
+        emptyAttributeCheck(localName, "nodeId", nodeId, parser);
+        final String nodeInType = attrs.getValue("nodeInType");
+        emptyAttributeCheck(localName, "nodeInType", nodeInType, parser);
+        compositeNode.linkIncomingConnections(type, new Long(nodeId), nodeInType);
+        return null;
+    }    
+    
+    public Object end(final String uri,
+                      final String localName,
+                      final ExtensibleXmlParser parser) throws SAXException {
+        parser.endConfiguration();
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return null;
+    }    
+
+}

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/OutPortHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/OutPortHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/OutPortHandler.java	2008-05-22 00:13:05 UTC (rev 20106)
@@ -0,0 +1,54 @@
+package org.drools.xml.processes;
+
+import java.util.HashSet;
+
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class OutPortHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    public OutPortHandler() {
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( CompositeNode.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.startConfiguration(localName, attrs);
+        CompositeNode compositeNode = (CompositeNode) parser.getParent();
+        final String type = attrs.getValue("type");
+        emptyAttributeCheck(localName, "type", type, parser);
+        final String nodeId = attrs.getValue("nodeId");
+        emptyAttributeCheck(localName, "nodeId", nodeId, parser);
+        final String nodeOutType = attrs.getValue("nodeOutType");
+        emptyAttributeCheck(localName, "nodeOutType", nodeOutType, parser);
+        compositeNode.linkOutgoingConnections(new Long(nodeId), nodeOutType, type);
+        return null;
+    }    
+    
+    public Object end(final String uri,
+                      final String localName,
+                      final ExtensibleXmlParser parser) throws SAXException {
+        parser.endConfiguration();
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return null;
+    }    
+
+}

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-05-21 16:10:32 UTC (rev 20105)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd	2008-05-22 00:13:05 UTC (rev 20106)
@@ -90,6 +90,7 @@
 				<xs:element ref="drools:subProcess"/>
 				<xs:element ref="drools:workItem"/>
 				<xs:element ref="drools:timer"/>
+				<xs:element ref="drools:composite"/>
 			</xs:choice>
 		</xs:complexType>
 	</xs:element>
@@ -263,6 +264,50 @@
 			<xs:attribute name="period" type="xs:string"/>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="composite">
+		<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:complexType>
+	</xs:element>
+	<xs:element name="in-ports">
+		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:in-port"/>
+			</xs:choice>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="in-port">
+		<xs:complexType>
+			<xs:attribute name="type" type="xs:string" use="required"/>
+			<xs:attribute name="nodeId" type="xs:string" use="required"/>
+			<xs:attribute name="nodeInType" type="xs:string" use="required"/>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="out-ports">
+		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:out-port"/>
+			</xs:choice>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="out-port">
+		<xs:complexType>
+			<xs:attribute name="type" type="xs:string" use="required"/>
+			<xs:attribute name="nodeId" type="xs:string" use="required"/>
+			<xs:attribute name="nodeOutType" type="xs:string" use="required"/>
+		</xs:complexType>
+	</xs:element>
 	<xs:element name="connections">
 		<xs:complexType>
 			<xs:sequence minOccurs="0" maxOccurs="unbounded">




More information about the jboss-svn-commits mailing list