[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