[jboss-svn-commits] JBL Code SVN: r33569 - in labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2: legacy and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jun 21 10:27:28 EDT 2010
Author: KrisVerlaenen
Date: 2010-06-21 10:27:26 -0400 (Mon, 21 Jun 2010)
New Revision: 33569
Added:
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AbstractNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ActionNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AdHocSubProcessHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMN2SemanticModule.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNDISemanticModule.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNSemanticModule.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BoundaryEventHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BusinessRuleTaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CallActivityHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ComplexGatewayHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CompositeContextNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DataObjectHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DefinitionsHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndEventHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EventNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ExclusiveGatewayHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/FaultNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ForEachNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InMessageRefHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InclusiveGatewayHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InterfaceHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateCatchEventHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateThrowEventHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ItemDefinitionHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/JoinHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/LaneHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ManualTaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/MessageHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/OperationHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ParallelGatewayHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ProcessHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/PropertyHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ReceiveTaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ScriptTaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SendTaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SequenceFlowHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ServiceTaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SplitHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StartEventHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StateNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SubProcessHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TimerNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TransactionHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/UserTaskHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/WorkItemNodeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/XmlBPMNProcessDumper.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ActivityShapeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/EventShapeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/GatewayShapeHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ProcessDiagramHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/SequenceFlowConnectorHandler.java
labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ShapeHandler.java
Log:
- adding legacy support for BPMN2 beta1 format
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AbstractNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AbstractNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AbstractNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,158 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashSet;
+
+import org.drools.bpmn2.core.Lane;
+import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public abstract class AbstractNodeHandler extends BaseAbstractHandler implements Handler {
+
+ protected final static String EOL = System.getProperty( "line.separator" );
+
+ public AbstractNodeHandler() {
+ initValidParents();
+ initValidPeers();
+ this.allowNesting = true;
+ }
+
+ protected void initValidParents() {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(NodeContainer.class);
+ }
+
+ protected void initValidPeers() {
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(null);
+ this.validPeers.add(Lane.class);
+ this.validPeers.add(Variable.class);
+ this.validPeers.add(Node.class);
+ this.validPeers.add(SequenceFlow.class);
+ }
+
+ public Object start(final String uri, final String localName, final Attributes attrs,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.startElementBuilder( localName, attrs );
+ final Node node = createNode(attrs);
+ String id = attrs.getValue("id");
+ try {
+ // remove starting _
+ id = id.substring(1);
+ // remove ids of parent nodes
+ id = id.substring(id.lastIndexOf("-") + 1);
+ final String name = attrs.getValue("name");
+ node.setName(name);
+ node.setId(new Integer(id));
+ } catch (NumberFormatException e) {
+ // id is not in the expected format, generating a new one
+ long newId = 0;
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+ for (org.drools.definition.process.Node n: nodeContainer.getNodes()) {
+ if (n.getId() > newId) {
+ newId = n.getId();
+ }
+ }
+ ((org.drools.workflow.core.Node) node).setId(++newId);
+ node.setMetaData("UniqueId", attrs.getValue("id"));
+ }
+ return node;
+ }
+
+ protected abstract Node createNode(Attributes attrs);
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ final Element element = parser.endElementBuilder();
+ Node node = (Node) parser.getCurrent();
+ handleNode(node, element, uri, localName, parser);
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+ nodeContainer.addNode(node);
+ return node;
+ }
+
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser)
+ throws SAXException {
+ final String x = element.getAttribute("x");
+ if (x != null && x.length() != 0) {
+ try {
+ node.setMetaData("x", new Integer(x));
+ } catch (NumberFormatException exc) {
+ throw new SAXParseException("<" + localName + "> requires an Integer 'x' attribute", parser.getLocator());
+ }
+ }
+ final String y = element.getAttribute("y");
+ if (y != null && y.length() != 0) {
+ try {
+ node.setMetaData("y", new Integer(y));
+ } catch (NumberFormatException exc) {
+ throw new SAXParseException("<" + localName + "> requires an Integer 'y' attribute", parser.getLocator());
+ }
+ }
+ final String width = element.getAttribute("width");
+ if (width != null && width.length() != 0) {
+ try {
+ node.setMetaData("width", new Integer(width));
+ } catch (NumberFormatException exc) {
+ throw new SAXParseException("<" + localName + "> requires an Integer 'width' attribute", parser.getLocator());
+ }
+ }
+ final String height = element.getAttribute("height");
+ if (height != null && height.length() != 0) {
+ try {
+ node.setMetaData("height", new Integer(height));
+ } catch (NumberFormatException exc) {
+ throw new SAXParseException("<" + localName + "> requires an Integer 'height' attribute", parser.getLocator());
+ }
+ }
+ }
+
+ public abstract void writeNode(final Node node, final StringBuilder xmlDump,
+ final boolean includeMeta);
+
+ protected void writeNode(final String name, final Node node,
+ final StringBuilder xmlDump, boolean includeMeta) {
+ xmlDump.append(" <" + name + " ");
+ xmlDump.append("id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(node) + "\" ");
+ if (node.getName() != null) {
+ xmlDump.append("name=\"" + XmlDumper.replaceIllegalChars(node.getName()) + "\" ");
+ }
+// if (includeMeta) {
+// Integer x = (Integer) node.getMetaData("x");
+// Integer y = (Integer) node.getMetaData("y");
+// Integer width = (Integer) node.getMetaData("width");
+// Integer height = (Integer) node.getMetaData("height");
+// if (x != null && x != 0) {
+// xmlDump.append("g:x=\"" + x + "\" ");
+// }
+// if (y != null && y != 0) {
+// xmlDump.append("g:y=\"" + y + "\" ");
+// }
+// if (width != null && width != -1) {
+// xmlDump.append("g:width=\"" + width + "\" ");
+// }
+// if (height != null && height != -1) {
+// xmlDump.append("g:height=\"" + height + "\" ");
+// }
+// }
+ }
+
+ protected void endNode(final StringBuilder xmlDump) {
+ xmlDump.append("/>" + EOL);
+ }
+
+ protected void endNode(final String name, final StringBuilder xmlDump) {
+ xmlDump.append(" </" + name + ">" + EOL);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ActionNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ActionNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ActionNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,105 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.rule.builder.dialect.java.JavaDialect;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.xml.sax.Attributes;
+
+public class ActionNodeHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ throw new IllegalArgumentException("Reading in should be handled by specific handlers");
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return ActionNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ ActionNode actionNode = (ActionNode) node;
+ DroolsConsequenceAction action = (DroolsConsequenceAction) actionNode.getAction();
+ if (action != null) {
+ String s = action.getConsequence();
+ if (s.startsWith("org.drools.process.instance.impl.WorkItemImpl workItem = new org.drools.process.instance.impl.WorkItemImpl();")) {
+ writeNode("intermediateThrowEvent", actionNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ String variable = (String) actionNode.getMetaData("MappingVariable");
+ if (variable != null) {
+ xmlDump.append(
+ " <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(actionNode) + "_Input\" />" + EOL +
+ " <dataInputAssociation>" + EOL +
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(variable) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(actionNode) + "_Input</targetRef>" + EOL +
+ " </dataInputAssociation>" + EOL +
+ " <inputSet>" + EOL +
+ " <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(actionNode) + "_Input</dataInputRefs>" + EOL +
+ " </inputSet>" + EOL);
+ }
+ xmlDump.append(" <messageEventDefinition messageRef=\"" + XmlBPMNProcessDumper.getUniqueNodeId(actionNode) + "_Message\"/>" + EOL);
+ endNode("intermediateThrowEvent", xmlDump);
+ } else if (s.startsWith("kcontext.getKnowledgeRuntime().signalEvent(\"")) {
+ writeNode("intermediateThrowEvent", actionNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ s = s.substring(44);
+ String type = s.substring(0, s.indexOf("\""));
+ s = s.substring(s.indexOf(",") + 2);
+ String variable = null;
+ if (!s.startsWith("null")) {
+ variable = s.substring(0, s.indexOf(")"));
+ xmlDump.append(
+ " <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(actionNode) + "_Input\" />" + EOL +
+ " <dataInputAssociation>" + EOL +
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(variable) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(actionNode) + "_Input</targetRef>" + EOL +
+ " </dataInputAssociation>" + EOL +
+ " <inputSet>" + EOL +
+ " <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(actionNode) + "_Input</dataInputRefs>" + EOL +
+ " </inputSet>" + EOL);
+ }
+ if (type.startsWith("Compensate-")) {
+ xmlDump.append(" <compensateEventDefinition activityRef=\"" + XmlDumper.replaceIllegalChars(type.substring(11)) + "\"/>" + EOL);
+ } else {
+ xmlDump.append(" <signalEventDefinition signalRef=\"" + XmlDumper.replaceIllegalChars(type) + "\"/>" + EOL);
+ }
+ endNode("intermediateThrowEvent", xmlDump);
+ } else if (s.startsWith("kcontext.getProcessInstance().signalEvent(\"")) {
+ writeNode("intermediateThrowEvent", actionNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ s = s.substring(43);
+ String type = s.substring(0, s.indexOf("\""));
+ xmlDump.append(" <compensateEventDefinition activityRef=\"" + XmlDumper.replaceIllegalChars(type.substring(11)) + "\"/>" + EOL);
+ endNode("intermediateThrowEvent", xmlDump);
+ } else if (s.startsWith("org.drools.process.instance.context.exception.ExceptionScopeInstance scopeInstance = (org.drools.process.instance.context.exception.ExceptionScopeInstance) ((org.drools.workflow.instance.NodeInstance) kcontext.getNodeInstance()).resolveContextInstance(org.drools.process.core.context.exception.ExceptionScope.EXCEPTION_SCOPE, \"")) {
+ writeNode("intermediateThrowEvent", actionNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ s = s.substring(327);
+ String type = s.substring(0, s.indexOf("\""));
+ s = s.substring(s.indexOf(",") + 2);
+ xmlDump.append(" <escalationEventDefinition escalationCode=\"" + XmlDumper.replaceIllegalChars(type) + "\"/>" + EOL);
+ endNode("intermediateThrowEvent", xmlDump);
+ } else if ("IntermediateThrowEvent-None".equals(actionNode.getMetaData("NodeType"))) {
+ writeNode("intermediateThrowEvent", actionNode, xmlDump, includeMeta);
+ endNode(xmlDump);
+ } else {
+ writeNode("scriptTask", actionNode, xmlDump, includeMeta);
+ if (JavaDialect.ID.equals(action.getDialect())) {
+ xmlDump.append("scriptLanguage=\"" + XmlBPMNProcessDumper.JAVA_LANGUAGE + "\" ");
+ }
+ if (action.getConsequence() != null) {
+ xmlDump.append(">" + EOL +
+ " <script>" + XmlDumper.replaceIllegalChars(action.getConsequence()) + "</script>" + EOL);
+ endNode("scriptTask", xmlDump);
+ } else {
+ endNode(xmlDump);
+ }
+ }
+ } else {
+ writeNode("scriptTask", actionNode, xmlDump, includeMeta);
+ endNode(xmlDump);
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AdHocSubProcessHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AdHocSubProcessHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/AdHocSubProcessHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,81 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.List;
+
+import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.definition.process.Connection;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.DynamicNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class AdHocSubProcessHandler extends CompositeContextNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ DynamicNode result = new DynamicNode();
+ VariableScope variableScope = new VariableScope();
+ result.addContext(variableScope);
+ result.setDefaultContext(variableScope);
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return DynamicNode.class;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ DynamicNode dynamicNode = (DynamicNode) node;
+ String cancelRemainingInstances = element.getAttribute("cancelRemainingInstances");
+ if ("false".equals(cancelRemainingInstances)) {
+ dynamicNode.setCancelRemainingInstances(false);
+ }
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("completionCondition".equals(nodeName)) {
+ String expression = xmlNode.getTextContent();
+ if ("getActivityInstanceAttribute(\"numberOfActiveInstances\") == 0".equals(expression)) {
+ dynamicNode.setAutoComplete(true);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ List<SequenceFlow> connections = (List<SequenceFlow>)
+ dynamicNode.getMetaData(ProcessHandler.CONNECTIONS);
+ ProcessHandler.linkConnections(dynamicNode, connections);
+ ProcessHandler.linkBoundaryEvents(dynamicNode);
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ DynamicNode dynamicNode = (DynamicNode) node;
+ writeNode("adHocSubProcess", dynamicNode, xmlDump, includeMeta);
+ if (!dynamicNode.isCancelRemainingInstances()) {
+ xmlDump.append(" cancelRemainingInstances=\"false\"");
+ }
+ xmlDump.append(" ordering=\"parallel\" >" + EOL);
+ // nodes
+ List<Node> subNodes = getSubNodes(dynamicNode);
+ xmlDump.append(" <!-- nodes -->" + EOL);
+ for (Node subNode: subNodes) {
+ XmlBPMNProcessDumper.INSTANCE.visitNode(subNode, xmlDump, includeMeta);
+ }
+ // connections
+ List<Connection> connections = getSubConnections(dynamicNode);
+ xmlDump.append(" <!-- connections -->" + EOL);
+ for (Connection connection: connections) {
+ XmlBPMNProcessDumper.INSTANCE.visitConnection(connection, xmlDump, includeMeta);
+ }
+ if (dynamicNode.isAutoComplete()) {
+ xmlDump.append(" <completionCondition xs:type=\"tFormalExpression\">getActivityInstanceAttribute(\"numberOfActiveInstances\") == 0</completionCondition>" + EOL);
+ }
+ endNode("adHocSubProcess", xmlDump);
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMN2SemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMN2SemanticModule.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMN2SemanticModule.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,72 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.CompositeContextNode;
+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;
+import org.drools.workflow.core.node.TimerNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.DefaultSemanticModule;
+
+public class BPMN2SemanticModule extends DefaultSemanticModule {
+
+ public BPMN2SemanticModule() {
+ super("http://www.omg.org/bpmn20");
+
+ addHandler("definitions", new DefinitionsHandler());
+
+ addHandler("process", new ProcessHandler());
+
+ addHandler("property", new PropertyHandler());
+ addHandler("lane", new LaneHandler());
+
+ addHandler("startEvent", new StartEventHandler());
+ addHandler("endEvent", new EndEventHandler());
+ addHandler("exclusiveGateway", new ExclusiveGatewayHandler());
+ addHandler("inclusiveGateway", new InclusiveGatewayHandler());
+ addHandler("parallelGateway", new ParallelGatewayHandler());
+ addHandler("complexGateway", new ComplexGatewayHandler());
+ addHandler("scriptTask", new ScriptTaskHandler());
+ addHandler("task", new TaskHandler());
+ addHandler("userTask", new UserTaskHandler());
+ addHandler("manualTask", new ManualTaskHandler());
+ addHandler("serviceTask", new ServiceTaskHandler());
+ addHandler("sendTask", new SendTaskHandler());
+ addHandler("receiveTask", new ReceiveTaskHandler());
+ addHandler("businessRuleTask", new BusinessRuleTaskHandler());
+ addHandler("callActivity", new CallActivityHandler());
+ addHandler("subProcess", new SubProcessHandler());
+ addHandler("adHocSubProcess", new AdHocSubProcessHandler());
+ addHandler("intermediateCatchEvent", new IntermediateCatchEventHandler());
+ addHandler("intermediateThrowEvent", new IntermediateThrowEventHandler());
+ addHandler("boundaryEvent", new BoundaryEventHandler());
+ addHandler("dataObject", new DataObjectHandler());
+ addHandler("transaction", new TransactionHandler());
+
+ addHandler("sequenceFlow", new SequenceFlowHandler());
+
+ addHandler("itemDefinition", new ItemDefinitionHandler());
+ addHandler("message", new MessageHandler());
+ addHandler("interface", new InterfaceHandler());
+ addHandler("operation", new OperationHandler());
+ addHandler("inMessageRef", new InMessageRefHandler());
+
+ handlersByClass.put(Split.class, new SplitHandler());
+ handlersByClass.put(Join.class, new JoinHandler());
+ handlersByClass.put(EventNode.class, new EventNodeHandler());
+ handlersByClass.put(TimerNode.class, new TimerNodeHandler());
+ handlersByClass.put(EndNode.class, new EndNodeHandler());
+ handlersByClass.put(FaultNode.class, new FaultNodeHandler());
+ handlersByClass.put(WorkItemNode.class, new WorkItemNodeHandler());
+ handlersByClass.put(ActionNode.class, new ActionNodeHandler());
+ handlersByClass.put(StateNode.class, new StateNodeHandler());
+ handlersByClass.put(CompositeContextNode.class, new CompositeContextNodeHandler());
+ handlersByClass.put(ForEachNode.class, new ForEachNodeHandler());
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNDISemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNDISemanticModule.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNDISemanticModule.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,22 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.bpmn2.legacy.beta1.di.ActivityShapeHandler;
+import org.drools.bpmn2.legacy.beta1.di.EventShapeHandler;
+import org.drools.bpmn2.legacy.beta1.di.GatewayShapeHandler;
+import org.drools.bpmn2.legacy.beta1.di.ProcessDiagramHandler;
+import org.drools.bpmn2.legacy.beta1.di.SequenceFlowConnectorHandler;
+import org.drools.xml.DefaultSemanticModule;
+
+public class BPMNDISemanticModule extends DefaultSemanticModule {
+
+ public BPMNDISemanticModule() {
+ super("http://bpmndi.org");
+
+ addHandler("processDiagram", new ProcessDiagramHandler());
+ addHandler("eventShape", new EventShapeHandler());
+ addHandler("gatewayShape", new GatewayShapeHandler());
+ addHandler("activityShape", new ActivityShapeHandler());
+ addHandler("sequenceFlowConnector", new SequenceFlowConnectorHandler());
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNSemanticModule.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BPMNSemanticModule.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,74 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.CompositeContextNode;
+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;
+import org.drools.workflow.core.node.TimerNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.DefaultSemanticModule;
+
+public class BPMNSemanticModule extends DefaultSemanticModule {
+
+ public static final String BPMN2_URI = "http://schema.omg.org/spec/BPMN/2.0";
+
+ public BPMNSemanticModule() {
+ super(BPMN2_URI);
+
+ addHandler("definitions", new DefinitionsHandler());
+
+ addHandler("process", new ProcessHandler());
+
+ addHandler("property", new PropertyHandler());
+ addHandler("lane", new LaneHandler());
+
+ addHandler("startEvent", new StartEventHandler());
+ addHandler("endEvent", new EndEventHandler());
+ addHandler("exclusiveGateway", new ExclusiveGatewayHandler());
+ addHandler("inclusiveGateway", new InclusiveGatewayHandler());
+ addHandler("parallelGateway", new ParallelGatewayHandler());
+ addHandler("complexGateway", new ComplexGatewayHandler());
+ addHandler("scriptTask", new ScriptTaskHandler());
+ addHandler("task", new TaskHandler());
+ addHandler("userTask", new UserTaskHandler());
+ addHandler("manualTask", new ManualTaskHandler());
+ addHandler("serviceTask", new ServiceTaskHandler());
+ addHandler("sendTask", new SendTaskHandler());
+ addHandler("receiveTask", new ReceiveTaskHandler());
+ addHandler("businessRuleTask", new BusinessRuleTaskHandler());
+ addHandler("callActivity", new CallActivityHandler());
+ addHandler("subProcess", new SubProcessHandler());
+ addHandler("adHocSubProcess", new AdHocSubProcessHandler());
+ addHandler("intermediateCatchEvent", new IntermediateCatchEventHandler());
+ addHandler("intermediateThrowEvent", new IntermediateThrowEventHandler());
+ addHandler("boundaryEvent", new BoundaryEventHandler());
+ addHandler("dataObject", new DataObjectHandler());
+ addHandler("transaction", new TransactionHandler());
+
+ addHandler("sequenceFlow", new SequenceFlowHandler());
+
+ addHandler("itemDefinition", new ItemDefinitionHandler());
+ addHandler("message", new MessageHandler());
+ addHandler("interface", new InterfaceHandler());
+ addHandler("operation", new OperationHandler());
+ addHandler("inMessageRef", new InMessageRefHandler());
+
+ handlersByClass.put(Split.class, new SplitHandler());
+ handlersByClass.put(Join.class, new JoinHandler());
+ handlersByClass.put(EventNode.class, new EventNodeHandler());
+ handlersByClass.put(TimerNode.class, new TimerNodeHandler());
+ handlersByClass.put(EndNode.class, new EndNodeHandler());
+ handlersByClass.put(FaultNode.class, new FaultNodeHandler());
+ handlersByClass.put(WorkItemNode.class, new WorkItemNodeHandler());
+ handlersByClass.put(ActionNode.class, new ActionNodeHandler());
+ handlersByClass.put(StateNode.class, new StateNodeHandler());
+ handlersByClass.put(CompositeContextNode.class, new CompositeContextNodeHandler());
+ handlersByClass.put(ForEachNode.class, new ForEachNodeHandler());
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BoundaryEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BoundaryEventHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BoundaryEventHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,167 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.process.core.event.EventFilter;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.core.node.EventNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class BoundaryEventHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new EventNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return EventNode.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();
+ String attachedTo = element.getAttribute("attachedToRef");
+ String cancelActivityString = element.getAttribute("cancelActivity");
+ boolean cancelActivity = true;
+ if ("false".equals(cancelActivityString)) {
+ cancelActivity = false;
+ }
+ // 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 ("escalationEventDefinition".equals(nodeName)) {
+ // reuse already created EventNode
+ handleEscalationNode(node, element, uri, localName, parser, attachedTo, cancelActivity);
+ break;
+ } else if ("errorEventDefinition".equals(nodeName)) {
+ // reuse already created EventNode
+ handleErrorNode(node, element, uri, localName, parser, attachedTo, cancelActivity);
+ break;
+ } else if ("timerEventDefinition".equals(nodeName)) {
+ // reuse already created EventNode
+ handleTimerNode(node, element, uri, localName, parser, attachedTo, cancelActivity);
+ break;
+ } else if ("compensateEventDefinition".equals(nodeName)) {
+ // reuse already created EventNode
+ handleCompensationNode(node, element, uri, localName, parser, attachedTo, cancelActivity);
+ break;
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+ nodeContainer.addNode(node);
+ return node;
+ }
+
+ protected void handleEscalationNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser, final String attachedTo,
+ final boolean cancelActivity) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ EventNode eventNode = (EventNode) node;
+ eventNode.setMetaData("AttachedTo", attachedTo);
+ eventNode.setMetaData("CancelActivity", cancelActivity);
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("escalationEventDefinition".equals(nodeName)) {
+ String type = ((Element) xmlNode).getAttribute("escalationCode");
+ if (type != null && type.trim().length() > 0) {
+ List<EventFilter> eventFilters = new ArrayList<EventFilter>();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType("Escalation-" + attachedTo + "-" + type);
+ eventFilters.add(eventFilter);
+ eventNode.setEventFilters(eventFilters);
+ eventNode.setMetaData("EscalationEvent", type);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void handleErrorNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser, final String attachedTo,
+ final boolean cancelActivity) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ EventNode eventNode = (EventNode) node;
+ eventNode.setMetaData("AttachedTo", attachedTo);
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("errorEventDefinition".equals(nodeName)) {
+ String type = ((Element) xmlNode).getAttribute("errorCode");
+ if (type != null && type.trim().length() > 0) {
+ List<EventFilter> eventFilters = new ArrayList<EventFilter>();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType("Error-" + attachedTo + "-" + type);
+ eventFilters.add(eventFilter);
+ eventNode.setEventFilters(eventFilters);
+ eventNode.setMetaData("ErrorEvent", type);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void handleTimerNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser, final String attachedTo,
+ final boolean cancelActivity) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ EventNode eventNode = (EventNode) node;
+ eventNode.setMetaData("AttachedTo", attachedTo);
+ eventNode.setMetaData("CancelActivity", cancelActivity);
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("timerEventDefinition".equals(nodeName)) {
+ String timeCycle = null;
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ while (subNode instanceof Element) {
+ String subNodeName = subNode.getNodeName();
+ if ("timeCycle".equals(subNodeName)) {
+ timeCycle = subNode.getTextContent();
+ break;
+ }
+ subNode = subNode.getNextSibling();
+ }
+ if (timeCycle != null && timeCycle.trim().length() > 0) {
+ List<EventFilter> eventFilters = new ArrayList<EventFilter>();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType("Timer-" + attachedTo + "-" + timeCycle);
+ eventFilters.add(eventFilter);
+ eventNode.setEventFilters(eventFilters);
+ eventNode.setMetaData("TimeCycle", timeCycle);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void handleCompensationNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser, final String attachedTo,
+ final boolean cancelActivity) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ EventNode eventNode = (EventNode) node;
+ eventNode.setMetaData("AttachedTo", attachedTo);
+ List<EventFilter> eventFilters = new ArrayList<EventFilter>();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ String eventType = "Compensate-";
+ eventFilter.setType(eventType);
+ eventFilters.add(eventFilter);
+ ((EventNode) node).setEventFilters(eventFilters);
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by specific handlers");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BusinessRuleTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BusinessRuleTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/BusinessRuleTaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,41 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.RuleSetNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class BusinessRuleTaskHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new RuleSetNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return RuleSetNode.class;
+ }
+
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ RuleSetNode ruleSetNode = (RuleSetNode) node;
+ String ruleFlowGroup = element.getAttribute("ruleFlowGroup");
+ if (ruleFlowGroup != null) {
+ ruleSetNode.setRuleFlowGroup(ruleFlowGroup);
+ }
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ RuleSetNode ruleSetNode = (RuleSetNode) node;
+ writeNode("businessRuleTask", ruleSetNode, xmlDump, includeMeta);
+ if (ruleSetNode.getRuleFlowGroup() != null) {
+ xmlDump.append("g:ruleFlowGroup=\"" + XmlDumper.replaceIllegalChars(ruleSetNode.getRuleFlowGroup()) + "\" ");
+ }
+ endNode(xmlDump);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CallActivityHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CallActivityHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CallActivityHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,146 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.SubProcessNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class CallActivityHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new SubProcessNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return SubProcessNode.class;
+ }
+
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ SubProcessNode subProcessNode = (SubProcessNode) node;
+ String processId = element.getAttribute("calledElement");
+ if (processId != null) {
+ subProcessNode.setProcessId(processId);
+ }
+ String waitForCompletion = element.getAttribute("waitForCompletion");
+ if (waitForCompletion != null && "false".equals(waitForCompletion)) {
+ subProcessNode.setWaitForCompletion(false);
+ }
+ String independent = element.getAttribute("independent");
+ if (independent != null && "false".equals(independent)) {
+ subProcessNode.setIndependent(false);
+ }
+ Map<String, String> dataInputs = new HashMap<String, String>();
+ Map<String, String> dataOutputs = new HashMap<String, String>();
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("ioSpecification".equals(nodeName)) {
+ readIoSpecification(xmlNode, dataInputs, dataOutputs);
+ } else if ("dataInputAssociation".equals(nodeName)) {
+ readDataInputAssociation(xmlNode, subProcessNode, dataInputs);
+ } else if ("dataOutputAssociation".equals(nodeName)) {
+ readDataOutputAssociation(xmlNode, subProcessNode, dataOutputs);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void readIoSpecification(org.w3c.dom.Node xmlNode, Map<String, String> dataInputs, Map<String, String> dataOutputs) {
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ while (subNode instanceof Element) {
+ String subNodeName = subNode.getNodeName();
+ if ("dataInput".equals(subNodeName)) {
+ String id = ((Element) subNode).getAttribute("id");
+ String inputName = ((Element) subNode).getAttribute("name");
+ dataInputs.put(id, inputName);
+ } else if ("dataOutput".equals(subNodeName)) {
+ String id = ((Element) subNode).getAttribute("id");
+ String outputName = ((Element) subNode).getAttribute("name");
+ dataOutputs.put(id, outputName);
+ }
+ subNode = subNode.getNextSibling();
+ }
+ }
+
+ protected void readDataInputAssociation(org.w3c.dom.Node xmlNode, SubProcessNode subProcessNode, Map<String, String> dataInputs) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ String from = subNode.getTextContent();
+ // targetRef
+ subNode = subNode.getNextSibling();
+ String to = subNode.getTextContent();
+ subProcessNode.addInMapping(dataInputs.get(to), from);
+ }
+
+ protected void readDataOutputAssociation(org.w3c.dom.Node xmlNode, SubProcessNode subProcessNode, Map<String, String> dataOutputs) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ String from = subNode.getTextContent();
+ // targetRef
+ subNode = subNode.getNextSibling();
+ String to = subNode.getTextContent();
+ subProcessNode.addOutMapping(dataOutputs.get(from), to);
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ SubProcessNode subProcessNode = (SubProcessNode) node;
+ writeNode("callActivity", subProcessNode, xmlDump, includeMeta);
+ if (subProcessNode.getProcessId() != null) {
+ xmlDump.append("calledElement=\"" + XmlDumper.replaceIllegalChars(subProcessNode.getProcessId()) + "\" ");
+ }
+ if (!subProcessNode.isWaitForCompletion()) {
+ xmlDump.append("tns:waitForCompletion=\"false\" ");
+ }
+ if (!subProcessNode.isIndependent()) {
+ xmlDump.append("tns:independent=\"false\" ");
+ }
+ xmlDump.append(">" + EOL);
+ writeIO(subProcessNode, xmlDump);
+ endNode("callActivity", xmlDump);
+ }
+
+ protected void writeIO(SubProcessNode subProcessNode, StringBuilder xmlDump) {
+ xmlDump.append(" <ioSpecification>" + EOL);
+ for (Map.Entry<String, String> entry: subProcessNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(subProcessNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input\" name=\"" + XmlDumper.replaceIllegalChars(entry.getKey()) + "\" />" + EOL);
+ }
+ for (Map.Entry<String, String> entry: subProcessNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(subProcessNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Output\" name=\"" + XmlDumper.replaceIllegalChars(entry.getKey()) + "\" />" + EOL);
+ }
+ xmlDump.append(" <inputSet>" + EOL);
+ for (Map.Entry<String, String> entry: subProcessNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(subProcessNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input</dataInputRefs>" + EOL);
+ }
+ xmlDump.append(" </inputSet>" + EOL);
+ xmlDump.append(" <outputSet>" + EOL);
+ for (Map.Entry<String, String> entry: subProcessNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(subProcessNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Output</dataOutputRefs>" + EOL);
+ }
+ xmlDump.append(" </outputSet>" + EOL);
+ xmlDump.append(" </ioSpecification>" + EOL);
+ for (Map.Entry<String, String> entry: subProcessNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(entry.getValue()) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(subProcessNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input</targetRef>" + EOL);
+ xmlDump.append(" </dataInputAssociation>" + EOL);
+ }
+ for (Map.Entry<String, String> entry: subProcessNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(subProcessNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Output</sourceRef>" + EOL +
+ " <targetRef>" + entry.getValue() + "</targetRef>" + EOL);
+ xmlDump.append(" </dataOutputAssociation>" + EOL);
+ }
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ComplexGatewayHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ComplexGatewayHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ComplexGatewayHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,35 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+import org.xml.sax.Attributes;
+
+public class ComplexGatewayHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ final String type = attrs.getValue("gatewayDirection");
+ if ("converging".equals(type)) {
+ Join join = new Join();
+ join.setType(Join.TYPE_UNDEFINED);
+ return join;
+ } else if ("diverging".equals(type)) {
+ Split split = new Split();
+ split.setType(Split.TYPE_UNDEFINED);
+ return split;
+ } else {
+ throw new IllegalArgumentException(
+ "Unknown gateway direction: " + type);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by split / join handler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CompositeContextNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CompositeContextNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/CompositeContextNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,91 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.compiler.xml.XmlDumper;
+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.workflow.core.Node;
+import org.drools.workflow.core.node.CompositeContextNode;
+import org.drools.workflow.core.node.CompositeNode;
+import org.xml.sax.Attributes;
+
+public class CompositeContextNodeHandler 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 CompositeContextNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ CompositeContextNode compositeNode = (CompositeContextNode) node;
+ String nodeType = "subProcess";
+ if (node.getMetaData("Transaction") != null) {
+ nodeType = "transaction";
+ }
+ writeNode(nodeType, 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=\"" + XmlDumper.replaceIllegalChars(variable.getName()) + "\" ");
+ if (variable.getType() != null) {
+ xmlDump.append("itemSubjectRef=\"" + XmlBPMNProcessDumper.getUniqueNodeId(compositeNode) + "-" + XmlDumper.replaceIllegalChars(variable.getName()) + "Item\"" );
+ }
+ // TODO: value
+ xmlDump.append("/>" + EOL);
+ }
+ }
+ // nodes
+ List<Node> subNodes = getSubNodes(compositeNode);
+ xmlDump.append(" <!-- nodes -->" + EOL);
+ for (Node subNode: subNodes) {
+ XmlBPMNProcessDumper.INSTANCE.visitNode(subNode, xmlDump, includeMeta);
+ }
+ // connections
+ List<Connection> connections = getSubConnections(compositeNode);
+ xmlDump.append(" <!-- connections -->" + EOL);
+ for (Connection connection: connections) {
+ XmlBPMNProcessDumper.INSTANCE.visitConnection(connection, xmlDump, includeMeta);
+ }
+ endNode(nodeType, 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);
+ }
+ }
+ }
+ }
+ return connections;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DataObjectHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DataObjectHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DataObjectHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,89 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.ItemDefinition;
+import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.process.core.ContextContainer;
+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.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class DataObjectHandler extends BaseAbstractHandler implements Handler {
+
+ public DataObjectHandler() {
+ initValidParents();
+ initValidPeers();
+ this.allowNesting = false;
+ }
+
+ protected void initValidParents() {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(ContextContainer.class);
+ }
+
+ protected void initValidPeers() {
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(null);
+ this.validPeers.add(Variable.class);
+ this.validPeers.add(Node.class);
+ this.validPeers.add(SequenceFlow.class);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ final String id = attrs.getValue("id");
+ final String itemSubjectRef = attrs.getValue("itemSubjectRef");
+
+ Object parent = parser.getParent();
+ if (parent instanceof ContextContainer) {
+ ContextContainer contextContainer = (ContextContainer) parent;
+ VariableScope variableScope = (VariableScope)
+ contextContainer.getDefaultContext(VariableScope.VARIABLE_SCOPE);
+ List variables = variableScope.getVariables();
+ Variable variable = new Variable();
+ variable.setMetaData("DataObject", "true");
+ variable.setName(id);
+ // retrieve type from item definition
+ DataType dataType = new ObjectDataType();
+ 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());
+ }
+ }
+ variable.setType(dataType);
+ variables.add(variable);
+ return variable;
+ }
+
+ return new Variable();
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return Variable.class;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DefinitionsHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DefinitionsHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/DefinitionsHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,55 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashSet;
+
+import org.drools.bpmn2.core.Definitions;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class DefinitionsHandler extends BaseAbstractHandler implements Handler {
+
+ public static final String CONNECTIONS = "BPMN.Connections";
+
+ @SuppressWarnings("unchecked")
+ public DefinitionsHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(null);
+
+ 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.startElementBuilder(localName, attrs);
+ return new Definitions();
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ final Element element = parser.endElementBuilder();
+ Definitions definitions = (Definitions) parser.getCurrent();
+ RuleFlowProcess process = (RuleFlowProcess)
+ ((ProcessBuildData) parser.getData()).getProcess();
+ String namespace = element.getAttribute("targetNamespace");
+ process.setMetaData("TargetNamespace", namespace);
+ definitions.setTargetNamespace(namespace);
+ return definitions;
+ }
+
+ public Class<?> generateNodeFor() {
+ return null;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndEventHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndEventHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,233 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.FaultNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class EndEventHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ EndNode node = new EndNode();
+ node.setTerminate(false);
+ return node;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return EndNode.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
+ super.handleNode(node, element, uri, localName, parser);
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("terminateEventDefinition".equals(nodeName)) {
+ // reuse already created EndNode
+ handleTerminateNode(node, element, uri, localName, parser);
+ break;
+ } else if ("signalEventDefinition".equals(nodeName)) {
+ handleSignalNode(node, element, uri, localName, parser);
+ } else if ("messageEventDefinition".equals(nodeName)) {
+ handleMessageNode(node, element, uri, localName, parser);
+ } else if ("errorEventDefinition".equals(nodeName)) {
+ // create new faultNode
+ FaultNode faultNode = new FaultNode();
+ faultNode.setId(node.getId());
+ faultNode.setName(node.getName());
+ faultNode.setTerminateParent(true);
+ faultNode.setMetaData("UniqueId", node.getMetaData("UniqueId"));
+ node = faultNode;
+ super.handleNode(node, element, uri, localName, parser);
+ handleErrorNode(node, element, uri, localName, parser);
+ break;
+ } else if ("escalationEventDefinition".equals(nodeName)) {
+ // create new faultNode
+ FaultNode faultNode = new FaultNode();
+ faultNode.setId(node.getId());
+ faultNode.setName(node.getName());
+ faultNode.setMetaData("UniqueId", node.getMetaData("UniqueId"));
+ node = faultNode;
+ super.handleNode(node, element, uri, localName, parser);
+ handleEscalationNode(node, element, uri, localName, parser);
+ break;
+ } else if ("compensateEventDefinition".equals(nodeName)) {
+ // reuse already created ActionNode
+ handleCompensationNode(node, element, uri, localName, parser);
+ break;
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+ nodeContainer.addNode(node);
+ return node;
+ }
+
+ public void handleTerminateNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ ((EndNode) node).setTerminate(true);
+ }
+
+ public void handleSignalNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ EndNode endNode = (EndNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataInputAssociation".equals(nodeName)) {
+ readEndDataInputAssociation(xmlNode, endNode);
+ } else if ("signalEventDefinition".equals(nodeName)) {
+ String signalName = ((Element) xmlNode).getAttribute("signalRef");
+ String variable = (String) endNode.getMetaData("MappingVariable");
+ List<DroolsAction> actions = new ArrayList<DroolsAction>();
+ actions.add(new DroolsConsequenceAction("mvel",
+ "kcontext.getKnowledgeRuntime().signalEvent(\""
+ + signalName + "\", " + (variable == null ? "null" : variable) + ")"));
+ endNode.setActions(EndNode.EVENT_NODE_ENTER, actions);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void handleMessageNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ EndNode endNode = (EndNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataInputAssociation".equals(nodeName)) {
+ readEndDataInputAssociation(xmlNode, endNode);
+ } else if ("messageEventDefinition".equals(nodeName)) {
+ String messageRef = ((Element) xmlNode).getAttribute("messageRef");
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ throw new IllegalArgumentException("No messages found");
+ }
+ Message message = messages.get(messageRef);
+ if (message == null) {
+ throw new IllegalArgumentException("Could not find message " + messageRef);
+ }
+ String variable = (String) endNode.getMetaData("MappingVariable");
+ endNode.setMetaData("MessageType", message.getType());
+ List<DroolsAction> actions = new ArrayList<DroolsAction>();
+
+ actions.add(new DroolsConsequenceAction("java",
+ "org.drools.process.instance.impl.WorkItemImpl workItem = new org.drools.process.instance.impl.WorkItemImpl();" + EOL +
+ "workItem.setName(\"Send Task\");" + EOL +
+ "workItem.setParameter(\"MessageType\", \"" + message.getType() + "\");" + EOL +
+ (variable == null ? "" : "workItem.setParameter(\"Message\", " + variable + ");" + EOL) +
+ "((org.drools.process.instance.WorkItemManager) kcontext.getKnowledgeRuntime().getWorkItemManager()).internalExecuteWorkItem(workItem);"));
+ endNode.setActions(EndNode.EVENT_NODE_ENTER, actions);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void readEndDataInputAssociation(org.w3c.dom.Node xmlNode, EndNode endNode) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ String eventVariable = subNode.getTextContent();
+ if (eventVariable != null && eventVariable.trim().length() > 0) {
+ endNode.setMetaData("MappingVariable", eventVariable);
+ }
+ }
+
+ public void handleErrorNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ FaultNode faultNode = (FaultNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataInputAssociation".equals(nodeName)) {
+ readFaultDataInputAssociation(xmlNode, faultNode);
+ } else if ("errorEventDefinition".equals(nodeName)) {
+ String faultName = ((Element) xmlNode).getAttribute("errorCode");
+ if (faultName != null && faultName.trim().length() > 0) {
+ faultNode.setFaultName(faultName);
+ }
+ faultNode.setTerminateParent(true);
+ } else if ("escalationEventDefinition".equals(nodeName)) {
+ String faultName = ((Element) xmlNode).getAttribute("escalationCode");
+ if (faultName != null && faultName.trim().length() > 0) {
+ faultNode.setFaultName(faultName);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ public void handleEscalationNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ FaultNode faultNode = (FaultNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataInputAssociation".equals(nodeName)) {
+ readFaultDataInputAssociation(xmlNode, faultNode);
+ } else if ("escalationEventDefinition".equals(nodeName)) {
+ String faultName = ((Element) xmlNode).getAttribute("escalationCode");
+ if (faultName != null && faultName.trim().length() > 0) {
+ faultNode.setFaultName(faultName);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void readFaultDataInputAssociation(org.w3c.dom.Node xmlNode, FaultNode faultNode) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ String faultVariable = subNode.getTextContent();
+ faultNode.setFaultVariable(faultVariable);
+ }
+
+ public void handleCompensationNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ EndNode actionNode = (EndNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("compensateEventDefinition".equals(nodeName)) {
+ String activityRef = ((Element) xmlNode).getAttribute("activityRef");
+ if (activityRef != null && activityRef.trim().length() > 0) {
+ actionNode.setMetaData("Compensate", activityRef);
+ List<DroolsAction> actions = new ArrayList<DroolsAction>();
+ actions.add(new DroolsConsequenceAction("java",
+ "kcontext.getProcessInstance().signalEvent(\"Compensate-" + activityRef + "\", null);"));
+ actionNode.setActions(EndNode.EVENT_NODE_ENTER, actions);
+ }
+// boolean waitForCompletion = true;
+// String waitForCompletionString = ((Element) xmlNode).getAttribute("waitForCompletion");
+// if ("false".equals(waitForCompletionString)) {
+// waitForCompletion = false;
+// }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by specific handlers");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EndNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,92 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.List;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.EndNode;
+import org.xml.sax.Attributes;
+
+public class EndNodeHandler 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 EndNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ EndNode endNode = (EndNode) node;
+ writeNode("endEvent", endNode, xmlDump, includeMeta);
+ if (endNode.isTerminate()) {
+ xmlDump.append(">" + EOL);
+ xmlDump.append(" <terminateEventDefinition/>" + EOL);
+ endNode("endEvent", xmlDump);
+ } else {
+ List<DroolsAction> actions = endNode.getActions(EndNode.EVENT_NODE_ENTER);
+ if (actions != null && !actions.isEmpty()) {
+ if (actions.size() == 1) {
+ DroolsConsequenceAction action = (DroolsConsequenceAction) actions.get(0);
+ String s = action.getConsequence();
+ if (s.startsWith("org.drools.process.instance.impl.WorkItemImpl workItem = new org.drools.process.instance.impl.WorkItemImpl();")) {
+ xmlDump.append(">" + EOL);
+ String variable = (String) endNode.getMetaData("MappingVariable");
+ if (variable != null) {
+ xmlDump.append(
+ " <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(endNode) + "_Input\" />" + EOL +
+ " <dataInputAssociation>" + EOL +
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(variable) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(endNode) + "_Input</targetRef>" + EOL +
+ " </dataInputAssociation>" + EOL +
+ " <inputSet>" + EOL +
+ " <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(endNode) + "_Input</dataInputRefs>" + EOL +
+ " </inputSet>" + EOL);
+ }
+ xmlDump.append(" <messageEventDefinition messageRef=\"" + XmlBPMNProcessDumper.getUniqueNodeId(endNode) + "_Message\"/>" + EOL);
+ endNode("endEvent", xmlDump);
+ } else if (s.startsWith("kcontext.getKnowledgeRuntime().signalEvent(\"")) {
+ xmlDump.append(">" + EOL);
+ s = s.substring(44);
+ String type = s.substring(0, s.indexOf("\""));
+ s = s.substring(s.indexOf(",") + 2);
+ String variable = null;
+ if (!s.startsWith("null")) {
+ variable = s.substring(0, s.indexOf(")"));
+ xmlDump.append(
+ " <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(endNode) + "_Input\" />" + EOL +
+ " <dataInputAssociation>" + EOL +
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(variable) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(endNode) + "_Input</targetRef>" + EOL +
+ " </dataInputAssociation>" + EOL +
+ " <inputSet>" + EOL +
+ " <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(endNode) + "_Input</dataInputRefs>" + EOL +
+ " </inputSet>" + EOL);
+ }
+ if (type.startsWith("Compensate-")) {
+ xmlDump.append(" <compensateEventDefinition activityRef=\"" + XmlDumper.replaceIllegalChars(type.substring(11)) + "\"/>" + EOL);
+ } else {
+ xmlDump.append(" <signalEventDefinition signalRef=\"" + XmlDumper.replaceIllegalChars(type) + "\"/>" + EOL);
+ }
+ endNode("endEvent", xmlDump);
+ } else if (s.startsWith("kcontext.getProcessInstance().signalEvent(\"")) {
+ xmlDump.append(">" + EOL);
+ s = s.substring(43);
+ String type = s.substring(0, s.indexOf("\""));
+ xmlDump.append(" <compensateEventDefinition activityRef=\"" + XmlDumper.replaceIllegalChars(type.substring(11)) + "\"/>" + EOL);
+ endNode("endEvent", xmlDump);
+ } else {
+ throw new IllegalArgumentException("Unknown action " + s);
+ }
+ }
+ } else {
+ endNode(xmlDump);
+ }
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EventNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EventNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/EventNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,92 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.EventNode;
+import org.xml.sax.Attributes;
+
+public class EventNodeHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ throw new IllegalArgumentException("Reading in should be handled by intermediate catch event handler");
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return EventNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ EventNode eventNode = (EventNode) node;
+ String attachedTo = (String) eventNode.getMetaData("AttachedTo");
+ if (attachedTo == null) {
+ writeNode("intermediateCatchEvent", eventNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ if (eventNode.getVariableName() != null) {
+ xmlDump.append(" <dataOutput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(eventNode) + "_Output\" name=\"event\" />" + EOL);
+ xmlDump.append(" <dataOutputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(eventNode) + "_Output</sourceRef>" + EOL +
+ " <targetRef>" + XmlDumper.replaceIllegalChars(eventNode.getVariableName()) + "</targetRef>" + EOL);
+ xmlDump.append(" </dataOutputAssociation>" + EOL);
+ xmlDump.append(" <outputSet>" + EOL);
+ xmlDump.append(" <dataOutputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(eventNode) + "_Output</dataOutputRefs>" + EOL);
+ xmlDump.append(" </outputSet>" + EOL);
+ }
+ if (eventNode.getEventFilters().size() > 0) {
+ String type = ((EventTypeFilter) eventNode.getEventFilters().get(0)).getType();
+ if (type.startsWith("Message-")) {
+ type = type.substring(8);
+ xmlDump.append(" <messageEventDefinition messageRef=\"" + XmlDumper.replaceIllegalChars(type) + "\"/>" + EOL);
+ } else {
+ xmlDump.append(" <signalEventDefinition signalRef=\"" + XmlDumper.replaceIllegalChars(type) + "\"/>" + EOL);
+ }
+ }
+ endNode("intermediateCatchEvent", xmlDump);
+ } else {
+ String type = ((EventTypeFilter) eventNode.getEventFilters().get(0)).getType();
+ if (type.startsWith("Escalation-")) {
+ type = type.substring(attachedTo.length() + 12);
+ boolean cancelActivity = (Boolean) eventNode.getMetaData("CancelActivity");
+ writeNode("boundaryEvent", eventNode, xmlDump, includeMeta);
+ xmlDump.append("attachedToRef=\"" + attachedTo + "\" ");
+ if (!cancelActivity) {
+ xmlDump.append("cancelActivity=\"false\" ");
+ }
+ xmlDump.append(">" + EOL);
+ xmlDump.append(" <escalationEventDefinition escalationCode=\"" + XmlDumper.replaceIllegalChars(type) + "\" />" + EOL);
+ endNode("boundaryEvent", xmlDump);
+ } else if (type.startsWith("Error-")) {
+ type = type.substring(attachedTo.length() + 7);
+ writeNode("boundaryEvent", eventNode, xmlDump, includeMeta);
+ xmlDump.append("attachedToRef=\"" + attachedTo + "\" ");
+ xmlDump.append(">" + EOL);
+ xmlDump.append(" <errorEventDefinition errorCode=\"" + XmlDumper.replaceIllegalChars(type) + "\" />" + EOL);
+ endNode("boundaryEvent", xmlDump);
+ } else if (type.startsWith("Timer-")) {
+ type = type.substring(attachedTo.length() + 7);
+ boolean cancelActivity = (Boolean) eventNode.getMetaData("CancelActivity");
+ writeNode("boundaryEvent", eventNode, xmlDump, includeMeta);
+ xmlDump.append("attachedToRef=\"" + attachedTo + "\" ");
+ if (!cancelActivity) {
+ xmlDump.append("cancelActivity=\"false\" ");
+ }
+ xmlDump.append(">" + EOL);
+ xmlDump.append(
+ " <timerEventDefinition>" + EOL +
+ " <timeCycle xs:type=\"tFormalExpression\">" + XmlDumper.replaceIllegalChars((String) eventNode.getMetaData("TimeCycle")) + "</timeCycle>" + EOL +
+ " </timerEventDefinition>" + EOL);
+ endNode("boundaryEvent", xmlDump);
+ } else if (type.startsWith("Compensate-")) {
+ type = type.substring(attachedTo.length() + 7);
+ writeNode("boundaryEvent", eventNode, xmlDump, includeMeta);
+ xmlDump.append("attachedToRef=\"" + attachedTo + "\" ");
+ xmlDump.append(">" + EOL);
+ xmlDump.append(" <compensateEventDefinition/>" + EOL);
+ endNode("boundaryEvent", xmlDump);
+ }
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ExclusiveGatewayHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ExclusiveGatewayHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ExclusiveGatewayHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,37 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+import org.xml.sax.Attributes;
+
+public class ExclusiveGatewayHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ final String type = attrs.getValue("gatewayDirection");
+ if ("converging".equals(type)) {
+ Join join = new Join();
+ join.setType(Join.TYPE_XOR);
+ return join;
+ } else if ("diverging".equals(type)) {
+ Split split = new Split();
+ split.setType(Split.TYPE_XOR);
+ String isDefault = attrs.getValue("default");
+ split.setMetaData("Default", isDefault);
+ return split;
+ } else {
+ throw new IllegalArgumentException(
+ "Unknown gateway direction: " + type);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by split / join handler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/FaultNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/FaultNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/FaultNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,42 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.FaultNode;
+import org.xml.sax.Attributes;
+
+public class FaultNodeHandler 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 FaultNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ FaultNode faultNode = (FaultNode) node;
+ writeNode("endEvent", faultNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ if (faultNode.getFaultVariable() != null) {
+ xmlDump.append(" <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(faultNode) + "_Input\" name=\"error\" />" + EOL);
+ xmlDump.append(" <dataInputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(faultNode.getFaultVariable()) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(faultNode) + "_Input</targetRef>" + EOL);
+ xmlDump.append(" </dataInputAssociation>" + EOL);
+ xmlDump.append(" <inputSet>" + EOL);
+ xmlDump.append(" <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(faultNode) + "_Input</dataInputRefs>" + EOL);
+ xmlDump.append(" </inputSet>" + EOL);
+ }
+ if (faultNode.isTerminateParent()) {
+ xmlDump.append(" <errorEventDefinition errorCode=\"" + XmlDumper.replaceIllegalChars(faultNode.getFaultName()) + "\" />" + EOL);
+ } else {
+ xmlDump.append(" <escalationEventDefinition escalationCode=\"" + XmlDumper.replaceIllegalChars(faultNode.getFaultName()) + "\" />" + EOL);
+ }
+ endNode("endEvent", xmlDump);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ForEachNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ForEachNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ForEachNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,97 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.compiler.xml.XmlDumper;
+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>" + XmlDumper.replaceIllegalChars(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=\"" + XmlDumper.replaceIllegalChars(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
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InMessageRefHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InMessageRefHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InMessageRefHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,61 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashSet;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Message;
+import org.drools.bpmn2.core.Interface.Operation;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class InMessageRefHandler extends BaseAbstractHandler implements Handler {
+
+ @SuppressWarnings("unchecked")
+ public InMessageRefHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(Operation.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.startElementBuilder(localName, attrs);
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ Element element = parser.endElementBuilder();
+ String messageId = element.getTextContent();
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ throw new IllegalArgumentException("No messages found");
+ }
+ Message message = messages.get(messageId);
+ if (message == null) {
+ throw new IllegalArgumentException("Could not find message " + messageId);
+ }
+ Operation operation = (Operation) parser.getParent();
+ operation.setMessage(message);
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return Message.class;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InclusiveGatewayHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InclusiveGatewayHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InclusiveGatewayHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,32 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.Split;
+import org.xml.sax.Attributes;
+
+public class InclusiveGatewayHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ final String type = attrs.getValue("gatewayDirection");
+ if ("diverging".equals(type)) {
+ Split split = new Split();
+ split.setType(Split.TYPE_OR);
+ String isDefault = attrs.getValue("default");
+ split.setMetaData("Default", isDefault);
+ return split;
+ } else {
+ throw new IllegalArgumentException(
+ "Unknown gateway direction: " + type);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by split / join handler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InterfaceHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InterfaceHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/InterfaceHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,66 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import org.drools.bpmn2.core.Definitions;
+import org.drools.bpmn2.core.Interface;
+import org.drools.bpmn2.core.ItemDefinition;
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+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 InterfaceHandler extends BaseAbstractHandler implements Handler {
+
+ @SuppressWarnings("unchecked")
+ public InterfaceHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(Definitions.class);
+
+ this.validPeers = new HashSet();
+ this.validPeers.add(null);
+ this.validPeers.add(ItemDefinition.class);
+ this.validPeers.add(Message.class);
+ this.validPeers.add(Interface.class);
+
+ this.allowNesting = false;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ String id = attrs.getValue("id");
+ String name = attrs.getValue("name");
+
+ ProcessBuildData buildData = (ProcessBuildData) parser.getData();
+ List<Interface> interfaces = (List<Interface>) buildData.getMetaData("Interfaces");
+ if (interfaces == null) {
+ interfaces = new ArrayList<Interface>();
+ buildData.setMetaData("Interfaces", interfaces);
+ }
+ Interface i = new Interface(id, name);
+ interfaces.add(i);
+ return i;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return Interface.class;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateCatchEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateCatchEventHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateCatchEventHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,191 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.process.core.event.EventFilter;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.process.core.timer.Timer;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.StateNode;
+import org.drools.workflow.core.node.TimerNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class IntermediateCatchEventHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new EventNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return EventNode.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 ("signalEventDefinition".equals(nodeName)) {
+ // reuse already created EventNode
+ handleSignalNode(node, element, uri, localName, parser);
+ break;
+ } else if ("messageEventDefinition".equals(nodeName)) {
+ // reuse already created EventNode
+ handleMessageNode(node, element, uri, localName, parser);
+ break;
+ } else if ("timerEventDefinition".equals(nodeName)) {
+ // create new timerNode
+ TimerNode timerNode = new TimerNode();
+ timerNode.setId(node.getId());
+ timerNode.setName(node.getName());
+ timerNode.setMetaData("UniqueId", node.getMetaData("UniqueId"));
+ node = timerNode;
+ handleTimerNode(node, element, uri, localName, parser);
+ break;
+ } else if ("conditionalEventDefinition".equals(nodeName)) {
+ // create new stateNode
+ StateNode stateNode = new StateNode();
+ stateNode.setId(node.getId());
+ stateNode.setName(node.getName());
+ stateNode.setMetaData("UniqueId", node.getMetaData("UniqueId"));
+ node = stateNode;
+ handleStateNode(node, element, uri, localName, parser);
+ break;
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+ nodeContainer.addNode(node);
+ return node;
+ }
+
+ protected void handleSignalNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ EventNode eventNode = (EventNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataOutputAssociation".equals(nodeName)) {
+ readDataOutputAssociation(xmlNode, eventNode);
+ } else if ("signalEventDefinition".equals(nodeName)) {
+ String type = ((Element) xmlNode).getAttribute("signalRef");
+ if (type != null && type.trim().length() > 0) {
+ List<EventFilter> eventFilters = new ArrayList<EventFilter>();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType(type);
+ eventFilters.add(eventFilter);
+ eventNode.setEventFilters(eventFilters);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void handleMessageNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ EventNode eventNode = (EventNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataOutputAssociation".equals(nodeName)) {
+ readDataOutputAssociation(xmlNode, eventNode);
+ } else if ("messageEventDefinition".equals(nodeName)) {
+ String messageRef = ((Element) xmlNode).getAttribute("messageRef");
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ throw new IllegalArgumentException("No messages found");
+ }
+ Message message = messages.get(messageRef);
+ if (message == null) {
+ throw new IllegalArgumentException("Could not find message " + messageRef);
+ }
+ eventNode.setMetaData("MessageType", message.getType());
+ List<EventFilter> eventFilters = new ArrayList<EventFilter>();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType("Message-" + messageRef);
+ eventFilters.add(eventFilter);
+ eventNode.setEventFilters(eventFilters);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void handleTimerNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ TimerNode timerNode = (TimerNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("timerEventDefinition".equals(nodeName)) {
+ Timer timer = new Timer();
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ while (subNode instanceof Element) {
+ String subNodeName = subNode.getNodeName();
+ if ("timeCycle".equals(subNodeName)) {
+ String period = subNode.getTextContent();
+ timer.setDelay(period);
+ break;
+ }
+ subNode = subNode.getNextSibling();
+ }
+ timerNode.setTimer(timer);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void handleStateNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ StateNode stateNode = (StateNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("conditionalEventDefinition".equals(nodeName)) {
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ while (subNode != null) {
+ String subnodeName = subNode.getNodeName();
+ if ("condition".equals(subnodeName)) {
+ stateNode.setMetaData("Condition", xmlNode.getTextContent());
+ break;
+ }
+ subNode = subNode.getNextSibling();
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void readDataOutputAssociation(org.w3c.dom.Node xmlNode, EventNode eventNode) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ // targetRef
+ subNode = subNode.getNextSibling();
+ String to = subNode.getTextContent();
+ eventNode.setVariableName(to);
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by specific handlers");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateThrowEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateThrowEventHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/IntermediateThrowEventHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,177 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.Map;
+
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class IntermediateThrowEventHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new ActionNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ final Element element = parser.endElementBuilder();
+ ActionNode node = (ActionNode) 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 ("signalEventDefinition".equals(nodeName)) {
+ // reuse already created ActionNode
+ handleSignalNode(node, element, uri, localName, parser);
+ break;
+ } else if ("messageEventDefinition".equals(nodeName)) {
+ // reuse already created ActionNode
+ handleMessageNode(node, element, uri, localName, parser);
+ break;
+ } else if ("escalationEventDefinition".equals(nodeName)) {
+ // reuse already created ActionNode
+ handleEscalationNode(node, element, uri, localName, parser);
+ break;
+ } else if ("compensateEventDefinition".equals(nodeName)) {
+ // reuse already created ActionNode
+ handleCompensationNode(node, element, uri, localName, parser);
+ break;
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ // none event definition
+ if (node.getAction() == null) {
+ node.setAction(new DroolsConsequenceAction("mvel", ""));
+ node.setMetaData("NodeType", "IntermediateThrowEvent-None");
+ }
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+ nodeContainer.addNode(node);
+ return node;
+ }
+
+ public void handleSignalNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ ActionNode actionNode = (ActionNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataInputAssociation".equals(nodeName)) {
+ readDataInputAssociation(xmlNode, actionNode);
+ } else if ("signalEventDefinition".equals(nodeName)) {
+ String signalName = ((Element) xmlNode).getAttribute("signalRef");
+ String variable = (String) actionNode.getMetaData("MappingVariable");
+ actionNode.setAction(new DroolsConsequenceAction("mvel",
+ "kcontext.getKnowledgeRuntime().signalEvent(\""
+ + signalName + "\", " + (variable == null ? "null" : variable) + ")"));
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void handleMessageNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ ActionNode actionNode = (ActionNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataInputAssociation".equals(nodeName)) {
+ readDataInputAssociation(xmlNode, actionNode);
+ } else if ("messageEventDefinition".equals(nodeName)) {
+ String messageRef = ((Element) xmlNode).getAttribute("messageRef");
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ throw new IllegalArgumentException("No messages found");
+ }
+ Message message = messages.get(messageRef);
+ if (message == null) {
+ throw new IllegalArgumentException("Could not find message " + messageRef);
+ }
+ String variable = (String) actionNode.getMetaData("MappingVariable");
+ actionNode.setMetaData("MessageType", message.getType());
+ actionNode.setAction(new DroolsConsequenceAction("java",
+ "org.drools.process.instance.impl.WorkItemImpl workItem = new org.drools.process.instance.impl.WorkItemImpl();" + EOL +
+ "workItem.setName(\"Send Task\");" + EOL +
+ "workItem.setParameter(\"MessageType\", \"" + message.getType() + "\");" + EOL +
+ (variable == null ? "" : "workItem.setParameter(\"Message\", " + variable + ");" + EOL) +
+ "((org.drools.process.instance.WorkItemManager) kcontext.getKnowledgeRuntime().getWorkItemManager()).internalExecuteWorkItem(workItem);"));
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ public void handleEscalationNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ ActionNode actionNode = (ActionNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataInputAssociation".equals(nodeName)) {
+ readDataInputAssociation(xmlNode, actionNode);
+ } else if ("escalationEventDefinition".equals(nodeName)) {
+ String faultName = ((Element) xmlNode).getAttribute("escalationCode");
+ if (faultName != null && faultName.trim().length() > 0) {
+ actionNode.setAction(new DroolsConsequenceAction("java",
+ "org.drools.process.instance.context.exception.ExceptionScopeInstance scopeInstance = (org.drools.process.instance.context.exception.ExceptionScopeInstance) ((org.drools.workflow.instance.NodeInstance) kcontext.getNodeInstance()).resolveContextInstance(org.drools.process.core.context.exception.ExceptionScope.EXCEPTION_SCOPE, \"" + faultName + "\");" + EOL +
+ "if (scopeInstance != null) {" + EOL +
+ " scopeInstance.handleException(\"" + faultName + "\", null);" + EOL +
+ "} else {" + EOL +
+ " ((org.drools.process.instance.ProcessInstance) kcontext.getProcessInstance()).setState(org.drools.process.instance.ProcessInstance.STATE_ABORTED);" + EOL +
+ "}"));
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ public void handleCompensationNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ ActionNode actionNode = (ActionNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("compensateEventDefinition".equals(nodeName)) {
+ String activityRef = ((Element) xmlNode).getAttribute("activityRef");
+ if (activityRef != null && activityRef.trim().length() > 0) {
+ actionNode.setMetaData("Compensate", activityRef);
+ actionNode.setAction(new DroolsConsequenceAction("java",
+ "kcontext.getProcessInstance().signalEvent(\"Compensate-" + activityRef + "\", null);"));
+ }
+// boolean waitForCompletion = true;
+// String waitForCompletionString = ((Element) xmlNode).getAttribute("waitForCompletion");
+// if ("false".equals(waitForCompletionString)) {
+// waitForCompletion = false;
+// }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void readDataInputAssociation(org.w3c.dom.Node xmlNode, ActionNode actionNode) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ String eventVariable = subNode.getTextContent();
+ if (eventVariable != null && eventVariable.trim().length() > 0) {
+ actionNode.setMetaData("MappingVariable", eventVariable);
+ }
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by action node handler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ItemDefinitionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ItemDefinitionHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ItemDefinitionHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,66 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Definitions;
+import org.drools.bpmn2.core.ItemDefinition;
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+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 ItemDefinitionHandler extends BaseAbstractHandler implements Handler {
+
+ @SuppressWarnings("unchecked")
+ public ItemDefinitionHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(Definitions.class);
+
+ this.validPeers = new HashSet();
+ this.validPeers.add(null);
+ this.validPeers.add(ItemDefinition.class);
+ this.validPeers.add(Message.class);
+
+ this.allowNesting = false;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ String id = attrs.getValue("id");
+ String type = attrs.getValue("structureRef");
+
+ ProcessBuildData buildData = (ProcessBuildData) parser.getData();
+ Map<String, ItemDefinition> itemDefinitions = (Map<String, ItemDefinition>)
+ buildData.getMetaData("ItemDefinitions");
+ if (itemDefinitions == null) {
+ itemDefinitions = new HashMap<String, ItemDefinition>();
+ buildData.setMetaData("ItemDefinitions", itemDefinitions);
+ }
+ ItemDefinition itemDefinition = new ItemDefinition(id);
+ itemDefinition.setStructureRef(type);
+ itemDefinitions.put(id, itemDefinition);
+ return itemDefinition;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return ItemDefinition.class;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/JoinHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/JoinHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/JoinHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,34 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.Join;
+import org.xml.sax.Attributes;
+
+public class JoinHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ throw new IllegalArgumentException("Reading in should be handled by gateway handler");
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Join.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ Join join = (Join) node;
+ switch (join.getType()) {
+ case Join.TYPE_AND:
+ writeNode("parallelGateway", node, xmlDump, includeMeta);
+ break;
+ case Join.TYPE_XOR:
+ writeNode("exclusiveGateway", node, xmlDump, includeMeta);
+ break;
+ default:
+ writeNode("complexGateway", node, xmlDump, includeMeta);
+ }
+ xmlDump.append("gatewayDirection=\"converging\" ");
+ endNode(xmlDump);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/LaneHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/LaneHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/LaneHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,78 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import org.drools.bpmn2.core.Lane;
+import org.drools.definition.process.WorkflowProcess;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class LaneHandler extends BaseAbstractHandler implements Handler {
+
+ public static final String LANES = "BPMN.Lanes";
+
+ @SuppressWarnings("unchecked")
+ public LaneHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(RuleFlowProcess.class);
+
+ this.validPeers = new HashSet();
+ this.validPeers.add(null);
+
+ this.allowNesting = false;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ String id = attrs.getValue("id");
+ String name = attrs.getValue("name");
+
+ WorkflowProcess process = (WorkflowProcess) parser.getParent();
+
+ List<Lane> lanes = (List<Lane>)
+ ((RuleFlowProcess) process).getMetaData(LaneHandler.LANES);
+ if (lanes == null) {
+ lanes = new ArrayList<Lane>();
+ ((RuleFlowProcess) process).setMetaData(LaneHandler.LANES, lanes);
+ }
+ Lane lane = new Lane(id);
+ lane.setName(name);
+ lanes.add(lane);
+ return lane;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ final Element element = parser.endElementBuilder();
+ Lane lane = (Lane) parser.getCurrent();
+
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("flowElementRef".equals(nodeName)) {
+ String flowElementRef = xmlNode.getTextContent();
+ lane.addFlowElement(flowElementRef);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ return lane;
+ }
+
+ public Class<?> generateNodeFor() {
+ return Lane.class;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ManualTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ManualTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ManualTaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,26 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+
+public class ManualTaskHandler extends TaskHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new WorkItemNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ protected String getTaskName(final Element element) {
+ return "Manual Task";
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by TaskHandler");
+ }
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/MessageHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/MessageHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/MessageHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,76 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Definitions;
+import org.drools.bpmn2.core.ItemDefinition;
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+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 MessageHandler extends BaseAbstractHandler implements Handler {
+
+ @SuppressWarnings("unchecked")
+ public MessageHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(Definitions.class);
+
+ this.validPeers = new HashSet();
+ this.validPeers.add(null);
+ this.validPeers.add(ItemDefinition.class);
+ this.validPeers.add(Message.class);
+
+ this.allowNesting = false;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ String id = attrs.getValue("id");
+ String structureRef = attrs.getValue("structureRef");
+
+ Map<String, ItemDefinition> itemDefinitions = (Map<String, ItemDefinition>)
+ ((ProcessBuildData) parser.getData()).getMetaData("ItemDefinitions");
+ if (itemDefinitions == null) {
+ throw new IllegalArgumentException("No item definitions found");
+ }
+ ItemDefinition itemDefinition = itemDefinitions.get(structureRef);
+ if (itemDefinition == null) {
+ throw new IllegalArgumentException("Could not find itemDefinition " + structureRef);
+ }
+
+ ProcessBuildData buildData = (ProcessBuildData) parser.getData();
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ messages = new HashMap<String, Message>();
+ buildData.setMetaData("Messages", messages);
+ }
+ Message message = new Message(id);
+ message.setType(itemDefinition.getStructureRef());
+ messages.put(id, message);
+ return message;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return Message.class;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/OperationHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/OperationHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/OperationHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,51 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashSet;
+
+import org.drools.bpmn2.core.Interface;
+import org.drools.bpmn2.core.Interface.Operation;
+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 OperationHandler extends BaseAbstractHandler implements Handler {
+
+ @SuppressWarnings("unchecked")
+ public OperationHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(Interface.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.startElementBuilder(localName, attrs);
+
+ String id = attrs.getValue("id");
+ String name = attrs.getValue("name");
+
+ Interface i = (Interface) parser.getParent();
+ Operation operation = i.addOperation(id, name);
+ return operation;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return Operation.class;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ParallelGatewayHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ParallelGatewayHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ParallelGatewayHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,35 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+import org.xml.sax.Attributes;
+
+public class ParallelGatewayHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ final String type = attrs.getValue("gatewayDirection");
+ if ("converging".equals(type)) {
+ Join join = new Join();
+ join.setType(Join.TYPE_AND);
+ return join;
+ } else if ("diverging".equals(type)) {
+ Split split = new Split();
+ split.setType(Split.TYPE_AND);
+ return split;
+ } else {
+ throw new IllegalArgumentException(
+ "Unknown gateway direction: " + type);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by split / join handler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ProcessHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ProcessHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ProcessHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,320 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Definitions;
+import org.drools.bpmn2.core.Interface;
+import org.drools.bpmn2.core.ItemDefinition;
+import org.drools.bpmn2.core.Lane;
+import org.drools.bpmn2.core.Message;
+import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.definition.process.Node;
+import org.drools.definition.process.NodeContainer;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.process.core.context.swimlane.Swimlane;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.process.core.timer.Timer;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.workflow.core.Connection;
+import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.ConnectionRef;
+import org.drools.workflow.core.impl.ConstraintImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.impl.NodeImpl;
+import org.drools.workflow.core.node.CompositeContextNode;
+import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.HumanTaskNode;
+import org.drools.workflow.core.node.Split;
+import org.drools.workflow.core.node.StateNode;
+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 ProcessHandler extends BaseAbstractHandler implements Handler {
+
+ public static final String CONNECTIONS = "BPMN.Connections";
+
+ @SuppressWarnings("unchecked")
+ public ProcessHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet();
+ this.validParents.add(Definitions.class);
+
+ this.validPeers = new HashSet();
+ this.validPeers.add(Interface.class);
+ this.validPeers.add(Message.class);
+ this.validPeers.add(ItemDefinition.class);
+ 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.startElementBuilder(localName, attrs);
+
+ String id = attrs.getValue("id");
+ String name = attrs.getValue("name");
+ String packageName = attrs.getValue("http://www.jboss.org/drools", "packageName");
+
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setAutoComplete(true);
+ process.setId(id);
+ if (name == null) {
+ name = id;
+ }
+ process.setName(name);
+ process.setType("RuleFlow");
+ if (packageName == null) {
+ packageName = "org.drools.bpmn2";
+ }
+ process.setPackageName(packageName);
+
+ ((ProcessBuildData) parser.getData()).setProcess(process);
+ return process;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ RuleFlowProcess process = (RuleFlowProcess) parser.getCurrent();
+ List<SequenceFlow> connections = (List<SequenceFlow>)
+ process.getMetaData(CONNECTIONS);
+ linkConnections(process, connections);
+ linkBoundaryEvents(process);
+ List<Lane> lanes = (List<Lane>)
+ process.getMetaData(LaneHandler.LANES);
+ assignLanes(process, lanes);
+ postProcessNodes(process);
+ return process;
+ }
+
+ public Class<?> generateNodeFor() {
+ return org.drools.definition.process.Process.class;
+ }
+
+ public static void linkConnections(NodeContainer nodeContainer, List<SequenceFlow> connections) {
+ if (connections != null) {
+ for (SequenceFlow connection: connections) {
+ String sourceRef = connection.getSourceRef();
+ String targetRef = connection.getTargetRef();
+ Node source = null;
+ Node target = null;
+ try {
+ // remove starting _
+ sourceRef = sourceRef.substring(1);
+ // remove ids of parent nodes
+ sourceRef = sourceRef.substring(sourceRef.lastIndexOf("-") + 1);
+ source = nodeContainer.getNode(new Integer(sourceRef));
+ } catch (NumberFormatException e) {
+ // try looking for a node with same "UniqueId" (in metadata)
+ for (Node node: nodeContainer.getNodes()) {
+ if (connection.getSourceRef().equals(node.getMetaData("UniqueId"))) {
+ source = node;
+ break;
+ }
+ }
+ if (source == null) {
+ throw new IllegalArgumentException("Could not find source node for connection:" + connection.getSourceRef());
+ }
+ }
+ try {
+ // remove starting _
+ targetRef = targetRef.substring(1);
+ // remove ids of parent nodes
+ targetRef = targetRef.substring(targetRef.lastIndexOf("-") + 1);
+ target = nodeContainer.getNode(new Integer(targetRef));
+ } catch (NumberFormatException e) {
+ // try looking for a node with same "UniqueId" (in metadata)
+ for (Node node: nodeContainer.getNodes()) {
+ if (connection.getTargetRef().equals(node.getMetaData("UniqueId"))) {
+ target = node;
+ break;
+ }
+ }
+ if (target == null) {
+ throw new IllegalArgumentException("Could not find target node for connection:" + connection.getTargetRef());
+ }
+ }
+ Connection result = new ConnectionImpl(
+ source, NodeImpl.CONNECTION_DEFAULT_TYPE,
+ target, NodeImpl.CONNECTION_DEFAULT_TYPE);
+ result.setMetaData("bendpoints", connection.getBendpoints());
+ if (source instanceof Split) {
+ Split split = (Split) source;
+ Constraint constraint = new ConstraintImpl();
+ String defaultConnection = (String) split.getMetaData("Default");
+ if (defaultConnection != null && defaultConnection.equals(connection.getId())) {
+ constraint.setDefault(true);
+ }
+ if (connection.getName() != null) {
+ constraint.setName(connection.getName());
+ } else {
+ constraint.setName("");
+ }
+ if (connection.getType() != null) {
+ constraint.setType(connection.getType());
+ } else {
+ constraint.setType("code");
+ }
+ if (connection.getLanguage() != null) {
+ constraint.setDialect(connection.getLanguage());
+ }
+ if (connection.getExpression() != null) {
+ constraint.setConstraint(connection.getExpression());
+ }
+ split.addConstraint(
+ new ConnectionRef(target.getId(), NodeImpl.CONNECTION_DEFAULT_TYPE),
+ constraint);
+ }
+ }
+ }
+ }
+
+ public static void linkBoundaryEvents(NodeContainer nodeContainer) {
+ for (Node node: nodeContainer.getNodes()) {
+ if (node instanceof EventNode) {
+ String attachedTo = (String) node.getMetaData("AttachedTo");
+ if (attachedTo != null) {
+ String type = ((EventTypeFilter)
+ ((EventNode) node).getEventFilters().get(0)).getType();
+ Node attachedNode = null;
+ try {
+ // remove starting _
+ String attachedToString = attachedTo.substring(1);
+ // remove ids of parent nodes
+ attachedToString = attachedToString.substring(attachedToString.lastIndexOf("-") + 1);
+ attachedNode = nodeContainer.getNode(new Integer(attachedToString));
+ } catch (NumberFormatException e) {
+ // try looking for a node with same "UniqueId" (in metadata)
+ for (Node subnode: nodeContainer.getNodes()) {
+ if (attachedTo.equals(subnode.getMetaData("UniqueId"))) {
+ attachedNode = subnode;
+ break;
+ }
+ }
+ if (attachedNode == null) {
+ throw new IllegalArgumentException("Could not find node to attach to: " + attachedTo);
+ }
+ }
+ if (type.startsWith("Escalation-")) {
+ boolean cancelActivity = (Boolean) node.getMetaData("CancelActivity");
+ CompositeContextNode compositeNode = (CompositeContextNode) attachedNode;
+ ExceptionScope exceptionScope = (ExceptionScope)
+ compositeNode.getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope == null) {
+ exceptionScope = new ExceptionScope();
+ compositeNode.addContext(exceptionScope);
+ compositeNode.setDefaultContext(exceptionScope);
+ }
+ String escalationCode = (String) node.getMetaData("EscalationEvent");
+ ActionExceptionHandler exceptionHandler = new ActionExceptionHandler();
+ exceptionHandler.setAction(new DroolsConsequenceAction("java",
+ (cancelActivity ? "((org.drools.workflow.instance.NodeInstance) kcontext.getNodeInstance()).cancel();" : "") +
+ "kcontext.getProcessInstance().signalEvent(\"Escalation-" + attachedTo + "-" + escalationCode + "\", null);"));
+ exceptionScope.setExceptionHandler(escalationCode, exceptionHandler);
+ } else if (type.startsWith("Error-")) {
+ CompositeContextNode compositeNode = (CompositeContextNode) attachedNode;
+ ExceptionScope exceptionScope = (ExceptionScope)
+ compositeNode.getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope == null) {
+ exceptionScope = new ExceptionScope();
+ compositeNode.addContext(exceptionScope);
+ compositeNode.setDefaultContext(exceptionScope);
+ }
+ String errorCode = (String) node.getMetaData("ErrorEvent");
+ ActionExceptionHandler exceptionHandler = new ActionExceptionHandler();
+ exceptionHandler.setAction(new DroolsConsequenceAction("java",
+ "((org.drools.workflow.instance.NodeInstance) kcontext.getNodeInstance()).cancel();" +
+ "kcontext.getProcessInstance().signalEvent(\"Error-" + attachedTo + "-" + errorCode + "\", null);"));
+ exceptionScope.setExceptionHandler(errorCode, exceptionHandler);
+ } else if (type.startsWith("Timer-")) {
+ boolean cancelActivity = (Boolean) node.getMetaData("CancelActivity");
+ CompositeContextNode compositeNode = (CompositeContextNode) attachedNode;
+ String timeCycle = (String) node.getMetaData("TimeCycle");
+ Timer timer = new Timer();
+ timer.setDelay(timeCycle);
+ compositeNode.addTimer(timer, new DroolsConsequenceAction("java",
+ (cancelActivity ? "((org.drools.workflow.instance.NodeInstance) kcontext.getNodeInstance()).cancel();" : "") +
+ "kcontext.getProcessInstance().signalEvent(\"Timer-" + attachedTo + "-" + timeCycle + "\", null);"));
+ } else if (type.startsWith("Compensate-")) {
+ String uniqueId = (String) node.getMetaData("UniqueId");
+ String eventType = "Compensate-" + uniqueId;
+ ((EventTypeFilter) ((EventNode) node).getEventFilters().get(0)).setType(eventType);
+ }
+ }
+ }
+ }
+ }
+
+ private void assignLanes(RuleFlowProcess process, List<Lane> lanes) {
+ List<String> laneNames = new ArrayList<String>();
+ Map<String, String> laneMapping = new HashMap<String, String>();
+ if (lanes != null) {
+ for (Lane lane: lanes) {
+ String name = lane.getName();
+ if (name != null) {
+ Swimlane swimlane = new Swimlane();
+ swimlane.setName(name);
+ process.getSwimlaneContext().addSwimlane(swimlane);
+ laneNames.add(name);
+ for (String flowElementRef: lane.getFlowElements()) {
+ laneMapping.put(flowElementRef, name);
+ }
+ }
+ }
+ }
+ assignLanes(process, laneMapping);
+ }
+
+ private void postProcessNodes(NodeContainer container) {
+ for (Node node: container.getNodes()) {
+ if (node instanceof StateNode) {
+ StateNode stateNode = (StateNode) node;
+ String condition = (String) stateNode.getMetaData("Condition");
+ Constraint constraint = new ConstraintImpl();
+ constraint.setConstraint(condition);
+ constraint.setType("rule");
+ for (org.drools.definition.process.Connection connection: stateNode.getDefaultOutgoingConnections()) {
+ stateNode.setConstraint(connection, constraint);
+ }
+ } else if (node instanceof NodeContainer) {
+ postProcessNodes((NodeContainer) node);
+ }
+ }
+ }
+
+ private void assignLanes(NodeContainer nodeContainer, Map<String, String> laneMapping) {
+ for (Node node: nodeContainer.getNodes()) {
+ String lane = null;
+ String uniqueId = (String) node.getMetaData("UniqueId");
+ if (uniqueId != null) {
+ lane = laneMapping.get(uniqueId);
+ } else {
+ lane = laneMapping.get(XmlBPMNProcessDumper.getUniqueNodeId(node));
+ }
+ if (lane != null) {
+ ((NodeImpl) node).setMetaData("Lane", lane);
+ if (node instanceof HumanTaskNode) {
+ ((HumanTaskNode) node).setSwimlane(lane);
+ }
+ }
+ if (node instanceof NodeContainer) {
+ assignLanes((NodeContainer) node, laneMapping);
+ }
+ }
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/PropertyHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/PropertyHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/PropertyHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,90 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.ItemDefinition;
+import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.process.core.ContextContainer;
+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.node.WorkItemNode;
+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 PropertyHandler extends BaseAbstractHandler implements Handler {
+
+ public PropertyHandler() {
+ initValidParents();
+ initValidPeers();
+ this.allowNesting = false;
+ }
+
+ protected void initValidParents() {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(ContextContainer.class);
+ this.validParents.add(WorkItemNode.class);
+ }
+
+ protected void initValidPeers() {
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(null);
+ this.validPeers.add(Variable.class);
+ this.validPeers.add(Node.class);
+ this.validPeers.add(SequenceFlow.class);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ final String id = attrs.getValue("id");
+ final String itemSubjectRef = attrs.getValue("itemSubjectRef");
+
+ Object parent = parser.getParent();
+ if (parent instanceof ContextContainer) {
+ ContextContainer contextContainer = (ContextContainer) parent;
+ VariableScope variableScope = (VariableScope)
+ contextContainer.getDefaultContext(VariableScope.VARIABLE_SCOPE);
+ List variables = variableScope.getVariables();
+ Variable variable = new Variable();
+ variable.setName(id);
+ // retrieve type from item definition
+ DataType dataType = new ObjectDataType();
+ 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());
+ }
+ }
+ variable.setType(dataType);
+ variables.add(variable);
+ return variable;
+ }
+
+ return new Variable();
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return Variable.class;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ReceiveTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ReceiveTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ReceiveTaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,50 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.Map;
+
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class ReceiveTaskHandler extends TaskHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new WorkItemNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ WorkItemNode workItemNode = (WorkItemNode) node;
+ String messageRef = element.getAttribute("messageRef");
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ throw new IllegalArgumentException("No messages found");
+ }
+ Message message = messages.get(messageRef);
+ if (message == null) {
+ throw new IllegalArgumentException("Could not find message " + messageRef);
+ }
+ workItemNode.getWork().setParameter("MessageType", message.getType());
+ }
+
+ protected String getTaskName(final Element element) {
+ return "Receive Task";
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by WorkItemNodeHandler");
+ }
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ScriptTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ScriptTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ScriptTaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,50 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.rule.builder.dialect.java.JavaDialect;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class ScriptTaskHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ ActionNode result = new ActionNode();
+ result.setAction(new DroolsConsequenceAction());
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ ActionNode actionNode = (ActionNode) node;
+ DroolsConsequenceAction action = (DroolsConsequenceAction) actionNode.getAction();
+ if (action == null) {
+ action = new DroolsConsequenceAction();
+ actionNode.setAction(action);
+ }
+ String language = element.getAttribute("scriptLanguage");
+ if (XmlBPMNProcessDumper.JAVA_LANGUAGE.equals(language)) {
+ action.setDialect(JavaDialect.ID);
+ }
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ if (xmlNode instanceof Element) {
+ action.setConsequence(xmlNode.getTextContent());
+ } else {
+ action.setConsequence("");
+ }
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by action node handler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SendTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SendTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SendTaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,50 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.Map;
+
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class SendTaskHandler extends TaskHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new WorkItemNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ WorkItemNode workItemNode = (WorkItemNode) node;
+ String messageRef = element.getAttribute("messageRef");
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ throw new IllegalArgumentException("No messages found");
+ }
+ Message message = messages.get(messageRef);
+ if (message == null) {
+ throw new IllegalArgumentException("Could not find message " + messageRef);
+ }
+ workItemNode.getWork().setParameter("MessageType", message.getType());
+ }
+
+ protected String getTaskName(final Element element) {
+ return "Send Task";
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by WorkItemNodeHandler");
+ }
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SequenceFlowHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SequenceFlowHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SequenceFlowHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,114 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.core.node.CompositeNode;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class SequenceFlowHandler extends BaseAbstractHandler implements Handler {
+
+ public SequenceFlowHandler() {
+ initValidParents();
+ initValidPeers();
+ this.allowNesting = false;
+ }
+
+ protected void initValidParents() {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(NodeContainer.class);
+ }
+
+ protected void initValidPeers() {
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(null);
+ this.validPeers.add(Variable.class);
+ this.validPeers.add(Node.class);
+ this.validPeers.add(SequenceFlow.class);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ final String id = attrs.getValue("id");
+ final String sourceRef = attrs.getValue("sourceRef");
+ final String targetRef = attrs.getValue("targetRef");
+ final String bendpoints = attrs.getValue("g:bendpoints");
+ final String name = attrs.getValue("name");
+
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+
+ List<SequenceFlow> connections = null;
+ if (nodeContainer instanceof RuleFlowProcess) {
+ connections = (List<SequenceFlow>)
+ ((RuleFlowProcess) nodeContainer).getMetaData(ProcessHandler.CONNECTIONS);
+ if (connections == null) {
+ connections = new ArrayList<SequenceFlow>();
+ ((RuleFlowProcess) nodeContainer).setMetaData(ProcessHandler.CONNECTIONS, connections);
+ }
+ } else if (nodeContainer instanceof CompositeNode) {
+ connections = (List<SequenceFlow>)
+ ((CompositeNode) nodeContainer).getMetaData(ProcessHandler.CONNECTIONS);
+ if (connections == null) {
+ connections = new ArrayList<SequenceFlow>();
+ ((CompositeNode) nodeContainer).setMetaData(ProcessHandler.CONNECTIONS, connections);
+ }
+ }
+ SequenceFlow connection = new SequenceFlow(id, sourceRef, targetRef);
+ connection.setBendpoints(bendpoints);
+ connection.setName(name);
+
+ connections.add(connection);
+
+ return connection;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ final Element element = parser.endElementBuilder();
+ SequenceFlow sequenceFlow = (SequenceFlow) parser.getCurrent();
+
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("conditionExpression".equals(nodeName)) {
+ String expression = xmlNode.getTextContent();
+ org.w3c.dom.Node languageNode = xmlNode.getAttributes().getNamedItem("language");
+ if (languageNode != null) {
+ String language = languageNode.getNodeValue();
+ if (XmlBPMNProcessDumper.JAVA_LANGUAGE.equals(language)) {
+ sequenceFlow.setLanguage("java");
+ } else if (XmlBPMNProcessDumper.RULE_LANGUAGE.equals(language)) {
+ sequenceFlow.setType("rule");
+ } else if (XmlBPMNProcessDumper.XPATH_LANGUAGE.equals(language)) {
+ sequenceFlow.setLanguage("XPath");
+ } else {
+ throw new IllegalArgumentException("Unknown language " + language);
+ }
+ }
+ sequenceFlow.setExpression(expression);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ return sequenceFlow;
+ }
+
+ public Class<?> generateNodeFor() {
+ return SequenceFlow.class;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ServiceTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ServiceTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/ServiceTaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,60 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.List;
+
+import org.drools.bpmn2.core.Interface;
+import org.drools.bpmn2.core.Interface.Operation;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class ServiceTaskHandler extends TaskHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new WorkItemNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ WorkItemNode workItemNode = (WorkItemNode) node;
+ String operationRef = element.getAttribute("operationRef");
+ List<Interface> interfaces = (List<Interface>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Interfaces");
+ if (interfaces == null) {
+ throw new IllegalArgumentException("No interfaces found");
+ }
+ Operation operation = null;
+ for (Interface i: interfaces) {
+ operation = i.getOperation(operationRef);
+ if (operation != null) {
+ break;
+ }
+ }
+ if (operation == null) {
+ throw new IllegalArgumentException("Could not find operation " + operationRef);
+ }
+ workItemNode.getWork().setParameter("Interface", operation.getInterface().getName());
+ workItemNode.getWork().setParameter("Operation", operation.getName());
+ workItemNode.getWork().setParameter("ParameterType", operation.getMessage().getType());
+ }
+
+ protected String getTaskName(final Element element) {
+ return "Service Task";
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException("Writing out should be handled by TaskHandler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SplitHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SplitHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SplitHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,59 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.Map;
+
+import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionRef;
+import org.drools.workflow.core.node.Split;
+import org.xml.sax.Attributes;
+
+public class SplitHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ throw new IllegalArgumentException("Reading in should be handled by gateway handler");
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Split.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ Split split = (Split) node;
+ switch (split.getType()) {
+ case Split.TYPE_AND:
+ writeNode("parallelGateway", node, xmlDump, includeMeta);
+ break;
+ case Split.TYPE_XOR:
+ writeNode("exclusiveGateway", node, xmlDump, includeMeta);
+ for (Map.Entry<ConnectionRef, Constraint> entry: split.getConstraints().entrySet()) {
+ if (entry.getValue().isDefault()) {
+ xmlDump.append("default=\"" +
+ XmlBPMNProcessDumper.getUniqueNodeId(split) + "-" +
+ XmlBPMNProcessDumper.getUniqueNodeId(node.getNodeContainer().getNode(entry.getKey().getNodeId())) +
+ "\" ");
+ break;
+ }
+ }
+ break;
+ case Split.TYPE_OR:
+ writeNode("inclusiveGateway", node, xmlDump, includeMeta);
+ for (Map.Entry<ConnectionRef, Constraint> entry: split.getConstraints().entrySet()) {
+ if (entry.getValue().isDefault()) {
+ xmlDump.append("default=\"" +
+ XmlBPMNProcessDumper.getUniqueNodeId(split) + "-" +
+ XmlBPMNProcessDumper.getUniqueNodeId(node.getNodeContainer().getNode(entry.getKey().getNodeId())) +
+ "\" ");
+ break;
+ }
+ }
+ break;
+ default:
+ writeNode("complexGateway", node, xmlDump, includeMeta);
+ }
+ xmlDump.append("gatewayDirection=\"diverging\" ");
+ endNode(xmlDump);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StartEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StartEventHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StartEventHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,173 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Message;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.process.core.event.EventTypeFilter;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.ConstraintTrigger;
+import org.drools.workflow.core.node.EventTrigger;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.Trigger;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class StartEventHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new StartNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return StartNode.class;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ StartNode startNode = (StartNode) node;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("dataOutputAssociation".equals(nodeName)) {
+ readDataOutputAssociation(xmlNode, startNode);
+ } else if ("conditionalEventDefinition".equals(nodeName)) {
+ String constraint = null;
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ while (subNode != null) {
+ String subnodeName = subNode.getNodeName();
+ if ("condition".equals(subnodeName)) {
+ constraint = xmlNode.getTextContent();
+ break;
+ }
+ subNode = subNode.getNextSibling();
+ }
+ ConstraintTrigger trigger = new ConstraintTrigger();
+ trigger.setConstraint(constraint);
+ startNode.addTrigger(trigger);
+ break;
+ } else if ("signalEventDefinition".equals(nodeName)) {
+ String type = ((Element) xmlNode).getAttribute("signalRef");
+ if (type != null && type.trim().length() > 0) {
+ EventTrigger trigger = new EventTrigger();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType(type);
+ trigger.addEventFilter(eventFilter);
+ String mapping = (String) startNode.getMetaData("TriggerMapping");
+ if (mapping != null) {
+ trigger.addInMapping(mapping, "event");
+ }
+ startNode.addTrigger(trigger);
+ }
+ } else if ("messageEventDefinition".equals(nodeName)) {
+ String messageRef = ((Element) xmlNode).getAttribute("messageRef");
+ Map<String, Message> messages = (Map<String, Message>)
+ ((ProcessBuildData) parser.getData()).getMetaData("Messages");
+ if (messages == null) {
+ throw new IllegalArgumentException("No messages found");
+ }
+ Message message = messages.get(messageRef);
+ if (message == null) {
+ throw new IllegalArgumentException("Could not find message " + messageRef);
+ }
+ startNode.setMetaData("MessageType", message.getType());
+ EventTrigger trigger = new EventTrigger();
+ EventTypeFilter eventFilter = new EventTypeFilter();
+ eventFilter.setType("Message-" + messageRef);
+ trigger.addEventFilter(eventFilter);
+ String mapping = (String) startNode.getMetaData("TriggerMapping");
+ if (mapping != null) {
+ trigger.addInMapping(mapping, "event");
+ }
+ startNode.addTrigger(trigger);
+ } else if ("timerEventDefinition".equals(nodeName)) {
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ while (subNode instanceof Element) {
+ String subNodeName = subNode.getNodeName();
+ if ("timeCycle".equals(subNodeName)) {
+ String period = subNode.getTextContent();
+ if (period != null && period.trim().length() > 0) {
+ ConstraintTrigger trigger = new ConstraintTrigger();
+ trigger.setConstraint("");
+ trigger.setHeader("timer (int:" + period + " " + period + ")");
+ startNode.addTrigger(trigger);
+ break;
+ }
+ }
+ subNode = subNode.getNextSibling();
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected void readDataOutputAssociation(org.w3c.dom.Node xmlNode, StartNode startNode) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ // targetRef
+ subNode = subNode.getNextSibling();
+ String to = subNode.getTextContent();
+ startNode.setMetaData("TriggerMapping", to);
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ StartNode startNode = (StartNode) node;
+ writeNode("startEvent", startNode, xmlDump, includeMeta);
+ List<Trigger> triggers = startNode.getTriggers();
+ if (triggers != null) {
+ xmlDump.append(">" + EOL);
+ if (triggers.size() > 1) {
+ throw new IllegalArgumentException("Multiple start triggers not supported");
+ }
+ Trigger trigger = triggers.get(0);
+ if (trigger instanceof ConstraintTrigger) {
+ ConstraintTrigger constraintTrigger = (ConstraintTrigger) trigger;
+ if (constraintTrigger.getHeader() == null) {
+ xmlDump.append(" <conditionalEventDefinition>" + EOL);
+ xmlDump.append(" <condition xs:type=\"tFormalExpression\" language=\"" + XmlBPMNProcessDumper.RULE_LANGUAGE + "\">" + constraintTrigger.getConstraint() + "</condition>" + EOL);
+ xmlDump.append(" </conditionalEventDefinition>" + EOL);
+ } else {
+ String header = constraintTrigger.getHeader();
+ int lenght = (header.length() - 13)/2;
+ String period = header.substring(11, 11 + lenght);
+ xmlDump.append(" <timerEventDefinition>" + EOL);
+ xmlDump.append(" <timeCycle xs:type=\"tFormalExpression\">" + period + "</timeCycle>" + EOL);
+ xmlDump.append(" </timerEventDefinition>" + EOL);
+ }
+ } else if (trigger instanceof EventTrigger) {
+ EventTrigger eventTrigger = (EventTrigger) trigger;
+ if (!trigger.getInMappings().isEmpty()) {
+ String mapping = eventTrigger.getInMappings().keySet().iterator().next();
+ xmlDump.append(
+ " <dataOutput id=\"_" + startNode.getId() + "_Output\" />" + EOL +
+ " <dataOutputAssociation>" + EOL +
+ " <sourceRef>_" + startNode.getId() + "_Output</sourceRef>" + EOL +
+ " <targetRef>" + mapping + "</targetRef>" + EOL +
+ " </dataOutputAssociation>" + EOL +
+ " <outputSet>" + EOL +
+ " <dataOutputRefs>_" + startNode.getId() + "_Output</dataOutputRefs>" + EOL +
+ " </outputSet>" + EOL);
+ }
+ String type = ((EventTypeFilter) eventTrigger.getEventFilters().get(0)).getType();
+ if (type.startsWith("Message-")) {
+ type = type.substring(8);
+ xmlDump.append(" <messageEventDefinition messageRef=\"" + type + "\"/>" + EOL);
+ } else {
+ xmlDump.append(" <signalEventDefinition signalRef=\"" + type + "\" />" + EOL);
+ }
+ } else {
+ throw new IllegalArgumentException("Unsupported trigger type " + trigger);
+ }
+ endNode("startEvent", xmlDump);
+ } else {
+ endNode(xmlDump);
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StateNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StateNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/StateNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,30 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.StateNode;
+import org.xml.sax.Attributes;
+
+public class StateNodeHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ throw new IllegalArgumentException("Reading in should be handled by intermediate catch event handler");
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return StateNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ StateNode stateNode = (StateNode) node;
+ String condition = (String) stateNode.getMetaData("Condition");
+ writeNode("intermediateCatchEvent", stateNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ xmlDump.append(" <conditionalEventDefinition>" + EOL);
+ xmlDump.append(" <condition xs:type=\"tFormalExpression\" language=\"" + XmlBPMNProcessDumper.RULE_LANGUAGE + "\">" + XmlDumper.replaceIllegalChars(condition) + "</condition>" + EOL);
+ xmlDump.append(" </conditionalEventDefinition>" + EOL);
+ endNode("intermediateCatchEvent", xmlDump);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SubProcessHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SubProcessHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/SubProcessHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,144 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.ItemDefinition;
+import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.compiler.xml.ProcessBuildData;
+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.ForEachNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class SubProcessHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ CompositeContextNode result = new CompositeContextNode();
+ VariableScope variableScope = new VariableScope();
+ result.addContext(variableScope);
+ result.setDefaultContext(variableScope);
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ 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
+ boolean found = false;
+ 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);
+ found = true;
+ break;
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ if (!found) {
+ handleCompositeContextNode(node, element, uri, localName, parser);
+ }
+ NodeContainer nodeContainer = (NodeContainer) parser.getParent();
+ nodeContainer.addNode(node);
+ return node;
+ }
+
+ @SuppressWarnings("unchecked")
+ 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;
+ List<SequenceFlow> connections = (List<SequenceFlow>)
+ compositeNode.getMetaData(ProcessHandler.CONNECTIONS);
+ ProcessHandler.linkConnections(compositeNode, connections);
+ ProcessHandler.linkBoundaryEvents(compositeNode);
+ }
+
+ @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);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ 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);
+ }
+ }
+
+ @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 (dataType == null) {
+ dataType = new ObjectDataType("java.lang.Object");
+ }
+ if (variableName != null && variableName.trim().length() > 0) {
+ forEachNode.setVariable(variableName, dataType);
+ }
+ }
+ subNode = subNode.getNextSibling();
+ }
+ }
+
+ 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
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,109 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class TaskHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new WorkItemNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return Node.class;
+ }
+
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ WorkItemNode workItemNode = (WorkItemNode) node;
+ String name = getTaskName(element);
+ Work work = new WorkImpl();
+ work.setName(name);
+ workItemNode.setWork(work);
+ Map<String, String> dataInputs = new HashMap<String, String>();
+ Map<String, String> dataOutputs = new HashMap<String, String>();
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("ioSpecification".equals(nodeName)) {
+ readIoSpecification(xmlNode, dataInputs, dataOutputs);
+ } else if ("dataInputAssociation".equals(nodeName)) {
+ readDataInputAssociation(xmlNode, workItemNode, dataInputs);
+ } else if ("dataOutputAssociation".equals(nodeName)) {
+ readDataOutputAssociation(xmlNode, workItemNode, dataOutputs);
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ }
+
+ protected String getTaskName(final Element element) {
+ return element.getAttribute("taskName");
+ }
+
+ protected void readIoSpecification(org.w3c.dom.Node xmlNode, Map<String, String> dataInputs, Map<String, String> dataOutputs) {
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ while (subNode instanceof Element) {
+ String subNodeName = subNode.getNodeName();
+ if ("dataInput".equals(subNodeName)) {
+ String id = ((Element) subNode).getAttribute("id");
+ String inputName = ((Element) subNode).getAttribute("name");
+ dataInputs.put(id, inputName);
+ }
+ if ("dataOutput".equals(subNodeName)) {
+ String id = ((Element) subNode).getAttribute("id");
+ String outputName = ((Element) subNode).getAttribute("name");
+ dataOutputs.put(id, outputName);
+ }
+ subNode = subNode.getNextSibling();
+ }
+ }
+
+ protected void readDataInputAssociation(org.w3c.dom.Node xmlNode, WorkItemNode workItemNode, Map<String, String> dataInputs) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ if ("assignment".equals(subNode.getNodeName())) {
+ org.w3c.dom.Node subSubNode = subNode.getFirstChild();
+ String from = subSubNode.getTextContent();
+ subNode = subNode.getNextSibling();
+ subNode = subNode.getNextSibling();
+ String to = subNode.getTextContent();
+ workItemNode.getWork().setParameter(dataInputs.get(to), from);
+ } else {
+ String from = subNode.getTextContent();
+ // targetRef
+ subNode = subNode.getNextSibling();
+ String to = subNode.getTextContent();
+ workItemNode.addInMapping(
+ dataInputs.get(to),
+ from);
+ }
+ }
+
+ protected void readDataOutputAssociation(org.w3c.dom.Node xmlNode, WorkItemNode workItemNode, Map<String, String> dataOutputs) {
+ // sourceRef
+ org.w3c.dom.Node subNode = xmlNode.getFirstChild();
+ String from = subNode.getTextContent();
+ // targetRef
+ subNode = subNode.getNextSibling();
+ String to = subNode.getTextContent();
+ workItemNode.addOutMapping(dataOutputs.get(from), to);
+ }
+
+ @Override
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ throw new IllegalArgumentException(
+ "Writing out should be handled by the WorkItemNodeHandler");
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TimerNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TimerNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TimerNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,31 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.TimerNode;
+import org.xml.sax.Attributes;
+
+public class TimerNodeHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ throw new IllegalArgumentException("Reading in should be handled by intermediate catch event handler");
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return TimerNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ TimerNode timerNode = (TimerNode) node;
+ writeNode("intermediateCatchEvent", timerNode, xmlDump, includeMeta);
+ xmlDump.append(">" + EOL);
+ xmlDump.append(" <timerEventDefinition>" + EOL);
+ if (timerNode.getTimer() != null && timerNode.getTimer().getDelay() != null) {
+ xmlDump.append(" <timeCycle>" + XmlDumper.replaceIllegalChars(timerNode.getTimer().getDelay()) + "</timeCycle>" + EOL);
+ }
+ xmlDump.append(" </timerEventDefinition>" + EOL);
+ endNode("intermediateCatchEvent", xmlDump);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TransactionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TransactionHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/TransactionHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,20 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import org.drools.workflow.core.Node;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+public class TransactionHandler extends SubProcessHandler {
+
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ node.setMetaData("Transaction", true);
+ }
+
+ 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
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/UserTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/UserTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/UserTaskHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,153 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.HumanTaskNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class UserTaskHandler extends TaskHandler {
+
+ protected Node createNode(Attributes attrs) {
+ return new HumanTaskNode();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return HumanTaskNode.class;
+ }
+
+ protected void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser) throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ HumanTaskNode humanTaskNode = (HumanTaskNode) node;
+ Work work = new WorkImpl();
+ work.setName("Human Task");
+ humanTaskNode.setWork(work);
+ Map<String, String> dataInputs = new HashMap<String, String>();
+ Map<String, String> dataOutputs = new HashMap<String, String>();
+ List<String> owners = new ArrayList<String>();
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode != null) {
+ String nodeName = xmlNode.getNodeName();
+ if ("ioSpecification".equals(nodeName)) {
+ readIoSpecification(xmlNode, dataInputs, dataOutputs);
+ } else if ("dataInputAssociation".equals(nodeName)) {
+ readDataInputAssociation(xmlNode, humanTaskNode, dataInputs);
+ } else if ("dataOutputAssociation".equals(nodeName)) {
+ readDataOutputAssociation(xmlNode, humanTaskNode, dataOutputs);
+ } else if ("potentialOwner".equals(nodeName)) {
+ owners.add(readPotentialOwner(xmlNode, humanTaskNode));
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ if (owners.size() > 0) {
+ String owner = owners.get(0);
+ for (int i = 1; i < owners.size(); i++) {
+ owner += "," + owners.get(i);
+ }
+ humanTaskNode.getWork().setParameter("ActorId", owner);
+ }
+ }
+
+ protected String readPotentialOwner(org.w3c.dom.Node xmlNode, HumanTaskNode humanTaskNode) {
+ return xmlNode.getFirstChild().getFirstChild().getFirstChild().getTextContent();
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ HumanTaskNode humanTaskNode = (HumanTaskNode) node;
+ writeNode("userTask", humanTaskNode, xmlDump, includeMeta);
+ xmlDump.append("implementation=\"humanTaskWebService\" >" + EOL);
+ writeIO(humanTaskNode, xmlDump);
+ String ownerString = (String) humanTaskNode.getWork().getParameter("ActorId");
+ if (ownerString != null) {
+ String[] owners = ownerString.split(",");
+ for (String owner: owners) {
+ xmlDump.append(
+ " <potentialOwner resourceRef=\"tns:Actor\" >" + EOL +
+ " <resourceAssignmentExpression>" + EOL +
+ " <formalExpression>" + owner + "</formalExpression>" + EOL +
+ " </resourceAssignmentExpression>" + EOL +
+ " </potentialOwner>" + EOL);
+ }
+ }
+ endNode("userTask", xmlDump);
+ }
+
+ protected void writeIO(WorkItemNode workItemNode, StringBuilder xmlDump) {
+ xmlDump.append(" <ioSpecification>" + EOL);
+ for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Input\" name=\"" + entry.getKey() + "\" />" + EOL);
+ }
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (!"ActorId".equals(entry.getKey()) && entry.getValue() != null) {
+ xmlDump.append(" <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Input\" name=\"" + entry.getKey() + "\" />" + EOL);
+ }
+ }
+ for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Output\" name=\"" + entry.getKey() + "\" />" + EOL);
+ }
+ xmlDump.append(" <inputSet>" + EOL);
+ for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Input</dataInputRefs>" + EOL);
+ }
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (!"ActorId".equals(entry.getKey()) && entry.getValue() != null) {
+ xmlDump.append(" <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Input</dataInputRefs>" + EOL);
+ }
+ }
+ xmlDump.append(
+ " </inputSet>" + EOL);
+ xmlDump.append(" <outputSet>" + EOL);
+ for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Output</dataOutputRefs>" + EOL);
+ }
+ xmlDump.append(
+ " </outputSet>" + EOL);
+ xmlDump.append(
+ " </ioSpecification>" + EOL);
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (!"ActorId".equals(entry.getKey()) && entry.getValue() != null) {
+ xmlDump.append(
+ " <property id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "\" />" + EOL);
+ }
+ }
+ for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getValue() + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "</targetRef>" + EOL);
+ xmlDump.append(" </dataInputAssociation>" + EOL);
+ }
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (!"ActorId".equals(entry.getKey()) && entry.getValue() != null) {
+ xmlDump.append(" <dataInputAssociation>" + EOL);
+ xmlDump.append(
+ " <assignment>" + EOL +
+ " <from xs:type=\"tFormalExpression\">" + entry.getValue().toString() + "</from>" + EOL +
+ " <to xs:type=\"tFormalExpression\">" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Input</to>" + EOL +
+ " </assignment>" + EOL +
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Input</targetRef>" + EOL);
+ xmlDump.append(" </dataInputAssociation>" + EOL);
+ }
+ }
+ for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getValue() + "</targetRef>" + EOL);
+ xmlDump.append(" </dataOutputAssociation>" + EOL);
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/WorkItemNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/WorkItemNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/WorkItemNodeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,190 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.Map;
+
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.xml.sax.Attributes;
+
+public class WorkItemNodeHandler extends AbstractNodeHandler {
+
+ protected Node createNode(Attributes attrs) {
+ throw new IllegalArgumentException("Reading in should be handled by specific handlers");
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class generateNodeFor() {
+ return WorkItemNode.class;
+ }
+
+ public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ WorkItemNode workItemNode = (WorkItemNode) node;
+ String type = workItemNode.getWork().getName();
+ if ("Manual Task".equals(type)) {
+ writeNode("manualTask", workItemNode, xmlDump, includeMeta);
+ endNode(xmlDump);
+ return;
+ }
+ if ("Service Task".equals(type)) {
+ writeNode("serviceTask", workItemNode, xmlDump, includeMeta);
+ xmlDump.append("operationRef=\"" +
+ XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_ServiceOperation\" implementation=\"Other\" >" + EOL);
+ xmlDump.append(
+ " <ioSpecification>" + EOL +
+ " <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param\" name=\"Parameter\" />" + EOL +
+ " <dataOutput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result\" name=\"Result\" />" + EOL +
+ " <inputSet>" + EOL +
+ " <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</dataInputRefs>" + EOL +
+ " </inputSet>" + EOL +
+ " <outputSet>" + EOL +
+ " <dataOutputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result</dataOutputRefs>" + EOL +
+ " </outputSet>" + EOL +
+ " </ioSpecification>" + EOL);
+ String inMapping = workItemNode.getInMapping("Parameter");
+ if (inMapping != null) {
+ xmlDump.append(
+ " <dataInputAssociation>" + EOL +
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(inMapping) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</targetRef>" + EOL +
+ " </dataInputAssociation>" + EOL);
+ }
+ String outMapping = workItemNode.getOutMapping("Result");
+ if (outMapping != null) {
+ xmlDump.append(
+ " <dataOutputAssociation>" + EOL +
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result</sourceRef>" + EOL +
+ " <targetRef>" + XmlDumper.replaceIllegalChars(outMapping) + "</targetRef>" + EOL +
+ " </dataOutputAssociation>" + EOL);
+ }
+ endNode("serviceTask", xmlDump);
+ return;
+ }
+ if ("Send Task".equals(type)) {
+ writeNode("sendTask", workItemNode, xmlDump, includeMeta);
+ xmlDump.append("messageRef=\"" +
+ XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_Message\" implementation=\"Other\" >" + EOL);
+ xmlDump.append(
+ " <ioSpecification>" + EOL +
+ " <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param\" name=\"Message\" />" + EOL +
+ " <inputSet>" + EOL +
+ " <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</dataInputRefs>" + EOL +
+ " </inputSet>" + EOL +
+ " <outputSet/>" + EOL +
+ " </ioSpecification>" + EOL);
+ String inMapping = workItemNode.getInMapping("Message");
+ if (inMapping != null) {
+ xmlDump.append(
+ " <dataInputAssociation>" + EOL +
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(inMapping) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_param</targetRef>" + EOL +
+ " </dataInputAssociation>" + EOL);
+ }
+ endNode("sendTask", xmlDump);
+ return;
+ }
+ if ("Receive Task".equals(type)) {
+ writeNode("receiveTask", workItemNode, xmlDump, includeMeta);
+ xmlDump.append("messageRef=\"" +
+ XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_Message\" implementation=\"Other\" >" + EOL);
+ xmlDump.append(
+ " <ioSpecification>" + EOL +
+ " <dataOutput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result\" name=\"Message\" />" + EOL +
+ " <inputSet/>" + EOL +
+ " <outputSet>" + 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>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_result</sourceRef>" + EOL +
+ " <targetRef>" + XmlDumper.replaceIllegalChars(outMapping) + "</targetRef>" + EOL +
+ " </dataOutputAssociation>" + EOL);
+ }
+ endNode("receiveTask", xmlDump);
+ return;
+ }
+ writeNode("task", workItemNode, xmlDump, includeMeta);
+ xmlDump.append("tns:taskName=\"" + XmlDumper.replaceIllegalChars(type) + "\" >" + EOL);
+ writeIO(workItemNode, xmlDump);
+ endNode("task", xmlDump);
+ }
+
+ protected void writeIO(WorkItemNode workItemNode, StringBuilder xmlDump) {
+ xmlDump.append(" <ioSpecification>" + EOL);
+ for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input\" name=\"" + XmlDumper.replaceIllegalChars(entry.getKey()) + "\" />" + EOL);
+ }
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (entry.getValue() != null) {
+ xmlDump.append(" <dataInput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input\" name=\"" + XmlDumper.replaceIllegalChars(entry.getKey()) + "\" />" + EOL);
+ }
+ }
+ for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutput id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Output\" name=\"" + XmlDumper.replaceIllegalChars(entry.getKey()) + "\" />" + EOL);
+ }
+ xmlDump.append(" <inputSet>" + EOL);
+ for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input</dataInputRefs>" + EOL);
+ }
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (entry.getValue() != null) {
+ xmlDump.append(" <dataInputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input</dataInputRefs>" + EOL);
+ }
+ }
+ xmlDump.append(
+ " </inputSet>" + EOL);
+ xmlDump.append(" <outputSet>" + EOL);
+ for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutputRefs>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Output</dataOutputRefs>" + EOL);
+ }
+ xmlDump.append(
+ " </outputSet>" + EOL);
+ xmlDump.append(
+ " </ioSpecification>" + EOL);
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (entry.getValue() != null) {
+ xmlDump.append(
+ " <property id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "\" />" + EOL);
+ }
+ }
+ writeInputAssociation(workItemNode, xmlDump);
+ writeOutputAssociation(workItemNode, xmlDump);
+ }
+
+ protected void writeInputAssociation(WorkItemNode workItemNode, StringBuilder xmlDump) {
+ for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+ xmlDump.append(" <dataInputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlDumper.replaceIllegalChars(entry.getValue()) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input</targetRef>" + EOL);
+ xmlDump.append(" </dataInputAssociation>" + EOL);
+ }
+ for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+ if (entry.getValue() != null) {
+ xmlDump.append(" <dataInputAssociation>" + EOL);
+ xmlDump.append(
+ " <assignment>" + EOL +
+ " <from xs:type=\"tFormalExpression\">" + XmlDumper.replaceIllegalChars(entry.getValue().toString()) + "</from>" + EOL +
+ " <to xs:type=\"tFormalExpression\">" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input</to>" + EOL +
+ " </assignment>" + EOL +
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "</sourceRef>" + EOL +
+ " <targetRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + XmlDumper.replaceIllegalChars(entry.getKey()) + "Input</targetRef>" + EOL);
+ xmlDump.append(" </dataInputAssociation>" + EOL);
+ }
+ }
+ }
+
+ protected void writeOutputAssociation(WorkItemNode workItemNode, StringBuilder xmlDump) {
+ for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+ xmlDump.append(" <dataOutputAssociation>" + EOL);
+ xmlDump.append(
+ " <sourceRef>" + XmlBPMNProcessDumper.getUniqueNodeId(workItemNode) + "_" + entry.getKey() + "Output</sourceRef>" + EOL +
+ " <targetRef>" + XmlDumper.replaceIllegalChars(entry.getValue()) + "</targetRef>" + EOL);
+ xmlDump.append(" </dataOutputAssociation>" + EOL);
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/XmlBPMNProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/XmlBPMNProcessDumper.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/XmlBPMNProcessDumper.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,494 @@
+package org.drools.bpmn2.legacy.beta1;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.drools.bpmn2.xpath.XPathDialect;
+import org.drools.compiler.xml.XmlDumper;
+import org.drools.definition.process.Connection;
+import org.drools.definition.process.Node;
+import org.drools.definition.process.NodeContainer;
+import org.drools.definition.process.WorkflowProcess;
+import org.drools.process.core.ContextContainer;
+import org.drools.process.core.Work;
+import org.drools.process.core.context.swimlane.Swimlane;
+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;
+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.EventNode;
+import org.drools.workflow.core.node.EventTrigger;
+import org.drools.workflow.core.node.FaultNode;
+import org.drools.workflow.core.node.ForEachNode;
+import org.drools.workflow.core.node.HumanTaskNode;
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.RuleSetNode;
+import org.drools.workflow.core.node.Split;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.SubProcessNode;
+import org.drools.workflow.core.node.TimerNode;
+import org.drools.workflow.core.node.Trigger;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.Handler;
+import org.drools.xml.SemanticModule;
+
+public class XmlBPMNProcessDumper {
+
+ public static final String JAVA_LANGUAGE = "http://www.java.com/java";
+ public static final String RULE_LANGUAGE = "http://www.jboss.org/drools/rule";
+ public static final String XPATH_LANGUAGE = "http://www.w3.org/1999/XPath";
+
+ public static XmlBPMNProcessDumper INSTANCE = new XmlBPMNProcessDumper();
+
+ private final static String EOL = System.getProperty( "line.separator" );
+
+ private SemanticModule semanticModule;
+
+ private XmlBPMNProcessDumper() {
+ semanticModule = new BPMNSemanticModule();
+ }
+
+ public String dump(WorkflowProcess process) {
+ return dump(process, true);
+ }
+
+ public String dump(WorkflowProcess process, boolean includeMeta) {
+ StringBuilder xmlDump = new StringBuilder();
+ visitProcess(process, xmlDump, includeMeta);
+ return xmlDump.toString();
+ }
+
+ protected void visitProcess(WorkflowProcess process, StringBuilder xmlDump, boolean includeMeta) {
+ String targetNamespace = (String) process.getMetaData("TargetNamespace");
+ if (targetNamespace == null) {
+ targetNamespace = "http://www.jboss.org/drools";
+ }
+ xmlDump.append(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " + EOL +
+ "<definitions id=\"Definition\"" + EOL +
+ " targetNamespace=\"" + targetNamespace + "\"" + EOL +
+ " typeLanguage=\"http://www.java.com/javaTypes\"" + EOL +
+ " expressionLanguage=\"http://www.mvel.org/2.0\"" + EOL +
+ " xmlns=\"http://schema.omg.org/spec/BPMN/2.0\"" + EOL +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"" + EOL +
+ " xs:schemaLocation=\"http://schema.omg.org/spec/BPMN/2.0 BPMN20.xsd\"" + EOL +
+ " xmlns:di=\"http://bpmndi.org\"" + EOL +
+ " xmlns:tns=\"http://www.jboss.org/drools\">" + EOL + EOL);
+
+ // item definitions
+ VariableScope variableScope = (VariableScope)
+ ((org.drools.process.core.Process) process).getDefaultContext(VariableScope.VARIABLE_SCOPE);
+ visitVariableScope(variableScope, "_", xmlDump);
+ visitSubVariableScopes(process.getNodes(), xmlDump);
+
+ xmlDump.append(
+ " <resource id=\"Actor\" name=\"Human Actor\" />" + EOL + EOL);
+
+ visitInterfaces(process, xmlDump);
+
+ // the process itself
+ xmlDump.append(" <process processType=\"executable\" ");
+ if (process.getId() != null) {
+ xmlDump.append("id=\"" + XmlDumper.replaceIllegalChars(process.getId()) + "\" ");
+ }
+ if (process.getName() != null) {
+ xmlDump.append("name=\"" + XmlDumper.replaceIllegalChars(process.getName()) + "\" ");
+ }
+ String packageName = process.getPackageName();
+ if (packageName != null && !"org.drools.bpmn2".equals(packageName)) {
+ xmlDump.append("tns:packageName=\"" + XmlDumper.replaceIllegalChars(packageName) + "\" ");
+ }
+ // TODO: package, version
+ xmlDump.append(">" + EOL + EOL);
+ visitLanes(process, xmlDump);
+ visitHeader(process, xmlDump, includeMeta);
+ visitNodes(process, xmlDump, includeMeta);
+ visitConnections(process.getNodes(), xmlDump, includeMeta);
+ xmlDump.append(" </process>" + EOL + EOL);
+
+ if (includeMeta) {
+ xmlDump.append(
+ " <di:processDiagram processRef=\"" + XmlDumper.replaceIllegalChars(process.getId()) + "\" >" + EOL +
+ " <di:laneCompartment isVisible=\"false\" >" + EOL);
+ for (Node node: process.getNodes()) {
+ String nodeType = null;
+ Integer x = (Integer) node.getMetaData("x");
+ Integer y = (Integer) node.getMetaData("y");
+ Integer width = (Integer) node.getMetaData("width");
+ Integer height = (Integer) node.getMetaData("height");
+ if (node instanceof StartNode || node instanceof EndNode || node instanceof EventNode || node instanceof FaultNode) {
+ nodeType = "event";
+ int offsetX = (int) ((width - 30) / 2);
+ width = 30;
+ x = x + offsetX;
+ int offsetY = (int) ((height - 30) / 2);
+ y = y + offsetY;
+ height = 30;
+ } else if (node instanceof ActionNode || node instanceof RuleSetNode || node instanceof TimerNode) {
+ nodeType = "activity";
+ } else if (node instanceof Join || node instanceof Split) {
+ nodeType = "gateway";
+ int offsetX = (int) ((width - 40) / 2);
+ width = 40;
+ x = x + offsetX;
+ int offsetY = (int) ((height - 40) / 2);
+ y = y + offsetY;
+ height = 40;
+ } else if (node instanceof SubProcessNode) {
+ nodeType = "calledSubprocess";
+ } else if (node instanceof CompositeNode) {
+ nodeType = "subprocess";
+ } else if (node instanceof WorkItemNode) {
+ nodeType = "activity";
+ }
+ xmlDump.append(
+ " <di:" + nodeType + "Shape id=\"" + getUniqueNodeId(node) + "_gui\" " + nodeType + "Ref=\"" + getUniqueNodeId(node) + "\" " +
+ "x=\"" + x + "\" " +
+ "y=\"" + y + "\" " +
+ "width=\"" + width + "\" " +
+ "height=\"" + height + "\" " +
+ " />" + EOL);
+ }
+ xmlDump.append(
+ " </di:laneCompartment>" + EOL);
+ visitConnectionsDi(process.getNodes(), xmlDump);
+ xmlDump.append(
+ " </di:processDiagram>" + EOL + EOL);
+ }
+
+ xmlDump.append("</definitions>");
+ }
+
+ private void visitVariableScope(VariableScope variableScope, String prefix, StringBuilder xmlDump) {
+ if (variableScope != null && !variableScope.getVariables().isEmpty()) {
+ for (Variable variable: variableScope.getVariables()) {
+ xmlDump.append(
+ " <itemDefinition id=\"" + XmlDumper.replaceIllegalChars(prefix + variable.getName()) + "Item\" ");
+ if (variable.getType() != null) {
+ xmlDump.append("structureRef=\"" + XmlDumper.replaceIllegalChars(variable.getType().getStringType()) + "\" ");
+ }
+ xmlDump.append("/>" + EOL);
+ }
+ xmlDump.append(EOL);
+ }
+ }
+
+ private void visitSubVariableScopes(Node[] nodes, StringBuilder xmlDump) {
+ for (Node node: nodes) {
+ if (node instanceof ContextContainer) {
+ VariableScope variableScope = (VariableScope)
+ ((ContextContainer) node).getDefaultContext(VariableScope.VARIABLE_SCOPE);
+ if (variableScope != null) {
+ visitVariableScope(variableScope, XmlBPMNProcessDumper.getUniqueNodeId(node) + "-", xmlDump);
+ }
+ }
+ if (node instanceof NodeContainer) {
+ visitSubVariableScopes(((NodeContainer) node).getNodes(), xmlDump);
+ }
+ }
+ }
+
+ private void visitLanes(WorkflowProcess process, StringBuilder xmlDump) {
+ // lanes
+ Collection<Swimlane> swimlanes = ((SwimlaneContext)
+ ((org.drools.workflow.core.WorkflowProcess) process)
+ .getDefaultContext(SwimlaneContext.SWIMLANE_SCOPE)).getSwimlanes();
+ if (!swimlanes.isEmpty()) {
+ xmlDump.append(" <laneSet>" + EOL);
+ for (Swimlane swimlane: swimlanes) {
+ xmlDump.append(" <lane name=\"" + XmlDumper.replaceIllegalChars(swimlane.getName()) + "\" >" + EOL);
+ visitLane(process, swimlane.getName(), xmlDump);
+ xmlDump.append(" </lane>" + EOL);
+ }
+ xmlDump.append(" </laneSet>" + EOL);
+ }
+ }
+
+ private void visitLane(NodeContainer container, String lane, StringBuilder xmlDump) {
+ for (Node node: container.getNodes()) {
+ if (node instanceof HumanTaskNode) {
+ String swimlane = ((HumanTaskNode) node).getSwimlane();
+ if (lane.equals(swimlane)) {
+ xmlDump.append(" <flowElementRef>" + XmlBPMNProcessDumper.getUniqueNodeId(node) + "</flowElementRef>" + EOL);
+ }
+ } else {
+ String swimlane = (String) node.getMetaData("Lane");
+ if (lane.equals(swimlane)) {
+ xmlDump.append(" <flowElementRef>" + XmlBPMNProcessDumper.getUniqueNodeId(node) + "</flowElementRef>" + EOL);
+ }
+ }
+ if (node instanceof NodeContainer) {
+ visitLane((NodeContainer) node, lane, xmlDump);
+ }
+ }
+ }
+
+ protected void visitHeader(WorkflowProcess process, StringBuilder xmlDump, boolean includeMeta) {
+ // TODO: imports, function imports
+ // TODO: globals
+ // TODO: swimlanes
+ // TODO: exception handlers
+ VariableScope variableScope = (VariableScope)
+ ((org.drools.process.core.Process) process).getDefaultContext(VariableScope.VARIABLE_SCOPE);
+ if (variableScope != null) {
+ visitVariables(variableScope.getVariables(), xmlDump);
+ }
+ }
+
+ public static void visitVariables(List<Variable> variables, StringBuilder xmlDump) {
+ if (!variables.isEmpty()) {
+ xmlDump.append(" <!-- process variables -->" + EOL);
+ for (Variable variable: variables) {
+ if (variable.getMetaData("DataObject") == null) {
+ xmlDump.append(" <property id=\"" + XmlDumper.replaceIllegalChars(variable.getName()) + "\" ");
+ if (variable.getType() != null) {
+ xmlDump.append("itemSubjectRef=\"_" + XmlDumper.replaceIllegalChars(variable.getName()) + "Item\"" );
+ }
+ // TODO: value?
+ xmlDump.append("/>" + EOL);
+ }
+ }
+ for (Variable variable: variables) {
+ if (variable.getMetaData("DataObject") != null) {
+ xmlDump.append(" <dataObject id=\"" + XmlDumper.replaceIllegalChars(variable.getName()) + "\" ");
+ if (variable.getType() != null) {
+ xmlDump.append("itemSubjectRef=\"_" + XmlDumper.replaceIllegalChars(variable.getName()) + "Item\"" );
+ }
+ // TODO: value?
+ xmlDump.append("/>" + EOL);
+ }
+ }
+ xmlDump.append(EOL);
+ }
+ }
+
+ protected void visitInterfaces(WorkflowProcess process, StringBuilder xmlDump) {
+ for (Node node: process.getNodes()) {
+ if (node instanceof WorkItemNode) {
+ Work work = ((WorkItemNode) node).getWork();
+ if (work != null) {
+ if ("Service Task".equals(work.getName())) {
+ String interfaceName = (String) work.getParameter("Interface");
+ if (interfaceName == null) {
+ interfaceName = "";
+ }
+ String operationName = (String) work.getParameter("Operation");
+ if (operationName == null) {
+ operationName = "";
+ }
+ String parameterType = (String) work.getParameter("ParameterType");
+ if (parameterType == null) {
+ parameterType = "";
+ }
+ xmlDump.append(
+ " <itemDefinition id=\"" + getUniqueNodeId(node) + "_InMessageType\" structureRef=\"" + parameterType + "\"/>" + EOL +
+ " <message id=\"" + getUniqueNodeId(node) + "_InMessage\" structureRef=\"" + getUniqueNodeId(node) + "_InMessageType\" />" + EOL +
+ " <interface id=\"" + getUniqueNodeId(node) + "_ServiceInterface\" name=\"" + interfaceName + "\">" + EOL +
+ " <operation id=\"" + getUniqueNodeId(node) + "_ServiceOperation\" name=\"" + operationName + "\">" + EOL +
+ " <inMessageRef>" + getUniqueNodeId(node) + "_InMessage</inMessageRef>" + EOL +
+ " </operation>" + EOL +
+ " </interface>" + EOL + EOL);
+ } else if ("Send Task".equals(work.getName())) {
+ String messageType = (String) work.getParameter("MessageType");
+ if (messageType == null) {
+ messageType = "";
+ }
+ xmlDump.append(
+ " <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" structureRef=\"" + XmlDumper.replaceIllegalChars(messageType) + "\"/>" + EOL +
+ " <message id=\"" + getUniqueNodeId(node) + "_Message\" structureRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
+ } else if ("Receive Task".equals(work.getName())) {
+ String messageType = (String) work.getParameter("MessageType");
+ if (messageType == null) {
+ messageType = "";
+ }
+ xmlDump.append(
+ " <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" structureRef=\"" + XmlDumper.replaceIllegalChars(messageType) + "\"/>" + EOL +
+ " <message id=\"" + getUniqueNodeId(node) + "_Message\" structureRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
+ }
+ }
+ } else if (node instanceof EndNode) {
+ String messageType = (String) node.getMetaData("MessageType");
+ if (messageType != null) {
+ xmlDump.append(
+ " <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" structureRef=\"" + XmlDumper.replaceIllegalChars(messageType) + "\"/>" + EOL +
+ " <message id=\"" + getUniqueNodeId(node) + "_Message\" structureRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
+ }
+ } else if (node instanceof ActionNode) {
+ String messageType = (String) node.getMetaData("MessageType");
+ if (messageType != null) {
+ xmlDump.append(
+ " <itemDefinition id=\"" + getUniqueNodeId(node) + "_MessageType\" structureRef=\"" + XmlDumper.replaceIllegalChars(messageType) + "\"/>" + EOL +
+ " <message id=\"" + getUniqueNodeId(node) + "_Message\" structureRef=\"" + getUniqueNodeId(node) + "_MessageType\" />" + EOL + EOL);
+ }
+ } else if (node instanceof EventNode) {
+ String messageRef = ((EventTypeFilter) ((EventNode) node).getEventFilters().get(0)).getType();
+ messageRef = messageRef.substring(8);
+ String messageType = (String) node.getMetaData("MessageType");
+ xmlDump.append(
+ " <itemDefinition id=\"" + XmlDumper.replaceIllegalChars(messageRef) + "Type\" structureRef=\"" + XmlDumper.replaceIllegalChars(messageType) + "\"/>" + EOL +
+ " <message id=\"" + XmlDumper.replaceIllegalChars(messageRef) + "\" structureRef=\"" + XmlDumper.replaceIllegalChars(messageRef) + "Type\" />" + EOL + EOL);
+ } else if (node instanceof StartNode) {
+ StartNode startNode = (StartNode) node;
+ if (startNode.getTriggers() != null && !startNode.getTriggers().isEmpty()) {
+ Trigger trigger = startNode.getTriggers().get(0);
+ if (trigger instanceof EventTrigger) {
+ String eventType = ((EventTypeFilter) ((EventTrigger) trigger).getEventFilters().get(0)).getType();
+ if (eventType.startsWith("Message-")) {
+ eventType = eventType.substring(8);
+ String messageType = (String) node.getMetaData("MessageType");
+ xmlDump.append(
+ " <itemDefinition id=\"" + XmlDumper.replaceIllegalChars(eventType) + "Type\" structureRef=\"" + XmlDumper.replaceIllegalChars(messageType) + "\"/>" + EOL +
+ " <message id=\"" + XmlDumper.replaceIllegalChars(eventType) + "\" structureRef=\"" + XmlDumper.replaceIllegalChars(eventType) + "Type\" />" + EOL + EOL);
+ }
+ }
+ }
+ } else if (node instanceof ForEachNode) {
+ ForEachNode forEachNode = (ForEachNode) node;
+ xmlDump.append(
+ " <itemDefinition id=\"" + XmlBPMNProcessDumper.getUniqueNodeId(forEachNode) + "_multiInstanceItemType\" structureRef=\"" + XmlDumper.replaceIllegalChars(((ObjectDataType) forEachNode.getVariableType()).getClassName()) + "\"/>" + EOL + EOL);
+ }
+ }
+ }
+
+ private void visitNodes(WorkflowProcess process, StringBuilder xmlDump, boolean includeMeta) {
+ xmlDump.append(" <!-- nodes -->" + EOL);
+ for (Node node: process.getNodes()) {
+ visitNode(node, xmlDump, includeMeta);
+ }
+ xmlDump.append(EOL);
+ }
+
+ public void visitNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
+ Handler handler = semanticModule.getHandlerByClass(node.getClass());
+ if (handler != null) {
+ ((AbstractNodeHandler) handler).writeNode((org.drools.workflow.core.Node) node, xmlDump, includeMeta);
+ } else {
+ throw new IllegalArgumentException(
+ "Unknown node type: " + node);
+ }
+ }
+
+ private void visitConnections(Node[] nodes, StringBuilder xmlDump, boolean includeMeta) {
+ xmlDump.append(" <!-- connections -->" + EOL);
+ List<Connection> connections = new ArrayList<Connection>();
+ for (Node node: nodes) {
+ for (List<Connection> connectionList: node.getIncomingConnections().values()) {
+ connections.addAll(connectionList);
+ }
+ }
+ for (Connection connection: connections) {
+ visitConnection(connection, xmlDump, includeMeta);
+ }
+ xmlDump.append(EOL);
+ }
+
+ public void visitConnection(Connection connection, StringBuilder xmlDump, boolean includeMeta) {
+ xmlDump.append(" <sequenceFlow id=\"" +
+ getUniqueNodeId(connection.getFrom()) + "-" +
+ getUniqueNodeId(connection.getTo()) +
+ "\" sourceRef=\"" + getUniqueNodeId(connection.getFrom()) + "\" ");
+ // TODO fromType, toType
+ xmlDump.append("targetRef=\"" + getUniqueNodeId(connection.getTo()) + "\" ");
+// if (includeMeta) {
+// String bendpoints = (String) connection.getMetaData("bendpoints");
+// if (bendpoints != null) {
+// xmlDump.append("g:bendpoints=\"" + bendpoints + "\" ");
+// }
+// }
+ if (connection.getFrom() instanceof Split) {
+ Split split = (Split) connection.getFrom();
+ if (split.getType() == Split.TYPE_XOR || split.getType() == Split.TYPE_OR) {
+ Constraint constraint = split.getConstraint(connection);
+ if (constraint == null) {
+ xmlDump.append(">" + EOL +
+ " <conditionExpression xs:type=\"tFormalExpression\" />");
+ } else {
+ if (constraint.getName() != null && constraint.getName().trim().length() > 0) {
+ xmlDump.append("name=\"" + XmlDumper.replaceIllegalChars(constraint.getName()) + "\" ");
+ }
+ xmlDump.append(">" + EOL +
+ " <conditionExpression xs:type=\"tFormalExpression\" ");
+ if ("code".equals(constraint.getType())) {
+ if (JavaDialect.ID.equals(constraint.getDialect())) {
+ xmlDump.append("language=\"" + JAVA_LANGUAGE + "\" ");
+ } else if (XPathDialect.ID.equals(constraint.getDialect())) {
+ xmlDump.append("language=\"" + XPATH_LANGUAGE + "\" ");
+ }
+ } else {
+ xmlDump.append("language=\"" + RULE_LANGUAGE + "\" ");
+ }
+ String constraintString = constraint.getConstraint();
+ if (constraintString == null) {
+ constraintString = "";
+ }
+ xmlDump.append(">" + XmlDumper.replaceIllegalChars(constraintString) + "</conditionExpression>");
+ }
+ xmlDump.append(EOL
+ + " </sequenceFlow>" + EOL);
+ } else {
+ xmlDump.append("/>" + EOL);
+ }
+ } else {
+ xmlDump.append("/>" + EOL);
+ }
+ }
+
+ public static String getUniqueNodeId(Node node) {
+ String result = (String) node.getMetaData("UniqueId");
+ if (result != null) {
+ return result;
+ }
+ result = node.getId() + "";
+ NodeContainer nodeContainer = node.getNodeContainer();
+ while (nodeContainer instanceof CompositeNode) {
+ CompositeNode composite = (CompositeNode) nodeContainer;
+ result = composite.getId() + "-" + result;
+ nodeContainer = composite.getNodeContainer();
+ }
+ return "_" + result;
+ }
+
+ private void visitConnectionsDi(Node[] nodes, StringBuilder xmlDump) {
+ List<Connection> connections = new ArrayList<Connection>();
+ for (Node node: nodes) {
+ for (List<Connection> connectionList: node.getIncomingConnections().values()) {
+ connections.addAll(connectionList);
+ }
+ if (node instanceof CompositeNode) {
+ visitConnectionsDi(((CompositeNode) node).getNodes(), xmlDump);
+ }
+ }
+ for (Connection connection: connections) {
+ String bendpoints = (String) connection.getMetaData("bendpoints");
+ xmlDump.append(
+ " <di:sequenceFlowConnector sequenceFlowRef=\"" +
+ getUniqueNodeId(connection.getFrom()) + "-" + getUniqueNodeId(connection.getTo()) + "\" " +
+ "sourceRef=\"" + getUniqueNodeId(connection.getFrom()) + "_gui\" " +
+ "targetRef=\"" + getUniqueNodeId(connection.getTo()) + "_gui\" ");
+ if (bendpoints == null) {
+ xmlDump.append("/>" + EOL);
+ } else {
+ xmlDump.append(">" + EOL);
+ bendpoints = bendpoints.substring(1, bendpoints.length() - 1);
+ String[] points = bendpoints.split(";");
+ for (String point: points) {
+ String[] coords = point.split(",");
+ if (coords.length == 2) {
+ xmlDump.append(
+ " <di:bendpoint x=\"" + coords[0] + "\" y=\"" + coords[1] + "\" />" + EOL);
+ }
+ }
+ xmlDump.append(
+ " </di:sequenceFlowConnector>" + EOL);
+ }
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ActivityShapeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ActivityShapeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ActivityShapeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,9 @@
+package org.drools.bpmn2.legacy.beta1.di;
+
+public class ActivityShapeHandler extends ShapeHandler {
+
+ protected String getNodeRefName() {
+ return "activityRef";
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/EventShapeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/EventShapeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/EventShapeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,27 @@
+package org.drools.bpmn2.legacy.beta1.di;
+
+import org.drools.xml.ExtensibleXmlParser;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class EventShapeHandler extends ShapeHandler {
+
+ protected String getNodeRefName() {
+ return "eventRef";
+ }
+
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ NodeInfo nodeInfo = (NodeInfo) super.start(
+ uri, localName, attrs, parser);
+ int offsetX = (int) ((nodeInfo.getWidth() - 48) / 2);
+ nodeInfo.setX(nodeInfo.getX() + offsetX);
+ nodeInfo.setWidth(48);
+ int offsetY = (int) ((nodeInfo.getHeight() - 48) / 2);
+ nodeInfo.setY(nodeInfo.getY() + offsetY);
+ nodeInfo.setHeight(48);
+ return nodeInfo;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/GatewayShapeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/GatewayShapeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/GatewayShapeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,27 @@
+package org.drools.bpmn2.legacy.beta1.di;
+
+import org.drools.xml.ExtensibleXmlParser;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class GatewayShapeHandler extends ShapeHandler {
+
+ protected String getNodeRefName() {
+ return "gatewayRef";
+ }
+
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ NodeInfo nodeInfo = (NodeInfo) super.start(
+ uri, localName, attrs, parser);
+ int offsetX = (int) ((nodeInfo.getWidth() - 48) / 2);
+ nodeInfo.setX(nodeInfo.getX() + offsetX);
+ nodeInfo.setWidth(48);
+ int offsetY = (int) ((nodeInfo.getHeight() - 48) / 2);
+ nodeInfo.setY(nodeInfo.getY() + offsetY);
+ nodeInfo.setHeight(48);
+ return nodeInfo;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ProcessDiagramHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ProcessDiagramHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ProcessDiagramHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,164 @@
+package org.drools.bpmn2.legacy.beta1.di;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.bpmn2.core.Definitions;
+import org.drools.bpmn2.legacy.beta1.XmlBPMNProcessDumper;
+import org.drools.bpmn2.legacy.beta1.di.SequenceFlowConnectorHandler.ConnectionInfo;
+import org.drools.bpmn2.legacy.beta1.di.ShapeHandler.NodeInfo;
+import org.drools.compiler.xml.ProcessBuildData;
+import org.drools.definition.process.Connection;
+import org.drools.definition.process.Node;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.workflow.core.impl.ConnectionImpl;
+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 ProcessDiagramHandler extends BaseAbstractHandler implements Handler {
+
+ public ProcessDiagramHandler() {
+ initValidParents();
+ initValidPeers();
+ this.allowNesting = false;
+ }
+
+ protected void initValidParents() {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(Definitions.class);
+ }
+
+ protected void initValidPeers() {
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(org.drools.definition.process.Process.class);
+ }
+
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ final String processRef = attrs.getValue("processRef");
+ ProcessInfo info = new ProcessInfo(processRef);
+ return info;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ ProcessInfo processInfo = (ProcessInfo) parser.getCurrent();
+ RuleFlowProcess process = (RuleFlowProcess)
+ ((ProcessBuildData) parser.getData()).getProcess();
+ for (NodeInfo nodeInfo: processInfo.getNodeInfos().values()) {
+ boolean found = false;
+ for (Node node: process.getNodes()) {
+ String id = XmlBPMNProcessDumper.getUniqueNodeId(node);
+ if (nodeInfo.getNodeRef().equals(id)) {
+ found = true;
+ ((org.drools.workflow.core.Node) node).setMetaData("x", nodeInfo.getX());
+ ((org.drools.workflow.core.Node) node).setMetaData("y", nodeInfo.getY());
+ ((org.drools.workflow.core.Node) node).setMetaData("width", nodeInfo.getWidth());
+ ((org.drools.workflow.core.Node) node).setMetaData("height", nodeInfo.getHeight());
+ break;
+ }
+ }
+ if (!found) {
+ throw new IllegalArgumentException(
+ "Could not find node " + nodeInfo.getNodeRef());
+ }
+ }
+ for (ConnectionInfo connectionInfo: processInfo.getConnectionInfos()) {
+ if (connectionInfo.getBendpoints() != null) {
+ NodeInfo sourceNodeInfo = processInfo.getNodeInfo(connectionInfo.getSourceRef());
+ if (sourceNodeInfo == null) {
+ throw new IllegalArgumentException(
+ "Could not find sourceRef for connection info: " + connectionInfo.getSourceRef());
+ }
+ NodeInfo targetNodeInfo = processInfo.getNodeInfo(connectionInfo.getTargetRef());
+ if (targetNodeInfo == null) {
+ throw new IllegalArgumentException(
+ "Could not find sourceRef for connection info: " + connectionInfo.getTargetRef());
+ }
+ Node sourceNode = null;
+ for (Node node: process.getNodes()) {
+ String id = (String) XmlBPMNProcessDumper.getUniqueNodeId(node);
+ if (sourceNodeInfo.getNodeRef().equals(id)) {
+ sourceNode = node;
+ break;
+ }
+ }
+ if (sourceNode == null) {
+ throw new IllegalArgumentException(
+ "Could not find node for nodeRef: " + sourceNodeInfo.getNodeRef());
+ }
+ boolean found = false;
+ for (List<Connection> outgoingConnections: sourceNode.getOutgoingConnections().values()) {
+ for (Connection connection: outgoingConnections) {
+ if (targetNodeInfo.getNodeRef().equals(XmlBPMNProcessDumper.getUniqueNodeId(connection.getTo()))) {
+ ((ConnectionImpl) connection).setMetaData(
+ "bendpoints", connectionInfo.getBendpoints());
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ break;
+ }
+ }
+ if (!found) {
+ throw new IllegalArgumentException(
+ "Could not find connection from " + sourceNodeInfo.getNodeRef() +
+ " to " + targetNodeInfo.getNodeRef());
+ }
+ }
+ }
+ return processInfo;
+ }
+
+ public Class<?> generateNodeFor() {
+ return ProcessInfo.class;
+ }
+
+ public static class ProcessInfo {
+
+ private String processRef;
+ private Map<String, NodeInfo> nodeInfos = new HashMap<String, NodeInfo>();
+ private List<ConnectionInfo> connectionInfos = new ArrayList<ConnectionInfo>();
+
+ public ProcessInfo(String processRef) {
+ this.processRef = processRef;
+ }
+
+ public String getProcessRef() {
+ return processRef;
+ }
+
+ public void addNodeInfo(NodeInfo nodeInfo) {
+ this.nodeInfos.put(nodeInfo.getId(), nodeInfo);
+ }
+
+ public Map<String, NodeInfo> getNodeInfos() {
+ return nodeInfos;
+ }
+
+ public NodeInfo getNodeInfo(String nodeRef) {
+ return nodeInfos.get(nodeRef);
+ }
+
+ public void addConnectionInfo(ConnectionInfo connectionInfo) {
+ connectionInfos.add(connectionInfo);
+ }
+
+ public List<ConnectionInfo> getConnectionInfos() {
+ return connectionInfos;
+ }
+
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/SequenceFlowConnectorHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/SequenceFlowConnectorHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/SequenceFlowConnectorHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,128 @@
+package org.drools.bpmn2.legacy.beta1.di;
+
+import java.util.HashSet;
+
+import org.drools.bpmn2.legacy.beta1.di.ProcessDiagramHandler.ProcessInfo;
+import org.drools.bpmn2.legacy.beta1.di.ShapeHandler.NodeInfo;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class SequenceFlowConnectorHandler extends BaseAbstractHandler implements Handler {
+
+ public SequenceFlowConnectorHandler() {
+ initValidParents();
+ initValidPeers();
+ this.allowNesting = false;
+ }
+
+ protected void initValidParents() {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(ProcessInfo.class);
+ }
+
+ protected void initValidPeers() {
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(null);
+ this.validPeers.add(NodeInfo.class);
+ this.validPeers.add(ConnectionInfo.class);
+ }
+
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+
+ final String sequenceFlowRef = attrs.getValue("sequenceFlowRef");
+ ConnectionInfo info = new ConnectionInfo(sequenceFlowRef);
+ final String sourceRef = attrs.getValue("sourceRef");
+ final String targetRef = attrs.getValue("targetRef");
+ info.setSourceRef(sourceRef);
+ info.setTargetRef(targetRef);
+ ProcessInfo processInfo = (ProcessInfo) parser.getParent();
+ processInfo.addConnectionInfo(info);
+ return info;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ Element element = parser.endElementBuilder();
+ // now get bendpoints
+ String bendpoints = null;
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ while (xmlNode instanceof Element) {
+ String nodeName = xmlNode.getNodeName();
+ if ("bendpoint".equals(nodeName)) {
+ String x = ((Element) xmlNode).getAttribute("x");
+ String y = ((Element) xmlNode).getAttribute("y");
+ try {
+ int xValue = new Float(x).intValue();
+ int yValue = new Float(y).intValue();
+ if (bendpoints == null) {
+ bendpoints = "[";
+ } else {
+ bendpoints += ";";
+ }
+ bendpoints += xValue + "," + yValue;
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("Invalid bendpoint value", e);
+ }
+ }
+ xmlNode = xmlNode.getNextSibling();
+ }
+ ConnectionInfo connectionInfo = (ConnectionInfo) parser.getCurrent();
+ if (bendpoints != null) {
+ connectionInfo.setBendpoints(bendpoints + "]");
+ }
+ return connectionInfo;
+ }
+
+ public Class<?> generateNodeFor() {
+ return ConnectionInfo.class;
+ }
+
+ public static class ConnectionInfo {
+
+ private String sequenceFlowRef;
+ private String sourceRef;
+ private String targetRef;
+ private String bendpoints;
+
+ public ConnectionInfo(String sequenceFlowRef) {
+ this.sequenceFlowRef = sequenceFlowRef;
+ }
+
+ public String getSequenceFlowRef() {
+ return sequenceFlowRef;
+ }
+
+ public String getSourceRef() {
+ return sourceRef;
+ }
+
+ public void setSourceRef(String sourceRef) {
+ this.sourceRef = sourceRef;
+ }
+
+ public String getTargetRef() {
+ return targetRef;
+ }
+
+ public void setTargetRef(String targetRef) {
+ this.targetRef = targetRef;
+ }
+
+ public String getBendpoints() {
+ return bendpoints;
+ }
+
+ public void setBendpoints(String bendpoints) {
+ this.bendpoints = bendpoints;
+ }
+
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ShapeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ShapeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/legacy/beta1/di/ShapeHandler.java 2010-06-21 14:27:26 UTC (rev 33569)
@@ -0,0 +1,119 @@
+package org.drools.bpmn2.legacy.beta1.di;
+
+import java.util.HashSet;
+
+import org.drools.bpmn2.legacy.beta1.di.ProcessDiagramHandler.ProcessInfo;
+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 abstract class ShapeHandler extends BaseAbstractHandler implements Handler {
+
+ public ShapeHandler() {
+ initValidParents();
+ initValidPeers();
+ this.allowNesting = true;
+ }
+
+ protected void initValidParents() {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(ProcessInfo.class);
+ }
+
+ protected void initValidPeers() {
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(null);
+ this.validPeers.add(NodeInfo.class);
+ }
+
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+ final String id = attrs.getValue("id");
+ final String eventRef = attrs.getValue(getNodeRefName());
+ final String height = attrs.getValue("height");
+ final String width = attrs.getValue("width");
+ final String x = attrs.getValue("x");
+ final String y = attrs.getValue("y");
+ NodeInfo nodeInfo = new NodeInfo(id, eventRef);
+ nodeInfo.setX(new Float(x).intValue());
+ nodeInfo.setY(new Float(y).intValue());
+ nodeInfo.setWidth(new Float(width).intValue());
+ nodeInfo.setHeight(new Float(height).intValue());
+ ProcessInfo processInfo = (ProcessInfo) parser.getParent();
+ processInfo.addNodeInfo(nodeInfo);
+ return nodeInfo;
+ }
+
+ protected abstract String getNodeRefName();
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ parser.endElementBuilder();
+ return parser.getCurrent();
+ }
+
+ public Class<?> generateNodeFor() {
+ return NodeInfo.class;
+ }
+
+ public static class NodeInfo {
+
+ private String id;
+ private String nodeRef;
+ private Integer x;
+ private Integer y;
+ private Integer width;
+ private Integer height;
+
+ public NodeInfo(String id, String nodeRef) {
+ this.id = id;
+ this.nodeRef = nodeRef;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getNodeRef() {
+ return nodeRef;
+ }
+
+ public Integer getX() {
+ return x;
+ }
+
+ public void setX(Integer x) {
+ this.x = x;
+ }
+
+ public Integer getY() {
+ return y;
+ }
+
+ public void setY(Integer y) {
+ this.y = y;
+ }
+
+ public Integer getWidth() {
+ return width;
+ }
+
+ public void setWidth(Integer width) {
+ this.width = width;
+ }
+
+ public Integer getHeight() {
+ return height;
+ }
+
+ public void setHeight(Integer height) {
+ this.height = height;
+ }
+
+ }
+
+}
\ No newline at end of file
More information about the jboss-svn-commits
mailing list