[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