[jboss-svn-commits] JBL Code SVN: r31289 - in labs/jbossrules/trunk/drools-process/drools-bpmn2/src: test/java/org/drools/bpmn2 and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jan 28 12:59:00 EST 2010


Author: KrisVerlaenen
Date: 2010-01-28 12:58:59 -0500 (Thu, 28 Jan 2010)
New Revision: 31289

Added:
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-IntermediateThrowEventCompensate.xml
Modified:
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ActionNodeHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BoundaryEventHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EventNodeHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/IntermediateThrowEventHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ProcessHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java
Log:
 - adding BPMN2 compensation

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ActionNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ActionNodeHandler.java	2010-01-28 17:14:59 UTC (rev 31288)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ActionNodeHandler.java	2010-01-28 17:58:59 UTC (rev 31289)
@@ -68,6 +68,13 @@
 	                xmlDump.append("      <signalEventDefinition signalRef=\"" + 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=\"" + 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);

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BoundaryEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BoundaryEventHandler.java	2010-01-28 17:14:59 UTC (rev 31288)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BoundaryEventHandler.java	2010-01-28 17:58:59 UTC (rev 31289)
@@ -152,23 +152,12 @@
         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 ("compensateEventDefinition".equals(nodeName)) {
-                String activityRef = ((Element) xmlNode).getAttribute("activityRef");
-                if (activityRef != null && activityRef.trim().length() > 0) {
-                    List<EventFilter> eventFilters = new ArrayList<EventFilter>();
-                    EventTypeFilter eventFilter = new EventTypeFilter();
-                    eventFilter.setType("Compensate-" + eventNode.getUniqueId());
-                    eventFilters.add(eventFilter);
-                    eventNode.setEventFilters(eventFilters);
-                    eventNode.setMetaData("CompensationEvent", activityRef);
-                }
-            }
-            xmlNode = xmlNode.getNextSibling();
-        }
+        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) {

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EventNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EventNodeHandler.java	2010-01-28 17:14:59 UTC (rev 31288)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EventNodeHandler.java	2010-01-28 17:58:59 UTC (rev 31289)
@@ -77,7 +77,14 @@
                     "        <timeCycle xs:type=\"tFormalExpression\">" + 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);
+            } 
 		}
 	}
 

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/IntermediateThrowEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/IntermediateThrowEventHandler.java	2010-01-28 17:14:59 UTC (rev 31288)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/IntermediateThrowEventHandler.java	2010-01-28 17:58:59 UTC (rev 31289)
@@ -1,12 +1,17 @@
 package org.drools.bpmn2.xml;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.drools.bpmn2.core.Message;
+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.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.EventNode;
 import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.ProcessBuildData;
 import org.w3c.dom.Element;
@@ -146,7 +151,9 @@
             if ("compensateEventDefinition".equals(nodeName)) {
                 String activityRef = ((Element) xmlNode).getAttribute("activityRef");
                 if (activityRef != null && activityRef.trim().length() > 0) {
-                	actionNode.setMetaData("activityRef", activityRef);
+                	actionNode.setMetaData("Compensate", activityRef);
+                	actionNode.setAction(new DroolsConsequenceAction("java", 
+            			"kcontext.getProcessInstance().signalEvent(\"Compensate-" + activityRef + "\", null);"));
                 }
 //                boolean waitForCompletion = true;
 //                String waitForCompletionString = ((Element) xmlNode).getAttribute("waitForCompletion");

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ProcessHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ProcessHandler.java	2010-01-28 17:14:59 UTC (rev 31288)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ProcessHandler.java	2010-01-28 17:58:59 UTC (rev 31289)
@@ -16,6 +16,7 @@
 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.EventFilter;
 import org.drools.process.core.event.EventTypeFilter;
 import org.drools.process.core.timer.Timer;
 import org.drools.ruleflow.core.RuleFlowProcess;
@@ -96,7 +97,7 @@
         List<Lane> lanes = (List<Lane>)
             process.getMetaData(LaneHandler.LANES);
         assignLanes(process, lanes);
-        postProcessStateNodes(process);
+        postProcessNodes(process);
 		return process;
 	}
 
