[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