[jboss-svn-commits] JBL Code SVN: r31279 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/ruleflow/core/validation and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jan 28 10:19:52 EST 2010


Author: KrisVerlaenen
Date: 2010-01-28 10:19:51 -0500 (Thu, 28 Jan 2010)
New Revision: 31279

Added:
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ForEachNodeHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MultiInstanceLoopCharacteristicsProcess.xml
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.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/ForEachNode.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AdHocSubProcessHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMN2SemanticModule.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/CompositeContextNodeHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SubProcessHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/WorkItemNodeHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/resources/META-INF/Semantic.xsd
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-SubProcess.xml
Log:
 - adding BPMN2 nodes

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -104,6 +104,7 @@
         if ( !hasErrors ) {
             // generate and add rule for process
             String rules = generateRules( process );
+            System.out.println(rules);
             try {
                 packageBuilder.addPackageFromDrl( new StringReader( rules ) );
             } catch ( IOException e ) {

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	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -348,14 +348,15 @@
                     errors.add(new ProcessValidationErrorImpl(process,
                         "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
                 }
-                if (forEachNode.getLinkedIncomingNode(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE) == null) {
-                    errors.add(new ProcessValidationErrorImpl(process,
-                        "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no linked start node"));
-                }
-                if (forEachNode.getLinkedOutgoingNode(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE) == null) {
-                    errors.add(new ProcessValidationErrorImpl(process,
-                        "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no linked end node"));
-                }
+                // TODO: check, if no linked connections, for start and end node(s)
+//                if (forEachNode.getLinkedIncomingNode(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE) == null) {
+//                    errors.add(new ProcessValidationErrorImpl(process,
+//                        "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no linked start node"));
+//                }
+//                if (forEachNode.getLinkedOutgoingNode(org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE) == null) {
+//                    errors.add(new ProcessValidationErrorImpl(process,
+//                        "ForEach node '" + node.getName() + "' [" + node.getId() + "] has no linked end node"));
+//                }
                 validateNodes(forEachNode.getNodes(), errors, process);
             } else if (node instanceof DynamicNode) {
                 final DynamicNode dynamicNode = (DynamicNode) node;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/ForEachNode.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -82,6 +82,18 @@
         return variableName;
     }
     
+    public DataType getVariableType() {
+    	if (variableName == null) {
+    		return null;
+    	}
+    	for (Variable variable: ((VariableScope) getCompositeNode().getDefaultContext(VariableScope.VARIABLE_SCOPE)).getVariables()) {
+    		if (variableName.equals(variable.getName())) {
+    			return variable.getType();
+    		}
+    	}
+    	return null;
+    }
+    
     public CompositeContextNode getCompositeNode() {
         return (CompositeContextNode) super.getNode(2); 
     }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AdHocSubProcessHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AdHocSubProcessHandler.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AdHocSubProcessHandler.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -7,7 +7,7 @@
 import org.drools.workflow.core.node.DynamicNode;
 import org.xml.sax.Attributes;
 
-public class AdHocSubProcessHandler extends SubProcessHandler {
+public class AdHocSubProcessHandler extends CompositeContextNodeHandler {
     
     protected Node createNode(Attributes attrs) {
         return new DynamicNode();

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMN2SemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMN2SemanticModule.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMN2SemanticModule.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -5,6 +5,7 @@
 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.Join;
 import org.drools.workflow.core.node.Split;
 import org.drools.workflow.core.node.StateNode;
@@ -63,6 +64,7 @@
         handlersByClass.put(ActionNode.class, new ActionNodeHandler());
         handlersByClass.put(StateNode.class, new StateNodeHandler());
         handlersByClass.put(CompositeContextNode.class, new CompositeContextNodeHandler());
+        handlersByClass.put(ForEachNode.class, new ForEachNodeHandler());
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -5,6 +5,7 @@
 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.Join;
 import org.drools.workflow.core.node.Split;
 import org.drools.workflow.core.node.StateNode;
@@ -63,6 +64,7 @@
         handlersByClass.put(ActionNode.class, new ActionNodeHandler());
         handlersByClass.put(StateNode.class, new StateNodeHandler());
         handlersByClass.put(CompositeContextNode.class, new CompositeContextNodeHandler());
+        handlersByClass.put(ForEachNode.class, new ForEachNodeHandler());
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/CompositeContextNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/CompositeContextNodeHandler.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/CompositeContextNodeHandler.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -24,7 +24,11 @@
 
     public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
     	CompositeContextNode compositeNode = (CompositeContextNode) node;
-		writeNode("subProcess", compositeNode, xmlDump, includeMeta);
+    	String nodeType = "subProcess";
+    	if (node.getMetaData("Transaction") != null) {
+    		nodeType = "transaction";
+    	}
+		writeNode(nodeType, compositeNode, xmlDump, includeMeta);
 		xmlDump.append(" >" + EOL);
         // variables
 		VariableScope variableScope = (VariableScope) 
@@ -52,7 +56,7 @@
         for (Connection connection: connections) {
         	XmlBPMNProcessDumper.INSTANCE.visitConnection(connection, xmlDump, includeMeta);
         }
-		endNode("subProcess", xmlDump);
+		endNode(nodeType, xmlDump);
 	}
 	
 	protected List<Node> getSubNodes(CompositeNode compositeNode) {

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ForEachNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ForEachNodeHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ForEachNodeHandler.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -0,0 +1,96 @@
+package org.drools.bpmn2.xml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.definition.process.Connection;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.ForEachNode;
+import org.xml.sax.Attributes;
+
+public class ForEachNodeHandler extends AbstractNodeHandler {
+    
+    protected Node createNode(Attributes attrs) {
+    	throw new IllegalArgumentException("Reading in should be handled by end event handler");
+    }
+    
+    @SuppressWarnings("unchecked")
+	public Class generateNodeFor() {
+        return ForEachNode.class;
+    }
+
+    public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+    	ForEachNode forEachNode = (ForEachNode) node;
+    	writeNode("subProcess", forEachNode, xmlDump, includeMeta);
+		xmlDump.append(" >" + EOL);
+		// ioSpecification and dataInputAssociation 
+        xmlDump.append(
+            "      <ioSpecification>" + EOL +
+            "        <dataInput id=\"_" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_input\" name=\"MultiInstanceInput\" />" + EOL +
+            "        <inputSet>" + EOL +
+            "          <dataInputRefs>_" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_input</dataInputRefs>" + EOL +
+            "        </inputSet>" + EOL +
+            "        <outputSet/>" + EOL +
+            "      </ioSpecification>" + EOL);
+        String collectionExpression = forEachNode.getCollectionExpression();
+        if (collectionExpression != null) {
+            xmlDump.append(
+                "      <dataInputAssociation>" + EOL +
+                "        <sourceRef>" + collectionExpression + "</sourceRef>" + EOL +
+                "        <targetRef>_" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_input</targetRef>" + EOL +
+                "      </dataInputAssociation>" + EOL);
+        }
+        // multiInstanceLoopCharacteristics
+        xmlDump.append(
+    		"      <multiInstanceLoopCharacteristics>" + EOL +
+            "        <loopDataInputRef>_" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_input</loopDataInputRef>" + EOL);
+        String parameterName = forEachNode.getVariableName();
+        if (parameterName != null) {
+        	xmlDump.append("        <inputDataItem id=\"" + parameterName + "\" itemSubjectRef=\"_" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_multiInstanceItemType\"/>" + EOL);
+        }
+        xmlDump.append("      </multiInstanceLoopCharacteristics>" + EOL);
+		// nodes
+		List<Node> subNodes = getSubNodes(forEachNode);
+    	xmlDump.append("    <!-- nodes -->" + EOL);
+        for (Node subNode: subNodes) {
+    		XmlBPMNProcessDumper.INSTANCE.visitNode(subNode, xmlDump, includeMeta);
+        }
+        // connections
+        List<Connection> connections = getSubConnections(forEachNode);
+    	xmlDump.append("    <!-- connections -->" + EOL);
+        for (Connection connection: connections) {
+        	XmlBPMNProcessDumper.INSTANCE.visitConnection(connection, xmlDump, includeMeta);
+        }
+		endNode("subProcess", xmlDump);
+	}
+	
+	protected List<Node> getSubNodes(ForEachNode forEachNode) {
+    	List<Node> subNodes =
+    		new ArrayList<Node>();
+        for (org.drools.definition.process.Node subNode: forEachNode.getNodes()) {
+        	// filter out composite start and end nodes as they can be regenerated
+        	if ((!(subNode instanceof CompositeNode.CompositeNodeStart)) &&
+    			(!(subNode instanceof CompositeNode.CompositeNodeEnd))) {
+        		subNodes.add((Node) subNode);
+        	}
+        }
+        return subNodes;
+    }
+    
+    protected List<Connection> getSubConnections(ForEachNode forEachNode) {
+    	List<Connection> connections = new ArrayList<Connection>();
+        for (org.drools.definition.process.Node subNode: forEachNode.getNodes()) {
+        	// filter out composite start and end nodes as they can be regenerated
+            if (!(subNode instanceof CompositeNode.CompositeNodeEnd)) {
+                for (Connection connection: subNode.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE)) {
+                    if (!(connection.getFrom() instanceof CompositeNode.CompositeNodeStart)) {
+                        connections.add(connection);
+                    }
+                }
+            }
+        }
+        return connections;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SubProcessHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SubProcessHandler.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SubProcessHandler.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -1,16 +1,19 @@
 package org.drools.bpmn2.xml;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
+import org.drools.bpmn2.core.ItemDefinition;
 import org.drools.bpmn2.core.SequenceFlow;
-import org.drools.definition.process.Connection;
-import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.datatype.DataType;
+import org.drools.process.core.datatype.impl.type.ObjectDataType;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
 import org.drools.workflow.core.node.CompositeContextNode;
-import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.ForEachNode;
 import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.ProcessBuildData;
 import org.w3c.dom.Element;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -30,8 +33,37 @@
         return CompositeContextNode.class;
     }
 
+    public Object end(final String uri, final String localName,
+            final ExtensibleXmlParser parser) throws SAXException {
+		final Element element = parser.endElementBuilder();
+		Node node = (Node) parser.getCurrent();
+		// determine type of event definition, so the correct type of node
+		// can be generated
+		org.w3c.dom.Node xmlNode = element.getFirstChild();
+		while (xmlNode != null) {
+			String nodeName = xmlNode.getNodeName();
+			if ("multiInstanceLoopCharacteristics".equals(nodeName)) {
+				// create new timerNode
+				ForEachNode forEachNode = new ForEachNode();
+				forEachNode.setId(node.getId());
+				forEachNode.setName(node.getName());
+				for (org.drools.definition.process.Node subNode: ((CompositeContextNode) node).getNodes()) {
+					forEachNode.addNode(subNode);
+				}
+				forEachNode.setMetaData(ProcessHandler.CONNECTIONS, ((CompositeContextNode) node).getMetaData(ProcessHandler.CONNECTIONS));
+				node = forEachNode;
+				handleForEachNode(node, element, uri, localName, parser);
+				break;
+			}
+			xmlNode = xmlNode.getNextSibling();
+		}
+		NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+		nodeContainer.addNode(node);
+		return node;
+	}
+    
     @SuppressWarnings("unchecked")
-	protected void handleNode(final Node node, final Element element, final String uri, 
+	protected void handleCompositeContextNode(final Node node, final Element element, final String uri, 
             final String localName, final ExtensibleXmlParser parser) throws SAXException {
     	super.handleNode(node, element, uri, localName, parser);
     	CompositeContextNode compositeNode = (CompositeContextNode) node;
@@ -41,65 +73,64 @@
     	ProcessHandler.linkBoundaryEvents(compositeNode);
     }
     
-    public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
-    	CompositeContextNode compositeNode = (CompositeContextNode) node;
-		writeNode("subProcess", compositeNode, xmlDump, includeMeta);
-		xmlDump.append(" >" + EOL);
-        // variables
-		VariableScope variableScope = (VariableScope) 
-            compositeNode.getDefaultContext(VariableScope.VARIABLE_SCOPE);
-		if (variableScope != null && !variableScope.getVariables().isEmpty()) {
-            xmlDump.append("    <!-- variables -->" + EOL);
-            for (Variable variable: variableScope.getVariables()) {
-                xmlDump.append("    <property id=\"" + variable.getName() + "\" ");
-                if (variable.getType() != null) {
-                    xmlDump.append("itemSubjectRef=\"_" + compositeNode.getUniqueId() + "-" + variable.getName() + "Item\"" );
-                }
-                // TODO: value
-                xmlDump.append("/>" + EOL);
+    @SuppressWarnings("unchecked")
+	protected void handleForEachNode(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;
+    	org.w3c.dom.Node xmlNode = element.getFirstChild();
+        while (xmlNode != null) {
+            String nodeName = xmlNode.getNodeName();
+            if ("dataInputAssociation".equals(nodeName)) {
+                readDataInputAssociation(xmlNode, forEachNode);
+            } else if ("multiInstanceLoopCharacteristics".equals(nodeName)) {
+            	readMultiInstanceLoopCharacteristics(xmlNode, forEachNode, parser);
             }
-		}
-		// nodes
-		List<Node> subNodes = getSubNodes(compositeNode);
-    	xmlDump.append("    <!-- nodes -->" + EOL);
-        for (Node subNode: subNodes) {
-    		XmlBPMNProcessDumper.INSTANCE.visitNode(subNode, xmlDump, includeMeta);
+            xmlNode = xmlNode.getNextSibling();
         }
-        // connections
-        List<Connection> connections = getSubConnections(compositeNode);
-    	xmlDump.append("    <!-- connections -->" + EOL);
-        for (Connection connection: connections) {
-        	XmlBPMNProcessDumper.INSTANCE.visitConnection(connection, xmlDump, includeMeta);
+    	List<SequenceFlow> connections = (List<SequenceFlow>)
+			forEachNode.getMetaData(ProcessHandler.CONNECTIONS);
+    	ProcessHandler.linkConnections(forEachNode, connections);
+    	ProcessHandler.linkBoundaryEvents(forEachNode);
+    }
+    
+    protected void readDataInputAssociation(org.w3c.dom.Node xmlNode, ForEachNode forEachNode) {
+        // sourceRef
+        org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+        String inputVariable = subNode.getTextContent();
+        if (inputVariable != null && inputVariable.trim().length() > 0) {
+        	forEachNode.setCollectionExpression(inputVariable);
         }
-		endNode("subProcess", xmlDump);
-	}
-	
-	protected List<Node> getSubNodes(CompositeNode compositeNode) {
-    	List<Node> subNodes =
-    		new ArrayList<Node>();
-        for (org.drools.definition.process.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))) {
-        		subNodes.add((Node) subNode);
-        	}
-        }
-        return subNodes;
     }
     
-    protected List<Connection> getSubConnections(CompositeNode compositeNode) {
-    	List<Connection> connections = new ArrayList<Connection>();
-        for (org.drools.definition.process.Node subNode: compositeNode.getNodes()) {
-        	// filter out composite start and end nodes as they can be regenerated
-            if (!(subNode instanceof CompositeNode.CompositeNodeEnd)) {
-                for (Connection connection: subNode.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE)) {
-                    if (!(connection.getFrom() instanceof CompositeNode.CompositeNodeStart)) {
-                        connections.add(connection);
-                    }
+    @SuppressWarnings("unchecked")
+	protected void readMultiInstanceLoopCharacteristics(org.w3c.dom.Node xmlNode, ForEachNode forEachNode, ExtensibleXmlParser parser) {
+        // sourceRef
+        org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+        while (subNode != null) {
+            String nodeName = subNode.getNodeName();
+            if ("inputDataItem".equals(nodeName)) {
+            	String variableName = ((Element) subNode).getAttribute("id");
+            	String itemSubjectRef = ((Element) subNode).getAttribute("itemSubjectRef");
+            	DataType dataType = null;
+            	Map<String, ItemDefinition> itemDefinitions = (Map<String, ItemDefinition>)
+	            	((ProcessBuildData) parser.getData()).getMetaData("ItemDefinitions");
+		        if (itemDefinitions != null) {
+		        	ItemDefinition itemDefinition = itemDefinitions.get(itemSubjectRef);
+		        	if (itemDefinition != null) {
+		        		dataType = new ObjectDataType(itemDefinition.getStructureRef());
+		        	}
+		        }
+                if (variableName != null && variableName.trim().length() > 0) {
+                	forEachNode.setVariable(variableName, dataType);
                 }
             }
+            subNode = subNode.getNextSibling();
         }
-        return connections;
     }
+    
+    public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+        throw new IllegalArgumentException("Writing out should be handled by specific handlers");
+    }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/WorkItemNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/WorkItemNodeHandler.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/WorkItemNodeHandler.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -31,13 +31,13 @@
                 XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_ServiceOperation\" implementation=\"Other\" >" + EOL);
             xmlDump.append(
                 "      <ioSpecification>" + EOL +
-                "        <dataInput id=\"_2_param\" name=\"Parameter\" />" + EOL +
-                "        <dataOutput id=\"_2_result\" name=\"Result\" />" + EOL +
+                "        <dataInput id=\"_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param\" name=\"Parameter\" />" + EOL +
+                "        <dataOutput id=\"_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result\" name=\"Result\" />" + EOL +
                 "        <inputSet>" + EOL +
-                "          <dataInputRefs>_2_param</dataInputRefs>" + EOL +
+                "          <dataInputRefs>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</dataInputRefs>" + EOL +
                 "        </inputSet>" + EOL +
                 "        <outputSet>" + EOL +
-                "          <dataOutputRefs>_2_result</dataOutputRefs>" + EOL +
+                "          <dataOutputRefs>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result</dataOutputRefs>" + EOL +
                 "        </outputSet>" + EOL +
                 "      </ioSpecification>" + EOL);
             String inMapping = workItemNode.getInMapping("Parameter");
@@ -45,14 +45,14 @@
                 xmlDump.append(
                     "      <dataInputAssociation>" + EOL +
                     "        <sourceRef>" + inMapping + "</sourceRef>" + EOL +
-                    "        <targetRef>_2_param</targetRef>" + EOL +
+                    "        <targetRef>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</targetRef>" + EOL +
                     "      </dataInputAssociation>" + EOL);
             }
             String outMapping = workItemNode.getOutMapping("Result");
             if (outMapping != null) {
                 xmlDump.append(
                     "      <dataOutputAssociation>" + EOL +
-                    "        <sourceRef>_2_result</sourceRef>" + EOL +
+                    "        <sourceRef>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result</sourceRef>" + EOL +
                     "        <targetRef>" + outMapping + "</targetRef>" + EOL +
                     "      </dataOutputAssociation>" + EOL);
             }
@@ -65,9 +65,9 @@
                     XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_Message\" implementation=\"Other\" >" + EOL);
                 xmlDump.append(
                     "      <ioSpecification>" + EOL +
-                    "        <dataInput id=\"_2_param\" name=\"Message\" />" + EOL +
+                    "        <dataInput id=\"_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param\" name=\"Message\" />" + EOL +
                     "        <inputSet>" + EOL +
-                    "          <dataInputRefs>_2_param</dataInputRefs>" + EOL +
+                    "          <dataInputRefs>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</dataInputRefs>" + EOL +
                     "        </inputSet>" + EOL +
                     "        <outputSet/>" + EOL +
                     "      </ioSpecification>" + EOL);
@@ -76,7 +76,7 @@
                     xmlDump.append(
                         "      <dataInputAssociation>" + EOL +
                         "        <sourceRef>" + inMapping + "</sourceRef>" + EOL +
-                        "        <targetRef>_2_param</targetRef>" + EOL +
+                        "        <targetRef>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</targetRef>" + EOL +
                         "      </dataInputAssociation>" + EOL);
                 }
             endNode("sendTask", xmlDump);
@@ -88,17 +88,17 @@
                     XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_Message\" implementation=\"Other\" >" + EOL);
                 xmlDump.append(
                     "      <ioSpecification>" + EOL +
-                    "        <dataOutput id=\"_2_result\" name=\"Message\" />" + EOL +
+                    "        <dataOutput id=\"_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result\" name=\"Message\" />" + EOL +
                     "        <inputSet/>" + EOL +
                     "        <outputSet>" + EOL +
-                    "          <dataOutputRefs>_2_result</dataOutputRefs>" + EOL +
+                    "          <dataOutputRefs>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result</dataOutputRefs>" + EOL +
                     "        </outputSet>" + EOL +
                     "      </ioSpecification>" + EOL);
                 String outMapping = workItemNode.getOutMapping("Message");
                 if (outMapping != null) {
                     xmlDump.append(
                         "      <dataOutputAssociation>" + EOL +
-                        "        <sourceRef>_2_result</sourceRef>" + EOL +
+                        "        <sourceRef>_" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result</sourceRef>" + EOL +
                         "        <targetRef>" + outMapping + "</targetRef>" + EOL +
                         "      </dataOutputAssociation>" + EOL);
                 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -15,6 +15,7 @@
 import org.drools.process.core.context.swimlane.SwimlaneContext;
 import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.datatype.impl.type.ObjectDataType;
 import org.drools.process.core.event.EventTypeFilter;
 import org.drools.rule.builder.dialect.java.JavaDialect;
 import org.drools.workflow.core.Constraint;
@@ -24,6 +25,7 @@
 import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.EventTrigger;
+import org.drools.workflow.core.node.ForEachNode;
 import org.drools.workflow.core.node.HumanTaskNode;
 import org.drools.workflow.core.node.Split;
 import org.drools.workflow.core.node.StartNode;
@@ -288,7 +290,11 @@
                         }
                     }
                 }
-            }
+            } else if (node instanceof ForEachNode) {
+            	ForEachNode forEachNode = (ForEachNode) node;
+                xmlDump.append(
+                    "  <itemDefinition id=\"_" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_multiInstanceItemType\" structureRef=\"" + ((ObjectDataType) forEachNode.getVariableType()).getClassName() + "\"/>" + EOL + EOL);
+            } 
         }
     }
     

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/resources/META-INF/Semantic.xsd
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/resources/META-INF/Semantic.xsd	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/resources/META-INF/Semantic.xsd	2010-01-28 15:19:51 UTC (rev 31279)
@@ -1043,8 +1043,8 @@
 			<xsd:extension base="tLoopCharacteristics">
 				<xsd:sequence>
 					<xsd:element name="loopCardinality" type="tExpression" minOccurs="0" maxOccurs="1"/>
