[jboss-svn-commits] JBL Code SVN: r21264 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/workflow/core/node and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jul 28 19:21:18 EDT 2008


Author: KrisVerlaenen
Date: 2008-07-28 19:21:18 -0400 (Mon, 28 Jul 2008)
New Revision: 21264

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java
   labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java
   labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf
   labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java
Log:
JBRULES-1696: Extends WS-BPEL support

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/process/builder/SplitNodeBuilder.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -50,14 +50,12 @@
                 ruleConstraint.setDialect( constraint.getDialect() );
                 ruleConstraint.setName( constraint.getName() );
                 ruleConstraint.setPriority( constraint.getPriority() );
-                ruleConstraint.setPriority( constraint.getPriority() );
                 splitNode.setConstraint( outgoingConnection, ruleConstraint );
             } else if ( "code".equals( constraint.getType() ) ) {
                 ReturnValueConstraintEvaluator returnValueConstraint = new ReturnValueConstraintEvaluator();
                 returnValueConstraint.setDialect( constraint.getDialect() );
                 returnValueConstraint.setName( constraint.getName() );
                 returnValueConstraint.setPriority( constraint.getPriority() );
-                returnValueConstraint.setPriority( constraint.getPriority() );
                 splitNode.setConstraint( outgoingConnection, returnValueConstraint );            
                 
                 ReturnValueDescr returnValueDescr = new ReturnValueDescr();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeContextNode.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -38,9 +38,11 @@
 
     public Context resolveContext(String contextId, Object param) {
         Context context = getDefaultContext(contextId);
-        context = context.resolveContext(param);
         if (context != null) {
-            return context;
+	        context = context.resolveContext(param);
+	        if (context != null) {
+	            return context;
+	        }
         }
         return super.resolveContext(contextId, param);
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/CompositeNode.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -16,7 +16,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class CompositeNode extends NodeImpl implements NodeContainer {
+public class CompositeNode extends NodeImpl implements NodeContainer, EventNodeInterface {
 
     private static final long serialVersionUID = 400L;
     
@@ -73,6 +73,17 @@
         node.setNodeContainer(null);
     }
     
+	public boolean acceptsEvent(String type, Object event) {
+		for (Node node: getNodes()) {
+			if (node instanceof EventNodeInterface) {
+				if (((EventNodeInterface) node).acceptsEvent(type, event)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+    
     public void linkIncomingConnections(String inType, long inNodeId, String inNodeType) {
         linkIncomingConnections(inType, new NodeAndType(inNodeId, inNodeType));
     }
@@ -389,5 +400,5 @@
         }
         
     }
-    
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNode.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -8,7 +8,7 @@
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.impl.NodeImpl;
 
-public class EventNode extends NodeImpl {
+public class EventNode extends NodeImpl implements EventNodeInterface {
 
 	private static final long serialVersionUID = 4L;
 	
@@ -39,7 +39,16 @@
 		this.filters = filters;
 	}
 		
-    public void validateAddIncomingConnection(final String type, final Connection connection) {
+	public boolean acceptsEvent(String type, Object event) {
+    	for (EventFilter filter: filters) {
+    		if (!filter.acceptsEvent(type, event)) {
+    			return false;
+    		}
+    	}
+    	return true;
+    }
+	
+	public void validateAddIncomingConnection(final String type, final Connection connection) {
         throw new UnsupportedOperationException(
             "An event node does not have an incoming connection!");
     }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/EventNodeInterface.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,7 @@
+package org.drools.workflow.core.node;
+
+public interface EventNodeInterface {
+	
+	boolean acceptsEvent(String type, Object event);
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -29,19 +29,18 @@
 import org.drools.common.EventSupport;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.process.core.event.EventFilter;
 import org.drools.process.instance.EventListener;
 import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.NodeContainer;
 import org.drools.workflow.core.WorkflowProcess;
-import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.EventNodeInterface;
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.NodeInstanceContainer;
 import org.drools.workflow.instance.WorkflowProcessInstance;
 import org.drools.workflow.instance.node.EventBasedNodeInstance;
-import org.drools.workflow.instance.node.EventNodeInstance;
+import org.drools.workflow.instance.node.EventNodeInstanceInterface;
 
 /**
  * Default implementation of a RuleFlow process instance.
@@ -194,26 +193,15 @@
     		}
     	} else {
     		for (Node node: getWorkflowProcess().getNodes()) {
-    			if (node instanceof EventNode) {
-    				if (acceptsEvent((EventNode) node, type, event)) {
-    					EventNodeInstance eventNodeInstance = (EventNodeInstance) getNodeInstance(node);
-    					eventNodeInstance.setEvent(type, event);
-    					eventNodeInstance.trigger(null, null);
+    			if (node instanceof EventNodeInterface) {
+    				if (((EventNodeInterface) node).acceptsEvent(type, event)) {
+    					EventNodeInstanceInterface eventNodeInstance = (EventNodeInstanceInterface) getNodeInstance(node);
+    					eventNodeInstance.triggerEvent(type, event);
     				}
     			}
     		}
     	}
     }
-
-    public boolean acceptsEvent(EventNode eventNode, String type, Object event) {
-    	List<EventFilter> eventFilters = eventNode.getEventFilters();
-    	for (EventFilter filter: eventFilters) {
-    		if (!filter.acceptsEvent(type, event)) {
-    			return false;
-    		}
-    	}
-    	return true;
-    }
     
     public void addEventListener(String type, EventListener listener) {
     	List<EventListener> listeners = eventListeners.get(type);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -27,6 +27,7 @@
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.NodeContainer;
 import org.drools.workflow.core.node.CompositeNode;
+import org.drools.workflow.core.node.EventNodeInterface;
 import org.drools.workflow.instance.NodeInstance;
 import org.drools.workflow.instance.NodeInstanceContainer;
 import org.drools.workflow.instance.impl.NodeInstanceFactory;
@@ -38,7 +39,7 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class CompositeNodeInstance extends NodeInstanceImpl implements NodeInstanceContainer {
+public class CompositeNodeInstance extends NodeInstanceImpl implements NodeInstanceContainer, EventNodeInstanceInterface {
 
     private static final long serialVersionUID = 400L;
     
@@ -148,6 +149,17 @@
         return nodeInstance;
     }
 
+	public void triggerEvent(String type, Object event) {
+		for (Node node: getCompositeNode().getNodes()) {
+			if (node instanceof EventNodeInterface) {
+				if (((EventNodeInterface) node).acceptsEvent(type, event)) {
+					EventNodeInstanceInterface eventNodeInstance = (EventNodeInstanceInterface) getNodeInstance(node);
+					eventNodeInstance.triggerEvent(type, event);
+				}
+			}
+		}
+	}
+
     public class CompositeNodeStartInstance extends NodeInstanceImpl {
 
         private static final long serialVersionUID = 400L;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -28,11 +28,11 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class EventNodeInstance extends NodeInstanceImpl {
+public class EventNodeInstance extends NodeInstanceImpl implements EventNodeInstanceInterface {
 
     private static final long serialVersionUID = 400L;
 
-    public void setEvent(String type, Object event) {
+    public void triggerEvent(String type, Object event) {
     	String variableName = getEventNode().getVariableName();
     	if (variableName != null) {
     		VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
@@ -43,6 +43,7 @@
     		}
     		variableScopeInstance.setVariable(variableName, event);
     	}
+    	trigger(null, null);
     }
     
     public void internalTrigger(final NodeInstance from, String type) {

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,6 @@
+package org.drools.workflow.instance.node;
+
+public interface EventNodeInstanceInterface {
+
+	void triggerEvent(String type, Object event);
+}

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/EventTest.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -24,6 +24,7 @@
 import org.drools.workflow.core.impl.ConnectionImpl;
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.CompositeNode;
 import org.drools.workflow.core.node.EndNode;
 import org.drools.workflow.core.node.EventNode;
 import org.drools.workflow.core.node.Join;
@@ -431,4 +432,97 @@
         assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
     }
     
+    public void testEvent5() {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId("org.drools.process.event");
+        process.setName("Event Process");
+        
+        List<Variable> variables = new ArrayList<Variable>();
+        Variable variable = new Variable();
+        variable.setName("event");
+        ObjectDataType personDataType = new ObjectDataType();
+        personDataType.setClassName("org.drools.Person");
+        variable.setType(personDataType);
+        variables.add(variable);
+        process.getVariableScope().setVariables(variables);
+
+        StartNode startNode = new StartNode();
+        startNode.setName("Start");
+        startNode.setId(1);
+        process.addNode(startNode);
+        
+        CompositeNode compositeNode = new CompositeNode();
+        compositeNode.setName("CompositeNode");
+        compositeNode.setId(2);
+        process.addNode(compositeNode);
+        new ConnectionImpl(
+            startNode, Node.CONNECTION_DEFAULT_TYPE,
+            compositeNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        MilestoneNode milestoneNode = new MilestoneNode();
+        milestoneNode.setName("Milestone");
+        milestoneNode.setConstraint("eval(false)");
+        compositeNode.addNode(milestoneNode);
+        compositeNode.linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, milestoneNode.getId(), Node.CONNECTION_DEFAULT_TYPE);
+        
+        EventNode eventNode = new EventNode();
+        EventTypeFilter eventFilter = new EventTypeFilter();
+        eventFilter.setType("myEvent");
+        eventNode.addEventFilter(eventFilter);
+        eventNode.setVariableName("event");
+        compositeNode.addNode(eventNode);
+        
+        final List<String> myList = new ArrayList<String>();
+        ActionNode actionNode = new ActionNode();
+        actionNode.setName("Print");
+        DroolsAction action = new DroolsConsequenceAction("java", null);
+        action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ActionContext context) throws Exception {
+            	System.out.println("Detected event for person " + ((Person) context.getVariable("event")).getName());
+                myList.add("Executed action");
+            }
+        });
+        actionNode.setAction(action);
+        compositeNode.addNode(actionNode);
+        new ConnectionImpl(
+            eventNode, Node.CONNECTION_DEFAULT_TYPE,
+            actionNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        Join join = new Join();
+        join.setName("XOR Join");
+        join.setType(Join.TYPE_XOR);
+        compositeNode.addNode(join);
+        new ConnectionImpl(
+            milestoneNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+        new ConnectionImpl(
+            actionNode, Node.CONNECTION_DEFAULT_TYPE,
+            join, Node.CONNECTION_DEFAULT_TYPE
+        );
+        compositeNode.linkOutgoingConnections(join.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
+    
+        EndNode endNode = new EndNode();
+        endNode.setName("EndNode");
+        endNode.setId(3);
+        process.addNode(endNode);
+        new ConnectionImpl(
+            compositeNode, Node.CONNECTION_DEFAULT_TYPE,
+            endNode, Node.CONNECTION_DEFAULT_TYPE
+        );
+        
+        AbstractRuleBase ruleBase = (AbstractRuleBase) RuleBaseFactory.newRuleBase();
+        ruleBase.addProcess(process);
+        InternalWorkingMemory workingMemory = new ReteooWorkingMemory(1, ruleBase);
+        ProcessInstance processInstance = workingMemory.startProcess("org.drools.process.event");
+        assertEquals(0, myList.size());
+        Person jack = new Person();
+        jack.setName("Jack");
+        processInstance.signalEvent("myEvent", jack);
+        assertEquals(1, myList.size());
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/.classpath	2008-07-28 23:21:18 UTC (rev 21264)
@@ -9,6 +9,9 @@
 	<classpathentry combineaccessrules="false" kind="src" path="/drools-core"/>
 	<classpathentry kind="lib" path="lib/ode-bpel-compiler.jar"/>
 	<classpathentry kind="lib" path="lib/commons-logging-1.1.jar"/>
+	<classpathentry kind="lib" path="lib/saxon-xpath-8.7.jar"/>
+	<classpathentry kind="lib" path="lib/saxon-8.7.jar"/>
+	<classpathentry kind="lib" path="lib/saxon-dom-8.7.jar"/>
 	<classpathentry kind="lib" path="lib/wsdl4j-1.6.1.jar"/>
 	<classpathentry kind="lib" path="lib/ode-utils.jar"/>
 	<classpathentry kind="lib" path="lib/xercesImpl-2.9.0.jar"/>

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/compiler/BPELCompiler.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -9,8 +9,10 @@
 import org.apache.ode.bpel.compiler.bom.AssignActivity;
 import org.apache.ode.bpel.compiler.bom.BpelObjectFactory;
 import org.apache.ode.bpel.compiler.bom.Catch;
+import org.apache.ode.bpel.compiler.bom.Copy;
 import org.apache.ode.bpel.compiler.bom.EmptyActivity;
 import org.apache.ode.bpel.compiler.bom.FlowActivity;
+import org.apache.ode.bpel.compiler.bom.From;
 import org.apache.ode.bpel.compiler.bom.InvokeActivity;
 import org.apache.ode.bpel.compiler.bom.Link;
 import org.apache.ode.bpel.compiler.bom.LinkSource;
@@ -25,6 +27,7 @@
 import org.apache.ode.bpel.compiler.bom.SequenceActivity;
 import org.apache.ode.bpel.compiler.bom.SwitchActivity;
 import org.apache.ode.bpel.compiler.bom.ThrowActivity;
+import org.apache.ode.bpel.compiler.bom.To;
 import org.apache.ode.bpel.compiler.bom.WaitActivity;
 import org.apache.ode.bpel.compiler.bom.WhileActivity;
 import org.apache.ode.utils.StreamUtils;
@@ -47,9 +50,11 @@
 import org.drools.bpel.core.BPELWhile;
 import org.drools.bpel.core.BPELActivity.SourceLink;
 import org.drools.bpel.core.BPELActivity.TargetLink;
+import org.drools.bpel.xpath.XPathDialectConfiguration;
 import org.drools.common.AbstractRuleBase;
 import org.drools.compiler.DroolsError;
 import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.compiler.ProcessBuilder;
 import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.context.variable.VariableScope;
@@ -63,7 +68,9 @@
 			BPELCompiler compiler = new BPELCompiler();
 			BPELProcess process = compiler.compileProcess(
 				BPELCompiler.class.getResource(fileName));
-			PackageBuilder packageBuilder = new PackageBuilder();
+			PackageBuilderConfiguration configuration = new PackageBuilderConfiguration();
+			configuration.addDialect("XPath2.0", new XPathDialectConfiguration());
+			PackageBuilder packageBuilder = new PackageBuilder(configuration);
 			ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
 			processBuilder.buildProcess(process);
 	        if (!processBuilder.getErrors().isEmpty()) {
@@ -177,8 +184,28 @@
 		} else if (activity instanceof AssignActivity) {
 			AssignActivity assignActivity = (AssignActivity) activity;
 			BPELAssign assign = new BPELAssign();
-			// TODO assign copy
-			assign.setAction("");
+			for (Copy copy: assignActivity.getCopies()) {
+				BPELAssign.Copy bpelCopy = assign.new Copy();
+				From from = copy.getFrom();
+				To to = copy.getTo();
+				if (from.isVariableVal()) {
+					BPELAssign.VariablePart bpelFrom = assign.new VariablePart(
+						from.getAsVariableVal().getVariable(), 
+						from.getAsVariableVal().getNamespaceContext().toString() + ":" + from.getAsVariableVal().getPart());
+					bpelCopy.setFrom(bpelFrom);
+				} else {
+					throw new UnsupportedOperationException("Assign from does not yet support non-variable values");
+				}
+				if (to.isVariableVal()) {
+					BPELAssign.VariablePart bpelTo = assign.new VariablePart(
+						to.getAsVariableVal().getVariable(), 
+						to.getAsVariableVal().getNamespaceContext().toString() + ":" + to.getAsVariableVal().getPart());
+					bpelCopy.setTo(bpelTo);
+				} else {
+					throw new UnsupportedOperationException("Assign to does not yet support non-variable values");
+				}
+				assign.addCopy(bpelCopy);
+			}
 			result = assign;
 		} else if (activity instanceof EmptyActivity) {
 			result = new BPELEmpty();
@@ -217,14 +244,23 @@
 			BPELScope scope = new BPELScope();
 			VariableScope variableScope = scope.getVariableScope();
 	        List<Variable> variables = new ArrayList<Variable>();
-			// TODO
-//			for (org.apache.ode.bpel.compiler.bom.Variable variable: scopeActivity.getVariables()) {
-//		        Variable bpelVariable =	new Variable();
-//		        bpelVariable.setName(variable.getName());
-//		        bpelVariable.setType(new StringDataType());
-//		        variables.add(bpelVariable);
-//			}
+			for (org.apache.ode.bpel.compiler.bom.Variable variable: scopeActivity.getScope().getVariables()) {
+		        Variable bpelVariable =	new Variable();
+		        bpelVariable.setName(variable.getName());
+		        bpelVariable.setType(new StringDataType());
+		        variables.add(bpelVariable);
+			}
 			variableScope.setVariables(variables);
+			List<BPELFaultHandler> faultHandlers = new ArrayList<BPELFaultHandler>();
+	        for (Catch catcher: scopeActivity.getScope().getFaultHandler().getCatches()) {
+	            BPELFaultHandler faultHandler = new BPELFaultHandler();
+	            faultHandler.setFaultName(catcher.getFaultName().toString());
+	            faultHandler.setFaultVariable(catcher.getFaultVariable());
+	            faultHandler.setActivity(compileActivity(catcher.getActivity()));
+	            faultHandlers.add(faultHandler);
+	        }
+	        scope.setFaultHandlers(faultHandlers);
+			scope.setActivity(compileActivity(scopeActivity.getChildActivity()));
 			result = scope;
 		} else if (activity instanceof SwitchActivity) {
 			SwitchActivity switchActivity = (SwitchActivity) activity;
@@ -251,6 +287,9 @@
 				compileActivity(whileActivity.getActivity()));
 			result = bpelWhile;
 		} else {
+			// TODO: compensate
+			// TODO: exit
+			// BPEL2.0: If, RepeatUntil, CompensateScope, Rethrow, Validate
 			throw new IllegalArgumentException("Unknown activity type " + activity.getClass());
 		}
 		result.setName(activity.getName());
@@ -263,13 +302,17 @@
 			}
 			i++;
 		}
-		result.setSourceLinks(sourceLinks);
+		if (sourceLinks.length > 0) {
+			result.setSourceLinks(sourceLinks);
+		}
 		TargetLink[] targetLinks = new TargetLink[activity.getLinkTargets().size()];
 		i = 0;
 		for (LinkTarget linkTarget: activity.getLinkTargets()) {
 			targetLinks[i++] = new TargetLink(linkTarget.getLinkName());
 		}
-		result.setTargetLinks(targetLinks);
+		if (targetLinks.length > 0) {
+			result.setTargetLinks(targetLinks);
+		}
 		return result;
 	}
 

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELAssign.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,23 +1,31 @@
 package org.drools.bpel.core;
 
-import org.drools.workflow.core.impl.DroolsConsequenceAction;
-import org.drools.workflow.core.node.ActionNode;
+import java.util.ArrayList;
+import java.util.List;
 
+import org.drools.workflow.core.Connection;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.NodeImpl;
 
 /**
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELAssign extends ActionNode implements BPELActivity {
+public class BPELAssign extends NodeImpl implements BPELActivity {
 
     private static final long serialVersionUID = 400L;
     
+    private List<Copy> copies = new ArrayList<Copy>();
     private SourceLink[] sourceLinks;
     private TargetLink[] targetLinks;
     
-    public void setAction(String assign) {
-        setAction(new DroolsConsequenceAction("mvel", assign));
+    public void addCopy(Copy copy) {
+    	copies.add(copy);
     }
+    
+    public List<Copy> getCopies() {
+    	return copies;
+    }
 
     public SourceLink[] getSourceLinks() {
         return sourceLinks;
@@ -34,5 +42,75 @@
     public void setTargetLinks(TargetLink[] targetLinks) {
         this.targetLinks = targetLinks;
     }
+    
+    public void validateAddIncomingConnection(final String type,
+            final Connection connection) {
+        super.validateAddIncomingConnection(type, connection);
+        if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default incoming connection type!");
+        }
+        if (getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE) != null
+                && !getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one incoming connection!");
+        }
+    }
 
+    public void validateAddOutgoingConnection(final String type, final Connection connection) {
+        super.validateAddOutgoingConnection(type, connection);
+        if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
+            throw new IllegalArgumentException(
+                "This type of node only accepts default outgoing connection type!");
+        }
+        if (getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE) != null
+                && !getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE).isEmpty()) {
+            throw new IllegalArgumentException(
+                "This type of node cannot have more than one outgoing connection!");
+        }
+    }
+    
+    public class Copy {
+
+    	private VariablePart from;
+    	private VariablePart to;
+    	
+		public VariablePart getFrom() {
+			return from;
+		}
+		
+		public void setFrom(VariablePart from) {
+			this.from = from;
+		}
+		
+		public VariablePart getTo() {
+			return to;
+		}
+		
+		public void setTo(VariablePart to) {
+			this.to = to;
+		}
+			
+    }
+    
+    public class VariablePart {
+
+    	private String variable;
+    	private String part;
+    	
+    	public VariablePart(String variable, String part) {
+    		this.variable = variable;
+    		this.part = part;
+    	}
+    	
+    	public String getVariable() {
+    		return variable;
+    	}
+    	
+    	public String getPart() {
+    		return part;
+    	}
+    	
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELPick.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -27,6 +27,7 @@
     	EndNode end = new EndNode();
     	end.setTerminate(false);
     	end.setMetaData("hidden", true);
+    	addNode(end);
         join = new Join();
         join.setType(Join.TYPE_XOR);
         join.setMetaData("hidden", true);

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELScope.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,5 +1,8 @@
 package org.drools.bpel.core;
 
+import java.util.List;
+
+import org.drools.process.core.context.exception.ExceptionScope;
 import org.drools.process.core.context.variable.VariableScope;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.CompositeContextNode;
@@ -13,6 +16,9 @@
 
     private static final long serialVersionUID = 400L;
 
+	private SourceLink[] sourceLinks;
+    private TargetLink[] targetLinks;
+
     public BPELScope() {
 	    VariableScope variableScope = new VariableScope();
 	    addContext(variableScope);
@@ -35,20 +41,30 @@
             Node.CONNECTION_DEFAULT_TYPE);
     }
 
+    public void setFaultHandlers(List<BPELFaultHandler> faultHandlers) {
+        ExceptionScope exceptionScope = new ExceptionScope();
+        addContext(exceptionScope);
+        setDefaultContext(exceptionScope);
+        for (BPELFaultHandler faultHandler: faultHandlers) {
+            addNode(faultHandler.getActivity());
+            exceptionScope.setExceptionHandler(faultHandler.getFaultName(), faultHandler);
+        }
+    }
+    
     public SourceLink[] getSourceLinks() {
-        throw new IllegalArgumentException("A scope does not support links!");
+        return sourceLinks;
     }
 
-    public TargetLink[] getTargetLinks() {
-        throw new IllegalArgumentException("A scope does not support links!");
+    public void setSourceLinks(SourceLink[] sourceLinks) {
+        this.sourceLinks = sourceLinks;
     }
 
-    public void setSourceLinks(SourceLink[] sourceLinks) {
-        throw new IllegalArgumentException("A scope does not support links!");
+    public TargetLink[] getTargetLinks() {
+        return targetLinks;
     }
 
     public void setTargetLinks(TargetLink[] targetLinks) {
-        throw new IllegalArgumentException("A scope does not support links!");
+        this.targetLinks = targetLinks;
     }
-    
+
 }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/core/BPELWhile.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -66,7 +66,7 @@
         // TODO While constraint dialect
         constraint.setConstraint(condition);
         constraint.setType("code");
-        constraint.setDialect("mvel");
+        constraint.setDialect("XPath2.0");
         constraint.setPriority(getNodes().length - 2);
         split.setConstraint(connection, constraint);
     }

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELAssignInstance.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,24 +1,112 @@
 package org.drools.bpel.instance;
 
+import java.io.ByteArrayInputStream;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.ode.utils.DOMUtils;
+import org.drools.bpel.core.BPELAssign;
+import org.drools.bpel.core.BPELAssign.Copy;
+import org.drools.bpel.core.BPELAssign.VariablePart;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.workflow.core.Node;
 import org.drools.workflow.instance.NodeInstance;
-import org.drools.workflow.instance.node.ActionNodeInstance;
+import org.drools.workflow.instance.impl.NodeInstanceImpl;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.NodeList;
 
 /**
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELAssignInstance extends ActionNodeInstance {
+public class BPELAssignInstance extends NodeInstanceImpl {
     
     private static final long serialVersionUID = 400L;
 
+    public BPELAssign getBPELAssign() {
+    	return (BPELAssign) getNode();
+    }
+    
     public void internalTrigger(NodeInstance from, String type) {
         if (BPELLinkManager.checkActivityEnabled(this)) {
-            super.internalTrigger(from, type);
+        	BPELAssign assign = getBPELAssign();
+        	for (Copy copy: assign.getCopies()) {
+        		VariablePart fromPart = copy.getFrom();
+        		VariablePart toPart = copy.getTo();
+        		String fromValue = getVariableValue(fromPart.getVariable());
+        		String toValue = getVariableValue(toPart.getVariable());
+        		if (toValue == null) {
+        			toValue = initializeVariable(toPart.getVariable());
+        		}
+        		toValue = copy(fromValue, fromPart.getPart(), toValue, toPart.getPart());
+        		setVariableValue(toPart.getVariable(), toValue);
+        	}
+            triggerCompleted(Node.CONNECTION_DEFAULT_TYPE, true);
         }
     }
     
-    public void triggerCompleted() {
-        super.triggerCompleted();
+    private String copy(String fromValue, String fromPart, String toValue, String toPart) {
+        try {
+        	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    		Document fromDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(fromValue.getBytes()));
+        	Element from = DOMUtils.findChildByName((Element) fromDocument.getDocumentElement(), new QName(fromPart));
+    		Document toDocument = factory.newDocumentBuilder().parse(new ByteArrayInputStream(toValue.getBytes()));
+        	Element to = DOMUtils.findChildByName((Element) toDocument.getDocumentElement(), new QName(toPart));
+        	
+        	Element replacement = toDocument.createElementNS(from.getNamespaceURI(), from.getNodeName());
+            NodeList nl = from.getChildNodes();
+            for (int i = 0; i < nl.getLength(); ++i)
+                replacement.appendChild(toDocument.importNode(nl.item(i), true));
+            NamedNodeMap attrs = from.getAttributes();
+            for (int i = 0; i < attrs.getLength(); ++i) {
+                if (!((Attr)attrs.item(i)).getName().startsWith("xmlns")) {
+                    replacement.setAttributeNodeNS((Attr) toDocument.importNode(attrs.item(i), true));
+                }
+            }
+        	to.getParentNode().replaceChild(replacement, to);
+        	return DOMUtils.domToString(toDocument.getDocumentElement());
+        } catch (Throwable t) {
+        	throw new IllegalArgumentException("Could not copy value", t);
+        }
+    }
+    
+    private String initializeVariable(String variable) {
+    	// TODO
+    	return "<shippingRequestMessage><customerInfo></customerInfo></shippingRequestMessage>";
+    }
+    
+    private String getVariableValue(String variable) {
+    	VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+    		resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+    	if (variableScopeInstance != null) {
+            return (String) variableScopeInstance.getVariable(variable);
+        } else {
+            System.err.println("Could not find variable scope for variable " + variable);
+            System.err.println("when trying assign");
+            System.err.println("Continuing without setting variable.");
+        }
+    	return null;
+    }
+    
+    private void setVariableValue(String variable, String value) {
+    	VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
+    		resolveContextInstance(VariableScope.VARIABLE_SCOPE, variable);
+    	if (variableScopeInstance != null) {
+            variableScopeInstance.setVariable(variable, value);
+        } else {
+            System.err.println("Could not find variable scope for variable " + variable);
+            System.err.println("when trying assign");
+            System.err.println("Continuing without setting variable.");
+        }
+    }
+    
+    public void triggerCompleted(String type, boolean remove) {
+        super.triggerCompleted(type, remove);
         BPELLinkManager.activateTargetLinks(this);
     }
     

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELFaultHandlerInstance.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -55,7 +55,7 @@
                 System.err.println("Continuing without setting variable.");
             }
         }
-        nodeInstance.trigger(null, null);
+        nodeInstance.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
         if (nodeInstanceContainer instanceof BPELProcessInstance) {
         	((BPELProcessInstance) nodeInstanceContainer).setState(ProcessInstance.STATE_ABORTED);
         } else {

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELProcessInstance.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -27,6 +27,7 @@
         return (BPELProcess) getProcess();
     }
     
+    // TODO: unification with signalEvent
     public void acceptMessage(String partnerLink, String portType, String operation, String message) {
         if (getState() == STATE_PENDING) {
             setState(STATE_ACTIVE);

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELScopeInstance.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,13 +1,13 @@
 package org.drools.bpel.instance;
 
 import org.drools.workflow.instance.NodeInstance;
-import org.drools.workflow.instance.node.CompositeNodeInstance;
+import org.drools.workflow.instance.node.CompositeContextNodeInstance;
 
 /**
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class BPELScopeInstance extends CompositeNodeInstance {
+public class BPELScopeInstance extends CompositeContextNodeInstance {
 
     private static final long serialVersionUID = 400L;
 

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialect.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,162 @@
+package org.drools.bpel.xpath;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.TypeResolver;
+import org.drools.compiler.Dialect;
+import org.drools.lang.descr.BaseDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.ProcessDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.builder.AccumulateBuilder;
+import org.drools.rule.builder.ActionBuilder;
+import org.drools.rule.builder.ConsequenceBuilder;
+import org.drools.rule.builder.EntryPointBuilder;
+import org.drools.rule.builder.FromBuilder;
+import org.drools.rule.builder.PackageBuildContext;
+import org.drools.rule.builder.PatternBuilder;
+import org.drools.rule.builder.PredicateBuilder;
+import org.drools.rule.builder.ProcessBuildContext;
+import org.drools.rule.builder.ProcessClassBuilder;
+import org.drools.rule.builder.QueryBuilder;
+import org.drools.rule.builder.ReturnValueBuilder;
+import org.drools.rule.builder.ReturnValueEvaluatorBuilder;
+import org.drools.rule.builder.RuleBuildContext;
+import org.drools.rule.builder.RuleClassBuilder;
+import org.drools.rule.builder.RuleConditionBuilder;
+import org.drools.rule.builder.SalienceBuilder;
+
+public class XPathDialect implements Dialect {
+
+	private static final XPathReturnValueEvaluatorBuilder RETURN_VALUE_EVALUATOR_BUILDER = new XPathReturnValueEvaluatorBuilder();
+	
+	public String getId() {
+		return "XPath2.0";
+	}
+
+	public String getExpressionDialectName() {
+		return "XPath2.0";
+	}
+
+	public ReturnValueEvaluatorBuilder getReturnValueEvaluatorBuilder() {
+		return RETURN_VALUE_EVALUATOR_BUILDER;
+	}
+
+	public ActionBuilder getActionBuilder() {
+		return null;
+	}
+
+	public void addFunction(FunctionDescr functionDescr, TypeResolver typeResolver) {
+	}
+
+	public void addImport(String importEntry) {
+	}
+
+	public void addProcess(ProcessBuildContext context) {
+	}
+
+	public void addRule(RuleBuildContext context) {
+	}
+
+	public void addStaticImport(String importEntry) {
+	}
+
+	public AnalysisResult analyzeBlock(PackageBuildContext context,
+			BaseDescr descr, String text, Set[] availableIdentifiers) {
+		return null;
+	}
+
+	public AnalysisResult analyzeExpression(PackageBuildContext context,
+			BaseDescr descr, Object content, Set[] availableIdentifiers) {
+		return null;
+	}
+
+	public void compileAll() {
+	}
+
+	public AccumulateBuilder getAccumulateBuilder() {
+		return null;
+	}
+
+	public RuleConditionBuilder getBuilder(Class clazz) {
+		return null;
+	}
+
+	public Map getBuilders() {
+		return null;
+	}
+
+	public ClassFieldAccessorCache getClassFieldExtractorCache() {
+		return null;
+	}
+
+	public ConsequenceBuilder getConsequenceBuilder() {
+		return null;
+	}
+
+	public EntryPointBuilder getEntryPointBuilder() {
+		return null;
+	}
+
+	public RuleConditionBuilder getEvalBuilder() {
+		return null;
+	}
+
+	public FromBuilder getFromBuilder() {
+		return null;
+	}
+
+	public PatternBuilder getPatternBuilder() {
+		return null;
+	}
+
+	public PredicateBuilder getPredicateBuilder() {
+		return null;
+	}
+
+	public ProcessClassBuilder getProcessClassBuilder() {
+		return null;
+	}
+
+	public QueryBuilder getQueryBuilder() {
+		return null;
+	}
+
+	public List getResults() {
+		return null;
+	}
+
+	public ReturnValueBuilder getReturnValueBuilder() {
+		return null;
+	}
+
+	public RuleClassBuilder getRuleClassBuilder() {
+		return null;
+	}
+
+	public SalienceBuilder getSalienceBuilder() {
+		return null;
+	}
+
+	public TypeResolver getTypeResolver() {
+		return null;
+	}
+
+	public void init(RuleDescr ruleDescr) {
+	}
+
+	public void init(ProcessDescr processDescr) {
+	}
+
+	public void postCompileAddFunction(FunctionDescr functionDescr,
+			TypeResolver typeResolver) {
+	}
+
+	public void preCompileAddFunction(FunctionDescr functionDescr,
+			TypeResolver typeResolver) {
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathDialectConfiguration.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,26 @@
+package org.drools.bpel.xpath;
+
+import org.drools.compiler.Dialect;
+import org.drools.compiler.DialectConfiguration;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.compiler.PackageRegistry;
+import org.drools.rule.Package;
+
+public class XPathDialectConfiguration implements DialectConfiguration {
+
+	private PackageBuilderConfiguration packageBuilderConfiguration;
+	
+	public PackageBuilderConfiguration getPackageBuilderConfiguration() {
+		return packageBuilderConfiguration;
+	}
+
+	public void init(PackageBuilderConfiguration configuration) {
+		this.packageBuilderConfiguration = configuration;
+	}
+
+	public Dialect newDialect(PackageBuilder packageBuilder, PackageRegistry pkgRegistry, Package pkg) {
+		return new XPathDialect();
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluator.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,22 @@
+package org.drools.bpel.xpath;
+
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+
+import org.apache.ode.utils.DOMUtils;
+import org.drools.WorkingMemory;
+import org.drools.spi.ReturnValueEvaluator;
+
+public class XPathReturnValueEvaluator implements ReturnValueEvaluator {
+	
+	private XPathExpression expression;
+	
+	public void setExpression(XPathExpression expression) {
+		this.expression = expression;
+	}
+
+	public Object evaluate(WorkingMemory workingMemory) throws Exception {
+		return expression.evaluate(DOMUtils.newDocument(), XPathConstants.BOOLEAN);
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/xpath/XPathReturnValueEvaluatorBuilder.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -0,0 +1,67 @@
+package org.drools.bpel.xpath;
+
+import java.io.ByteArrayInputStream;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
+
+import net.sf.saxon.om.NamespaceConstant;
+import net.sf.saxon.xpath.XPathEvaluator;
+
+import org.drools.compiler.ReturnValueDescr;
+import org.drools.rule.builder.PackageBuildContext;
+import org.drools.rule.builder.ReturnValueEvaluatorBuilder;
+import org.drools.workflow.instance.impl.ReturnValueConstraintEvaluator;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class XPathReturnValueEvaluatorBuilder implements ReturnValueEvaluatorBuilder {
+
+	public void build(PackageBuildContext context,
+			ReturnValueConstraintEvaluator returnValueConstraintEvaluator,
+			ReturnValueDescr returnValueDescr) {
+		try {
+			XPathReturnValueEvaluator evaluator = new XPathReturnValueEvaluator();
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+			Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(returnValueDescr.getText().getBytes()));
+			Node node = document.getFirstChild().getFirstChild();
+	        if (node == null) {
+	            throw new IllegalStateException();
+	        }
+	        if (node.getNodeType() != Node.TEXT_NODE) {
+	            throw new IllegalArgumentException("Unexpected node type for XPath");
+	        }
+	        String xpathString = node.getNodeValue();
+			XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
+//	        xpf.setXPathFunctionResolver(new XPathFunctionResolver() {
+//				public XPathFunction resolveFunction(QName arg0, int arg1) {
+//					return null;
+//				}
+//	        });
+//	        xpf.setXPathVariableResolver(new XPathVariableResolver() {
+//	        	public Object resolveVariable(QName arg0) {
+//					return null;
+//				}
+//	        });
+	        XPathEvaluator xpe = (XPathEvaluator) xpf.newXPath();
+//	        xpe.setNamespaceContext(new NamespaceContext() {
+//				public String getNamespaceURI(String arg0) {
+//					return null;
+//				}
+//				public String getPrefix(String arg0) {
+//					return null;
+//				}
+//				public Iterator getPrefixes(String arg0) {
+//					return null;
+//				}
+//	        });
+	        XPathExpression expression = xpe.compile(xpathString);
+	        evaluator.setExpression(expression);
+			returnValueConstraintEvaluator.setEvaluator(evaluator);
+		} catch (Throwable t) {
+			throw new IllegalArgumentException("Could not compile XPath expression " + returnValueDescr.getText(), t);
+		}
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/resources/META-INF/bpelNodeBuilderRegistry.conf	2008-07-28 23:21:18 UTC (rev 21264)
@@ -1,11 +1,7 @@
 // we use MVEL to configure our nodes, simply populate a map, which will be added to the main registry
-import org.drools.workflow.core.node.Split;
-import org.drools.bpel.core.BPELAssign;
 import org.drools.bpel.core.BPELEmpty;
 import org.drools.process.builder.ActionNodeBuilder;
-import org.drools.process.builder.SplitNodeBuilder;
 
 [
-    BPELAssign   : new ActionNodeBuilder(),
     BPELEmpty    : new ActionNodeBuilder(),
 ]

Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java	2008-07-28 19:26:58 UTC (rev 21263)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/test/java/org/drools/bpel/test/BPELCoreTest.java	2008-07-28 23:21:18 UTC (rev 21264)
@@ -120,8 +120,10 @@
             // assign1
             BPELAssign assign1 = new BPELAssign();
             assign1.setId(++nodeId);
-            // $shippingRequest.customerInfo <- $PO.customerInfo
-            assign1.setAction("");
+            BPELAssign.Copy copy = assign1.new Copy();
+            copy.setFrom(assign1.new VariablePart("PO", "customerInfo"));
+            copy.setTo(assign1.new VariablePart("shippingRequest", "customerInfo"));
+            assign1.addCopy(copy);
             sequence1Activities.add(assign1);
             
             // invoke1
@@ -265,7 +267,8 @@
         BPELProcessInstance processInstance = (BPELProcessInstance) workingMemory.startProcess("1");
         
         // start process
-        BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder", "PURCHASE ORDER");
+        BPELTestUtil.webServiceInvocation(processInstance, "purchasing", "lns:purchaseOrderPT", "sendPurchaseOrder", 
+    		"<POMessage><customerInfo>Jack</customerInfo><purchaseOrder>PURCHASE_ORDER</purchaseOrder></POMessage>");
 
         // reply to web service invocations
         WorkItem workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "requestProductionScheduling");
@@ -275,14 +278,14 @@
         BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
         
         workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "shipping", "lns:shippingPT", "requestShipping");
-        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "SHIPPING");
+        BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, "<shippingInfoMessage><shippingInfo>SHIPPING_INFO</shippingInfo></shippingInfoMessage>");
         
         workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "invoicing", "lns:computePricePT", "sendShippingPrice");
         BPELTestUtil.replyWebServiceInvocation(workingMemory, workItem, null);
         
         // invoke web service callbacks
-        BPELTestUtil.webServiceInvocation(processInstance, "shipping", "lns:shippingCallbackPT", "sendSchedule", "SCHEDULE");
-        BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "lns:invoiceCallbackPT", "sendInvoice", "INVOICE");
+        BPELTestUtil.webServiceInvocation(processInstance, "shipping", "lns:shippingCallbackPT", "sendSchedule", "<scheduleMessage><schedule>SCHEDULE</schedule></scheduleMessage>");
+        BPELTestUtil.webServiceInvocation(processInstance, "invoicing", "lns:invoiceCallbackPT", "sendInvoice", "<InvMessage><IVC>INVOICE</IVC></InvMessage>");
 
         // reply to web service invocation
         workItem = BPELTestUtil.findWebServiceInvocation(workingMemory, "scheduling", "lns:schedulingPT", "sendShippingSchedule");




More information about the jboss-svn-commits mailing list