@@ -173,10 +174,10 @@
     public static void linkBoundaryEvents(NodeContainer nodeContainer) {
         for (Node node: nodeContainer.getNodes()) {
             if (node instanceof EventNode) {
-                String type = ((EventTypeFilter)
-                    ((EventNode) node).getEventFilters().get(0)).getType();
                 String attachedTo = (String) node.getMetaData("AttachedTo");
                 if (attachedTo != null) {
+                	String type = ((EventTypeFilter)
+                        ((EventNode) node).getEventFilters().get(0)).getType();
                     Node attachedNode = null;
                     try {
                         // remove starting _
@@ -236,6 +237,15 @@
                         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 eventType = "Compensate-";
+                        String uniqueId = (String) node.getMetaData("UniqueId");
+            	        if (uniqueId == null) {
+            	        	eventType += "_" + ((NodeImpl) attachedNode).getUniqueId();
+            	        } else {
+            	        	eventType += uniqueId;
+            	        }
+            	        ((EventTypeFilter) ((EventNode) node).getEventFilters().get(0)).setType(eventType);
                     }
                 }
             }
@@ -262,7 +272,7 @@
 	    assignLanes(process, laneMapping);
 	}
 	
-    private void postProcessStateNodes(NodeContainer container) {
+    private void postProcessNodes(NodeContainer container) {
         for (Node node: container.getNodes()) {
             if (node instanceof StateNode) {
                 StateNode stateNode = (StateNode) node;
@@ -274,7 +284,7 @@
                     stateNode.setConstraint(connection, constraint);
                 }
             } else if (node instanceof NodeContainer) {
-                postProcessStateNodes((NodeContainer) node);
+                postProcessNodes((NodeContainer) node);
             }
         }
     }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java	2010-01-28 17:14:59 UTC (rev 31288)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java	2010-01-28 17:58:59 UTC (rev 31289)
@@ -318,6 +318,13 @@
         assertTrue(processInstance.getState() == ProcessInstance.STATE_ABORTED);
     }
 
+    public void testCompensateIntermediateThrowEventProcess() throws Exception {
+        KnowledgeBase kbase = createKnowledgeBase("BPMN2-IntermediateThrowEventCompensate.xml");
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        ProcessInstance processInstance = ksession.startProcess("CompensateIntermediateThrowEvent");
+        assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
+    }
+
     public void testGraphicalInformation() throws Exception {
         KnowledgeBase kbase = createKnowledgeBase("BPMN2-OryxExportedExample.xml");
         final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-IntermediateThrowEventCompensate.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-IntermediateThrowEventCompensate.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-IntermediateThrowEventCompensate.xml	2010-01-28 17:58:59 UTC (rev 31289)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions id="Definition"
+             targetNamespace="http://www.example.org/MinimalExample"
+             typeLanguage="http://www.java.com/javaTypes"
+             expressionLanguage="http://www.mvel.org/2.0"
+             xmlns="http://schema.omg.org/spec/BPMN/2.0"
+             xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+             xs:schemaLocation="http://schema.omg.org/spec/BPMN/2.0 BPMN20.xsd"
+             xmlns:tns="http://www.example.org/MinimalExample">
+
+  <itemDefinition id="xType" structureRef="java.lang.String" />
+
+  <process id="CompensateIntermediateThrowEvent" name="Compensate Intermediate Throw Event Process">
+  
+    <property id="x" itemSubjectRef="tns:xType" />
+
+    <startEvent id="_1" name="StartProcess"/>
+    <sequenceFlow sourceRef="_1" targetRef="_2"/>
+    <scriptTask id="_2" name="Task">
+      <script>System.out.println("Executing task");</script>
+    </scriptTask>
+    <sequenceFlow sourceRef="_2" targetRef="_3"/>
+    <intermediateThrowEvent id="_3" name="CompensateEvent">
+      <compensateEventDefinition activityRef="_2"/>
+    </intermediateThrowEvent>
+    <sequenceFlow sourceRef="_3" targetRef="_4"/>
+    <endEvent id="_4" name="EndEvent"/>
+    <boundaryEvent id="_5" name="CompensateEvent" attachedToRef="_2">
+      <compensateEventDefinition />
+    </boundaryEvent>
+    <sequenceFlow sourceRef="_5" targetRef="_6"/>
+    <scriptTask id="_6" name="Compensate">
+      <script>System.out.println("Compensating task");</script>
+    </scriptTask>
+    <sequenceFlow sourceRef="_6" targetRef="_7"/>
+    <endEvent id="_7" name="EndEvent"/>
+    
+  </process>
+</definitions>



More information about the jboss-svn-commits mailing list