-					<xsd:element name="loopDataInput" type="tDataInput" minOccurs="0" maxOccurs="1"/>
-					<xsd:element name="loopDataOutput" type="tDataOutput" minOccurs="0" maxOccurs="1"/>
+					<xsd:element name="loopDataInputRef" type="xsd:QName" minOccurs="0" maxOccurs="1"/>
+					<xsd:element name="loopDataOutputRef" type="xsd:QName" minOccurs="0" maxOccurs="1"/>
 					<xsd:element name="inputDataItem" type="tProperty" minOccurs="0" maxOccurs="1"/>
 					<xsd:element name="outputDataItem" type="tProperty" minOccurs="0" maxOccurs="1"/>
 					<xsd:element ref="complexBehaviorDefinition" minOccurs="0" maxOccurs="unbounded"/>

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java	2010-01-28 15:19:51 UTC (rev 31279)
@@ -1,7 +1,9 @@
 package org.drools.bpmn2;
 
 import java.io.StringReader;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import junit.framework.TestCase;
@@ -172,6 +174,18 @@
 		assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
 	}
 
+	public void testMultiInstanceLoopCharacteristicsProcess() throws Exception {
+		KnowledgeBase kbase = createKnowledgeBase("BPMN2-MultiInstanceLoopCharacteristicsProcess.xml");
+		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+		Map<String, Object> params = new HashMap<String, Object>();
+		List<String> myList = new ArrayList<String>();
+		myList.add("First Item");
+		myList.add("Second Item");
+		params.put("list", myList);
+		ProcessInstance processInstance = ksession.startProcess("MultiInstanceLoopCharacteristicsProcess", params);
+		assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
+	}
+
     public void testEscalationBoundaryEvent() throws Exception {
         KnowledgeBase kbase = createKnowledgeBase("BPMN2-EscalationBoundaryEvent.xml");
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MultiInstanceLoopCharacteristicsProcess.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MultiInstanceLoopCharacteristicsProcess.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MultiInstanceLoopCharacteristicsProcess.xml	2010-01-28 15:19:51 UTC (rev 31279)
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions id="Definition"
+             targetNamespace="http://www.example.org/MinimalExample"
+             typeLanguage="http://www.java.com/javaTypes"
+             expressionLanguage="http://www.mvel.org/2.0"
+             xmlns="http://schema.omg.org/spec/BPMN/2.0"
+             xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+             xs:schemaLocation="http://schema.omg.org/spec/BPMN/2.0 BPMN20.xsd"
+             xmlns:tns="http://www.example.org/MinimalExample">
+
+  <itemDefinition id="itemType" structureRef="java.lang.String" />
+  <itemDefinition id="listType" structureRef="java.util.List" />
+  
+  <process id="MultiInstanceLoopCharacteristicsProcess" name="MultiInstanceLoopCharacteristics SubProcess">
+  
+    <!-- process variables -->
+    <property id="list" itemSubjectRef="listType" />
+  
+    <startEvent id="_1" name="StartProcess"/>
+    <sequenceFlow sourceRef="_1" targetRef="_2"/>
+    <subProcess id="_2" name="Hello" >
+      <ioSpecification>
+        <dataInput id="_2_input" name="MultiInstanceLoopDataInput" itemSubjectRef="listType" />
+        <inputSet>
+          <dataInputRefs>_2_input</dataInputRefs>
+        </inputSet>
+        <outputSet/>
+      </ioSpecification>
+      <dataInputAssociation>
+        <sourceRef>list</sourceRef>
+        <targetRef>_2_input</targetRef>
+      </dataInputAssociation>
+      <multiInstanceLoopCharacteristics>
+        <loopDataInputRef>_2_input</loopDataInputRef>
+        <inputDataItem id="item" itemSubjectRef="itemType"/>
+      </multiInstanceLoopCharacteristics>
+      <startEvent id="_2-1" name="StartSubProcess"/>
+      <sequenceFlow sourceRef="_2-1" targetRef="_2-2"/>
+      <scriptTask id="_2-2" name="Hello">
+        <script>System.out.println("item = " + item);</script>
+      </scriptTask>
+      <sequenceFlow sourceRef="_2-2" targetRef="_2-3"/>
+      <endEvent id="_2-3" name="EndSubProcess"/>
+    </subProcess>
+    <sequenceFlow sourceRef="_2" targetRef="_3"/>
+    <scriptTask id="_3" name="Goodbye">
+      <script>System.out.println("Goodbye World");</script>
+    </scriptTask>
+    <sequenceFlow sourceRef="_3" targetRef="_4"/>
+    <endEvent id="_4" name="EndProcess">
+      <terminateEventDefinition/>
+    </endEvent>
+  </process>
+</definitions>

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-SubProcess.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-SubProcess.xml	2010-01-28 15:05:13 UTC (rev 31278)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-SubProcess.xml	2010-01-28 15:19:51 UTC (rev 31279)
@@ -17,15 +17,15 @@
       <property id="x" itemSubjectRef="tns:_2-xType" />
       <startEvent id="_2-1" name="StartSubProcess"/>
       <sequenceFlow sourceRef="_2-1" targetRef="_2-2"/>
-      <scriptTask id="_2-2" name="Hello">
+      <scriptTask id="_2-2" name="Hello1">
         <script>System.out.println("x = " + x);</script>
       </scriptTask>
       <sequenceFlow sourceRef="_2-2" targetRef="_2-3"/>
-      <scriptTask id="_2-3" name="Hello">
+      <scriptTask id="_2-3" name="Hello2">
         <script>kcontext.setVariable("x", "Hello");</script>
       </scriptTask>
       <sequenceFlow sourceRef="_2-3" targetRef="_2-4"/>
-      <scriptTask id="_2-4" name="Hello">
+      <scriptTask id="_2-4" name="Hello3">
         <script>System.out.println("x = " + x);</script>
       </scriptTask>
       <sequenceFlow sourceRef="_2-4" targetRef="_2-5"/>



More information about the jboss-svn-commits mailing list