[jboss-svn-commits] JBL Code SVN: r28871 - in labs/jbossrules/trunk: drools-eclipse/org.drools.eclipse/META-INF and 12 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Aug 7 09:21:24 EDT 2009


Author: KrisVerlaenen
Date: 2009-08-07 09:21:23 -0400 (Fri, 07 Aug 2009)
New Revision: 28871

Added:
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFilePage.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFileWizard.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/editor/
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/editor/BPMNModelEditor.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/resources/org/drools/eclipse/flow/bpmn2/
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/resources/org/drools/eclipse/flow/bpmn2/Sample.bpmn.template
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/JoinHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SplitHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-BuyerProcess.png
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-BuyerProcess.xml
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess2.xml
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess3.xml
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-ExclusiveSplit.xml
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MinimalProcessWithGraphical.xml
Modified:
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/.classpath
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/META-INF/MANIFEST.MF
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/build.properties
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/plugin.xml
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/pom.xml
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/AuditView.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/WorkingMemoryViewContentProvider.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/core/SequenceFlow.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AbstractNodeHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EndEventHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ExclusiveGatewayHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ParallelGatewayHandler.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/main/java/org/drools/bpmn2/xml/PropertyHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ScriptTaskHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SequenceFlowHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/StartEventHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/TaskHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/UserTaskHandler.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java
   labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess.xml
Log:
- bpmn2 commit

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/.classpath	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/.classpath	2009-08-07 13:21:23 UTC (rev 28871)
@@ -17,5 +17,6 @@
 	<classpathentry exported="true" kind="lib" path="lib/antlr-runtime.jar"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="lib/drools-bpmn2.jar"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/META-INF/MANIFEST.MF	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/META-INF/MANIFEST.MF	2009-08-07 13:21:23 UTC (rev 28871)
@@ -43,6 +43,7 @@
  lib/antlr-runtime.jar,
  lib/drools-templates.jar,
  lib/mvel2.jar,
- lib/joda-time.jar
+ lib/joda-time.jar,
+ lib/drools-bpmn2.jar
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.drools.eclipse.util

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/build.properties
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/build.properties	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/build.properties	2009-08-07 13:21:23 UTC (rev 28871)
@@ -3,11 +3,7 @@
                icons/,\
                plugin.xml,\
                help/,\
-               lib/,\
-               lib/drools-templates.jar,\
-               lib/drools-api.jar,\
-               lib/mvel2.jar,\
-               lib/joda-time.jar
+               lib/
 bin.excludes = lib/drools-documentation.jar
 src.includes = META-INF/,\
                icons/,\

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/plugin.xml
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/plugin.xml	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/plugin.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -462,6 +462,18 @@
    </extension>
 
    <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            name="BPMN2 Editor"
+            extensions="bpmn, bpmn2"
+            icon="icons/process.gif"
+            contributorClass="org.drools.eclipse.flow.common.editor.GenericActionBarContributor"
+            class="org.drools.eclipse.flow.bpmn2.editor.BPMNModelEditor"
+            id="org.drools.eclipse.flow.bpmn2.editor.BPMNModelEditor">
+      </editor>
+   </extension>
+   
+   <extension
          point = "org.eclipse.ui.editorActions">
       <editorContribution
             id="org.drools.eclipse.flow.ruleflow.editor.action.CheckRuleFlowAction"
@@ -511,6 +523,42 @@
             class="org.drools.eclipse.flow.common.editor.action.ExportImageAction"
          />
       </editorContribution>
+      <editorContribution
+            id="org.drools.eclipse.flow.common.editor.action.VerticalAutoLayoutAction"
+            targetID="org.drools.eclipse.flow.bpmn2.editor.BPMNModelEditor">
+	     <action
+	        id="org.drools.eclipse.flow.common.editor.action.VerticalAutoLayoutAction"
+            label="Auto Layout (Vertical)"
+	        toolbarPath="Drools"
+            icon="icons/processV.gif"
+            tooltip="Auto layout the workflow (vertical)"
+            class="org.drools.eclipse.flow.common.editor.action.VerticalAutoLayoutAction"
+         />
+      </editorContribution>
+      <editorContribution
+            id="org.drools.eclipse.flow.common.editor.action.HorizontalAutoLayoutAction"
+            targetID="org.drools.eclipse.flow.bpmn2.editor.BPMNModelEditor">
+	     <action
+	        id="org.drools.eclipse.flow.common.editor.action.HorizontalAutoLayoutAction"
+            label="Auto Layout (Horizontal)"
+	        toolbarPath="Drools"
+            icon="icons/process.gif"
+            tooltip="Auto layout the workflow (horizontal)"
+            class="org.drools.eclipse.flow.common.editor.action.HorizontalAutoLayoutAction"
+         />
+      </editorContribution>
+      <editorContribution
+            id="org.drools.eclipse.flow.common.editor.action.ExportImageAction"
+            targetID="org.drools.eclipse.flow.bpmn2.editor.BPMNModelEditor">
+	     <action
+	        id="org.drools.eclipse.flow.common.editor.action.ExportImageAction"
+            label="Export Image"
+	        toolbarPath="Drools"
+            icon="icons/export.gif"
+            tooltip="Export image (PNG)"
+            class="org.drools.eclipse.flow.common.editor.action.ExportImageAction"
+         />
+      </editorContribution>
    </extension>
 
    <extension
@@ -530,6 +578,19 @@
 	  </wizard>
    </extension>
 
+   <extension
+         point = "org.eclipse.ui.newWizards">
+ 	  <wizard
+	      id = "org.drools.eclipse.flow.bpmn2.NewBPMNProcessFileWizard"
+      	  name = "BPMN2 Process"
+	      class="org.drools.eclipse.flow.bpmn2.NewBPMNProcessFileWizard"
+          category="org.drools.eclipse.new"
+	      icon="icons/process.gif">
+    	<description>A wizard that creates a new ruleflow file</description>
+	    <selection class="org.eclipse.core.resources.IResource"/>
+	  </wizard>
+   </extension>
+
    <extension-point id="processExtension" name="Process Extension" schema="schema/processExtension.exsd"/>
    <extension-point id="runtimeRecognizer" name="Drools Runtime Recognizer" schema="schema/runtimeRecognizer.exsd"/>
 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/pom.xml	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/pom.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -134,6 +134,22 @@
       </exclusions>
     </dependency>
     
+    <dependency>
+      <groupId>org.drools</groupId>
+      <artifactId>drools-bpmn2</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.eclipse.jdt</groupId>
+          <artifactId>core</artifactId>
+        </exclusion>
+
+        <exclusion>
+          <groupId>janino</groupId>
+          <artifactId>janino</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
     <!--dependency>
       <groupId>org.drools</groupId>
       <artifactId>drools-docs-expert</artifactId>

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -26,6 +26,7 @@
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
+import org.drools.bpmn2.xml.BPMNSemanticModule;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsError;
 import org.drools.compiler.DroolsParserException;
@@ -47,6 +48,7 @@
 import org.drools.rule.Package;
 import org.drools.rule.builder.dialect.java.JavaDialectConfiguration;
 import org.drools.util.StringUtils;
+import org.drools.xml.SemanticModules;
 import org.drools.xml.XmlProcessReader;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -513,7 +515,10 @@
                 }
                 configuration.setClassLoader( newLoader );
                 
-                XmlProcessReader xmlReader = new XmlProcessReader( configuration.getSemanticModules() );
+                SemanticModules modules = configuration.getSemanticModules();
+                modules.addSemanticModule( new BPMNSemanticModule() );
+                
+                XmlProcessReader xmlReader = new XmlProcessReader( modules );
                 Process process = (Process) xmlReader.read( new StringReader( input ) );
                 if ( process != null ) {
                     return parseProcess( process,

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -27,9 +27,15 @@
 import org.drools.eclipse.DroolsEclipsePlugin;
 import org.drools.eclipse.ProcessInfo;
 import org.drools.eclipse.preferences.IDroolsConstants;
+import org.drools.eclipse.util.DroolsRuntime;
+import org.drools.eclipse.util.DroolsRuntimeManager;
+import org.drools.eclipse.wizard.project.NewDroolsProjectWizard;
 import org.drools.guvnor.client.modeldriven.brl.RuleModel;
+import org.drools.guvnor.client.modeldriven.dt.GuidedDecisionTable;
 import org.drools.guvnor.server.util.BRDRLPersistence;
 import org.drools.guvnor.server.util.BRXMLPersistence;
+import org.drools.guvnor.server.util.GuidedDTDRLPersistence;
+import org.drools.guvnor.server.util.GuidedDTXMLPersistence;
 import org.drools.lang.ExpanderException;
 import org.drools.template.parser.DecisionTableParseException;
 import org.eclipse.core.resources.IFile;
@@ -90,6 +96,25 @@
     
     protected void fullBuild(IProgressMonitor monitor)
             throws CoreException {
+    	removeProblemsFor(getProject());
+    	IJavaProject project = JavaCore.create(getProject());
+    	IClasspathEntry[] classpathEntries = project.getRawClasspath();
+    	for (int i = 0; i < classpathEntries.length; i++) {
+    		if (NewDroolsProjectWizard.DROOLS_CLASSPATH_CONTAINER_PATH.equals(classpathEntries[i].getPath().toString())) {
+    			String[] jars = DroolsRuntimeManager.getDroolsRuntimeJars(getProject());
+    			if (jars == null || jars.length == 0) {
+    				String runtime = DroolsRuntimeManager.getDroolsRuntime(getProject());
+    				IMarker marker = getProject().createMarker(IDroolsModelMarker.DROOLS_MODEL_PROBLEM_MARKER);
+    				if (runtime == null) {
+    					marker.setAttribute(IMarker.MESSAGE, "Could not find default Drools runtime");
+    				} else {
+    					marker.setAttribute(IMarker.MESSAGE, "Could not find Drools runtime " + runtime);
+    				}
+    	            marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
+    	            return;
+    			}
+			}
+    	}
         getProject().accept(new DroolsBuildVisitor());
     }
     
@@ -118,11 +143,11 @@
     
     protected boolean parseResource(IResource res, boolean clean) {
         try {
-            IJavaProject project = JavaCore.create(res.getProject());
             // exclude .guvnorinfo files
             if (".guvnorinfo".equals(res.getName())) {
             	return false;
             }
+            IJavaProject project = JavaCore.create(res.getProject());
             // exclude files that are located in the output directory,
             // unless the ouput directory is the same as the project location
             if (!project.getOutputLocation().equals(project.getPath())
@@ -207,6 +232,20 @@
             	createMarker(res, t.getMessage(), -1);
             }
             return false;
+        } else if (res instanceof IFile && "bpmn".equals(res.getFileExtension())) {
+            removeProblemsFor(res);
+            try {
+            	if (clean) {
+            		DroolsEclipsePlugin.getDefault().invalidateResource(res);
+            	}
+            	DroolsBuildMarker[] markers = parseRuleFlowFile((IFile) res);
+		        for (int i = 0; i < markers.length; i++) {
+		        	createMarker(res, markers[i].getText(), markers[i].getLine());
+		        }
+            } catch (Throwable t) {
+            	createMarker(res, t.getMessage(), -1);
+            }
+            return false;
         }
 
         return true;
@@ -326,6 +365,37 @@
         return (DroolsBuildMarker[]) markers.toArray(new DroolsBuildMarker[markers.size()]);
     }
     
+    private DroolsBuildMarker[] parseGDSTFile(IFile file) {
+    	List markers = new ArrayList();
+		try {
+			String gdst = convertToString(file.getContents());
+			GuidedDecisionTable dt = GuidedDTXMLPersistence.getInstance().unmarshal(gdst);
+			String drl = GuidedDTDRLPersistence.getInstance().marshal(dt);
+			
+			// TODO pass this through DSL converter in case brl is based on dsl
+			
+	        DRLInfo drlInfo =
+            	DroolsEclipsePlugin.getDefault().parseGDSTResource(drl, file);
+            // parser errors
+            markParseErrors(markers, drlInfo.getParserErrors());  
+            markOtherErrors(markers, drlInfo.getBuilderErrors());
+        } catch (DroolsParserException e) {
+            // we have an error thrown from DrlParser
+            Throwable cause = e.getCause();
+            if (cause instanceof RecognitionException ) {
+                RecognitionException recogErr = (RecognitionException) cause;
+                markers.add(new DroolsBuildMarker(recogErr.getMessage(), recogErr.line)); //flick back the line number
+            }
+        } catch (Exception t) {
+        	String message = t.getMessage();
+            if (message == null || message.trim().equals( "" )) {
+                message = "Error: " + t.getClass().getName();
+            }
+            markers.add(new DroolsBuildMarker(message));
+        }
+        return (DroolsBuildMarker[]) markers.toArray(new DroolsBuildMarker[markers.size()]);
+    }
+    
     protected DroolsBuildMarker[] parseRuleFlowFile(IFile file) {
         if (!file.exists()) {
             return new DroolsBuildMarker[0];

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/AuditView.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/AuditView.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/AuditView.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -203,7 +203,7 @@
 					break;
 				case LogEvent.BEFORE_RULEFLOW_CREATED:
 					RuleFlowLogEvent inRuleFlowEvent = (RuleFlowLogEvent) inEvent;
-					event.setString("RuleFlow started: " + inRuleFlowEvent.getProcessName() + "[" + inRuleFlowEvent.getProcessId() + "]");
+					event.setString("Process started: " + inRuleFlowEvent.getProcessName() + "[" + inRuleFlowEvent.getProcessId() + "]");
 					if (!beforeEvents.isEmpty()) {
                         ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
@@ -216,7 +216,7 @@
                     break;
 				case LogEvent.BEFORE_RULEFLOW_COMPLETED:
 					inRuleFlowEvent = (RuleFlowLogEvent) inEvent;
-					event.setString("RuleFlow completed: " + inRuleFlowEvent.getProcessName() + "[" + inRuleFlowEvent.getProcessId() + "]");
+					event.setString("Process completed: " + inRuleFlowEvent.getProcessName() + "[" + inRuleFlowEvent.getProcessId() + "]");
 					if (!beforeEvents.isEmpty()) {
                         ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
@@ -229,7 +229,7 @@
                     break;
                 case LogEvent.BEFORE_RULEFLOW_NODE_TRIGGERED:
                     RuleFlowNodeLogEvent inRuleFlowNodeEvent = (RuleFlowNodeLogEvent) inEvent;
-                    event.setString("RuleFlow node triggered: " + inRuleFlowNodeEvent.getNodeName() + " in process " + inRuleFlowNodeEvent.getProcessName() + "[" + inRuleFlowNodeEvent.getProcessId() + "]");
+                    event.setString("Process node triggered: " + inRuleFlowNodeEvent.getNodeName() + " in process " + inRuleFlowNodeEvent.getProcessName() + "[" + inRuleFlowNodeEvent.getProcessId() + "]");
                     if (!beforeEvents.isEmpty()) {
                         ((Event) beforeEvents.peek()).addSubEvent(event);
                     } else {
@@ -242,7 +242,7 @@
                     break;
 				case LogEvent.BEFORE_RULEFLOW_GROUP_ACTIVATED:
 					RuleFlowGroupLogEvent inRuleFlowGroupEvent = (RuleFlowGroupLogEvent) inEvent;
-					event.setString("RuleFlowGroup activated: " + inRuleFlowGroupEvent.getGroupName() + "[size=" + inRuleFlowGroupEvent.getSize() + "]");
+					event.setString("RuleFlow Group activated: " + inRuleFlowGroupEvent.getGroupName() + "[size=" + inRuleFlowGroupEvent.getSize() + "]");
 					if (!beforeEvents.isEmpty()) {
                         ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
@@ -255,7 +255,7 @@
                     break;
 				case LogEvent.BEFORE_RULEFLOW_GROUP_DEACTIVATED:
 					inRuleFlowGroupEvent = (RuleFlowGroupLogEvent) inEvent;
-					event.setString("RuleFlowGroup deactivated: " + inRuleFlowGroupEvent.getGroupName() + "[size=" + inRuleFlowGroupEvent.getSize() + "]");
+					event.setString("RuleFlow Group deactivated: " + inRuleFlowGroupEvent.getGroupName() + "[size=" + inRuleFlowGroupEvent.getSize() + "]");
 					if (!beforeEvents.isEmpty()) {
                         ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/WorkingMemoryViewContentProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/WorkingMemoryViewContentProvider.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/WorkingMemoryViewContentProvider.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -73,9 +73,23 @@
                 result.add(new MyJavaVariable("[" + i + "]", vals[i]));
             }
             
+//            objects = DebugUtil.getValueByExpression("return iterateNonDefaultEntryPointObjectsToList().toArray();", stackObj);
+//
+//            if (objects instanceof IJavaArray) {
+//                IJavaArray array = (IJavaArray) objects;
+//	            vals = array.getValues();
+//	            for ( int i = 0; i < vals.length; i++ ) {
+//	            	vals = array.getValues();
+//	            	name = name.replace(' ', '_');
+//	            	result.add(new MyVariableWrapper(name, 
+//	            		new ObjectWrapper((IJavaObject) agendaGroup,
+//	        				(IJavaVariable[]) activationsResult.toArray(new IJavaVariable[activationsResult.size()]))));
+//	            }
+//            }
             
             return (IVariable[]) result.toArray(new IVariable[0]);
         }
+        
         return null;
     }
     

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFilePage.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFilePage.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFilePage.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,73 @@
+package org.drools.eclipse.flow.bpmn2;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.InputStream;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * Page for creating a new RuleFlow file.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class NewBPMNProcessFilePage extends WizardNewFileCreationPage {
+
+    private IWorkbench workbench;
+
+    public NewBPMNProcessFilePage(IWorkbench workbench, IStructuredSelection selection) {
+        super("createBPMNProcessPage", selection);
+        setTitle("Create BPMN Process");
+        setDescription("Create a new BPMN process");
+        this.workbench = workbench;
+    }
+
+    public void createControl(Composite parent) {
+        super.createControl(parent);
+        setPageComplete(true);
+    }
+
+    public boolean finish() {
+        String fileName = getFileName();
+        if (!fileName.endsWith(".bpmn")) {
+            setFileName(fileName + ".bpmn");
+        }
+        org.eclipse.core.resources.IFile newFile = createNewFile();
+        if (newFile == null)
+            return false;
+        try {
+            IWorkbenchWindow dwindow = workbench.getActiveWorkbenchWindow();
+            org.eclipse.ui.IWorkbenchPage page = dwindow.getActivePage();
+            if (page != null)
+                IDE.openEditor(page, newFile, true);
+        } catch (PartInitException e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+    
+    protected InputStream getInitialContents() {
+        String s = "org/drools/eclipse/flow/bpmn2/Sample.bpmn.template";
+        return getClass().getClassLoader().getResourceAsStream(s);
+    }
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFileWizard.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFileWizard.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/NewBPMNProcessFileWizard.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,49 @@
+package org.drools.eclipse.flow.bpmn2;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Wizard for creating a new RuleFlow file.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class NewBPMNProcessFileWizard extends Wizard implements INewWizard {
+
+    private IWorkbench workbench;
+    private IStructuredSelection selection;
+    private NewBPMNProcessFilePage mainPage;
+    
+    public void init(IWorkbench workbench, IStructuredSelection selection) {
+        this.workbench = workbench;
+        this.selection = selection;
+        setWindowTitle("New BPMN Process");
+    }
+    
+    public void addPages() {
+        mainPage = new NewBPMNProcessFilePage(workbench, selection);
+        addPage(mainPage);
+     }
+
+    public boolean performFinish() {
+        return mainPage.finish();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/editor/BPMNModelEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/editor/BPMNModelEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/bpmn2/editor/BPMNModelEditor.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,213 @@
+package org.drools.eclipse.flow.bpmn2.editor;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.StringReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.bpmn2.xml.BPMNSemanticModule;
+import org.drools.bpmn2.xml.XmlBPMNProcessDumper;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.WorkItemDefinitions;
+import org.drools.eclipse.flow.common.editor.GenericModelEditor;
+import org.drools.eclipse.flow.ruleflow.core.RuleFlowProcessWrapper;
+import org.drools.eclipse.flow.ruleflow.core.RuleFlowWrapperBuilder;
+import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.WorkItemWrapper;
+import org.drools.eclipse.flow.ruleflow.editor.RuleFlowPaletteFactory;
+import org.drools.eclipse.flow.ruleflow.editor.editpart.RuleFlowEditPartFactory;
+import org.drools.eclipse.util.ProjectClassLoader;
+import org.drools.process.core.WorkDefinition;
+import org.drools.process.core.WorkDefinitionExtension;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.xml.SemanticModules;
+import org.drools.xml.XmlProcessReader;
+import org.drools.xml.XmlRuleFlowProcessDumper;
+import org.drools.xml.processes.RuleFlowMigrator;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
+import org.eclipse.gef.palette.PaletteDrawer;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.requests.SimpleFactory;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+
+/**
+ * Graphical editor for a RuleFlow.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class BPMNModelEditor extends GenericModelEditor {
+
+    protected EditPartFactory createEditPartFactory() {
+    	RuleFlowEditPartFactory factory = new RuleFlowEditPartFactory();
+    	factory.setProject(getJavaProject());
+        return factory;
+    }
+
+    protected PaletteRoot createPalette() {
+        return RuleFlowPaletteFactory.createPalette();
+    }
+
+    protected Object createModel() {
+        RuleFlowProcessWrapper result = new RuleFlowProcessWrapper();
+        StartNodeWrapper start = new StartNodeWrapper();
+        start.setConstraint(new Rectangle(100, 100, -1, -1));
+        result.addElement(start);
+        start.setParent(result);
+        IFile file = ((IFileEditorInput)getEditorInput()).getFile();
+        String name = file.getName();
+        result.setName(name.substring(0, name.length() - 3));
+        return result;
+    }
+    
+    public RuleFlowProcessWrapper getRuleFlowModel() {
+        return (RuleFlowProcessWrapper) getModel();
+    }
+
+    protected void setInput(IEditorInput input) {
+        super.setInput(input);
+        if (input instanceof IFileEditorInput) {
+        	refreshPalette(((IFileEditorInput) input).getFile());
+        }
+    }
+    
+    private void refreshPalette(IFile file) {
+        IJavaProject javaProject = getJavaProject();
+        if (javaProject != null) {
+            try {
+                ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+                ClassLoader newLoader = ProjectClassLoader.getProjectClassLoader(javaProject);
+                try {
+                    Thread.currentThread().setContextClassLoader(newLoader);
+                    PaletteDrawer drawer = (PaletteDrawer) getPaletteRoot().getChildren().get(2);
+                    List entries = new ArrayList();
+                    try {
+	                    for (final WorkDefinition workDefinition: WorkItemDefinitions.getWorkDefinitions(file).values()) {
+	                        final String label;
+	                        String description = workDefinition.getName();
+	                        String icon = null;
+	                        if (workDefinition instanceof WorkDefinitionExtension) {
+	                            WorkDefinitionExtension extension = (WorkDefinitionExtension) workDefinition;
+	                            label = extension.getDisplayName();
+	                            description = extension.getExplanationText();
+	                            icon = extension.getIcon();
+	                        } else {
+	                            label = workDefinition.getName();
+	                        }
+	                        
+	                        URL iconUrl = null;
+	                        if (icon != null) {
+	                            iconUrl = newLoader.getResource(icon);
+	                        }
+	                        if (iconUrl == null) {
+	                            iconUrl = DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/action.gif");
+	                        }
+	                        CombinedTemplateCreationEntry combined = new CombinedTemplateCreationEntry(
+	                            label,
+	                            description,
+	                            WorkItemWrapper.class,
+	                            new SimpleFactory(WorkItemWrapper.class) {
+	                                public Object getNewObject() {
+	                                    WorkItemWrapper workItemWrapper = (WorkItemWrapper) super.getNewObject();
+	                                    workItemWrapper.setName(label);
+	                                    workItemWrapper.setWorkDefinition(workDefinition);
+	                                    return workItemWrapper;
+	                                }
+	                            },
+	                            ImageDescriptor.createFromURL(iconUrl), 
+	                            ImageDescriptor.createFromURL(iconUrl)
+	                        );
+	                        entries.add(combined);
+	                    }
+                    } catch (Throwable t) {
+                		MessageDialog.openError(
+                			getSite().getShell(), "Parsing work item definitions", t.getMessage());
+                    }
+                    drawer.setChildren(entries);
+                } finally {
+                    Thread.currentThread().setContextClassLoader(oldLoader);
+                }
+            } catch (Exception e) {
+                DroolsEclipsePlugin.log(e);
+            }
+        }
+    }
+
+    protected void writeModel(OutputStream os) throws IOException {
+    	writeModel(os, true);
+    }
+    
+    protected void writeModel(OutputStream os, boolean includeGraphics) throws IOException {
+        OutputStreamWriter writer = new OutputStreamWriter(os);
+        try {
+            XmlBPMNProcessDumper dumper = XmlBPMNProcessDumper.INSTANCE;
+            String out = dumper.dump(getRuleFlowModel().getRuleFlowProcess(), includeGraphics);
+            writer.write(out);
+        } catch (Throwable t) {
+            DroolsEclipsePlugin.log(t);
+        }
+        writer.close();
+    }
+    
+    
+    protected void createModel(InputStream is) {
+    	try 
+    	{
+    		InputStreamReader isr = new InputStreamReader(is);
+    		SemanticModules semanticModules = new SemanticModules();
+    		semanticModules.addSemanticModule(new BPMNSemanticModule());
+    		XmlProcessReader xmlReader = new XmlProcessReader(semanticModules);
+    		
+    		try 
+    		{
+    			RuleFlowProcess process = (RuleFlowProcess) xmlReader.read(isr);
+    			if (process == null) {
+    				setModel(createModel());
+    			} else {
+    				setModel(new RuleFlowWrapperBuilder().getProcessWrapper(process, getJavaProject()));
+    			}
+    		} catch (Throwable t) {
+    			DroolsEclipsePlugin.log(t);
+    			MessageDialog.openError( getSite().getShell(),
+                    "Could not read RuleFlow file",
+                    "An exception occurred while reading in the RuleFlow XML: "
+                    	+ t.getMessage() + " See the error log for more details.");
+    			setModel(createModel());
+    		}
+
+    		if (isr != null){
+    			isr.close();
+    		}
+    	} catch (Throwable t) {
+    		DroolsEclipsePlugin.log(t);
+    	}
+    }
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/resources/org/drools/eclipse/flow/bpmn2/Sample.bpmn.template
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/resources/org/drools/eclipse/flow/bpmn2/Sample.bpmn.template	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/resources/org/drools/eclipse/flow/bpmn2/Sample.bpmn.template	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<definitions id="Definition"
+             targetNamespace="http://www.jboss.org/drools"
+             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:g="http://www.jboss.org/drools/flow/gpd"
+             xmlns:tns="http://www.jboss.org/drools">
+
+  <resource id="Actor" name="Human Actor" />
+
+  <process id="Sample" name="Sample Process" >
+
+    <!-- process variables -->
+
+    <!-- nodes -->
+    <startEvent id="StartProcess" g:x="16" g:y="16" g:width="48" g:height="48" />
+
+    <!-- connections -->
+
+  </process>
+
+</definitions>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/core/SequenceFlow.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/core/SequenceFlow.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/core/SequenceFlow.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -4,6 +4,8 @@
 
 	private String sourceRef;
 	private String targetRef;
+	private String bendpoints;
+	private String expression;
 	
 	public SequenceFlow(String sourceRef, String targetRef) {
 		this.sourceRef = sourceRef;
@@ -17,5 +19,21 @@
 	public String getTargetRef() {
 		return targetRef;
 	}
+
+	public String getBendpoints() {
+		return bendpoints;
+	}
+
+	public void setBendpoints(String bendpoints) {
+		this.bendpoints = bendpoints;
+	}
+
+	public String getExpression() {
+		return expression;
+	}
+
+	public void setExpression(String expression) {
+		this.expression = expression;
+	}
 	
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AbstractNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AbstractNodeHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/AbstractNodeHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -12,6 +12,7 @@
 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 {
 
@@ -61,17 +62,67 @@
     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) {
+    		                 final StringBuilder xmlDump, boolean includeMeta) {
     	xmlDump.append("    <" + name + " "); 
         if (node.getName() != null) {
-            xmlDump.append("name=\"" + node.getName() + "\" ");
+            xmlDump.append("id=\"" + 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) {

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/BPMNSemanticModule.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,30 @@
+package org.drools.bpmn2.xml;
+
+import org.drools.workflow.core.node.Join;
+import org.drools.workflow.core.node.Split;
+import org.drools.xml.DefaultSemanticModule;
+
+public class BPMNSemanticModule extends DefaultSemanticModule {
+	
+	public BPMNSemanticModule() {
+		super("http://schema.omg.org/spec/BPMN/2.0");
+		
+		addHandler("process", new ProcessHandler());
+		
+		addHandler("property", new PropertyHandler());
+
+		addHandler("startEvent", new StartEventHandler());
+		addHandler("endEvent", new EndEventHandler());
+		addHandler("exclusiveGateway", new ExclusiveGatewayHandler());
+		addHandler("parallelGateway", new ParallelGatewayHandler());
+		addHandler("scriptTask", new ScriptTaskHandler());
+		addHandler("task", new TaskHandler());
+		addHandler("userTask", new UserTaskHandler());
+
+		addHandler("sequenceFlow", new SequenceFlowHandler());
+		
+		handlersByClass.put(Split.class, new SplitHandler());
+		handlersByClass.put(Join.class, new JoinHandler());
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EndEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EndEventHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/EndEventHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -17,7 +17,7 @@
 
 	public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
 		EndNode endNode = (EndNode) node;
-		writeNode("endEvent", endNode, xmlDump);
+		writeNode("endEvent", endNode, xmlDump, includeMeta);
 		endNode(xmlDump);
 	}
 

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ExclusiveGatewayHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ExclusiveGatewayHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ExclusiveGatewayHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -29,13 +29,7 @@
     }
 
 	public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
-		writeNode("exclusiveGateway", node, xmlDump);
-		if (node instanceof Split) {
-			xmlDump.append("gatewayDirection=\"diverging\" ");
-		} else if (node instanceof Join) {
-			xmlDump.append("gatewayDirection=\"converging\" ");
-		}
-		endNode(xmlDump);
+		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/xml/JoinHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/JoinHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/JoinHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,34 @@
+package org.drools.bpmn2.xml;
+
+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:
+				throw new IllegalArgumentException("Unsupported join type: " + join.getType());
+		}
+		xmlDump.append("gatewayDirection=\"converging\" ");
+		endNode(xmlDump);
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ParallelGatewayHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ParallelGatewayHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ParallelGatewayHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -29,7 +29,7 @@
     }
 
 	public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
-		writeNode("exclusiveGateway", node, xmlDump);
+		writeNode("exclusiveGateway", node, xmlDump, includeMeta);
 		if (node instanceof Split) {
 			xmlDump.append("gatewayDirection=\"diverging\" ");
 		} else if (node instanceof Join) {

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	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ProcessHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -6,8 +6,13 @@
 import org.drools.bpmn2.core.SequenceFlow;
 import org.drools.definition.process.Node;
 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.NodeImpl;
+import org.drools.workflow.core.node.Split;
 import org.drools.xml.BaseAbstractHandler;
 import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.Handler;
@@ -91,9 +96,20 @@
 					throw new IllegalArgumentException(
 						"Could not find target " + targetRef);
 				}
-				new ConnectionImpl(
+				Connection result = new ConnectionImpl(
 					source, NodeImpl.CONNECTION_DEFAULT_TYPE, 
 					target, NodeImpl.CONNECTION_DEFAULT_TYPE);
+				result.setMetaData("bendpoints", connection.getBendpoints());
+				if (connection.getExpression() != null) {
+					Split split = (Split) source;
+					Constraint constraint = new ConstraintImpl();
+					constraint.setType("code");
+					constraint.setName("");
+					constraint.setConstraint(connection.getExpression());
+					split.addConstraint(
+						new ConnectionRef(target.getId(), NodeImpl.CONNECTION_DEFAULT_TYPE),
+						constraint);
+				}
 			}
 		}
 	}

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/PropertyHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/PropertyHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/PropertyHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -4,11 +4,12 @@
 import java.util.List;
 
 import org.drools.bpmn2.core.SequenceFlow;
+import org.drools.definition.process.WorkflowProcess;
 import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.datatype.impl.type.ObjectDataType;
 import org.drools.ruleflow.core.RuleFlowProcess;
 import org.drools.workflow.core.Node;
-import org.drools.workflow.core.NodeContainer;
+import org.drools.workflow.core.node.WorkItemNode;
 import org.drools.xml.BaseAbstractHandler;
 import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.Handler;
@@ -25,7 +26,8 @@
     
     protected void initValidParents() {
         this.validParents = new HashSet<Class<?>>();
-        this.validParents.add(NodeContainer.class);
+        this.validParents.add(RuleFlowProcess.class);
+        this.validParents.add(WorkItemNode.class);
     }
     
     protected void initValidPeers() {
@@ -45,16 +47,19 @@
 		final String id = attrs.getValue("id");
 		final String itemSubjectRef = attrs.getValue("itemSubjectRef");
 
-		RuleFlowProcess process = (RuleFlowProcess) parser.getParent();
-		
-		List variables = process.getVariableScope().getVariables();
-		Variable variable = new Variable();
-		variable.setName(id);
-		// TODO add object type
-		variable.setType(new ObjectDataType());
-		variables.add(variable);
+		Object parent = parser.getParent();
+		if (parent instanceof RuleFlowProcess) {
+			RuleFlowProcess process = (RuleFlowProcess) parent;
+			List variables = process.getVariableScope().getVariables();
+			Variable variable = new Variable();
+			variable.setName(id);
+			// TODO add object type
+			variable.setType(new ObjectDataType());
+			variables.add(variable);
+			return variable;
+		}
 
-		return variable;
+		return new Variable();
 	}
 
 	public Object end(final String uri, final String localName,
@@ -64,7 +69,7 @@
 	}
 
 	public Class<?> generateNodeFor() {
-		return SequenceFlow.class;
+		return Variable.class;
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ScriptTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ScriptTaskHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/ScriptTaskHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -27,6 +27,10 @@
     	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 (language != null) {
 			action.setDialect(language);
@@ -39,7 +43,7 @@
 
 	public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
 		ActionNode actionNode = (ActionNode) node;
-		writeNode("scriptTask", actionNode, xmlDump);
+		writeNode("scriptTask", actionNode, xmlDump, includeMeta);
 		DroolsConsequenceAction action = (DroolsConsequenceAction) actionNode.getAction();
 		xmlDump.append("scriptLanguage=\"" + action.getDialect() + "\" >\n");
 		xmlDump.append("      <script>" + XmlDumper.replaceIllegalChars(action.getConsequence()) + "</script>\n");

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SequenceFlowHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SequenceFlowHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SequenceFlowHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -12,6 +12,7 @@
 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;
 
@@ -44,6 +45,7 @@
 
 		final String sourceRef = attrs.getValue("sourceRef");
 		final String targetRef = attrs.getValue("targetRef");
+		final String bendpoints = attrs.getValue("g:bendpoints");
 
 		RuleFlowProcess process = (RuleFlowProcess) parser.getParent();
 		
@@ -54,6 +56,8 @@
 			process.setMetaData(ProcessHandler.CONNECTIONS, connections);
 		}
 		SequenceFlow connection = new SequenceFlow(sourceRef, targetRef);
+		connection.setBendpoints(bendpoints);
+		
 		connections.add(connection);
 
 		return connection;
@@ -61,8 +65,19 @@
 
 	public Object end(final String uri, final String localName,
 			          final ExtensibleXmlParser parser) throws SAXException {
-		parser.endElementBuilder();
-		return parser.getCurrent();
+		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();
+        		sequenceFlow.setExpression(expression);
+        	}
+        	xmlNode = xmlNode.getNextSibling();
+        }
+        return parser.getCurrent();
 	}
 
 	public Class<?> generateNodeFor() {

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SplitHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SplitHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/SplitHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,34 @@
+package org.drools.bpmn2.xml;
+
+import org.drools.workflow.core.Node;
+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);
+				break;
+			default:
+				throw new IllegalArgumentException("Unsupported split type: " + split.getType());
+		}
+		xmlDump.append("gatewayDirection=\"diverging\" ");
+		endNode(xmlDump);
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/StartEventHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/StartEventHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/StartEventHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -17,7 +17,7 @@
 
 	public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
 		StartNode startNode = (StartNode) node;
-		writeNode("startEvent", startNode, xmlDump);
+		writeNode("startEvent", startNode, xmlDump, includeMeta);
 		endNode(xmlDump);
 	}
 

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/TaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/TaskHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/TaskHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -27,43 +27,149 @@
             final String localName, final ExtensibleXmlParser parser) throws SAXException {
     	super.handleNode(node, element, uri, localName, parser);
     	WorkItemNode workItemNode = (WorkItemNode) node;
-        String name = element.getAttribute("name");
+        String name = element.getAttribute("taskName");
         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)) {
-        		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);
-                	}
-                	subNode = subNode.getNextSibling();
-        		}
+        		readIoSpecification(xmlNode, dataInputs, dataOutputs);
         	} else if ("dataInputAssociation".equals(nodeName)) {
-        		// sourceRef
-        		org.w3c.dom.Node subNode = xmlNode.getFirstChild();
-        		String from = subNode.getTextContent();
-        		// targetRef
-        		subNode = subNode.getNextSibling();
-        		String to = subNode.getTextContent();
-        		workItemNode.addInMapping(dataInputs.get(to), from);
+        		readDataInputAssociation(xmlNode, workItemNode, dataInputs);
+        	} else if ("dataOutputAssociation".equals(nodeName)) {
+        		readDataOutputAssociation(xmlNode, workItemNode, 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);
+        	}
+        	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();
+    		String to = subNode.getTextContent();
+    		workItemNode.getWork().setParameter(to.substring(workItemNode.getName().length() + 1), from);
+		} else {
+    		String from = subNode.getTextContent();
+    		// targetRef
+    		subNode = subNode.getNextSibling();
+    		String to = subNode.getTextContent();
+    		workItemNode.addInMapping(
+				dataInputs.get(to).substring(workItemNode.getName().length() + 1),
+				from.substring(workItemNode.getName().length() + 1));
+		}
+    }
+    
+    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(
+			from.substring(workItemNode.getName().length() + 1),
+			dataOutputs.get(to).substring(workItemNode.getName().length() + 1));
+    }
 
 	public void writeNode(Node node, StringBuilder xmlDump, boolean includeMeta) {
 		WorkItemNode workItemNode = (WorkItemNode) node;
-		writeNode("task", workItemNode, xmlDump);
-		endNode(xmlDump);
+		writeNode("task", workItemNode, xmlDump, includeMeta);
+		xmlDump.append("tns:taskName=\"" + workItemNode.getWork().getName() + "\" >" + 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=\"" + workItemNode.getName() + "_" + entry.getKey() + "Input\" name=\"" + entry.getKey() + "\" />" + EOL);
+		}
+		for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+			if (entry.getValue() != null) {
+				xmlDump.append("        <dataInput id=\"" + workItemNode.getName() + "_" + entry.getKey() + "Input\" name=\"" + entry.getKey() + "\" />" + EOL);
+			}
+		}
+		for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+			xmlDump.append("        <dataOutput id=\"" + workItemNode.getName() + "_" + entry.getKey() + "Output\" name=\"" + entry.getKey() + "\" />" + EOL);
+		}
+		xmlDump.append("        <inputSet>" + EOL);
+		for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+			xmlDump.append("          <dataInputRefs>" + workItemNode.getName() + "_" + entry.getKey() + "Input</dataInputRefs>" + EOL);
+		}
+		for (Map.Entry<String, Object> entry: workItemNode.getWork().getParameters().entrySet()) {
+			if (entry.getValue() != null) {
+				xmlDump.append("          <dataInputRefs>" + workItemNode.getName() + "_" + 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>" + workItemNode.getName() + "_" + 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=\"" + workItemNode.getName() + "_" + entry.getKey() + "\" />" + EOL);
+			}
+		}
+		for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+			xmlDump.append("      <dataInputAssociation>" + EOL);
+			xmlDump.append(
+				"        <sourceRef>" + workItemNode.getName() + "_" + entry.getValue() + "</sourceRef>" + EOL +
+				"        <targetRef>" + workItemNode.getName() + "_" + entry.getKey() + "</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\">" + entry.getValue().toString() + "</from>" + EOL +
+					"          <to xs:type=\"tFormalExpression\">" + workItemNode.getName() + "_" + entry.getKey() + "Input</to>" + EOL +
+					"        </assignment>" + EOL +
+					"        <sourceRef>" + workItemNode.getName() + "_" + entry.getKey() + "</sourceRef>" + EOL +
+					"        <targetRef>" + workItemNode.getName() + "_" + 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>" + workItemNode.getName() + "_" + entry.getKey() + "</sourceRef>" + EOL +
+				"        <targetRef>" + workItemNode.getName() + "_" + entry.getValue() + "</targetRef>" + EOL);
+			xmlDump.append("      </dataOutputAssociation>" + EOL);
+		}
+	}
 
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/UserTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/UserTaskHandler.java	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/UserTaskHandler.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -1,10 +1,21 @@
 package org.drools.bpmn2.xml;
 
+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 AbstractNodeHandler {
+public class UserTaskHandler extends TaskHandler {
     
     protected Node createNode(Attributes attrs) {
         return new HumanTaskNode();
@@ -15,10 +26,128 @@
         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);
-		endNode(xmlDump);
+		writeNode("userTask", humanTaskNode, xmlDump, includeMeta);
+		xmlDump.append(">" + 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=\"" + workItemNode.getName() + "_" + 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=\"" + workItemNode.getName() + "_" + entry.getKey() + "Input\" name=\"" + entry.getKey() + "\" />" + EOL);
+			}
+		}
+		for (Map.Entry<String, String> entry: workItemNode.getOutMappings().entrySet()) {
+			xmlDump.append("        <dataOutput id=\"" + workItemNode.getName() + "_" + entry.getKey() + "Output\" name=\"" + entry.getKey() + "\" />" + EOL);
+		}
+		xmlDump.append("        <inputSet>" + EOL);
+		for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+			xmlDump.append("          <dataInputRefs>" + workItemNode.getName() + "_" + 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>" + workItemNode.getName() + "_" + 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>" + workItemNode.getName() + "_" + 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=\"" + workItemNode.getName() + "_" + entry.getKey() + "\" />" + EOL);
+			}
+		}
+		for (Map.Entry<String, String> entry: workItemNode.getInMappings().entrySet()) {
+			xmlDump.append("      <dataInputAssociation>" + EOL);
+			xmlDump.append(
+				"        <sourceRef>" + workItemNode.getName() + "_" + entry.getValue() + "</sourceRef>" + EOL +
+				"        <targetRef>" + workItemNode.getName() + "_" + 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\">" + workItemNode.getName() + "_" + entry.getKey() + "Input</to>" + EOL +
+					"        </assignment>" + EOL +
+					"        <sourceRef>" + workItemNode.getName() + "_" + entry.getKey() + "</sourceRef>" + EOL +
+					"        <targetRef>" + workItemNode.getName() + "_" + 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>" + workItemNode.getName() + "_" + entry.getKey() + "</sourceRef>" + EOL +
+				"        <targetRef>" + workItemNode.getName() + "_" + entry.getValue() + "</targetRef>" + EOL);
+			xmlDump.append("      </dataOutputAssociation>" + EOL);
+		}
+	}
+
 }

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/main/java/org/drools/bpmn2/xml/XmlBPMNProcessDumper.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,168 @@
+package org.drools.bpmn2.xml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.definition.process.Connection;
+import org.drools.definition.process.Node;
+import org.drools.definition.process.WorkflowProcess;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.workflow.core.node.Split;
+import org.drools.xml.Handler;
+import org.drools.xml.SemanticModule;
+import org.drools.xml.XmlDumper;
+
+public class XmlBPMNProcessDumper {
+    
+	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) {
+        xmlDump.append(
+    		"<?xml version=\"1.0\" encoding=\"UTF-8\"?> " + EOL +
+            "<definitions id=\"Definition\"" + EOL +
+            "             targetNamespace=\"http://www.jboss.org/drools\"" + 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:g=\"http://www.jboss.org/drools/flow/gpd\"" + 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);
+	    if (variableScope != null && !variableScope.getVariables().isEmpty()) {
+	    	for (Variable variable: variableScope.getVariables()) {
+	            xmlDump.append(
+            		"  <itemDefinition id=\"" + variable.getName() + "Item\" ");
+	            if (variable.getType() != null) {
+	            	xmlDump.append("structureRef=\"" + variable.getType().getStringType() + "\" ");
+	            }
+	            xmlDump.append("/>" + EOL);
+	        }
+	    	xmlDump.append(EOL);
+	    }
+        
+	    xmlDump.append(
+    		"  <resource id=\"Actor\" name=\"Human Actor\" />" + EOL + EOL);
+
+	    // the process itself
+		xmlDump.append("  <process ");
+        if (process.getId() != null) {
+            xmlDump.append("id=\"" + process.getId() + "\" ");
+        }
+        if (process.getName() != null) {
+            xmlDump.append("name=\"" + process.getName() + "\" ");
+        }
+        // TODO: package, version
+        xmlDump.append(">" + EOL + EOL);
+        visitHeader(process, xmlDump, includeMeta);
+        visitNodes(process, xmlDump, includeMeta);
+        visitConnections(process.getNodes(), xmlDump, includeMeta);
+        xmlDump.append("  </process>" + EOL + EOL);
+        xmlDump.append("</definitions>");
+    }
+    
+    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) {
+    	xmlDump.append("    <!-- process variables -->" + EOL);
+        for (Variable variable: variables) {
+            xmlDump.append("    <property id=\"" + variable.getName() + "\" ");
+            if (variable.getType() != null) {
+            	xmlDump.append("itemSubjectRef=\"tns:" + variable.getName() + "Item\"" );
+            }
+            // TODO: value
+            xmlDump.append("/>" + EOL);
+        }
+        xmlDump.append(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 sourceRef=\"" + connection.getFrom().getName() + "\" ");
+        // TODO fromType, toType
+        xmlDump.append("targetRef=\"" + connection.getTo().getName() + "\" ");
+        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) {
+        		String constraint = split.getConstraint(connection).getConstraint();
+        		xmlDump.append(">" + EOL +
+    				"      <conditionExpression>" + XmlDumper.replaceIllegalChars(constraint) + "</conditionExpression>" + EOL +
+    				"    </sequenceFlow>" + EOL);
+        	} else {
+            	xmlDump.append("/>" + EOL);
+            }
+        } else {
+        	xmlDump.append("/>" + EOL);
+        }
+    }
+    
+}

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	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/java/org/drools/bpmn2/SimpleBPMNProcessTest.java	2009-08-07 13:21:23 UTC (rev 28871)
@@ -25,6 +25,12 @@
 		ksession.startProcess("Minimal");
 	}
 
+	public void testMinimalProcessWithGraphical() throws Exception {
+		KnowledgeBase kbase = createKnowledgeBase("BPMN2-MinimalProcessWithGraphical.xml");
+		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+		ksession.startProcess("Minimal");
+	}
+
 	public void testEvaluationProcess() throws Exception {
 		KnowledgeBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess.xml");
 		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -35,6 +41,35 @@
 		ksession.startProcess("Evaluation", params);
 	}
 
+	public void testEvaluationProcess2() throws Exception {
+		KnowledgeBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess2.xml");
+		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+		ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler());
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("employee", "UserId-12345");
+		ksession.startProcess("com.sample.evaluation", params);
+	}
+
+	public void testEvaluationProcess3() throws Exception {
+		KnowledgeBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess3.xml");
+		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+		ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler());
+		ksession.getWorkItemManager().registerWorkItemHandler("RegisterRequest", new SystemOutWorkItemHandler());
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("employee", "john");
+		ksession.startProcess("Evaluation", params);
+	}
+
+	public void testExclusiveSplit() throws Exception {
+		KnowledgeBase kbase = createKnowledgeBase("BPMN2-ExclusiveSplit.xml");
+		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+		ksession.getWorkItemManager().registerWorkItemHandler("Email", new SystemOutWorkItemHandler());
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("x", "First");
+		params.put("y", "Second");
+		ksession.startProcess("com.sample.test", params);
+	}
+
 	private KnowledgeBase createKnowledgeBase(String process) throws Exception {
 		KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
 		((PackageBuilderConfiguration) conf).initSemanticModules();

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-BuyerProcess.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-BuyerProcess.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-BuyerProcess.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-BuyerProcess.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-BuyerProcess.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions id="Definition"
+             targetNamespace="http://www.example.org/UserTaskExample"
+             typeLanguage="http://www.w3.org/2001/XMLSchema"
+             expressionLanguage="http://www.w3.org/1999/XPath"
+             xmlns="http://www.omg.org/bpmn20"
+             xmlns:tns="http://www.example.org/UserTaskExample">
+
+  <resource id="regionalManager" name="Regional Manager">
+    <resourceParameter id="buyerName" isRequired="true" name="Buyer Name" type="xsd:string"/>
+    <resourceParameter id="region" isRequired="false" name="Region" type="xsd:string"/>
+  </resource>
+
+  <resource id="departmentalReviewer" name="Departmental Reviewer">
+    <resourceParameter id="buyerName" isRequired="true" name="Buyer Name" type="xsd:string"/>
+  </resource>
+
+  <!-- Process definition -->
+  <process id="Buyer" name="Buyer Process">
+    <startEvent id="StartProcess"/>
+    <sequenceFlow sourceRef="StartProcess" targetRef="QuotationHandling"/>
+    <task id="QuotationHandling" name="Quotation Handling"/>
+    <sequenceFlow sourceRef="QuotationHandling" targetRef="ApproveOrder"/>
+    <userTask id="ApproveOrder" name="ApproveOrder">
+      <potentialOwner resourceRef="tns:regionalManager">
+        <resourceParameterBinding parameterRef="tns:buyerName">
+          <formalExpression>getDataInput('order')/address/name</formalExpression>
+        </resourceParameterBinding>
+        <resourceParameterBinding parameterRef="tns:region">
+          <formalExpression>getDataInput('order')/address/country</formalExpression>
+        </resourceParameterBinding>
+      </potentialOwner>
+    </userTask>
+    <sequenceFlow sourceRef="ApproveOrder" targetRef="OrderApprovedDecision"/>
+    <exclusiveGateway id="OrderApprovedDecision" gatewayDirection="diverging"/>
+    <sequenceFlow sourceRef="OrderApprovedDecision" targetRef="OrderAndShipment">
+      <conditionExpression>Was the Order Approved?</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow sourceRef="OrderApprovedDecision" targetRef="TerminateProcess">
+      <conditionExpression>Was the Order NOT Approved?</conditionExpression>
+    </sequenceFlow>
+    <endEvent id="TerminateProcess">
+      <terminateEventDefinition id="TerminateEvent"/>
+    </endEvent>
+    <parallelGateway id="OrderAndShipment" gatewayDirection="diverging"/>
+    <sequenceFlow sourceRef="OrderAndShipment" targetRef="OrderHandling"/>
+    <sequenceFlow sourceRef="OrderAndShipment" targetRef="ShipmentHandling"/>
+    <task id="OrderHandling" name="Order Handling"/>
+    <task id="ShipmentHandling" name="Shipment Handling"/>
+    <sequenceFlow sourceRef="OrderHandling" targetRef="OrderAndShipmentMerge"/>
+    <sequenceFlow sourceRef="ShipmentHandling" targetRef="OrderAndShipmentMerge"/>
+    <parallelGateway id="OrderAndShipmentMerge" gatewayDirection="converging"/>
+    <userTask id="ReviewOrder" name="Review Order">
+      <potentialOwner resourceRef="tns:departmentalReviewer">
+        <resourceParameterBinding parameterRef="tns:buyerName">
+          <formalExpression>getDataInput('order')/address/name</formalExpression>
+        </resourceParameterBinding>
+      </potentialOwner>
+    </userTask>
+    <sequenceFlow sourceRef="ReviewOrder" targetRef="EndProcess"/>
+    <endEvent id="EndProcess"/>
+  </process>
+</definitions>

Modified: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess.xml	2009-08-07 13:19:42 UTC (rev 28870)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -28,7 +28,8 @@
     <parallelGateway id="Diverge" gatewayDirection="diverging"/>
     <task id="RegisterRequest" name="RegisterRequest">
       <ioSpecification>
-        <dataInput id="employeeInputSet" name="employeeId" itemSubjectRef="tns:employeeId" />
+        <dataInput id="employeeIdInput" name="employeeId" />
+        <dataInput id="descriptionInput" name="description" />
         <inputSet>
           <dataInputRefs>employeeInputSet</dataInputRefs>
         </inputSet>
@@ -36,8 +37,12 @@
       </ioSpecification>
       <dataInputAssociation>
         <sourceRef>employee</sourceRef>
-        <targetRef>employeeInputSet</targetRef>
+        <targetRef>employeeIdInput</targetRef>
       </dataInputAssociation>
+      <dataInputAssociation>
+        <sourceRef>description</sourceRef>
+        <targetRef>descriptionInput</targetRef>
+      </dataInputAssociation>
     </task>
     <userTask id="Two">
     </userTask>

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess2.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess2.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess2.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<definitions id="Definition"
+             targetNamespace="http://www.jboss.org/drools"
+             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:g="http://www.jboss.org/drools/flow/gpd"
+             xmlns:tns="http://www.jboss.org/drools">
+
+  <itemDefinition id="employeeItem" structureRef="java.lang.Object" />
+
+  <resource id="Actor" name="Human Actor" />
+
+  <process id="com.sample.evaluation" name="Evaluation Process" >
+
+    <!-- process variables -->
+    <property id="employee" itemSubjectRef="tns:employeeItem"/>
+
+    <!-- nodes -->
+    <endEvent id="EndProcess" g:x="683" g:y="56" g:width="48" g:height="48" />
+    <userTask id="Project_Manager_Evaluation" g:x="352" g:y="16" g:width="225" g:height="48" >
+      <ioSpecification>
+        <dataInput id="Project_Manager_Evaluation_CommentInput" name="Comment" />
+        <dataInput id="Project_Manager_Evaluation_TaskNameInput" name="TaskName" />
+        <dataInput id="Project_Manager_Evaluation_PriorityInput" name="Priority" />
+        <dataInput id="Project_Manager_Evaluation_ContentInput" name="Content" />
+        <dataInput id="Project_Manager_Evaluation_SkippableInput" name="Skippable" />
+        <inputSet>
+          <dataInputRefs>Project_Manager_Evaluation_CommentInput</dataInputRefs>
+          <dataInputRefs>Project_Manager_Evaluation_TaskNameInput</dataInputRefs>
+          <dataInputRefs>Project_Manager_Evaluation_PriorityInput</dataInputRefs>
+          <dataInputRefs>Project_Manager_Evaluation_ContentInput</dataInputRefs>
+          <dataInputRefs>Project_Manager_Evaluation_SkippableInput</dataInputRefs>
+        </inputSet>
+        <outputSet>
+        </outputSet>
+      </ioSpecification>
+      <property id="Project_Manager_Evaluation_Comment" />
+      <property id="Project_Manager_Evaluation_TaskName" />
+      <property id="Project_Manager_Evaluation_Priority" />
+      <property id="Project_Manager_Evaluation_Content" />
+      <property id="Project_Manager_Evaluation_Skippable" />
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">You need to perform an evaluation for #{employee}</from>
+          <to xs:type="tFormalExpression">Project_Manager_Evaluation_CommentInput</to>
+        </assignment>
+        <sourceRef>Project_Manager_Evaluation_Comment</sourceRef>
+        <targetRef>Project_Manager_Evaluation_CommentInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">Performance Evaluation</from>
+          <to xs:type="tFormalExpression">Project_Manager_Evaluation_TaskNameInput</to>
+        </assignment>
+        <sourceRef>Project_Manager_Evaluation_TaskName</sourceRef>
+        <targetRef>Project_Manager_Evaluation_TaskNameInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">1</from>
+          <to xs:type="tFormalExpression">Project_Manager_Evaluation_PriorityInput</to>
+        </assignment>
+        <sourceRef>Project_Manager_Evaluation_Priority</sourceRef>
+        <targetRef>Project_Manager_Evaluation_PriorityInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression"></from>
+          <to xs:type="tFormalExpression">Project_Manager_Evaluation_ContentInput</to>
+        </assignment>
+        <sourceRef>Project_Manager_Evaluation_Content</sourceRef>
+        <targetRef>Project_Manager_Evaluation_ContentInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">false</from>
+          <to xs:type="tFormalExpression">Project_Manager_Evaluation_SkippableInput</to>
+        </assignment>
+        <sourceRef>Project_Manager_Evaluation_Skippable</sourceRef>
+        <targetRef>Project_Manager_Evaluation_SkippableInput</targetRef>
+      </dataInputAssociation>
+      <potentialOwner resourceRef="tns:Actor" >
+        <resourceAssignmentExpression>
+          <formalExpression>john</formalExpression>
+        </resourceAssignmentExpression>
+      </potentialOwner>
+    </userTask>
+    <startEvent id="StartProcess" g:x="16" g:y="56" g:width="48" g:height="48" />
+    <userTask id="HR_Manager_Evaluation" g:x="352" g:y="96" g:width="225" g:height="48" >
+      <ioSpecification>
+        <dataInput id="HR_Manager_Evaluation_CommentInput" name="Comment" />
+        <dataInput id="HR_Manager_Evaluation_TaskNameInput" name="TaskName" />
+        <dataInput id="HR_Manager_Evaluation_PriorityInput" name="Priority" />
+        <dataInput id="HR_Manager_Evaluation_ContentInput" name="Content" />
+        <dataInput id="HR_Manager_Evaluation_SkippableInput" name="Skippable" />
+        <inputSet>
+          <dataInputRefs>HR_Manager_Evaluation_CommentInput</dataInputRefs>
+          <dataInputRefs>HR_Manager_Evaluation_TaskNameInput</dataInputRefs>
+          <dataInputRefs>HR_Manager_Evaluation_PriorityInput</dataInputRefs>
+          <dataInputRefs>HR_Manager_Evaluation_ContentInput</dataInputRefs>
+          <dataInputRefs>HR_Manager_Evaluation_SkippableInput</dataInputRefs>
+        </inputSet>
+        <outputSet>
+        </outputSet>
+      </ioSpecification>
+      <property id="HR_Manager_Evaluation_Comment" />
+      <property id="HR_Manager_Evaluation_TaskName" />
+      <property id="HR_Manager_Evaluation_Priority" />
+      <property id="HR_Manager_Evaluation_Content" />
+      <property id="HR_Manager_Evaluation_Skippable" />
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">You need to perform an evaluation for #{employee}</from>
+          <to xs:type="tFormalExpression">HR_Manager_Evaluation_CommentInput</to>
+        </assignment>
+        <sourceRef>HR_Manager_Evaluation_Comment</sourceRef>
+        <targetRef>HR_Manager_Evaluation_CommentInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">Performance Evaluation</from>
+          <to xs:type="tFormalExpression">HR_Manager_Evaluation_TaskNameInput</to>
+        </assignment>
+        <sourceRef>HR_Manager_Evaluation_TaskName</sourceRef>
+        <targetRef>HR_Manager_Evaluation_TaskNameInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">1</from>
+          <to xs:type="tFormalExpression">HR_Manager_Evaluation_PriorityInput</to>
+        </assignment>
+        <sourceRef>HR_Manager_Evaluation_Priority</sourceRef>
+        <targetRef>HR_Manager_Evaluation_PriorityInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression"></from>
+          <to xs:type="tFormalExpression">HR_Manager_Evaluation_ContentInput</to>
+        </assignment>
+        <sourceRef>HR_Manager_Evaluation_Content</sourceRef>
+        <targetRef>HR_Manager_Evaluation_ContentInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">false</from>
+          <to xs:type="tFormalExpression">HR_Manager_Evaluation_SkippableInput</to>
+        </assignment>
+        <sourceRef>HR_Manager_Evaluation_Skippable</sourceRef>
+        <targetRef>HR_Manager_Evaluation_SkippableInput</targetRef>
+      </dataInputAssociation>
+      <potentialOwner resourceRef="tns:Actor" >
+        <resourceAssignmentExpression>
+          <formalExpression>mary</formalExpression>
+        </resourceAssignmentExpression>
+      </potentialOwner>
+    </userTask>
+    <userTask id="Self_Evaluation" g:x="96" g:y="56" g:width="143" g:height="48" >
+      <ioSpecification>
+        <dataInput id="Self_Evaluation_SkippableInput" name="Skippable" />
+        <dataInput id="Self_Evaluation_PriorityInput" name="Priority" />
+        <dataInput id="Self_Evaluation_TaskNameInput" name="TaskName" />
+        <dataInput id="Self_Evaluation_CommentInput" name="Comment" />
+        <inputSet>
+          <dataInputRefs>Self_Evaluation_SkippableInput</dataInputRefs>
+          <dataInputRefs>Self_Evaluation_PriorityInput</dataInputRefs>
+          <dataInputRefs>Self_Evaluation_TaskNameInput</dataInputRefs>
+          <dataInputRefs>Self_Evaluation_CommentInput</dataInputRefs>
+        </inputSet>
+        <outputSet>
+        </outputSet>
+      </ioSpecification>
+      <property id="Self_Evaluation_Skippable" />
+      <property id="Self_Evaluation_Priority" />
+      <property id="Self_Evaluation_TaskName" />
+      <property id="Self_Evaluation_Comment" />
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">false</from>
+          <to xs:type="tFormalExpression">Self_Evaluation_SkippableInput</to>
+        </assignment>
+        <sourceRef>Self_Evaluation_Skippable</sourceRef>
+        <targetRef>Self_Evaluation_SkippableInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">1</from>
+          <to xs:type="tFormalExpression">Self_Evaluation_PriorityInput</to>
+        </assignment>
+        <sourceRef>Self_Evaluation_Priority</sourceRef>
+        <targetRef>Self_Evaluation_PriorityInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">Performance Evaluation</from>
+          <to xs:type="tFormalExpression">Self_Evaluation_TaskNameInput</to>
+        </assignment>
+        <sourceRef>Self_Evaluation_TaskName</sourceRef>
+        <targetRef>Self_Evaluation_TaskNameInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression"></from>
+          <to xs:type="tFormalExpression">Self_Evaluation_CommentInput</to>
+        </assignment>
+        <sourceRef>Self_Evaluation_Comment</sourceRef>
+        <targetRef>Self_Evaluation_CommentInput</targetRef>
+      </dataInputAssociation>
+      <potentialOwner resourceRef="tns:Actor" >
+        <resourceAssignmentExpression>
+          <formalExpression>#{employee}</formalExpression>
+        </resourceAssignmentExpression>
+      </potentialOwner>
+    </userTask>
+    <parallelGateway id="Converge" g:x="603" g:y="56" g:width="49" g:height="49" gatewayDirection="converging" />
+    <parallelGateway id="Diverge" g:x="271" g:y="56" g:width="49" g:height="49" gatewayDirection="diverging" />
+
+    <!-- connections -->
+    <sequenceFlow sourceRef="Converge" targetRef="EndProcess" />
+    <sequenceFlow sourceRef="Diverge" targetRef="Project_Manager_Evaluation" g:bendpoints="[295,39]" />
+    <sequenceFlow sourceRef="Diverge" targetRef="HR_Manager_Evaluation" g:bendpoints="[295,120]" />
+    <sequenceFlow sourceRef="StartProcess" targetRef="Self_Evaluation" />
+    <sequenceFlow sourceRef="Project_Manager_Evaluation" targetRef="Converge" g:bendpoints="[627,40]" />
+    <sequenceFlow sourceRef="HR_Manager_Evaluation" targetRef="Converge" g:bendpoints="[627,121]" />
+    <sequenceFlow sourceRef="Self_Evaluation" targetRef="Diverge" />
+
+  </process>
+
+</definitions>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess3.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess3.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-EvaluationProcess3.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions id="Definition"
+             targetNamespace="http://www.example.org/EvaluationExample"
+             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/EvaluationExample">
+
+  <!-- resources -->
+  <resource id="projectManager" name="Project Manager"/>
+  <resource id="humanResourceManager" name="HR Manager"/>
+  
+  <!-- item definitions -->
+  <itemDefinition id="employeeId" structureRef="java.lang.String" />
+  
+  <process id="Evaluation" name="Evaluation Process">
+    
+    <!-- process variables -->
+    <property id="employee" itemSubjectRef="tns:employeeId" />
+  
+    <!-- nodes -->  
+    <startEvent id="StartProcess"/>
+    <scriptTask id="Log" scriptLanguage="java">
+      <script>System.out.println("Processing evaluation for employee " + employee);</script>
+    </scriptTask>
+    <exclusiveGateway id="Diverge" gatewayDirection="diverging"/>
+    <sequenceFlow sourceRef="Diverge" targetRef="RegisterRequest">
+      <conditionExpression>return employee == "john";</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow sourceRef="Diverge" targetRef="Two">
+      <conditionExpression>return true;</conditionExpression>
+    </sequenceFlow>
+    <task id="RegisterRequest" name="RegisterRequest">
+      <ioSpecification>
+        <dataInput id="employeeIdInput" name="employeeId" itemSubjectRef="tns:employeeId" />
+        <dataInput id="actorIdInput" name="actorId" itemSubjectRef="tns:employeeId" />
+        <inputSet>
+          <dataInputRefs>employeeIdInput</dataInputRefs>
+          <dataInputRefs>actorIdInput</dataInputRefs>
+        </inputSet>
+        <outputSet/>
+      </ioSpecification>
+      <property id="actorId" itemSubjectRef="java.lang.String" />
+      <dataInputAssociation>
+        <sourceRef>employee</sourceRef>
+        <targetRef>employeeIdInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">John</from>
+          <to xs:type="tFormalExpression">actorId</to>
+        </assignment>
+        <sourceRef>actorId</sourceRef>
+        <targetRef>actorIdInput</targetRef>
+      </dataInputAssociation>
+    </task>
+    <userTask id="Two">
+    </userTask>
+    <exclusiveGateway id="Converge" gatewayDirection="converging"/>
+    <endEvent id="EndProcess"/>
+    
+    <!-- connections -->
+    <sequenceFlow sourceRef="StartProcess" targetRef="Log"/>
+    <sequenceFlow sourceRef="Log" targetRef="Diverge"/>
+    <sequenceFlow sourceRef="RegisterRequest" targetRef="Converge"/>
+    <sequenceFlow sourceRef="Two" targetRef="Converge"/>
+    <sequenceFlow sourceRef="Converge" targetRef="EndProcess"/>
+    
+  </process>
+</definitions>

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-ExclusiveSplit.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-ExclusiveSplit.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-ExclusiveSplit.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<definitions id="Definition"
+             targetNamespace="http://www.jboss.org/drools"
+             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:g="http://www.jboss.org/drools/flow/gpd"
+             xmlns:tns="http://www.jboss.org/drools">
+
+  <itemDefinition id="xItem" structureRef="java.lang.Object" />
+  <itemDefinition id="yItem" structureRef="java.lang.Object" />
+
+  <process id="com.sample.test" name="Test" >
+
+    <!-- process variables -->
+    <property id="x" itemSubjectRef="tns:xItem"/>
+    <property id="y" itemSubjectRef="tns:yItem"/>
+
+    <!-- nodes -->
+    <scriptTask id="Script2" g:x="177" g:y="96" g:width="80" g:height="48" scriptLanguage="mvel" >
+      <script>System.out.println("y=" + y);</script>
+    </scriptTask>
+    <endEvent id="End" g:x="370" g:y="56" g:width="48" g:height="48" />
+    <task id="Email" g:x="163" g:y="180" g:width="100" g:height="48" tns:taskName="Email">
+      <ioSpecification>
+        <dataInput id="FromInput" name="From" />
+        <dataInput id="ToInput" name="To" />
+        <dataInput id="SubjectInput" name="Subject" />
+        <dataInput id="BodyInput" name="Body" />
+        <inputSet>
+          <dataInputRefs>FromInput</dataInputRefs>
+          <dataInputRefs>ToInput</dataInputRefs>
+          <dataInputRefs>SubjectInput</dataInputRefs>
+          <dataInputRefs>BodyInput</dataInputRefs>
+        </inputSet>
+        <outputSet>
+        </outputSet>
+      </ioSpecification>
+      <property id="From" />
+      <property id="Subject" />
+      <property id="To" />
+      <property id="Body" />
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">me at mail.com</from>
+          <to xs:type="tFormalExpression">From</to>
+        </assignment>
+        <sourceRef>From</sourceRef>
+        <targetRef>FromInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">Urgent email !</from>
+          <to xs:type="tFormalExpression">Subject</to>
+        </assignment>
+        <sourceRef>Subject</sourceRef>
+        <targetRef>SubjectInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">you at mail.com</from>
+          <to xs:type="tFormalExpression">To</to>
+        </assignment>
+        <sourceRef>To</sourceRef>
+        <targetRef>ToInput</targetRef>
+      </dataInputAssociation>
+      <dataInputAssociation>
+        <assignment>
+          <from xs:type="tFormalExpression">This is an urgent email #{x}</from>
+          <to xs:type="tFormalExpression">Body</to>
+        </assignment>
+        <sourceRef>Body</sourceRef>
+        <targetRef>BodyInput</targetRef>
+      </dataInputAssociation>
+    </task>
+    <exclusiveGateway id="Split" g:x="96" g:y="56" g:width="49" g:height="49" gatewayDirection="diverging" />
+    <startEvent id="Start" g:x="16" g:y="56" g:width="48" g:height="48" />
+    <scriptTask id="Script1" g:x="177" g:y="16" g:width="80" g:height="48" scriptLanguage="mvel" >
+      <script>System.out.println("x=" + x);</script>
+    </scriptTask>
+    <exclusiveGateway id="Join" g:x="289" g:y="56" g:width="49" g:height="49" gatewayDirection="converging" />
+
+    <!-- connections -->
+    <sequenceFlow sourceRef="Split" targetRef="Script2" g:bendpoints="[120,120]" >
+      <conditionExpression>return x == "Second";</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow sourceRef="Start" targetRef="Split" />
+    <sequenceFlow sourceRef="Split" targetRef="Script1" g:bendpoints="[120,40]" >
+      <conditionExpression>return x == "First";</conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow sourceRef="Script2" targetRef="Join" g:bendpoints="[314,119]" />
+    <sequenceFlow sourceRef="Script1" targetRef="Join" g:bendpoints="[313,40]" />
+    <sequenceFlow sourceRef="Join" targetRef="Email" />
+    <sequenceFlow sourceRef="Email" targetRef="End" />
+
+  </process>
+
+</definitions>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MinimalProcessWithGraphical.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MinimalProcessWithGraphical.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpmn2/src/test/resources/BPMN2-MinimalProcessWithGraphical.xml	2009-08-07 13:21:23 UTC (rev 28871)
@@ -0,0 +1,23 @@
+<?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:di="http://www.omg.com/di/1.0.0"
+             xmlns:g="http://www.jboss.org/drools/flow/gpd"
+             xmlns:tns="http://www.example.org/MinimalExample">
+
+  <process id="Minimal" name="Minimal Process">
+    <startEvent id="StartProcess" g:x="1" g:y="1" />
+    <sequenceFlow sourceRef="StartProcess" targetRef="Hello"/>
+    <scriptTask id="Hello" scriptLanguage="java">
+      <script>System.out.println("Hello World");</script>
+    </scriptTask>
+    <sequenceFlow sourceRef="Hello" targetRef="EndProcess" g:bendpoints="[10,10]" />
+    <endEvent id="EndProcess"/>
+  </process>
+
+</definitions>



More information about the jboss-svn-commits mailing list