[jboss-svn-commits] JBL Code SVN: r33975 - in labs/jbossrules/trunk/drools-pipeline: src and 22 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jul 16 22:23:50 EDT 2010


Author: mark.proctor at jboss.com
Date: 2010-07-16 22:23:49 -0400 (Fri, 16 Jul 2010)
New Revision: 33975

Added:
   labs/jbossrules/trunk/drools-pipeline/src/
   labs/jbossrules/trunk/drools-pipeline/src/main/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/dataloaders/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java
   labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java
   labs/jbossrules/trunk/drools-pipeline/src/main/resources/
   labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd
   labs/jbossrules/trunk/drools-pipeline/src/test/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/dataloaders/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/dataloaders/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/dataloaders/smooks/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departmentData.xls
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl
   labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl
Log:
JBRULES-2347 Camel
-merging all the pipelien modueles, to simplify the build, as they are only kept around now for legacy users.



Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,234 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+
+import org.drools.command.Setter;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.SignalEventCommand;
+import org.drools.command.runtime.process.StartProcessCommand;
+import org.drools.command.runtime.rule.FireAllRulesCommand;
+import org.drools.command.runtime.rule.InsertElementsCommand;
+import org.drools.command.runtime.rule.InsertObjectCommand;
+import org.drools.command.runtime.rule.ModifyCommand;
+import org.drools.command.runtime.rule.QueryCommand;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * 
+ * @author Wolfgang Laun
+ */
+public class CommandTranslator {
+	private Map<Class<?>, CommandTransformer> class2trans;
+
+	public CommandTranslator(){
+		class2trans = new HashMap<Class<?>, CommandTransformer>();
+		class2trans.put(BatchExecutionCommand.class,   new BatchExecutionTransformer());
+		class2trans.put(InsertElementsCommand.class,   new InsertElementsTransformer());
+		class2trans.put(InsertObjectCommand.class,     new InsertObjectTransformer());
+		class2trans.put(ModifyCommand.class,     	   new ModifyObjectTransformer());
+		class2trans.put(QueryCommand.class,            new QueryTransformer());
+		class2trans.put(SetGlobalCommand.class,        new SetGlobalTransformer());
+		class2trans.put(SignalEventCommand.class,      new SignalEventTransformer());
+		class2trans.put(StartProcessCommand.class,     new StartProcessTransformer());
+		class2trans.put(FireAllRulesCommand.class,     new FireAllRulesTransformer());
+	}
+
+	/**
+	 * Transforms a list of XML elements representing Drools command objects
+	 * to a list of <tt>Command&lt;?&gt;</tt> objects. Application objects
+	 * are unmarshalled, using an <tt>Unmarshaller</tt> object derived from
+	 * the object's class.
+	 * 
+	 * @param xmlCmds the list of XML elements representing Drools command objects
+	 * @return 
+	 * @return a list of <tt>Command&lt;?&gt;</tt> objects
+	 */
+	public GenericCommand<?> transform(BatchExecutionCommand batchExecution, Unmarshaller unmarshaller) {
+		CommandTransformer commandTransformer = class2trans.get(batchExecution.getClass());
+		return commandTransformer.transform(this, batchExecution, unmarshaller);
+	}
+
+	protected CommandTransformer getCommandTransformer(Class<?> clazz) {
+		return class2trans.get(clazz);
+	}
+
+	protected Object makeObject(Node node, Unmarshaller unmarshaller) {        
+		Object obj = null;
+		try {
+			obj = unmarshaller.unmarshal(node);
+		} catch (JAXBException e) {
+			// TODO: remove this
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+		return obj;
+	}
+}
+
+
+/**
+ * Abstract base class for all command transformers.
+ */
+abstract class CommandTransformer {
+	abstract GenericCommand<?> transform(CommandTranslator ct, Object o , Unmarshaller unmarshaller);
+}
+
+/**
+ * Class for transforming a BatchExecution command.
+ */
+class BatchExecutionTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator cmdTrans, Object o , Unmarshaller unmarshaller) {
+		BatchExecutionCommand be = (BatchExecutionCommand)o;
+		List<GenericCommand<?>> xmlCmds = be.getCommands();
+		for (ListIterator<GenericCommand<?>> i = xmlCmds.listIterator(); i.hasNext();) {
+			GenericCommand<?> cmd = i.next();
+			CommandTransformer ct = cmdTrans.getCommandTransformer(cmd.getClass());
+			if (ct != null) {
+				i.set(ct.transform(cmdTrans, cmd, unmarshaller));
+			}
+		}
+		return be;
+	}
+}
+
+/**
+ * Class for transforming an InsertElements command.
+ */
+class InsertElementsTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+		InsertElementsCommand insertElementsCmd = (InsertElementsCommand)o;
+		List<Object> objectsList = new ArrayList<Object>(insertElementsCmd.getObjects().size());
+		
+		for (Object obj : insertElementsCmd.getObjects()) {
+			if (obj instanceof Node) {
+				objectsList.add(ct.makeObject((Node) obj, unmarshaller));
+			} else {
+				objectsList.add(obj);
+			}
+		}
+
+		insertElementsCmd.setObjects(objectsList);
+		return insertElementsCmd;
+	}
+}
+
+/**
+ * Class for transforming a InsertObject command.
+ */
+class InsertObjectTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+		InsertObjectCommand io = (InsertObjectCommand)o;
+		Object object = io.getObject();
+		if (object instanceof Element) {
+			Element el = (Element)object;
+			Object obj = ct.makeObject(el , unmarshaller);
+			io.setObject(obj);
+		}
+		return io;
+	}
+}
+
+/**
+ * Class for transforming a ModifyObject command.
+ */
+class ModifyObjectTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+		ModifyCommand mo = (ModifyCommand)o;
+		List<?> setters = mo.getSetters();
+		List<Setter> convertedSetters = new ArrayList<Setter>();
+		for (Object node : setters) {
+			Setter setter;
+			if (node instanceof Element) {
+				setter = (Setter) ct.makeObject((Element)node, unmarshaller);
+			}
+			else {
+				setter = (Setter) node;
+			}
+			convertedSetters.add(setter);
+		}
+		mo.setSetters(convertedSetters);
+		return mo;
+	}
+}
+
+/**
+ * Class for transforming a FireAllRules command.
+ */
+class FireAllRulesTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+		return (FireAllRulesCommand)o;
+	}
+}
+
+/**
+ * Class for transforming a Query command.
+ */
+class QueryTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+		QueryCommand q = (QueryCommand)o;
+		for (ListIterator<Object> i = q.getArguments().listIterator(); i.hasNext();) {
+			Object object = i.next();
+			if (object instanceof Element) {
+				i.set(ct.makeObject((Element) object, unmarshaller));
+			}
+		}
+		return q;
+	}
+}
+
+/**
+ * Class for transforming a SetGlobal command.
+ */
+class SetGlobalTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+		SetGlobalCommand sg = (SetGlobalCommand)o;
+		Object object = sg.getObject();
+		if (object instanceof Element) {
+			Element el = (Element)object;
+			Object obj = ct.makeObject(el , unmarshaller);
+			sg.setObject(obj);
+		}
+		return sg;
+	}
+}
+
+/**
+ * Class for transforming a SignalEvent command.
+ */
+class SignalEventTransformer extends CommandTransformer {
+	public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+		SignalEventCommand se = (SignalEventCommand)o;
+		Object ev = se.getEvent();
+		if (ev != null) {
+			Object obj = ct.makeObject((Element)ev , unmarshaller);
+			se.setEvent(obj);
+		}
+		return se;
+	}
+}
+
+/**
+ * Class for transforming a StartProcess command.
+ */
+class StartProcessTransformer extends CommandTransformer {
+	public GenericCommand<?> transform( CommandTranslator ct, Object o, Unmarshaller unmarshaller ) {
+		StartProcessCommand sp = (StartProcessCommand)o;
+		for (Map.Entry<String, Object> entry: sp.getParameters().entrySet()) {
+			Object obj = entry.getValue();
+			if (obj instanceof Element) {
+				entry.setValue(ct.makeObject((Element) obj, unmarshaller));
+			}
+		}
+		return sp;
+	}
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,23 @@
+package org.drools.runtime.pipeline.impl;
+
+public class DroolsSmooksConfiguration {
+	private String rootId;
+	
+	public DroolsSmooksConfiguration() {
+		this.rootId = "root";
+	}		
+	
+	public DroolsSmooksConfiguration(String rootId) {
+		this.rootId = rootId;
+	}
+
+	public void setRootId(String rootId) {
+		this.rootId = rootId;
+	}
+
+	public String getRootId() {
+		return rootId;
+	}
+	
+	
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,61 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.Source;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.xml.sax.InputSource;
+
+public class JaxbFromXmlTransformer extends BaseEmitter
+    implements
+    Transformer {
+    private Unmarshaller            unmarshaller;
+
+    public JaxbFromXmlTransformer(Unmarshaller unmarshaller) {
+        this.unmarshaller = unmarshaller;
+    }
+
+    public void receive(Object object,
+                       PipelineContext context) {
+        Object result = null;
+        try {
+            if ( object instanceof File ) {
+                result = this.unmarshaller.unmarshal( (File) object );
+            } else if ( object instanceof!
  InputStream ) {
+                result = this.unmarshaller.unmarshal( (InputStream) object );
+            } else if ( object instanceof Reader ) {
+                result = this.unmarshaller.unmarshal( (Reader) object );
+            } else if ( object instanceof Source ) {
+                result = this.unmarshaller.unmarshal( (Source) object );
+            } else if ( object instanceof InputSource ) {
+                result = this.unmarshaller.unmarshal( (InputSource) object );
+            }  else if ( object instanceof Resource ) {
+                result = this.unmarshaller.unmarshal( (( Resource ) object).getReader() );
+            }  else if ( object instanceof String ) {
+                result = this.unmarshaller.unmarshal( new StringReader( ( String ) object ) );
+            } else {
+                throw new IllegalArgumentException( "signal object must be instance of File, InputStream, Reader, Source, InputSource, Resource, String" );
+            }
+   !
      } catch ( Exception e ) {
+            handleException( t!
 his,
+  
                           object,
+                             e );
+        }
+        
+        if ( result instanceof JAXBElement ) {
+            result = ((JAXBElement) object).getValue();
+        }
+        
+        emit( result,
+              context );
+    }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,38 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.StringWriter;
+
+import javax.xml.bind.Marshaller;
+
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+public class JaxbToXmlTransformer extends BaseEmitter
+    implements
+    Transformer {
+    private Marshaller            marshaller;
+
+    public JaxbToXmlTransformer(Marshaller marshaller) {
+        this.marshaller = marshaller;
+    }
+
+    public void receive(Object object,
+                       PipelineContext context) {
+        Object result = null;
+        try {
+            StringWriter stringWriter = new StringWriter();
+            
+            this.marshaller.marshal( object, stringWriter );
+
+            result = stringWriter.getBuffer().toString();
+        } catch ( Exception e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+        
+        emit( result,
+              context );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,20 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import org.drools.runtime.pipeline.JaxbTransformerProvider;
+import org.drools.runtime.pipeline.Transformer;
+
+public class JaxbTransformerProviderImpl implements JaxbTransformerProvider {
+    public Transformer newJaxbFromXmlTransformer(Unmarshaller unmarshaller) {
+        return new JaxbFromXmlTransformer( unmarshaller );
+    }
+    
+    public Transformer newJaxbToXmlTransformer(Marshaller marshaller) {
+        return new JaxbToXmlTransformer( marshaller );
+    }    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,150 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.naming.InitialContext;
+
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.pipeline.Service;
+
+public class JmsMessenger extends BaseService
+    implements
+    Service {
+    private ConnectionFactory    connectionFactory;
+    private Destination          destination;
+    private MessageConsumer      consumer;
+    private Connection           connection;
+    private Session              session;
+
+    private ResultHandlerFactory resultHandlerFactory;
+    private Pipeline             pipeline;
+
+    private Thread               thread;
+
+    private JmsMessengerRunner   jmsFeederRunner;
+
+    public JmsMessenger(Pipeline pipeline,
+                        Properties properties,
+                        String destinationName,
+                        ResultHandlerFactory resultHandlerFactory) {
+        super();
+        this.pipeline = pipeline;
+        this.resultHandlerFactory = resultHandlerFactory;
+
+        try {
+            InitialContext jndiContext = new InitialContext( properties );
+            this.connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+            this.destination = (Destination) jndiContext.lookup( destinationName );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to instantiate JmsFeeder",
+                                        e );
+        }
+    }
+
+    public void start() {
+        try {
+            this.connection = this.connectionFactory.createConnection();
+            this.session = this.connection.createSession( false,
+                                                          Session.AUTO_ACKNOWLEDGE );
+            this.consumer = this.session.createConsumer( destination );
+
+            this.connection.start();
+        } catch ( Exception e ) {
+            handleException( this,
+                             null,
+                             e );
+        }
+        this.jmsFeederRunner = new JmsMessengerRunner( this,
+                                                       this.consumer,
+                                                       this.pipeline,
+                                                       this.resultHandlerFactory );
+        this.jmsFeederRunner.setRun( true );
+        this.thread = new Thread( this.jmsFeederRunner );
+        this.thread.start();
+    }
+
+    public void stop() {
+        try {
+            this.jmsFeederRunner.setRun( false );
+            // this will interrupt the receive()
+            this.consumer.close();
+            this.connection.stop();
+        } catch ( JMSException e ) {
+            handleException( this,
+                             null,
+                             e );
+        }
+    }
+
+    //    public void run() {
+    //        while ( this.run ) {
+    //            Message msg = null;
+    //            try {
+    //                msg = this.consumer.receive();
+    //                System.out.println( "msg received : " + msg );
+    //                //                emit( msg,
+    //                //                      new EntryPointPipelineContext( this.entryPoint ) );
+    //            } catch ( JMSException e ) {
+    //                handleException( this,
+    //                                 msg,
+    //                                 e );
+    //            }
+    //        }
+    //    }
+
+    public static class JmsMessengerRunner
+        implements
+        Runnable {
+        private JmsMessenger         feeder;
+        private MessageConsumer      consumer;
+        private Pipeline             pipeline;
+        private ResultHandlerFactory resultHandlerFactory;
+        private volatile boolean     run;
+
+        public JmsMessengerRunner(JmsMessenger feeder,
+                                  MessageConsumer consumer,
+                                  Pipeline pipeline,
+                                  ResultHandlerFactory resultHandlerFactory) {
+            super();
+            this.feeder = feeder;
+            this.consumer = consumer;
+            this.pipeline = pipeline;
+            this.resultHandlerFactory = resultHandlerFactory;
+        }
+
+        public void run() {
+            while ( this.run ) {
+                Message msg = null;
+                try {
+                    msg = this.consumer.receive();     
+                    if (  msg != null ) {
+                        if ( this.resultHandlerFactory != null ) {
+                            pipeline.insert( msg,
+                                             this.resultHandlerFactory.newResultHandler() );
+                        } else {
+                            pipeline.insert( msg,
+                                             null );
+                        }
+                    }
+                } catch ( JMSException e ) {
+                    this.feeder.handleException( this.feeder,
+                                                 msg,
+                                                 e );
+                }
+            }
+        }
+
+        public void setRun(boolean run) {
+            this.run = run;
+        }
+
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,31 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Properties;
+
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.JmsMessengerProvider;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.pipeline.Service;
+
+public class JmsMessengerProviderImpl
+    implements
+    JmsMessengerProvider {
+    public Service newJmsMessenger(Pipeline pipeline,
+                                   Properties properties,
+                                   String destinationName,
+                                   ResultHandlerFactory resultHandlerFactory) {
+        return new JmsMessenger( pipeline,
+                                 properties,
+                                 destinationName,
+                                 resultHandlerFactory );
+    }
+
+    public Action newJmsUnwrapMessageObject() {
+        return new JmsUnwrapMessageObject();
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,28 @@
+package org.drools.runtime.pipeline.impl;
+
+import javax.jms.JMSException;
+import javax.jms.ObjectMessage;
+
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Receiver;
+
+public class JmsUnwrapMessageObject extends BaseEmitter
+    implements
+    Action,
+    Receiver {
+
+    public void receive(Object object,
+                        PipelineContext context) {
+        try {
+            Object result = ((ObjectMessage) object).getObject();
+            emit( result,
+                  context );
+        } catch ( JMSException e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,28 @@
+package org.drools.runtime.pipeline.impl;
+
+import javax.jms.JMSException;
+import javax.jms.TextMessage;
+
+import org.drools.runtime.pipeline.Emitter;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Receiver;
+
+public class JmsUnwrapText extends BaseEmitter
+    implements
+    Receiver,
+    Emitter {
+
+    public void receive(Object object,
+                        PipelineContext context) {
+        try {
+            String string = ((TextMessage) object).getText();
+            emit( string,
+                  context );
+        } catch ( JMSException e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,99 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.jxls.reader.XLSReadMessage;
+import net.sf.jxls.reader.XLSReadStatus;
+import net.sf.jxls.reader.XLSReader;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.JxlsTransformerProvider;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.mvel2.MVEL;
+import org.mvel2.ParserContext;
+import org.mvel2.compiler.ExpressionCompiler;
+
+public class JxlsTransformer extends BaseEmitter
+    implements
+    Transformer {
+
+    private XLSReader    xlsReader;
+    private Serializable expr;
+    private String       text;
+
+    public JxlsTransformer(XLSReader xlsReader,
+                           String text) {
+        super();
+        this.xlsReader = xlsReader;
+        this.text = text;
+    }
+
+    public void receive(Object object,
+                       PipelineContext context) {
+        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader( context.getClassLoader() );
+
+        if ( expr == null ) {
+            // create MVEL compilation
+            final ParserContext parserContext = new ParserContext();
+            parserContext.setStrictTypeEnforcement( false );
+
+            ExpressionCompiler compiler = new ExpressionCompiler( this.text );
+            this.expr = compiler.compile( parserContext );
+        }
+
+        XLSReadStatus readStatus = null;
+        Map<String, Object> beans = null;
+        try {
+            beans = (Map<String, Object>) MVEL.executeExpression( this.expr,
+                                                                  object );
+            
+            // error check beans
+            if ( beans == null || !(beans instanceof Map) ) {
+                throw new RuntimeException( "Bean map expression must evaluate to a populated Map interface" );
+            }
+            
+            if ( object instanceof InputStream ) {
+                readStatus = xlsReader.read( (InputStream) object,
+                                             beans );
+            } else if ( object instanceof Resource ) {
+                readStatus = xlsReader.read( ((Resource) object).getInputStream(),
+                                             beans );                
+            } else {
+                throw new IllegalArgumentException( "signal object must be instance of InputStream or Resource" );
+            }
+
+            // error check xls reader
+            if ( readStatus == null || !readStatus.isStatusOK() ) {
+                StringBuilder builder = new StringBuilder();
+                builder.append( "Unable to parse resource with XLS:\n" );
+                for ( XLSReadMessage message : ((List<XLSReadMessage>) readStatus.getReadMessages()) ) {
+                    builder.append( message.getMessage() + "\n" );
+                }
+                throw new RuntimeException( "Unable to parse resource with XLS:\n" + builder.toString() );
+            }
+            
+        } catch ( Exception e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+
+        Thread.currentThread().setContextClassLoader( originalClassLoader );
+        emit( beans,
+              context );
+    }
+
+    //    
+        public static class JxlsTransformerProviderImpl implements JxlsTransformerProvider {
+            public Transformer newJxlsTransformer(XLSReader xlsReader,
+                                                  String text) {
+                return new JxlsTransformer( xlsReader, text );
+            }
+        }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,86 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+public class ListMapping {
+
+	public static void main(String[] args) throws Exception {
+		Object asd = new Person("lucaz");
+		Field fieldName = asd.getClass().getDeclaredField("name");
+		fieldName.setAccessible(true);
+		String fieldValue = (String) fieldName.get(asd);
+		System.out.println("fieldValue = " + fieldValue);
+
+//		Object object = fieldName.get(asd);
+//		System.out.println(object);
+
+//		Course course = new Course();
+//		
+//		course.addPerson(new Person("lucas"));
+//		course.addPerson(new Person("jose"));
+//		
+//		Class<?>[] classes = {Person.class, Course.class};
+//		
+//		JAXBContext jaxb = JAXBContext.newInstance(classes);
+//
+//		Marshaller xmlConverter = jaxb.createMarshaller();
+//		xmlConverter.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+//		xmlConverter.marshal(course, System.out);
+		
+	}
+
+}
+
+ at XmlRootElement
+
+class Course {
+	
+//	@XmlElementWrapper(name="persons")
+	@XmlElement(name="person")
+	private List<Person> persons = new ArrayList<Person>();
+	
+	public Course() {
+	}
+	
+	public void addPerson(Person person) {
+		persons.add(person);
+	}
+	
+	public List<Person> getPersons() {
+		return this.persons;
+	}
+	
+}
+
+ at XmlRootElement(name="person")
+class Person {
+
+	@XmlAttribute
+	private String name;
+	
+	public Person() {
+	}
+	
+	public Person(String name) {
+		this.setName(name);
+	}
+	
+	@Override
+	public String toString() {
+		return getName();
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,23 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Map;
+
+import com.thoughtworks.xstream.XStream;
+
+public class NamedXstreamLookupStrategy
+    implements
+    XStreamResolverStrategy {
+    private Map<String, XStream> xstreams;
+    
+    public NamedXstreamLookupStrategy(Map<String, XStream> xstreams) {
+        this.xstreams = xstreams;
+    }
+
+    public XStream lookup(String name) {
+        return this.xstreams.get( name );
+    }
+    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,96 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.transform.TransformerException;
+
+import org.drools.FactHandle;
+import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.rule.Declaration;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.QueryResultsRow;
+import org.drools.runtime.rule.impl.FlatQueryResults;
+import org.drools.runtime.rule.impl.NativeQueryResults;
+import org.drools.spi.ObjectType;
+import org.drools.xml.jaxb.util.JaxbListWrapper;
+
+public class ResultTranslator {
+
+	private Object convert(Object obj) {
+		if (obj instanceof FactHandle && !(obj instanceof DisconnectedFactHandle)) {
+			return new DisconnectedFactHandle(((FactHandle) obj).toExternalForm());
+		}
+		
+		if (obj instanceof NativeQueryResults) {
+			NativeQueryResults nativeQueryResults = (NativeQueryResults) obj;
+            List<Declaration> declrs = new ArrayList<Declaration>();
+            HashMap<String, Integer> identifiers = new HashMap<String, Integer>(  );
+            
+            for ( String identifier : nativeQueryResults.getIdentifiers() ) {
+            	// we don't want to marshall the query parameters
+            	Declaration declr = nativeQueryResults.getDeclarations().get( identifier );
+            	ObjectType objectType = declr.getPattern().getObjectType();
+            	if ( objectType instanceof ClassObjectType &&
+            		((ClassObjectType) objectType).getClassType() == DroolsQuery.class ) {
+            			continue;
+            	}
+            	declrs.add(declr);
+            	identifiers.put(identifier, declrs.size() - 1);
+            }
+            
+            ArrayList<ArrayList<Object>> results = new ArrayList<ArrayList<Object>>( nativeQueryResults.size() );
+            ArrayList<ArrayList<org.drools.runtime.rule.FactHandle>> factHandles = new ArrayList<ArrayList<org.drools.runtime.rule.FactHandle>> ( nativeQueryResults.size() );
+            for (QueryResultsRow row : nativeQueryResults) {
+            	ArrayList<Object> objectList = new ArrayList<Object>();
+                ArrayList<org.drools.runtime.rule.FactHandle> factHandleList = new ArrayList<org.drools.runtime.rule.FactHandle>();
+                for (int i = 0; i < declrs.size(); i++) {
+                	objectList.add(convert(row.get(declrs.get(i).getIdentifier())));
+                	factHandleList.add(new DisconnectedFactHandle(row.getFactHandle(declrs.get(i).getIdentifier()).toExternalForm()));
+                }                
+            	factHandles.add(factHandleList);
+                results.add(objectList);
+            }
+
+            return new FlatQueryResults(identifiers, results, factHandles);
+		}
+		
+		Class<? extends Object> vClass = obj.getClass();
+		if (List.class.isAssignableFrom(vClass) && !JaxbListWrapper.class.equals(vClass)) {
+			JaxbListWrapper<Object> wrapper = new JaxbListWrapper<Object>(((List<?>) obj).size());
+			for (Object item : ((List<?>) obj)) {
+				wrapper.add(convert(item));
+			}
+			return wrapper;
+		}
+		return obj;
+	}
+	
+	public String transform( ExecutionResultImpl executionResult, Marshaller marshaller ) throws JAXBException, TransformerException{
+
+		//TODO {bauna} remove this try
+		try {
+			StringWriter writer = new StringWriter();
+			for (Map.Entry<String, Object> entry : executionResult.getFactHandles().entrySet()) {
+				entry.setValue(convert(entry.getValue()));
+			}
+			
+			for (Map.Entry<String, Object> entry : executionResult.getResults().entrySet()) {
+				entry.setValue(convert(entry.getValue()));
+			}
+			marshaller.marshal(executionResult, writer);
+			return writer.toString();
+		} catch (Throwable e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+	
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,21 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.List;
+
+public class Root {
+	private List children;
+	
+	public Root() {
+		
+	}
+
+	public List getChildren() {
+		return children;
+	}
+
+	public void setChildren(List children) {
+		this.children = children;
+	}
+	
+	
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,68 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.BaseEmitter;
+import org.milyn.Smooks;
+import org.milyn.container.ExecutionContext;
+import org.milyn.payload.JavaResult;
+import org.milyn.payload.StringSource;
+
+public class SmooksFromSourceTransformer extends BaseEmitter
+    implements
+    Transformer {
+    private Smooks                    smooks;
+    private DroolsSmooksConfiguration configuration;
+
+    public SmooksFromSourceTransformer(Smooks smooks,
+                             DroolsSmooksConfiguration configuration) {
+        this.smooks = smooks;
+        this.configuration = configuration;
+
+    }
+
+    public void receive(Object object,
+                       PipelineContext context) {
+        this.smooks.setClassLoader( context.getClassLoader() );
+        Object result = null;
+        try {
+            JavaResult javaResult = new JavaResult();
+            ExecutionContext executionContext = this.smooks.createExecutionContext();
+
+            Source source = null;
+            if ( object instanceof Source ) {
+                source = ( Source ) object;
+            } else if ( object instanceof InputStream ) {                
+                source =  new StreamSource( ( InputStream ) object );
+            } else if ( object instanceof Reader ) {                
+                source =  new StreamSource( ( Reader ) object );
+            } else if ( object instanceof Resource ) {                
+                source =  new StreamSource( ( ( Resource ) object).getReader() );
+            } else if ( object instanceof String ) {                 
+                source =  new StringSource( (String) object);
+            } else {
+                throw new IllegalArgumentException( "signal object must be instance of Source, InputStream, Reader, Resource or String" );
+            }
+            
+            this.smooks.filter( source,
+                                javaResult,
+                                executionContext );            
+            
+            result = javaResult.getBean( this.configuration.getRootId() );
+        } catch ( Exception e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+        emit( result,
+              context );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,62 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.SmooksTransformerProvider;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.BaseEmitter;
+import org.milyn.Smooks;
+import org.milyn.container.ExecutionContext;
+import org.milyn.payload.JavaResult;
+import org.milyn.payload.JavaSource;
+import org.milyn.payload.StringResult;
+
+public class SmooksToSourceTransformer extends BaseEmitter
+    implements
+    Transformer {
+    private Smooks smooks;
+
+    public SmooksToSourceTransformer(Smooks smooks) {
+        this.smooks = smooks;
+    }
+
+    public void receive(Object object,
+                        PipelineContext context) {
+        this.smooks.setClassLoader( context.getClassLoader() );
+        Object result = null;
+        try {
+            StringResult stringResult = new StringResult();
+            ExecutionContext executionContext = this.smooks.createExecutionContext();
+
+            this.smooks.filter( new JavaSource( object ),
+                                stringResult,
+                                executionContext );
+
+            result = stringResult.getResult();
+        } catch ( Exception e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+        emit( result,
+              context );
+    }
+
+//    public static class SmooksTransformerProviderImpl
+//        implements
+//        SmooksTransformerProvider {
+//        public Transformer newSmooksTransformer(Smooks smooks,
+//                                                String rootId) {
+//            DroolsSmooksConfiguration conf = new DroolsSmooksConfiguration( rootId );
+//            return new SmooksToSourceTransformer( smooks,
+//                                                  conf );
+//        }
+//    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,21 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.SmooksTransformerProvider;
+import org.drools.runtime.pipeline.Transformer;
+import org.milyn.Smooks;
+
+public class SmooksTransformerProviderImpl implements SmooksTransformerProvider {
+    public Transformer newSmooksFromSourceTransformer(Smooks smooks,
+                                                      String rootId) {
+        DroolsSmooksConfiguration conf = new DroolsSmooksConfiguration( rootId );
+        return new SmooksFromSourceTransformer( smooks,
+                                      conf );
+    }
+    
+    public Transformer newSmooksToSourceTransformer(Smooks smooks) {
+        return new SmooksToSourceTransformer( smooks );
+    }    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,118 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.core.util.StringUtils;
+import org.drools.grid.ExecutionNode;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.impl.StatelessKnowledgeSessionImpl;
+import org.drools.io.Resource;
+import org.drools.reteoo.ReteooRuleBase;
+import org.drools.runtime.CommandExecutor;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomReader;
+
+public class XStreamFromXmlGridTransformer extends BaseEmitter
+    implements
+    Transformer {
+
+    private XStreamResolverStrategy strategy;
+    private Object payload;
+    private PipelineContext context;
+    
+    private static Pattern p = Pattern.compile("[\"']?lookup[\"']?\\s*[:=]\\s*[\"']([^\"']+)[\"']");
+    
+    public XStreamFromXmlGridTransformer(XStreamResolverStrategy strategy) {
+        this.strategy = strategy;
+    }
+
+    public void receive(Object object,
+                        PipelineContext context) {            
+        this.payload = processPayload(object, context);
+        emit( this.payload,
+              context );
+    }
+
+    public Object processPayload(Object object, PipelineContext context) {
+        
+        try {
+            String str ;
+            if ( object instanceof String ) {
+                str = (String) object; 
+            } else if ( object instanceof Reader ) {
+                str = StringUtils.toString( ((Reader)object) );
+            } else if ( object instanceof InputStream ) {
+                str = StringUtils.toString( ((InputStream)object) );
+            } else if ( object instanceof Resource ) {
+                str = StringUtils.toString( ((Resource) object).getReader());
+            } else {
+                throw new IllegalArgumentException( "signal object must be instance of String, Reader, InputStream or Resource, was: " + object );
+            }                  
+            
+            Matcher m = p.matcher( str );
+            String name = null;
+            if ( m.find() ) {
+                name = m.group( 1 );
+            }
+            
+            XStream xstream = this.strategy.lookup(name);
+            if (xstream == null) {
+                throw new IllegalArgumentException("Unable to lookup XStream parser using name '" + name + "'");
+            }
+            ExecutionNodePipelineContextImpl executionNodeContext = (ExecutionNodePipelineContextImpl) context;
+            ExecutionNode node = executionNodeContext.getExecutionNode();
+            CommandExecutor executor = node.get(DirectoryLookupFactoryService.class).lookup(name);
+            if (executor == null) {
+                throw new IllegalArgumentException("Unable to lookup CommandExecutor using name '" + name + "'");
+            }
+            executionNodeContext.setCommandExecutor(executor);
+            ClassLoader cl = null;
+            if (executor instanceof StatefulKnowledgeSessionImpl) {
+                cl = ((ReteooRuleBase) (( StatefulKnowledgeSessionImpl ) executor).getRuleBase()).getRootClassLoader();
+                xstream.setClassLoader(cl);
+            } else if (executor instanceof StatelessKnowledgeSessionImpl) {
+                cl = ((ReteooRuleBase) (( StatelessKnowledgeSessionImpl ) executor).getRuleBase()).getRootClassLoader();
+            } else {
+                throw new IllegalArgumentException("Unable to set ClassLoader on " + executor);
+            }
+            xstream.setClassLoader(cl);
+            executionNodeContext.setClassLoader(cl);
+            payload = xstream.fromXML( ((String) object) );
+            context.getProperties().put("xstream-instance", xstream);
+            this.context = context;
+        } catch (Exception e) {
+            handleException(this, object, e);
+        }
+        return payload;
+    }
+
+    public Object getPayload() {
+        return payload;
+    }
+
+    public void setPayload(Object payload) {
+        this.payload = payload;
+    }
+
+    public PipelineContext getContext() {
+        return context;
+    }
+
+    public void setContext(PipelineContext context) {
+        this.context = context;
+    }
+    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,50 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamFromXmlTransformer extends BaseEmitter
+    implements  
+    Transformer {
+    private XStream                    xstream;   
+
+    public XStreamFromXmlTransformer(XStream xstream) {
+        this.xstream = xstream;
+
+    }
+
+    public void receive(Object object,
+                       PipelineContext context) {
+        this.xstream.setClassLoader( context.getClassLoader() );
+        Object result = null;
+        try {
+        	if ( object instanceof String ) {
+        	    result = this.xstream.fromXML( ( String ) object );
+        	} else  if ( object instanceof Reader ) {
+        		result = this.xstream.fromXML( ( Reader ) object );
+        	} else if ( object instanceof InputStream ) {
+        		result = this.xstream.fromXML( ( InputStream ) object );
+        	} else if ( object instanceof Resource ) {
+                result = this.xstream.fromXML( (( Resource ) object).getReader() );
+            } else {
+                throw new IllegalArgumentException( "signal object must be instance of InputStream or Resource" );
+            }
+        } catch ( Exception e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+        emit( result,
+              context );
+    }
+    
+    public void sniff(Reader reader) {
+        
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,10 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import com.thoughtworks.xstream.XStream;
+
+public interface XStreamResolverStrategy {
+    XStream lookup(String name);
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,43 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamToXmlGridTransformer extends BaseEmitter
+    implements
+    Transformer {
+    Object result = null;
+    public void receive(Object object,
+                        PipelineContext context) { 
+        this.result = transform(context, object);
+        
+        emit( result,
+              context );
+    }
+
+    public Object transform(PipelineContext context, Object object) {
+        XStream xstream = (XStream) context.getProperties().get( "xstream-instance" );
+        xstream.setClassLoader(context.getClassLoader());
+        Object result = null;
+        try {
+            result = xstream.toXML(object);
+        } catch (Exception e) {
+            handleException(this, object, e);
+        }
+        return result;
+    }
+
+    public Object getResult() {
+        return result;
+    }
+
+    public void setResult(Object result) {
+        this.result = result;
+    }
+    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,35 @@
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+
+
+public class XStreamToXmlTransformer extends BaseEmitter
+    implements
+    Transformer {
+    private XStream xstream;
+
+    public XStreamToXmlTransformer(XStream xstream) {
+        this.xstream = xstream;
+
+    }
+
+    public void receive(Object object,
+                        PipelineContext context) {
+        this.xstream.setClassLoader( context.getClassLoader() );
+        Object result = null;
+        try {
+            result = this.xstream.toXML( object );
+        } catch ( Exception e ) {
+            handleException( this,
+                             object,
+                             e );
+        }
+        emit( result,
+              context );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,19 @@
+/**
+ * 
+ */
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.XStreamTransformerProvider;
+
+import com.thoughtworks.xstream.XStream;
+ 
+public class XStreamTransformerProviderImpl implements XStreamTransformerProvider {
+    public Transformer newXStreamFromXmlTransformer(XStream xstream) {
+        return new XStreamFromXmlTransformer( xstream );
+    }
+    
+    public Transformer newXStreamToXmlTransformer(XStream xstream) {
+        return new XStreamToXmlTransformer( xstream );
+    }        
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://drools.org/drools-5.0/batch-execution" xmlns:batch-execution="http://drools.org/drools-5.0/batch-execution">
+  
+  <xs:annotation id="fact-instance-structure">
+    <xs:documentation>
+      
+      Data for fact instances are demonstrated below. The "shape" of these are driven by the module defined in the knowledge base.
+      These are simple structures representing the state of the object (type co-ercision is done by the server).
+      
+    </xs:documentation>
+    <xs:appinfo>
+      <ExamplePackage.ExampleFact>
+        <ExampleField1>sample value 1</ExampleField1>
+        <ExampleField2>sample value 2</ExampleField2>
+      </ExamplePackage.ExampleFact>
+      <ExamplePackage.ExampleFact2>
+        <ExampleField1>sample value 1</ExampleField1>
+        <ExampleField2>sample value 2</ExampleField2>
+      </ExamplePackage.ExampleFact2>
+    </xs:appinfo>
+    <xs:documentation>It is possible for fields to contain nested objects as their value. Also, a field can have a "reference" 
+      attribute which has an xpath expression to the referred value if necessary.</xs:documentation>
+  </xs:annotation>
+  
+  
+  <xs:element name="batch-execution">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:set-global"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:startProcess"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:insert-elements"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:get-objects"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:fire-all-rules"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:insert"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:get-global"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:query"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  
+  <xs:element name="set-global">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+        <xs:any/>
+      </xs:sequence>
+      <xs:attribute name="identifier" use="required" type="xs:string"/>
+      <xs:attribute name="out" type="xs:boolean"/>
+      <xs:attribute name="out-identifier" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="startProcess">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="batch-execution:parameter"/>
+      </xs:sequence>
+      <xs:attribute name="processId" use="required" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+        <xs:any/>
+      </xs:sequence>
+      <xs:attribute name="identifier" use="required" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="insert-elements">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+        <xs:any />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="get-objects">
+    <xs:complexType>
+      <xs:attribute name="out-identifier" use="required" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="fire-all-rules">
+    <xs:complexType/>
+  </xs:element>
+  <xs:element name="insert">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+        <xs:any/>
+      </xs:sequence>
+      <xs:attribute name="out-identifier" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="get-global">
+    <xs:complexType>
+      <xs:attribute name="identifier" use="required" type="xs:string"/>
+      <xs:attribute name="out-identifier" use="required" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="query">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:annotation><xs:appinfo>Fact instance structure</xs:appinfo></xs:annotation>
+        <xs:any minOccurs="0"/>
+      </xs:sequence>
+      <xs:attribute name="name" use="required" type="xs:string"/>
+      <xs:attribute name="out-identifier" use="required" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  
+</xs:schema>

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,51 @@
+package org.drools;
+
+import org.drools.event.rule.WorkingMemoryEventListener;
+import org.drools.event.rule.ObjectInsertedEvent;
+import org.drools.event.rule.ObjectUpdatedEvent;
+import org.drools.event.rule.ObjectRetractedEvent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Michael Neale
+ */
+public class ChangeCollector implements WorkingMemoryEventListener {
+
+    private List<String> retracted;
+    private List changes;
+
+
+
+
+    public List<String> getRetracted() {
+        return retracted;
+    }
+
+
+    public List getChanges() {
+        return changes;
+    }
+
+
+    public void objectInserted(ObjectInsertedEvent event) {
+        
+    }
+
+    public void objectUpdated(ObjectUpdatedEvent event) {
+        if (changes == null) changes = new ArrayList();
+        if (event.getObject() instanceof Cheese) {
+            Cheese c = (Cheese) event.getObject();
+            changes.add(c);
+        }
+    }
+
+    public void objectRetracted(ObjectRetractedEvent event) {
+        if (retracted == null) retracted = new ArrayList<String>();
+        if (event.getOldObject() instanceof Cheese) {
+            Cheese c = (Cheese) event.getOldObject();
+            retracted.add(c.getType());
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,122 @@
+package org.drools;
+
+
+import java.io.Serializable;
+import java.util.Date;
+
+/*
+ * 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.
+ */
+
+public class Cheese
+    implements
+    Serializable {
+
+    public static final String STILTON = "stilton";
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 400L;
+    private String            type;
+    private int               price;
+    private int               oldPrice;
+    private Date              usedBy;
+
+    public Cheese() {
+
+    }
+
+    public Cheese(final String type) {
+        super();
+        this.type = type;
+        this.price = 0;
+    }
+
+    public Cheese(final String type,
+                  final int price) {
+        super();
+        this.type = type;
+        this.price = price;
+    }
+
+    public Cheese(final String type,
+                  final int price,
+                  final int oldPrice ) {
+        super();
+        this.type = type;
+        this.price = price;
+        this.oldPrice = oldPrice;
+    }
+
+    public int getPrice() {
+        return this.price;
+    }
+
+    public String getType() {
+        return this.type;
+    }
+
+    public void setType(final String type) {
+        this.type = type;
+    }
+
+    public void setPrice(final int price) {
+        this.price = price;
+    }
+
+    public String toString() {
+        return "Cheese( type='" + this.type + "', price=" + this.price + " )";
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + price;
+        result = PRIME * result + ((type == null) ? 0 : type.hashCode());
+        return result;
+    }
+
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final Cheese other = (Cheese) obj;
+        if ( price != other.price ) return false;
+        if ( type == null ) {
+            if ( other.type != null ) return false;
+        } else if ( !type.equals( other.type ) ) return false;
+        return true;
+    }
+
+    public int getOldPrice() {
+        return oldPrice;
+    }
+
+    public void setOldPrice(int oldPrice) {
+        this.oldPrice = oldPrice;
+    }
+
+    public Date getUsedBy() {
+        return usedBy;
+    }
+
+    public void setUsedBy(Date usedBy) {
+        this.usedBy = usedBy;
+    }
+
+
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,269 @@
+package org.drools;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Person
+    implements
+    Serializable {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 400L;
+    private String            name;
+    private String            likes;
+    private int               age;
+    private BigDecimal        bigDecimal;
+    private BigInteger        bigInteger;
+    private String            hair;
+
+    private char              sex;
+
+    private boolean           alive;
+
+    private String            status;
+
+    private Cheese            cheese;
+
+    private List              addresses = new ArrayList();
+
+//    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+//        name    = (String)in.readObject();
+//        likes    = (String)in.readObject();
+//        age     = in.readInt();
+//        bigDecimal    = (BigDecimal)in.readObject();
+//        bigInteger    = (BigInteger)in.readObject();
+//        hair    = (String)in.readObject();
+//        sex     = in.readChar();
+//        alive   = in.readBoolean();
+//        status    = (String)in.readObject();
+//        cheese    = (Cheese)in.readObject();
+//        addresses    = (List)in.readObject();
+//    }
+//
+//    public void writeExternal(ObjectOutput out) throws IOException {
+//        out.writeObject(name);
+//        out.writeObject(likes);
+//        out.writeObject(bigDecimal);
+//        out.writeObject(bigInteger);
+//        out.writeObject(hair);
+//        out.writeChar(sex);
+//        out.writeBoolean(alive);
+//        out.writeObject(status);
+//        out.writeObject(cheese);
+//        out.writeObject(addresses);
+//    }
+
+    public List getAddresses() {
+        return addresses;
+    }
+
+    public void setAddresses(List addresses) {
+        this.addresses = addresses;
+    }
+
+    public Person() {
+
+    }
+
+    public Person(String name,
+                  int age) {
+        super();
+        this.name = name;
+        this.age = age;
+    }
+
+    public Person(final String name) {
+        this( name,
+              "",
+              0 );
+    }
+
+    public Person(final String name,
+                  final String likes) {
+        this( name,
+              likes,
+              0 );
+    }
+
+    public Person(final String name,
+                  final String likes,
+                  final int age) {
+        this.name = name;
+        this.likes = likes;
+        this.age = age;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#getStatus()
+     */
+    public String getStatus() {
+        return this.status;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#setStatus(java.lang.String)
+     */
+    public void setStatus(final String status) {
+        this.status = status;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#getLikes()
+     */
+    public String getLikes() {
+        return this.likes;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#getName()
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#getAge()
+     */
+    public int getAge() {
+        return this.age;
+    }
+
+    public void setAge(final int age) {
+        this.age = age;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#isAlive()
+     */
+    public boolean isAlive() {
+        return this.alive;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#setAlive(boolean)
+     */
+    public void setAlive(final boolean alive) {
+        this.alive = alive;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#getSex()
+     */
+    public char getSex() {
+        return this.sex;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#setSex(char)
+     */
+    public void setSex(final char sex) {
+        this.sex = sex;
+    }
+
+    public String getHair() {
+        return this.hair;
+    }
+
+    public void setHair(final String hair) {
+        this.hair = hair;
+    }
+
+    public String toString() {
+        return "[Person name='" + this.name + "']";
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.age;
+        result = PRIME * result + (this.alive ? 1231 : 1237);
+        result = PRIME * result + ((this.name == null) ? 0 : this.name.hashCode());
+        result = PRIME * result + this.sex;
+        return result;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean equals(final Object obj) {
+        if ( this == obj ) {
+            return true;
+        }
+        if ( obj == null ) {
+            return false;
+        }
+        if ( getClass() != obj.getClass() ) {
+            return false;
+        }
+        final Person other = (Person) obj;
+        if ( this.age != other.age ) {
+            return false;
+        }
+        if ( this.alive != other.alive ) {
+            return false;
+        }
+        if ( this.name == null ) {
+            if ( other.name != null ) {
+                return false;
+            }
+        } else if ( !this.name.equals( other.name ) ) {
+            return false;
+        }
+        if ( this.sex != other.sex ) {
+            return false;
+        }
+        return true;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#getBigDecimal()
+     */
+    public BigDecimal getBigDecimal() {
+        return this.bigDecimal;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#setBigDecimal(java.math.BigDecimal)
+     */
+    public void setBigDecimal(final BigDecimal bigDecimal) {
+        this.bigDecimal = bigDecimal;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#getBigInteger()
+     */
+    public BigInteger getBigInteger() {
+        return this.bigInteger;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.PersonInterface#setBigInteger(java.math.BigInteger)
+     */
+    public void setBigInteger(final BigInteger bigInteger) {
+        this.bigInteger = bigInteger;
+    }
+
+    public void setLikes(final String likes) {
+        this.likes = likes;
+    }
+
+    public Cheese getCheese() {
+        return this.cheese;
+    }
+
+    public void setCheese(final Cheese cheese) {
+        this.cheese = cheese;
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,22 @@
+/**
+ * 
+ */
+package org.drools;
+
+public class TestVariable {
+    
+    private String name;
+    
+    public TestVariable(String name) {
+        this.name = name;
+    }
+    
+    public String getName() {
+        return name;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,59 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Sample Department bean to demostrate main excel export features
+ * author: Leonid Vysochyn
+ */
+public class Company {
+    private String name;
+    private Employee chief = new Employee();
+    private List employee = new ArrayList();
+
+    public Company() {
+    }
+
+    public Company(String name) {
+        this.name = name;
+    }
+
+    public Company(String name, Employee chief, List staff) {
+        this.name = name;
+        this.chief = chief;
+        this.employee = staff;
+    }
+
+    public void addEmployee(Employee employee) {
+        this.employee.add(employee);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Employee getChief() {
+        return chief;
+    }
+
+    public void setChief(Employee chief) {
+        this.chief = chief;
+    }    
+
+    public List getEmployee() {
+        return employee;
+    }
+
+    public void setEmployee(List staff) {
+        this.employee = employee;
+    }
+    
+    public String toString() {
+        return "[Company name : " + this.name + " chief : " + this.chief + " staff : " + this.employee + "]";
+    }    
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,59 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Sample Department bean to demostrate main excel export features
+ * author: Leonid Vysochyn
+ */
+public class Department {
+    private String name;
+    private Employee chief = new Employee();
+    private List staff = new ArrayList();
+    
+    public Department() {
+    }
+
+    public Department(String name) {
+        this.name = name;
+    }
+
+    public Department(String name, Employee chief, List staff) {
+        this.name = name;
+        this.chief = chief;
+        this.staff = staff;
+    }
+
+    public void addEmployee(Employee employee) {
+        this.staff.add(employee);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Employee getChief() {
+        return chief;
+    }
+
+    public void setChief(Employee chief) {
+        this.chief = chief;
+    }
+
+    public List getStaff() {
+        return staff;
+    }
+
+    public void setStaff(List staff) {
+        this.staff = staff;
+    }
+    
+    public String toString() {
+        return "[Department name : " + this.name + " chief : " + this.chief + " staff : " + this.staff + "]";
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,120 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Sample Employee bean to demostrate simple export features
+ * @author Leonid Vysochyn
+ */
+public class Employee {
+    private String name;
+    private Integer age;
+    private Double payment;
+    private Double bonus;
+    private Date birthDate;
+    private Employee superior;
+    private List notes;
+    private String id;
+
+
+    public Employee() {
+    }
+
+    public List getNotes() {
+        return notes;
+    }
+
+    public void setNotes(List notes) {
+        this.notes = notes;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Employee(String name, Integer age, Double payment, Double bonus) {
+        this.name = name;
+        this.age = age;
+        this.payment = payment;
+        this.bonus = bonus;
+    }
+
+    public Employee(String name, int age, double payment, double bonus, Date birthDate) {
+        this.name = name;
+        this.age = new Integer(age);
+        this.payment = new Double(payment);
+        this.bonus = new Double(bonus);
+        this.birthDate = birthDate;
+    }
+
+    public Employee(String name, Double payment, Double bonus) {
+        this.name = name;
+        this.payment = payment;
+        this.bonus = bonus;
+    }
+
+    public Employee(String name, int age, double payment, double bonus) {
+        this.name = name;
+        this.age = new Integer(age);
+        this.payment = new Double(payment);
+        this.bonus = new Double(bonus);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getAge() {
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
+
+    public Double getPayment() {
+        return payment;
+    }
+
+    public void setPayment(Double payment) {
+        this.payment = payment;
+    }
+
+    public Double getBonus() {
+        return bonus;
+    }
+
+    public void setBonus(Double bonus) {
+        this.bonus = bonus;
+    }
+
+    public Date getBirthDate() {
+        return birthDate;
+    }
+
+    public void setBirthDate(Date birthDate) {
+        this.birthDate = birthDate;
+    }
+
+    public Employee getSuperior() {
+        return superior;
+    }
+
+    public void setSuperior(Employee superior) {
+        this.superior = superior;
+    }
+    
+    public String toString() {
+        return "[Employee name : " + this.name + "]"; 
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,1992 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.ChangeCollector;
+import org.drools.Cheese;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.Person;
+import org.drools.TestVariable;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.command.runtime.rule.ModifyCommand;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.definition.KnowledgePackage;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.local.LocalConnection;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.io.Resource;
+import org.drools.io.ResourceFactory;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.runtime.process.WorkflowProcessInstance;
+import org.drools.runtime.rule.FactHandle;
+import org.xml.sax.SAXException;
+
+import com.thoughtworks.xstream.XStream;
+
+public class JSonBatchExecutionTest extends TestCase {
+
+    protected void setUp() throws Exception {
+        XMLUnit.setIgnoreComments( true );
+        XMLUnit.setIgnoreWhitespace( true );
+        XMLUnit.setIgnoreAttributeOrder( true );
+        XMLUnit.setNormalizeWhitespace( true );
+        XMLUnit.setNormalize( true );
+    }
+
+    private void assertXMLEqual(String expectedXml,
+                                String resultXml) {
+        try {
+            Diff diff = new Diff( expectedXml,
+                                  resultXml );
+            diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+            XMLAssert.assertXMLEqual( diff,
+                                      true );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "XML Assertion failure",
+                                        e );
+        }
+    }
+
+    public void testListenForChanges() throws Exception {
+
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "import org.drools.ChangeCollector \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese(price==25) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "end\n";
+
+        str += "rule rule2 \n";
+        str += "  when \n";
+        str += "    p : Person(name=='mic') \n";
+        str += "    c : Cheese(price != 42) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    c.setPrice( 42 ); \n";
+        str += "    update(c); \n";
+        str += "end\n";
+
+        str += "rule rule3 \n";
+        str += "  when \n";
+        str += "    p : Person(name=='mark') \n";
+        str += "    c : Cheese(price == 42) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    retract(c); \n";
+        str += "end\n";
+
+        str += "rule ruleBootStrap \n";
+        str += "salience 10000\n";
+        str += "  when \n";
+        str += "    $c : ChangeCollector() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    kcontext.getKnowledgeRuntime().addEventListener($c); \n";
+        str += "end\n";
+
+        str += "rule ruleCleanup \n";
+        str += "salience -10000\n";
+        str += "  when \n";
+        str += "    $c : ChangeCollector() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    kcontext.getKnowledgeRuntime().removeEventListener($c); \n";
+        str += "    retract($c); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );    
+                
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"insert\":{\"object\":{\"org.drools.Person\":{\"name\":\"mic\"} }, \"out-identifier\":\"person\" } }";
+        inXml += ",  {\"insert\":{\"object\":{\"org.drools.ChangeCollector\":{} }, \"out-identifier\":\"changes\" } }";        
+        inXml += ",  {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );    
+                        
+        
+        resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+        
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result );        
+        ChangeCollector collector = ( ChangeCollector ) result.getValue( "changes" );
+        Cheese c = ( Cheese ) collector.getChanges().get( 0 );
+        assertEquals( 42, c.getPrice() );
+
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"insert\":{\"object\":{\"org.drools.Person\":{\"name\":\"mark\"} }, \"out-identifier\":\"person\" } }";
+        inXml += ",  {\"insert\":{\"object\":{\"org.drools.ChangeCollector\":{} }, \"out-identifier\":\"changes\" } }";        
+        inXml += ",  {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";  
+        inXml = roundTripFromXml( inXml );
+        
+        resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        
+        outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+        
+        result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result );        
+        collector = ( ChangeCollector ) result.getValue( "changes" );
+        assertEquals( "stilton", collector.getRetracted().get( 0 ) );        
+
+    }
+
+    public void testInsertWithDefaults() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );    
+        
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );        
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result );
+        
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        stilton = (Cheese) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );        
+
+//        String expectedXml = "";
+//        expectedXml = "{\"execution-results\":{\"results\":{\"outStilton\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"oldPrice\":0,\"price\":30}}},\"fact-handles\":{\"outStilton\":\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\"}}}";
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier=\"outStilton\">\n";
+//        expectedXml += "    <org.drools.Cheese>\n";
+//        expectedXml += "      <type>stilton</type>\n";
+//        expectedXml += "      <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      <price>30</price>\n";
+//        expectedXml += "    </org.drools.Cheese>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+//        JSONAssert.assertEquals( expectedXml, outXml );
+    }
+
+    public void testInsertWithReturnObjectFalse() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"return-object\":false, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml ); 
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml ); 
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject ( result );
+        assertNull( result.getValue( "outStilton" ) );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        Cheese stilton = (Cheese) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+    }
+
+    public void testGetObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":{\"max\":10}}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );
+        
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();        
+        outXml = roundTripFromXml( outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults) roundTripFromObject( result );
+        
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"get-object\":{ ";
+        inXml += "      \"out-identifier\":'outStilton',";
+        inXml += "      \"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+        inXml += "]}}";   
+        inXml = roundTripFromXml( inXml );        
+      
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+        
+        result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults) roundTripFromObject( result );
+        stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+    }
+
+    public void testRetractObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":{\"max\":10}}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults) roundTripFromObject( result );
+        
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "  { \"retract\":{\"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+        inXml += "]}}";   
+        inXml = roundTripFromXml( inXml );
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"get-object\":{ ";
+        inXml += "      \"out-identifier\":'outStilton',";
+        inXml += "      \"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+        inXml += "]}}";   
+        inXml = roundTripFromXml( inXml );
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults) roundTripFromObject( result );
+        assertNull( result.getValue( "outStilton" ) );
+    }
+
+    public void testModifyObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = ((FactHandle) result.getFactHandle( "outStilton" ));
+//
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier=\"outStilton\">\n";
+//        expectedXml += "    <org.drools.Cheese>\n";
+//        expectedXml += "      <type>stilton</type>\n";
+//        expectedXml += "      <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      <price>30</price>\n";
+//        expectedXml += "    </org.drools.Cheese>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+        
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"modify\":{\"fact-handle\":'" + factHandle.toExternalForm() + "'";
+        inXml += ",                \"setters\":[{\"accessor\":\"oldPrice\",\"set\":42}, {\"accessor\":\"price\",\"set\":50}]";
+        inXml += "} }";        
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";   
+        inXml = roundTripFromXml( inXml );        
+        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"get-object\":{ ";
+        inXml += "      \"out-identifier\":'outCheddar',";
+        inXml += "      \"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+        inXml += "]}}";   
+        inXml = roundTripFromXml( inXml );
+        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+        result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject ( result );
+        Cheese cheddar = (Cheese) result.getValue( "outCheddar" );
+        assertEquals( 42,
+                      cheddar.getOldPrice() );
+        assertEquals( 55,
+                      cheddar.getPrice() );
+
+        //now test for code injection:
+        ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = false;        
+        inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"modify\":{\"fact-handle\":'" + factHandle.toExternalForm() + "'";
+        inXml += ",                \"setters\":[{\"accessor\":\"type\",\"set\":\"44; System.exit(1);\"}, {\"accessor\":\"price\",\"set\":50}]";
+        inXml += "} }";        
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";   
+        inXml = roundTripFromXml( inXml );           
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = true;
+
+    }
+
+    public void testInsertElements() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list1 \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "     list1.add( $c );";
+        str += "end\n";
+        
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+        inXml += "                   ,\"object\":{\"list\":{\"object\":[]}}";
+        inXml += "   } } "; //        
+        inXml += ",  {\"insert-elements\":{\"objects\":[";        
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";        
+        inXml += "   ]}}";
+        inXml += "]}}";                 
+        inXml = roundTripFromXml( inXml );         
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();                
+        outXml = roundTripFromXml( outXml );
+        
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier='list'>\n";
+//        expectedXml += "    <list>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>35</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>30</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "    </list>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+//
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result );
+        List list = (List) result.getValue( "list1" );
+        Cheese stilton25 = new Cheese( "stilton",
+                                       30 );
+        Cheese stilton30 = new Cheese( "stilton",
+                                       35 );
+
+        Set expectedList = new HashSet();
+        expectedList.add( stilton25 );
+        expectedList.add( stilton30 );
+
+        assertEquals( expectedList,
+                      new HashSet( list ) );
+    }
+
+    public void testFactHandleReturn() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list1 \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    System.err.println(42); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"get-global\":{\"identifier\":\"list1\",\"out-identifier\":\"out-list\"}}";               
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );          
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        FactHandle fh = ksession.insert( new Person( "mic",
+                                                     42 ) );
+        List<FactHandle> list = new ArrayList<FactHandle>();
+        list.add( fh );
+
+        ksession.setGlobal( "list1",
+                            list );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+        
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result );
+        List outList = ( List ) result.getValue( "out-list" );
+        assertEquals( 1, outList.size() );
+        assertEquals( fh.toExternalForm(), ((FactHandle)outList.get(0)).toExternalForm() );
+        assertNotSame( fh, outList.get( 0 ));
+        
+
+//        System.err.println( outXml );
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n" + "  <result identifier=\"out-list\">\n" + "    <list>\n" + "      <fact-handle externalForm=\"" + fh.toExternalForm() + "\"/>\n" + "    </list>\n" + "  </result>\n" + "</execution-results>";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+
+    }
+
+    public void testInsertElementsWithReturnObjects() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list1 \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "    list1.add( $c );";
+        str += "end\n";
+        
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+        inXml += "                   ,\"object\":{\"list\":{\"object\":[]}}";
+        inXml += "   } } "; //        
+        inXml += ",  {\"insert-elements\":{\"out-identifier\":\"myfacts\",\"return-objects\":true,\"objects\":[";        
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";        
+        inXml += "   ]}}";
+        inXml += ", {\"fire-all-rules\":\"\"}";        
+        inXml += "]}}";                 
+        inXml = roundTripFromXml( inXml );        
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+        
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults) roundTripFromObject( result );
+        
+        List list1 = ( List ) result.getValue( "list1" );
+        assertEquals( 2, list1.size() );
+        assertTrue( list1.contains( new Cheese("stilton", 35) ) );
+        assertTrue( list1.contains( new Cheese("stilton", 30) ) );          
+        
+        List myFacts = ( List ) result.getValue( "myfacts" );
+        assertEquals( 2, list1.size() );
+        assertTrue( myFacts.contains( new Cheese("stilton", 35) ) );
+        assertTrue( myFacts.contains( new Cheese("stilton", 30) ) );        
+        
+        List factHandles = ( List ) result.getFactHandle( "myfacts" );
+        List list = new ArrayList();
+        list.add( ksession.getObject( ((InternalFactHandle)factHandles.get( 0 )) ) );
+        list.add( ksession.getObject( ((InternalFactHandle)factHandles.get( 1 )) ) );
+        assertTrue( list.contains( new Cheese("stilton", 35) ) );
+        assertTrue( list.contains( new Cheese("stilton", 30) ) );          
+
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier='list'>\n";
+//        expectedXml += "    <list>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>35</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>30</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "    </list>\n";
+//        expectedXml += "  </result>\n";
+//
+//        expectedXml += "  <result identifier=\"myfacts\">\n";
+//        expectedXml += "  <list>\n";
+//        expectedXml += "    <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese[2]\"/>\n";
+//        expectedXml += "    <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese\"/>\n";
+//        expectedXml += "  </list>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <fact-handles identifier=\"myfacts\">\n";
+//        for ( FactHandle factHandle : factHandles ) {
+//            if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 30 ) {
+//                expectedXml += "  <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+//            }
+//        }
+//
+//        for ( FactHandle factHandle : factHandles ) {
+//            if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 35 ) {
+//                expectedXml += "  <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+//            }
+//        }
+//        expectedXml += "  </fact-handles>\n";
+//
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+    }
+
+    public void testSetGlobal() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list1 \n";
+        str += "global java.util.List list2 \n";
+        str += "global java.util.List list3 \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( 30 ); \n";
+        str += "    list1.add( $c ); \n";
+        str += "    list2.add( $c ); \n";
+        str += "    list3.add( $c ); \n";
+        str += "end\n";
+        
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += " {\"set-global\":{\"identifier\":\"list1\"";
+        inXml += "                  ,\"object\":{\"list\":{\"object\":[]}}";
+        inXml += "} } ";   
+        inXml += ", {\"set-global\":{\"identifier\":\"list2\",\"out\"=true";
+        inXml += "                  ,\"object\":{\"list\":{\"object\":[]}}";
+        inXml += "} } ";
+        inXml += ", {\"set-global\":{\"identifier\":\"list3\",\"out-identifier\"=\"outList3\"";
+        inXml += "                  ,\"object\":{\"list\":{\"object\":[]}}";
+        inXml += "} } ";        
+        inXml += ", {\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":5}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml ); 
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier='list2'>\n";
+//        expectedXml += "    <list>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>30</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "    </list>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <result identifier='outList3'>\n";
+//        expectedXml += "    <list>\n";
+//        expectedXml += "      <org.drools.Cheese reference='../../../result/list/org.drools.Cheese'/>\n";
+//        expectedXml += "    </list>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+//
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        Cheese stilton = new Cheese( "stilton",
+                                     30 );
+
+        assertNull( result.getValue( "list1" ) );
+
+        List list2 = (List) result.getValue( "list2" );
+        assertEquals( 1,
+                      list2.size() );
+        assertEquals( stilton,
+                      list2.get( 0 ) );
+
+        List list3 = (List) result.getValue( "outList3" );
+        assertEquals( 1,
+                      list3.size() );
+        assertEquals( stilton,
+                      list3.get( 0 ) );
+    }
+
+    public void testGetGlobal() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list1 \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    list1.add( $c ); \n";
+        str += "end\n";
+        
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+        inXml += "                   ,\"object\":{\"list\":{\"object\":[]}}";
+        inXml += "   } } "; //        
+        inXml += ",  {\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ",  {\"get-global\":{\"identifier\":\"list1\",\"out-identifier\"=\"out-list\"}}";               
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );         
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+        
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result );
+        List resultsList = ( List ) result.getValue("out-list");
+        assertEquals(1, resultsList.size() );
+        assertEquals(new Cheese("stilton",25), resultsList.get(0));
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier=\"out-list\">\n";
+//        expectedXml += "    <list>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>25</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "    </list>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+    }
+
+    public void testGetObjects() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml ="";
+        inXml =  "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"insert-elements\":{\"objects\":[";        
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";        
+        inXml += "   ]}}";
+        inXml += ",  {\"get-objects\":{\"out-identifier\":\"list1\"}}";        
+        inXml += "]}}";     
+        inXml = roundTripFromXml( inXml );
+        
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml );
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>";
+//        expectedXml += "  <result identifier='list'>";
+//        expectedXml += "    <list>";
+//        expectedXml += "      <org.drools.Cheese>";
+//        expectedXml += "        <type>stilton</type>";
+//        expectedXml += "        <price>30</price>";
+//        expectedXml += "        <oldPrice>0</oldPrice>";
+//        expectedXml += "      </org.drools.Cheese>";
+//        expectedXml += "      <org.drools.Cheese>";
+//        expectedXml += "        <type>stilton</type>";
+//        expectedXml += "        <price>35</price>";
+//        expectedXml += "        <oldPrice>0</oldPrice>";
+//        expectedXml += "      </org.drools.Cheese>";
+//        expectedXml += "    </list>";
+//        expectedXml += "  </result>";
+//        expectedXml += "</execution-results>";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+//
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = ( ExecutionResults ) roundTripFromObject( result ); 
+        List list = (List) result.getValue( "list1" );
+        Cheese stilton25 = new Cheese( "stilton",
+                                       30 );
+        Cheese stilton30 = new Cheese( "stilton",
+                                       35 );
+
+        Set expectedList = new HashSet();
+        expectedList.add( stilton25 );
+        expectedList.add( stilton30 );
+
+        assertEquals( expectedList,
+                      new HashSet( list ) );
+    }
+
+    public void testQuery() throws Exception {
+        String str = "";
+        str += "package org.drools.test  \n";
+        str += "import org.drools.Cheese \n";
+        str += "query cheeses \n";
+        str += "    stilton : Cheese(type == 'stilton') \n";
+        str += "    cheddar : Cheese(type == 'cheddar', price == stilton.price) \n";
+        str += "end\n";
+        str += "query cheesesWithParams(String a, String b) \n";
+        str += "    stilton : Cheese(type == a) \n";
+        str += "    cheddar : Cheese(type == b, price == stilton.price) \n";
+        str += "end\n";
+
+        String inXml ="";
+        inXml =  "{\"batch-execution\":{\"commands\":[";
+        inXml += "  {\"insert-elements\":{\"objects\":[";        
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":2}}, ";
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"cheddar\",\"price\":1}}, ";
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"cheddar\",\"price\":2}}, ";
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":1}}  ";        
+        inXml += "   ]}}";
+        inXml += ",  {\"query\":{\"out-identifier\":\"cheeses\",\"name\":\"cheeses\"}}";        
+        inXml += "]}}";     
+        inXml = roundTripFromXml( inXml );        
+        
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();        
+        outXml = roundTripFromXml( outXml );
+
+//        Iterator<QueryResultsRow> it1 = ksession.getQueryResults( "cheeses" ).iterator();
+//        Iterator<QueryResultsRow> it2 = ksession.getQueryResults( "cheesesWithParams",
+//                                                                  new String[]{"stilton", "cheddar"} ).iterator();
+//        QueryResultsRow row = null;
+//
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier='cheeses'>\n";
+//        expectedXml += "    <query-results>\n";
+//        expectedXml += "      <identifiers>\n";
+//        expectedXml += "        <identifier>stilton</identifier>\n";
+//        expectedXml += "        <identifier>cheddar</identifier>\n";
+//        expectedXml += "      </identifiers>\n";
+//        expectedXml += "      <row>\n";
+//        row = it1.next();
+//        expectedXml += "        <org.drools.Cheese>\n";
+//        expectedXml += "          <type>stilton</type>\n";
+//        expectedXml += "          <price>1</price>\n";
+//        expectedXml += "          <oldPrice>0</oldPrice>\n";
+//        expectedXml += "        </org.drools.Cheese>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+//        expectedXml += "        <org.drools.Cheese>\n";
+//        expectedXml += "          <type>cheddar</type>\n";
+//        expectedXml += "          <price>1</price>\n";
+//        expectedXml += "          <oldPrice>0</oldPrice>\n";
+//        expectedXml += "        </org.drools.Cheese>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+//        expectedXml += "      </row>\n";
+//        expectedXml += "      <row>\n";
+//        row = it1.next();
+//        expectedXml += "        <org.drools.Cheese>\n";
+//        expectedXml += "          <type>stilton</type>\n";
+//        expectedXml += "          <price>2</price>\n";
+//        expectedXml += "          <oldPrice>0</oldPrice>\n";
+//        expectedXml += "        </org.drools.Cheese>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+//        expectedXml += "        <org.drools.Cheese>\n";
+//        expectedXml += "          <type>cheddar</type>\n";
+//        expectedXml += "          <price>2</price>\n";
+//        expectedXml += "          <oldPrice>0</oldPrice>\n";
+//        expectedXml += "        </org.drools.Cheese>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+//        expectedXml += "      </row>\n";
+//        expectedXml += "    </query-results>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <result identifier='cheeses2'>\n";
+//        expectedXml += "    <query-results>\n";
+//        expectedXml += "      <identifiers>\n";
+//        expectedXml += "        <identifier>stilton</identifier>\n";
+//        expectedXml += "        <identifier>cheddar</identifier>\n";
+//        expectedXml += "      </identifiers>\n";
+//        expectedXml += "      <row>\n";
+//        row = it2.next();
+//        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese\"/>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+//        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese[2]\"/>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+//        expectedXml += "      </row>\n";
+//        expectedXml += "      <row>\n";
+//        row = it2.next();
+//        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese\"/>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+//        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese[2]\"/>\n";
+//        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+//        expectedXml += "      </row>\n";
+//        expectedXml += "    </query-results>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+//
+        ExecutionResults batchResult = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        batchResult = ( ExecutionResults ) roundTripFromObject( batchResult );
+
+        Cheese stilton1 = new Cheese( "stilton",
+                                      1 );
+        Cheese cheddar1 = new Cheese( "cheddar",
+                                      1 );
+        Cheese stilton2 = new Cheese( "stilton",
+                                      2 );
+        Cheese cheddar2 = new Cheese( "cheddar",
+                                      2 );
+
+        Set set = new HashSet();
+        List list = new ArrayList();
+        list.add( stilton1 );
+        list.add( cheddar1 );
+        set.add( list );
+
+        list = new ArrayList();
+        list.add( stilton2 );
+        list.add( cheddar2 );
+        set.add( list );
+
+        org.drools.runtime.rule.QueryResults results = (org.drools.runtime.rule.QueryResults) batchResult.getValue( "cheeses" );
+        assertEquals( 2,
+                      results.size() );
+        assertEquals( 2,
+                      results.getIdentifiers().length );
+        Set newSet = new HashSet();
+        for ( org.drools.runtime.rule.QueryResultsRow result : results ) {
+            list = new ArrayList();
+            list.add( result.get( "stilton" ) );
+            list.add( result.get( "cheddar" ) );
+            newSet.add( list );
+        }
+        assertEquals( set,
+                      newSet );
+    }
+
+    public void testManualFireAllRules() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list1 \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "    list1.add( $c );";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+        inXml += "                   ,\"object\":{\"list\":{\"object\":[]}}";
+        inXml += "   } } "; //        
+        inXml += ",  {\"insert-elements\":{\"objects\":[";        
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+        inXml += "   {   \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";        
+        inXml += "   ]}}";
+        inXml += ", {\"fire-all-rules\":\"\"}";  
+        inXml += ", {\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"brie\",\"price\":10,\"oldPrice\":0}}, \"out-identifier\":\"outBrie\" } }";        
+        inXml += "]}}";                 
+        inXml = roundTripFromXml( inXml );         
+        
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        FactHandle factHandle = (FactHandle) ((ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml )).getFactHandle( "outBrie" );
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier='list'>\n";
+//        expectedXml += "    <list>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>35</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "      <org.drools.Cheese>\n";
+//        expectedXml += "        <type>stilton</type>\n";
+//        expectedXml += "        <price>30</price>\n";
+//        expectedXml += "        <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      </org.drools.Cheese>\n";
+//        expectedXml += "    </list>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <result identifier='outBrie'>\n";
+//        expectedXml += "    <org.drools.Cheese>\n";
+//        expectedXml += "      <type>brie</type>\n";
+//        expectedXml += "      <price>10</price>\n";
+//        expectedXml += "      <oldPrice>5</oldPrice>\n";
+//        expectedXml += "    </org.drools.Cheese>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <fact-handle identifier=\"outBrie\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+//        expectedXml += "</execution-results>\n";
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = (ExecutionResults) roundTripFromObject( result );
+
+        // brie should not have been added to the list
+        List list = (List) result.getValue( "list1" );
+        Cheese stilton25 = new Cheese( "stilton",
+                                       30 );
+        Cheese stilton30 = new Cheese( "stilton",
+                                       35 );
+
+        Set expectedList = new HashSet();
+        expectedList.add( stilton25 );
+        expectedList.add( stilton30 );
+
+        assertEquals( expectedList,
+                      new HashSet( list ) );
+
+        // brie should not have changed
+        Cheese brie10 = new Cheese( "brie",
+                                    10 );
+        brie10.setOldPrice( 5 );
+        assertEquals( brie10,
+                      result.getValue( "outBrie" ) );
+    }
+
+    public void testProcess() throws SAXException,
+                             IOException {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <imports>\n";
+        str += "      <import name=\"org.drools.TestVariable\" />\n";
+        str += "    </imports>\n";
+        str += "    <globals>\n";
+        str += "      <global identifier=\"list1\" type=\"java.util.List\" />\n";
+        str += "    </globals>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"person\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"TestVariable\" />\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <actionNode id=\"2\" name=\"MyActionNode\" >\n";
+        str += "      <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Triggered\");\n";
+        str += "list1.add(person.name);\n";
+        str += "</action>\n";
+        str += "    </actionNode>\n";
+        str += "    <end id=\"3\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"2\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "  </connections>\n" + "\n";
+        str += "</process>";
+
+        Reader source = new StringReader( str );
+        kbuilder.add( ResourceFactory.newReaderResource( source ),
+                      ResourceType.DRF );
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal( "list1",
+                            list );
+        TestVariable person = new TestVariable( "John Doe" );
+        
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"start-process\":";
+        inXml += "      {\"process-id\":\"org.drools.actions\",";
+        inXml += "     \"parameters\":[";
+        inXml += "        {\"identifier\":\"person\",";
+        inXml += "         \"object\":{\"@class\":\"org.drools.TestVariable\",";
+        inXml += "                     \"name\":\"John Doe\"}}]}},";
+        inXml += "    {\"get-global\":{\"identifier\":\"list1\",\"out-identifier\":\"out-list\"}}]}}";       
+        inXml = roundTripFromXml( inXml );
+        
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+        outXml = roundTripFromXml( outXml ); 
+        
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        result = (ExecutionResults) roundTripFromObject( result );
+        list = (List) result.getValue( "out-list" );
+        
+        assertEquals( 1,
+                      list.size() );
+        assertEquals( "John Doe",
+                      list.get( 0 ) );
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier=\"out-list\">\n";
+//        expectedXml += "    <list>\n";
+//        expectedXml += "      <string>John Doe</string>\n";
+//        expectedXml += "    </list>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+    }
+
+    public void testProcessInstanceSignalEvent() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"MyVar\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>SomeText</value>\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <eventNode id=\"2\" name=\"Event\" variableName=\"MyVar\" >\n";
+        str += "      <eventFilters>\n";
+        str += "        <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+        str += "      </eventFilters>\n";
+        str += "    </eventNode>\n";
+        str += "    <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+        str += "    <end id=\"4\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"3\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "    <connection from=\"3\" to=\"4\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";
+
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRF );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"signal-event\":{\"process-instance-id\":" + processInstance.getId() +",\"event-type\":\"MyEvent\"";
+        inXml += "                   ,\"object\":{\"string\":[\"MyValue\"]} } }";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );         
+
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        assertEquals( "MyValue",
+                      ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+    }
+
+    public void testProcessRuntimeSignalEvent() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"MyVar\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>SomeText</value>\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <eventNode id=\"2\" name=\"Event\" scope=\"external\" variableName=\"MyVar\" >\n";
+        str += "      <eventFilters>\n";
+        str += "        <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+        str += "      </eventFilters>\n";
+        str += "    </eventNode>\n";
+        str += "    <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+        str += "    <end id=\"4\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"3\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "    <connection from=\"3\" to=\"4\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";
+
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRF );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"signal-event\":{\"event-type\":\"MyEvent\"";
+        inXml += "                    ,\"object\":{\"string\":[\"MyValue\"]} } }";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );             
+
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        assertEquals( "MyValue",
+                      ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+    }
+
+    public void testCompleteWorkItem() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"UserName\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>John Doe</value>\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Person\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"MyObject\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Number\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <workItem id=\"2\" name=\"HumanTask\" >\n";
+        str += "      <work name=\"Human Task\" >\n";
+        str += "        <parameter name=\"ActorId\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{UserName}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Content\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{Person.name}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"TaskName\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>Do something</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Priority\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Comment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Attachment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "        </parameter>\n";
+        str += "      </work>\n";
+        str += "      <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+        str += "      <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+        str += "      <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+        str += "      <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+        str += "    </workItem>\n";
+        str += "    <end id=\"3\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"2\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";        
+        
+        Reader source = new StringReader( str );
+        kbuilder.add( ResourceFactory.newReaderResource( source ),
+                      ResourceType.DRF );
+
+        Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kpkgs );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        TestWorkItemHandler handler = new TestWorkItemHandler();
+        ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+                                                               handler );
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "John Doe" );
+        Person person = new Person();
+        person.setName( "John Doe" );
+        parameters.put( "Person",
+                        person );
+        WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+                                                                                                   parameters );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+        assertEquals( "John Doe",
+                      workItem.getParameter( "ActorId" ) );
+        assertEquals( "John Doe",
+                      workItem.getParameter( "Content" ) );
+        assertEquals( "John Doe",
+                      workItem.getParameter( "Comment" ) );
+
+        assertEquals( WorkItem.PENDING,
+                      workItem.getState() );
+
+        String inXml = "";
+        inXml = "{\"complete-work-item\":{\"id\":" + workItem.getId() + "}}";                
+        inXml = roundTripFromXml( inXml );
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( WorkItem.COMPLETED,
+                      workItem.getState() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+
+        parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "Jane Doe" );
+        parameters.put( "MyObject",
+                        "SomeString" );
+        person = new Person();
+        person.setName( "Jane Doe" );
+        parameters.put( "Person",
+                        person );
+        processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+                                                                           parameters );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+        assertEquals( "Jane Doe",
+                      workItem.getParameter( "ActorId" ) );
+        assertEquals( "SomeString",
+                      workItem.getParameter( "Attachment" ) );
+        assertEquals( "Jane Doe",
+                      workItem.getParameter( "Content" ) );
+        assertEquals( "Jane Doe",
+                      workItem.getParameter( "Comment" ) );
+
+        assertEquals( WorkItem.PENDING,
+                      workItem.getState() );
+           
+        inXml = "{\"complete-work-item\":{\"id\":" + workItem.getId() + ",\"results\":{\"identifier\":\"Result\",\"object\":{\"@class\":\"string\",\"$\":\"SomeOtherString\"}}}}";
+        inXml = roundTripFromXml( inXml );
+        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( WorkItem.COMPLETED,
+                      workItem.getState() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        assertEquals( "SomeOtherString",
+                      processInstance.getVariable( "MyObject" ) );
+        assertEquals( 15,
+                      processInstance.getVariable( "Number" ) );
+    }
+
+    public void testAbortWorkItem() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"UserName\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>John Doe</value>\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Person\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"MyObject\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Number\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <workItem id=\"2\" name=\"HumanTask\" >\n";
+        str += "      <work name=\"Human Task\" >\n";
+        str += "        <parameter name=\"ActorId\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{UserName}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Content\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{Person.name}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"TaskName\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>Do something</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Priority\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Comment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Attachment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "        </parameter>\n";
+        str += "      </work>\n";
+        str += "      <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+        str += "      <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+        str += "      <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+        str += "      <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+        str += "    </workItem>\n";
+        str += "    <end id=\"3\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"2\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";
+
+        Reader source = new StringReader( str );
+        kbuilder.add( ResourceFactory.newReaderResource( source ),
+                      ResourceType.DRF );
+
+        Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kpkgs );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        TestWorkItemHandler handler = new TestWorkItemHandler();
+        ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+                                                               handler );
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "John Doe" );
+        Person person = new Person();
+        person.setName( "John Doe" );
+        parameters.put( "Person",
+                        person );
+        WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+                                                                                                   parameters );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+
+        assertEquals( WorkItem.PENDING,
+                      workItem.getState() );
+
+        String inXml = "{\"abort-work-item\":{\"id\":" + workItem.getId() + "}}";
+        inXml = roundTripFromXml( inXml );
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( WorkItem.ABORTED,
+                      workItem.getState() );
+    }
+
+    public static class TestWorkItemHandler
+        implements
+        WorkItemHandler {
+        private WorkItem workItem;
+
+        public void executeWorkItem(WorkItem workItem,
+                                    WorkItemManager manager) {
+            this.workItem = workItem;
+        }
+
+        public void abortWorkItem(WorkItem workItem,
+                                  WorkItemManager manager) {
+        }
+
+        public WorkItem getWorkItem() {
+            return workItem;
+        }
+    }
+
+    public void testInsertObjectWithDeclaredFact() throws Exception {
+        String str = "";
+        str += "package org.foo \n";
+        str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Whee() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.foo.Whee\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";        
+        //inXml = roundTripFromXml( inXml );   // can't round trip, as dosn't have the correct class loader       
+        
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        ClassLoader cl = ((InternalRuleBase) ((StatefulKnowledgeSessionImpl) ksession).getRuleBase()).getRootClassLoader();
+        XStream xstream = BatchExecutionHelper.newJSonMarshaller();
+        xstream.setClassLoader( cl );
+        FactHandle factHandle = (FactHandle) ((ExecutionResults) xstream.fromXML( outXml )).getFactHandle( "outStilton" );        
+        assertNotNull( factHandle );
+        
+        Object object = ((ExecutionResults) xstream.fromXML( outXml )).getValue( "outStilton" );        
+        assertEquals( "org.foo.Whee", object.getClass().getName() );
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier=\"outStilton\">\n";
+//        expectedXml += "    <org.foo.Whee>\n";
+//        expectedXml += "      <type>stilton</type>\n";
+//        expectedXml += "      <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      <price>30</price>\n";
+//        expectedXml += "    </org.foo.Whee>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+
+    }
+
+    public void testInsertObjectStateful() throws Exception {
+        String str = "";
+        str += "package org.foo \n";
+        str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Whee(price < 30) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n update($c);\n";
+        str += "end\n";
+        str += "query results\n";
+        str += "    w: Whee(price > 0)";
+        str += "end\n";
+        
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.foo.Whee\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}} } }";
+        inXml += "]}}";        
+        //inXml = roundTripFromXml( inXml );   // can't round trip, as dosn't have the correct class loader           
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        inXml = "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"query\":{\"out-identifier\":\"matchingthings\",\"name\":\"results\"}}";
+        inXml += "]}}";         
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        //we have not fired the rules yet
+        assertTrue( outXml.indexOf( "\"price\":25" ) >= 0 );
+
+        getPipelineStateful( ksession ).insert( "{\"fire-all-rules\":\"\"}",
+                                                resultHandler );
+
+        //ok lets try that again...
+        inXml = "{\"batch-execution\":{\"commands\":[";
+        inXml += "   {\"query\":{\"out-identifier\":\"matchingthings\",\"name\":\"results\"}}";
+        inXml += "]}}";          
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        assertTrue( outXml.indexOf( "\"price\":30" ) >= 0 );
+    }
+
+    public void testVsmPipeline() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "{\"batch-execution\":{\"lookup\":\"ksession1\", \"commands\":[";
+        inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+        inXml += ", {\"fire-all-rules\":\"\"}";
+        inXml += "]}}";        
+        inXml = roundTripFromXml( inXml );        
+        
+        LocalConnection connection = new LocalConnection();
+        ExecutionNode node = connection.getExecutionNode(null);
+
+        StatefulKnowledgeSession ksession = getExecutionNodeSessionStateful(node, ResourceFactory.newByteArrayResource( str.getBytes() ) );
+
+        node.get(DirectoryLookupFactoryService.class).register("ksession1", ksession);
+
+        XStreamResolverStrategy xstreamStrategy = new XStreamResolverStrategy() {
+            public XStream lookup(String name) {
+                return BatchExecutionHelper.newJSonMarshaller();
+            }
+        };
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineSessionStateful(node, xstreamStrategy).insert(inXml, resultHandler);
+        String outXml = (String) resultHandler.getObject();
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        stilton = (Cheese) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+//        String expectedXml = "";
+//        expectedXml += "<execution-results>\n";
+//        expectedXml += "  <result identifier=\"outStilton\">\n";
+//        expectedXml += "    <org.drools.Cheese>\n";
+//        expectedXml += "      <type>stilton</type>\n";
+//        expectedXml += "      <oldPrice>0</oldPrice>\n";
+//        expectedXml += "      <price>30</price>\n";
+//        expectedXml += "    </org.drools.Cheese>\n";
+//        expectedXml += "  </result>\n";
+//        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+//        expectedXml += "</execution-results>\n";
+//
+//        assertXMLEqual( expectedXml,
+//                        outXml );
+    }
+
+    private Pipeline getPipeline(StatelessKnowledgeSession ksession) {
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+        outTransformer.setReceiver( assignResult );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( outTransformer );
+
+        Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+        inTransformer.setReceiver( batchExecution );
+
+        Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( inTransformer );
+
+        return pipeline;
+    }
+
+ 
+
+    private Pipeline getPipelineStateful(StatefulKnowledgeSession ksession) {
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+        outTransformer.setReceiver( assignResult );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( outTransformer );
+
+        Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+        inTransformer.setReceiver( batchExecution );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( inTransformer );
+
+        return pipeline;
+    }
+    
+    private Pipeline getPipelineSessionStateful(ExecutionNode node, XStreamResolverStrategy xstreamResolverStrategy) {
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        //Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        Transformer outTransformer = new XStreamToXmlGridTransformer();
+        outTransformer.setReceiver( assignResult );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( outTransformer );
+
+        //Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        Transformer inTransformer = new XStreamFromXmlGridTransformer( xstreamResolverStrategy );
+        inTransformer.setReceiver( batchExecution );
+
+//        Transformer domTransformer = new ToXmlNodeTransformer();
+//        domTransformer.setReceiver( inTransformer );
+
+        //Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        Pipeline pipeline = new ExecutionNodePipelineImpl( node );
+
+        pipeline.setReceiver( inTransformer );
+
+        return pipeline;
+    }    
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+
+    private StatelessKnowledgeSession getSession2(Resource resource) throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( resource,
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        assertFalse( kbuilder.hasErrors() );
+        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        kbase.addKnowledgePackages( pkgs );
+        StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
+
+        return session;
+    }
+
+    private StatefulKnowledgeSession getSessionStateful(Resource resource) throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( resource,
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+        }
+
+        assertFalse( kbuilder.hasErrors() );
+        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        kbase.addKnowledgePackages( pkgs );
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+        return session;
+    }
+
+    private StatefulKnowledgeSession getExecutionNodeSessionStateful(ExecutionNode node, Resource resource) throws Exception {
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        kbuilder.add( resource,
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+        }
+
+        assertFalse( kbuilder.hasErrors() );
+        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+
+        kbase.addKnowledgePackages( pkgs );
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+        return session;
+    }
+    
+    public String roundTripFromXml(String inXml) {
+       Object object =  BatchExecutionHelper.newJSonMarshaller().fromXML( inXml );
+        inXml = BatchExecutionHelper.newJSonMarshaller().toXML( object );
+        object =  BatchExecutionHelper.newJSonMarshaller().fromXML( inXml );
+        return BatchExecutionHelper.newJSonMarshaller().toXML( object );        
+    }
+    
+    public Object roundTripFromObject(Object object) {
+        String xml = BatchExecutionHelper.newJSonMarshaller().toXML( object );
+        object =  BatchExecutionHelper.newJSonMarshaller().fromXML( xml );
+        xml = BatchExecutionHelper.newJSonMarshaller().toXML( object );
+        return BatchExecutionHelper.newJSonMarshaller().fromXML( xml );          
+        
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,133 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStreamReader;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.JaxbConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.core.util.StringUtils;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+public class JaxbFactTest extends TestCase {
+    public void testFact() throws Exception {
+        Options xjcOpts = new Options();
+        xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );               
+        
+        kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+                                                          getClass() ), ResourceType.XSD,
+                                                          jaxbConf );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+
+        JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+                                                                     kbase ); 
+        
+        Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+        Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        String xml = StringUtils.readFileAsString( new InputStreamReader( getClass().getResourceAsStream( "order.xml" ) ) );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( xml,
+                         resultHandler );
+
+        FactHandle factHandle = (FactHandle) ((Map) resultHandler.getObject()).keySet().iterator().next();
+        assertNotNull( factHandle );
+
+        // now round trip that fact
+        Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+        Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+        assignAsResult.setReceiver( executeResult );
+
+        //transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+        Marshaller marshaller = jaxbCtx.createMarshaller();
+        transformer = PipelineFactory.newJaxbToXmlTransformer( marshaller );
+        transformer.setReceiver( assignAsResult );
+
+        KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();
+        getObject.setReceiver( transformer );
+
+        pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( getObject );
+
+        resultHandler = new ResultHandlerImpl();
+        pipeline.insert( factHandle,
+                         resultHandler );
+
+        assertEqualsIgnoreWhitespace( xml,
+                                      (String) resultHandler.getObject() );
+    }
+
+    private static void assertEqualsIgnoreWhitespace(final String expected,
+                                                     final String actual) {
+        final String cleanExpected = expected.replaceAll( "\\s+",
+                                                          "" );
+        final String cleanActual = actual.replaceAll( "\\s+",
+                                                      "" );
+        assertEquals( cleanExpected,
+                      cleanActual );
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,128 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.JaxbConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.core.util.StringUtils;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+import junit.framework.TestCase;
+
+public class JaxbGlobalTest extends TestCase {
+    public void testGlobal() throws Exception {
+        Options xjcOpts = new Options();
+        xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );               
+        
+        kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+                                                            getClass() ), ResourceType.XSD,
+                                                            jaxbConf );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        KnowledgeRuntimeCommand setGlobalStage = PipelineFactory.newStatefulKnowledgeSessionSetGlobal( "order" );
+
+        JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+                                                                     kbase );  
+        
+        Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+        Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+        transformer.setReceiver(setGlobalStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        String xml = StringUtils.readFileAsString( new InputStreamReader( getClass().getResourceAsStream( "order.xml" ) ) );
+        
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( xml,
+                         resultHandler );
+
+        // now round trip that global
+        Action executeResult = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+        assignAsResult.setReceiver( executeResult );
+        
+        //transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+        Marshaller marshaller = jaxbCtx.createMarshaller();
+        transformer = PipelineFactory.newJaxbToXmlTransformer( marshaller );
+        transformer.setReceiver( assignAsResult );
+        
+        KnowledgeRuntimeCommand getGlobalStage = PipelineFactory.newStatefulKnowledgeSessionGetGlobal( );        
+        getGlobalStage.setReceiver( transformer );
+
+        pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( getGlobalStage );
+        
+        resultHandler = new ResultHandlerImpl();
+        pipeline.insert( "order", resultHandler );  
+        
+        assertEqualsIgnoreWhitespace( xml, (String) resultHandler.getObject() );
+    }
+    
+    private static void assertEqualsIgnoreWhitespace(final String expected,
+                                                     final String actual) {
+               final String cleanExpected = expected.replaceAll( "\\s+",
+                                                                 "" );
+               final String cleanActual = actual.replaceAll( "\\s+",
+                                                             "" );
+               assertEquals( cleanExpected,
+                             cleanActual );
+           }
+    
+    public static class ResultHandlerImpl
+    implements
+    ResultHandler {
+    Object object;
+
+    public void handleResult(Object object) {
+        this.object = object;
+    }
+
+    public Object getObject() {
+        return this.object;
+    }
+}
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,200 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import junit.framework.TestCase;
+
+import org.apache.activemq.broker.BrokerService;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.pipeline.Service;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.core.util.StringUtils;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+public class JaxbSimpleJmsMessengerTest extends TestCase {
+
+    private SimpleProducer simpleProducer;
+    private BrokerService  broker;
+    private String         destinationName = "dynamicQueues/FOO.BAR";
+    private String         url             = "vm://localhost:61616";
+
+    private Properties     props;
+
+    protected void setUp() {
+        try {
+            this.broker = new BrokerService();
+            // configure the broker
+            this.broker.setBrokerName( "consumer" );
+            this.broker.addConnector( url );
+            this.broker.start();
+
+            props = new Properties();
+            props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+                               "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+            props.setProperty( Context.PROVIDER_URL,
+                               this.url );
+
+            this.simpleProducer = new SimpleProducer( props,
+                                                      this.destinationName );
+            this.simpleProducer.start();
+        } catch ( Exception e ) {
+            throw new RuntimeException( e );
+        }
+    }
+    
+    protected void tearDown() throws Exception {
+        this.simpleProducer.stop();
+        this.broker.stop();
+    }
+
+    public void testJmsWithJaxb() throws Exception {
+        Options xjcOpts = new Options();
+        xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        String[] classNames = KnowledgeBuilderHelper.addXsdModel( ResourceFactory.newClassPathResource( "order.xsd",
+                                                                                                        getClass() ),
+                                                                  kbuilder,
+                                                                  xjcOpts,
+                                                                  "xsd" );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        Action resultHandlerStage = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( resultHandlerStage );
+
+        JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( classNames,
+                                                                     kbase );
+        Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+        Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+        transformer.setReceiver( insertStage );
+
+        Action unwrapObjectStage = PipelineFactory.newJmsUnwrapMessageObject();
+        unwrapObjectStage.setReceiver( transformer );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( unwrapObjectStage );
+
+        ResultHandleFactoryImpl factory = new ResultHandleFactoryImpl();
+        Service feeder = PipelineFactory.newJmsMessenger( pipeline,
+                                                          props,
+                                                          this.destinationName,
+                                                          factory );
+        feeder.start();
+
+        String xml = StringUtils.readFileAsString( new InputStreamReader( getClass().getResourceAsStream( "order.xml" ) ) );
+
+        this.simpleProducer.sendObject( xml );
+
+        for ( int i = 0; i < 5; i++ ) {
+            // iterate and sleep 5 times, to give these messages time to complete.
+            if ( factory.list.size() == 1 ) {
+                break;
+            }
+            Thread.sleep( 5000 );
+        }
+
+        FactHandle factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 0 )).getObject()).keySet().iterator().next();
+        assertNotNull( factHandle );
+
+        assertEquals( 1,
+                      factory.list.size() );
+
+        Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+        Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+        assignAsResult.setReceiver( executeResult );
+
+        //transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+        Marshaller marshaller = jaxbCtx.createMarshaller();
+        transformer = PipelineFactory.newJaxbToXmlTransformer( marshaller );
+        transformer.setReceiver( assignAsResult );
+
+        KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();
+        getObject.setReceiver( transformer );
+
+        pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( getObject );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( factHandle,
+                         resultHandler );
+
+        assertEqualsIgnoreWhitespace( xml,
+                                      (String) resultHandler.getObject() );
+        feeder.stop();
+
+    }
+
+    public static class ResultHandleFactoryImpl
+        implements
+        ResultHandlerFactory {
+        List list = new ArrayList();
+
+        public ResultHandler newResultHandler() {
+            ResultHandler handler = new ResultHandlerImpl();
+            list.add( handler );
+            return handler;
+        }
+
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+
+    private static void assertEqualsIgnoreWhitespace(final String expected,
+                                                     final String actual) {
+        final String cleanExpected = expected.replaceAll( "\\s+",
+                                                          "" );
+        final String cleanActual = actual.replaceAll( "\\s+",
+                                                      "" );
+        assertEquals( cleanExpected,
+                      cleanActual );
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,232 @@
+package org.drools.runtime.pipeline.impl;
+
+/*
+ * 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.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.JaxbConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.common.InternalRuleBase;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+public class JaxbTest extends TestCase {
+
+    //    public void testModelLoad() throws Exception {
+    //        Options xjcOpts = new Options();
+    //        xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+    //        PackageBuilder pkgBuilder = new PackageBuilder();
+    //
+    //        InputStream stream = getClass().getResourceAsStream( "test.xsd" );
+    //        String[] classNames = DroolsJaxbHelper.addModel( new InputStreamReader( stream ),
+    //                                                         pkgBuilder,
+    //                                                         xjcOpts,
+    //                                                         "xsd" );
+    //
+    //        assertFalse( pkgBuilder.hasErrors() );
+    //
+    //        RuleBase rb = RuleBaseFactory.newRuleBase();
+    //        rb.addPackage( pkgBuilder.getPackage() );
+    //
+    //        JAXBContext jaxbCtx = DroolsJaxbHelper.newInstance( classNames,
+    //                                                            rb );
+    //        Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+    //        JAXBElement elm = ( JAXBElement ) unmarshaller.unmarshal( getClass().getResourceAsStream( "data.xml" ) );
+    //       
+    //        assertEquals( "com.oracle.sample3.USAddress",
+    //                      elm.getValue().getClass().getName() );        
+    //    }
+
+    public void testDirectRoot() throws Exception {
+        Options xjcOpts = new Options();
+        xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        
+        JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );               
+        
+        kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+                                                          getClass() ), ResourceType.XSD,
+                                                          jaxbConf );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List list1 = new ArrayList();
+        ksession.setGlobal( "list1",
+                            list1 );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+        
+        JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+                                                                     kbase ); 
+        Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+        
+//        ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+//        
+//        ClassLoader classLoader = ((InternalRuleBase) ((KnowledgeBaseImpl) kbase).getRuleBase()).getRootClassLoader();
+//        
+//        Thread.currentThread().setContextClassLoader( classLoader );
+//        Unmarshaller unmarshaller = JAXBContext.newInstance( "org.drools.model.order" ).createUnmarshaller();
+//        Thread.currentThread().setContextClassLoader( originalClassLoader );
+        
+        Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( new StreamSource( getClass().getResourceAsStream( "order.xml" ) ),
+                         resultHandler );
+        ksession.fireAllRules();
+
+        Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+
+        ksession.fireAllRules();
+
+        assertEquals( 1,
+                      handles.size() );
+        assertEquals( 1,
+                      list1.size() );
+
+        assertEquals( "org.drools.model.order.Order",
+                      list1.get( 0 ).getClass().getName() );
+    }
+
+    public void testNestedIterable() throws Exception {
+        Options xjcOpts = new Options();
+        xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );               
+        
+        kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+                                                          getClass() ), ResourceType.XSD,
+                                                          jaxbConf );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List list1 = new ArrayList();
+        List list2 = new ArrayList();
+        ksession.setGlobal( "list1",
+                            list1 );
+        ksession.setGlobal( "list2",
+                            list2 );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+
+        Splitter splitter = PipelineFactory.newIterateSplitter();
+        splitter.setReceiver( insertStage );
+
+        Expression expression = PipelineFactory.newMvelExpression( "this.orderItem" );
+        expression.setReceiver( splitter );
+
+        JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+                                                                     kbase ); 
+        
+        Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+        Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+        transformer.setReceiver( expression );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( new StreamSource( getClass().getResourceAsStream( "order.xml" ) ),
+                         resultHandler );
+
+        Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      handles.size() );
+        assertEquals( 1,
+                      list1.size() );
+        assertEquals( 1,
+                      list2.size() );
+
+        assertEquals( "org.drools.model.order.Order$OrderItem",
+                      list1.get( 0 ).getClass().getName() );
+
+        assertEquals( "org.drools.model.order.Order$OrderItem",
+                      list2.get( 0 ).getClass().getName() );
+
+        assertNotSame( list1.get( 0 ),
+                       list2.get( 0 ) );
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,73 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.impl.KnowledgeBuilderImpl;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.pipeline.Callable;
+import org.drools.runtime.pipeline.ListAdapter;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.BasePipelineContext;
+import org.drools.runtime.pipeline.impl.JxlsTransformer;
+import org.drools.runtime.pipeline.impl.ListAdapterImpl;
+import org.mvel2.MVEL;
+import org.mvel2.ParserConfiguration;
+import org.mvel2.ParserContext;
+
+import junit.framework.TestCase;
+import net.sf.jxls.reader.ReaderBuilder;
+import net.sf.jxls.reader.XLSDataReadException;
+import net.sf.jxls.reader.XLSReadStatus;
+import net.sf.jxls.reader.XLSReader;
+
+public class JxlsTest extends TestCase {
+    public void test1() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        // kbuilder.add( ResourceFactory.newClassPathResource( "test_JXLS.drl", getClass() ), ResourceType.DRL );
+        
+        ClassLoader cl = ((KnowledgeBuilderImpl)kbuilder).pkgBuilder.getRootClassLoader(); 
+        Thread.currentThread().setContextClassLoader( cl );
+
+        InputStream inputXLS = new BufferedInputStream(getClass().getResourceAsStream( "departmentData.xls"));
+        
+        XLSReader mainReader = ReaderBuilder.buildFromXML( ResourceFactory.newClassPathResource( "departments.xml", getClass() ).getInputStream() );
+        Transformer transformer = PipelineFactory.newJxlsTransformer(mainReader, "[ 'departments' : new java.util.ArrayList(), 'company' : new org.drools.runtime.pipeline.impl.Company() ]");
+        
+        Callable callable = new CallableImpl();
+
+        callable.setReceiver( transformer );
+        transformer.setReceiver( callable );        
+        BasePipelineContext context = new BasePipelineContext( Thread.currentThread().getContextClassLoader() );
+        
+        Map<String, Object> beans = ( Map<String, Object> ) callable.call( inputXLS, context );
+
+        assertEquals( Company.class.getName(), beans.get( "company" ).getClass().getName());
+        assertEquals( ArrayList.class.getName(), beans.get( "departments" ).getClass().getName());
+        
+        Company company = ( Company )  beans.get( "company" );
+        assertEquals( "A-Team", company.getName() );
+        assertEquals( 4, company.getEmployee().size() );
+        
+        List<Department> departments = ( List<Department> ) beans.get( "departments" );
+        assertEquals( 3, departments.size() );
+        
+        Department department = departments.get( 0 );
+        assertEquals( "IT", department.getName() );        
+        assertEquals( 5, department.getStaff().size() );
+        
+        department = departments.get( 2 );
+        assertEquals( "BA", department.getName() );        
+        assertEquals( 4, department.getStaff().size() );        
+    }
+    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,96 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.activemq.broker.BrokerService;
+
+public class SimpleConsumer {
+
+    public SimpleConsumer() {
+        super();
+    }
+
+    public static void main(String[] args) throws Exception {
+        BrokerService broker = new BrokerService();
+        // configure the broker
+        broker.setBrokerName( "consumer" );
+        broker.addConnector( "tcp://localhost:61616" );
+        broker.start();
+
+        Context jndiContext = null;
+        ConnectionFactory connectionFactory = null;
+        Connection connection = null;
+        Session session = null;
+        Destination destination = null;
+        MessageConsumer consumer = null;
+        TextMessage message = null;
+        String destinationName = "dynamicQueues/FOO.BAR";
+        final int NUM_MSGS = 50;
+
+        try {
+            Properties props = new Properties();
+            props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+                               "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+            props.setProperty( Context.PROVIDER_URL,
+                               "tcp://localhost:61616" );
+            jndiContext = new InitialContext( props );
+        }
+
+        catch ( NamingException e ) {
+            System.out.println( "Could not create JNDI API context: " + e.toString() );
+            System.exit( 1 );
+        }
+
+        try {
+            connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+            destination = (Destination) jndiContext.lookup( destinationName );
+        }
+
+        catch ( NamingException e ) {
+            e.printStackTrace();
+            System.out.println( "JNDI API lookup failed: " + e );
+            System.exit( 1 );
+        }
+
+        try {
+            connection = connectionFactory.createConnection();
+            session = connection.createSession( false,
+                                                Session.AUTO_ACKNOWLEDGE );
+
+            //producer = session.createProducer(destination);
+            consumer = session.createConsumer( destination );
+            connection.start();
+            //message = session.createTextMessage();
+
+            for ( int i = 0; i < NUM_MSGS; i++ ) {
+                Message msg = consumer.receive();
+                System.out.println( "received : " + msg );
+                if ( msg instanceof TextMessage ) {
+                    message = (TextMessage) msg;
+                    System.out.println( message.getText() );
+                }
+            }
+        } catch ( JMSException e ) {
+            System.out.println( "Exception occurred: " + e );
+        } finally {
+            if ( connection != null ) {
+                try {
+                    connection.close();
+                } catch ( JMSException e ) {
+                }
+            }
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,136 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Context;
+
+import junit.framework.TestCase;
+
+import org.apache.activemq.broker.BrokerService;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.rule.FactHandle;
+
+public class SimpleJmsMessengerTest extends TestCase {
+
+    private SimpleProducer simpleProducer;
+    private BrokerService  broker;
+    private String         destinationName = "dynamicQueues/FOO.BAR";
+    private String         url             = "vm://localhost:61616";
+
+    private Properties     props;
+
+    protected void setUp() {
+        try {
+            this.broker = new BrokerService();
+            // configure the broker
+            this.broker.setBrokerName( "consumer" );
+            this.broker.addConnector( url );
+            this.broker.start();
+
+            props = new Properties();
+            props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+                               "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+            props.setProperty( Context.PROVIDER_URL,
+                               this.url );
+
+            this.simpleProducer = new SimpleProducer( props,
+                                                      this.destinationName );
+            this.simpleProducer.start();
+        } catch ( Exception e ) {
+            throw new RuntimeException( e );
+        }
+    }
+    
+    protected void tearDown() throws Exception {
+        this.simpleProducer.stop();
+        this.broker.stop();
+    }    
+
+    public void testJms() throws Exception {
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        StatefulKnowledgeSessionPipelineImpl pipeline = new StatefulKnowledgeSessionPipelineImpl( ksession );
+
+        JmsUnwrapMessageObject unwrapObjectStage = new JmsUnwrapMessageObject();
+        StatefulKnowledgeSessionInsertStage insertStage = new StatefulKnowledgeSessionInsertStage();
+        unwrapObjectStage.setReceiver( insertStage );
+        ExecuteResultHandler resultHandlerStage = new ExecuteResultHandler();
+        insertStage.setReceiver( resultHandlerStage );
+        pipeline.setReceiver( unwrapObjectStage );
+
+        ResultHandleFactoryImpl factory = new ResultHandleFactoryImpl();
+        JmsMessenger feeder = new JmsMessenger( pipeline,
+                                                props,
+                                                this.destinationName,
+                                                factory );
+        feeder.start();
+        this.simpleProducer.sendObject( "hello" );
+        this.simpleProducer.sendObject( "hello1" );
+        this.simpleProducer.sendObject( "hello2" );
+        this.simpleProducer.sendObject( "hello3" );
+
+        for ( int i = 0; i < 5; i++ ) {
+            // iterate and sleep 5 times, to give these messages time to complete.
+            if ( factory.list.size() == 4 ) {
+                break;
+            }
+            Thread.sleep( 500 );
+        }
+
+        assertEquals( 4,
+                      factory.list.size() );
+
+        FactHandle factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 0 )).getObject()).keySet().iterator().next();
+        assertEquals( "hello",
+                      ksession.getObject( factHandle ) );
+
+        factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 1 )).getObject()).keySet().iterator().next();
+        assertEquals( "hello1",
+                      ksession.getObject( factHandle ) );
+
+        factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 2 )).getObject()).keySet().iterator().next();
+        assertEquals( "hello2",
+                      ksession.getObject( factHandle ) );
+
+        factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 3 )).getObject()).keySet().iterator().next();
+        assertEquals( "hello3",
+                      ksession.getObject( factHandle ) );
+        feeder.stop();
+
+    }
+
+    public static class ResultHandleFactoryImpl
+        implements
+        ResultHandlerFactory {
+        List list = new ArrayList();
+
+        public ResultHandler newResultHandler() {
+            ResultHandler handler = new ResultHandlerImpl();
+            list.add( handler );
+            return handler;
+        }
+
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,157 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.Serializable;
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.activemq.command.ActiveMQObjectMessage;
+import org.apache.activemq.command.ActiveMQTextMessage;
+
+public class SimpleProducer {
+
+    private ConnectionFactory connectionFactory;
+    private Destination       destination;
+    private MessageProducer   producer;
+    private Connection        connection;
+    private Session           session;
+
+    public SimpleProducer(Properties properties,
+                          String destinationName) {
+        try {
+            InitialContext jndiContext = new InitialContext( properties );
+            this.connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+            this.destination = (Destination) jndiContext.lookup( destinationName );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "Unable to instantiate JmsFeeder",
+                                        e );
+        }
+    }
+
+    public void start() {
+        try {
+            this.connection = this.connectionFactory.createConnection();
+            this.session = this.connection.createSession( false,
+                                                          Session.AUTO_ACKNOWLEDGE );
+            this.producer = this.session.createProducer( destination );
+            this.connection.start();
+        } catch ( Exception e ) {
+            throw new RuntimeException( e );
+        }
+    }
+
+    public void setText(String text) {
+        ActiveMQTextMessage textMessage = new ActiveMQTextMessage();
+        try {
+            textMessage.setText( text );
+            this.producer.send( textMessage );
+        } catch ( JMSException e ) {
+            throw new RuntimeException( e );
+        }
+    }
+
+    public void sendObject(Serializable object) {
+        ActiveMQObjectMessage objectMessage = new ActiveMQObjectMessage();
+        try {
+            objectMessage.setObject( object );
+            this.producer.send( objectMessage );
+        } catch ( JMSException e ) {
+            throw new RuntimeException( e );
+        }
+    }
+
+    public void stop() {
+        try {
+            //            this.run = false;
+            // this will interrupt the receive()
+            this.producer.close();
+            this.connection.stop();
+        } catch ( JMSException e ) {
+            throw new RuntimeException( e );
+        }
+    }
+
+    public void simpleProducer2() {
+        Context jndiContext = null;
+        ConnectionFactory connectionFactory = null;
+        Connection connection = null;
+        Session session = null;
+        Destination destination = null;
+        MessageProducer producer = null;
+        String destinationName = "dynamicQueues/FOO.BAR";
+        final int numMsgs = 50;
+
+        System.out.println( "Destination name is " + destinationName );
+        /*
+         * Create a JNDI API InitialContext object
+         */
+        try {
+            Properties props = new Properties();
+            props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+                               "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+            props.setProperty( Context.PROVIDER_URL,
+                               "vm://localhost:61616" );
+            jndiContext = new InitialContext( props );
+        } catch ( NamingException e ) {
+            e.printStackTrace();
+            System.out.println( "Could not create JNDI API context: " + e.toString() );
+            System.exit( 1 );
+        }
+
+        /*
+         * Look up connection factory and destination.
+         */
+        try {
+            connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+            destination = (Destination) jndiContext.lookup( destinationName );
+        } catch ( NamingException e ) {
+            e.printStackTrace();
+            //LOG.info("JNDI API lookup failed: " + e);
+            System.exit( 1 );
+        }
+
+        /*
+         * Create connection. Create session from connection; false means
+         * session is not transacted. Create sender and text message. Send
+         * messages, varying text slightly. Send end-of-messages message.
+         * Finally, close connection.
+         */
+        try {
+            connection = connectionFactory.createConnection();
+            session = connection.createSession( false,
+                                                Session.AUTO_ACKNOWLEDGE );
+            //session.createTopic( "" )
+            producer = session.createProducer( destination );
+            TextMessage message = session.createTextMessage();
+            for ( int i = 0; i < numMsgs; i++ ) {
+                message.setText( "This is message " + (i + 1) );
+                System.out.println( "Sending message: " + message.getText() );
+                producer.send( message );
+            }
+
+            /*
+             * Send a non-text control message indicating end of messages.
+             */
+            producer.send( session.createMessage() );
+        } catch ( JMSException e ) {
+            e.printStackTrace();
+            System.out.println( "Exception occurred: " + e );
+        } finally {
+            if ( connection != null ) {
+                try {
+                    connection.close();
+                } catch ( JMSException e ) {
+                }
+            }
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,163 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+import org.milyn.io.StreamUtils;
+
+public class SmookStatefulSessionTest extends TestCase {
+
+    public void testDirectRoot() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksDirectRoot.drl",
+                                                            SmookStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+
+        // Instantiate Smooks with the config...
+        Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+        Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+                                                                                  "orderItem" );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( getClass().getResourceAsStream( "SmooksDirectRoot.xml" ),
+                         resultHandler );
+        ksession.fireAllRules();
+
+        Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+
+        assertEquals( 1,
+                      handles.size() );
+        assertEquals( 1,
+                      list.size() );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+    }
+
+    public void testNestedIterable() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+                                                            SmookStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+
+        Splitter splitter = PipelineFactory.newIterateSplitter();
+        splitter.setReceiver( insertStage );
+
+        Expression expression = PipelineFactory.newMvelExpression( "children" );
+        expression.setReceiver( splitter );
+
+        // Instantiate Smooks with the config...
+        Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+        Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+                                                                                  "root" );
+        transformer.setReceiver( expression );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+                         resultHandler );
+
+        Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      handles.size() );
+        assertEquals( 2,
+                      list.size() );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+        assertEquals( "example.OrderItem",
+                      list.get( 1 ).getClass().getName() );
+
+        assertNotSame( list.get( 0 ),
+                       list.get( 1 ) );
+    }
+
+    private static byte[] readInputMessage(InputStream stream) {
+        try {
+            return StreamUtils.readStream( stream );
+        } catch ( IOException e ) {
+            e.printStackTrace();
+            return "<no-message/>".getBytes();
+        }
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,158 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.common.InternalFactHandle;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.Join;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Receiver;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+import org.milyn.io.StreamUtils;
+
+public class SmookStatelessSessionTest extends TestCase {
+
+    public void testSmooksDirectRoot() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksDirectRoot.drl",
+                                                            SmookStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( assignResult );
+        
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newInsertObjectCommand();
+        insertStage.setReceiver( batchExecution );
+
+        // Instantiate Smooks with the config...
+        Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+        Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+                                                                                  "orderItem" );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksDirectRoot.xml" ) ),
+                         resultHandler );
+
+        assertEquals( 1,
+                      list.size() );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+    }
+
+    public void testSmooksNestedIterable() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+                                                            SmookStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( assignResult );
+        
+        KnowledgeRuntimeCommand insertElementsStage = PipelineFactory.newInsertElementsCommand();
+        insertElementsStage.setReceiver( batchExecution );
+        
+        Expression mvelExpression = PipelineFactory.newMvelExpression( "this.children" );
+        mvelExpression.setReceiver( insertElementsStage );
+
+        // Instantiate Smooks with the config...
+        Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+        Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+                                                                                  "root" );
+        transformer.setReceiver( mvelExpression );
+
+        Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+                         resultHandler );
+
+        assertEquals( 2,
+                      list.size() );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+        assertEquals( "example.OrderItem",
+                      list.get( 1 ).getClass().getName() );
+
+        assertNotSame( list.get( 0 ),
+                       list.get( 1 ) );
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,103 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import org.custommonkey.xmlunit.Diff;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+
+import junit.framework.TestCase;
+
+public class SmooksFactTest extends TestCase {
+   
+    public void testFact() throws Exception {
+        String xml = "<org.drools.runtime.pipeline.impl.Root><children><example.OrderItem><price>8.9</price><quantity>2</quantity><productId>111</productId></example.OrderItem><example.OrderItem><price>5.2</price><quantity>7</quantity><productId>222</productId></example.OrderItem></children></org.drools.runtime.pipeline.impl.Root>";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+                                                            SmooksFactTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+        
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+
+        Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+        Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+                                                                                  "root" );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+                         resultHandler );
+        
+        FactHandle factHandle = ( FactHandle ) ((Map)resultHandler.getObject()).keySet().iterator().next();
+        assertNotNull( factHandle );         
+
+        // now round trip that fact
+        Action executeResult = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+        assignAsResult.setReceiver( executeResult );
+
+        transformer = PipelineFactory.newSmooksToSourceTransformer( smooks );
+        transformer.setReceiver( assignAsResult );
+        
+        KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();      
+        getObject.setReceiver( transformer );
+
+        pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( getObject );
+
+        resultHandler = new ResultHandlerImpl();
+        pipeline.insert( factHandle, resultHandler );
+
+        assertTrue( new Diff( xml, (String) resultHandler.getObject() ).similar() );
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,98 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import org.custommonkey.xmlunit.Diff;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+
+import com.thoughtworks.xstream.XStream;
+
+import junit.framework.TestCase;
+
+public class SmooksGlobalTest extends TestCase {
+    
+    public void testGlobal() throws Exception {
+        String xml = "<org.drools.runtime.pipeline.impl.Root><children><example.OrderItem><price>8.9</price><quantity>2</quantity><productId>111</productId></example.OrderItem><example.OrderItem><price>5.2</price><quantity>7</quantity><productId>222</productId></example.OrderItem></children></org.drools.runtime.pipeline.impl.Root>";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+                                                            SmooksGlobalTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        KnowledgeRuntimeCommand setGlobalStage = PipelineFactory.newStatefulKnowledgeSessionSetGlobal( "root" );
+
+        Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+        Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+                                                                                  "root" );
+        transformer.setReceiver( setGlobalStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+                         resultHandler );
+
+        // now round trip that global
+
+        Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+        Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+        assignAsResult.setReceiver( executeResult );
+
+        transformer = PipelineFactory.newSmooksToSourceTransformer( smooks );
+        transformer.setReceiver( assignAsResult );
+
+        pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        resultHandler = new ResultHandlerImpl();
+        pipeline.insert( ksession.getGlobal( "root" ),
+                         resultHandler );
+        
+        assertTrue( new Diff( xml, (String) resultHandler.getObject() ).similar() );
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,2008 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.Cheese;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.Person;
+import org.drools.TestVariable;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.command.runtime.rule.ModifyCommand;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.definition.KnowledgePackage;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.local.LocalConnection;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.io.Resource;
+import org.drools.io.ResourceFactory;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.runtime.process.WorkflowProcessInstance;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.QueryResultsRow;
+import org.xml.sax.SAXException;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamBatchExecutionTest extends TestCase {
+
+    protected void setUp() throws Exception {
+        XMLUnit.setIgnoreComments( true );
+        XMLUnit.setIgnoreWhitespace( true );
+        XMLUnit.setIgnoreAttributeOrder( true );
+        XMLUnit.setNormalizeWhitespace( true );
+        XMLUnit.setNormalize( true );
+    }
+
+    private void assertXMLEqual(String expectedXml,
+                                String resultXml) {
+        try {
+            Diff diff = new Diff( expectedXml,
+                                  resultXml );
+            diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+            XMLAssert.assertXMLEqual( diff,
+                                      true );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "XML Assertion failure",
+                                        e );
+        }
+    }
+
+    public void testListenForChanges() throws Exception {
+
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "import org.drools.ChangeCollector \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese(price==25) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "end\n";
+
+        str += "rule rule2 \n";
+        str += "  when \n";
+        str += "    p : Person(name=='mic') \n";
+        str += "    c : Cheese(price != 42) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    c.setPrice( 42 ); \n";
+        str += "    update(c); \n";
+        str += "end\n";
+
+        str += "rule rule3 \n";
+        str += "  when \n";
+        str += "    p : Person(name=='mark') \n";
+        str += "    c : Cheese(price == 42) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    retract(c); \n";
+        str += "end\n";
+
+        str += "rule ruleBootStrap \n";
+        str += "salience 10000\n";
+        str += "  when \n";
+        str += "    $c : ChangeCollector() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    kcontext.getKnowledgeRuntime().addEventListener($c); \n";
+        str += "end\n";
+
+        str += "rule ruleCleanup \n";
+        str += "salience -10000\n";
+        str += "  when \n";
+        str += "    $c : ChangeCollector() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    kcontext.getKnowledgeRuntime().removeEventListener($c); \n";
+        str += "    retract($c); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='person'>";
+        inXml += "    <org.drools.Person>";
+        inXml += "      <name>mic</name>";
+        inXml += "    </org.drools.Person>";
+        inXml += "  </insert>";
+        inXml += "  <insert out-identifier='changes'>";
+        inXml += "    <org.drools.ChangeCollector/>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        assertTrue( outXml.indexOf( "<changes>" ) > -1 );
+
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='person'>";
+        inXml += "    <org.drools.Person>";
+        inXml += "      <name>mark</name>";
+        inXml += "    </org.drools.Person>";
+        inXml += "  </insert>";
+        inXml += "  <insert out-identifier='changes'>";
+        inXml += "    <org.drools.ChangeCollector/>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+
+        assertTrue( outXml.indexOf( "<retracted>" ) > -1 );
+
+    }
+
+    public void testInsertWithDefaults() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        stilton = (Cheese) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier=\"outStilton\">\n";
+        expectedXml += "    <org.drools.Cheese>\n";
+        expectedXml += "      <type>stilton</type>\n";
+        expectedXml += "      <oldPrice>0</oldPrice>\n";
+        expectedXml += "      <price>30</price>\n";
+        expectedXml += "    </org.drools.Cheese>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+    }
+
+    public void testInsertWithReturnObjectFalse() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton' return-object='false'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        assertNull( result.getValue( "outStilton" ) );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        Cheese stilton = (Cheese) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+    }
+
+    public void testGetObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+    }
+
+    public void testRetractObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <retract fact-handle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        assertNull( result.getValue( "outStilton" ) );
+    }
+
+    public void testModifyObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = ((FactHandle) result.getFactHandle( "outStilton" ));
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier=\"outStilton\">\n";
+        expectedXml += "    <org.drools.Cheese>\n";
+        expectedXml += "      <type>stilton</type>\n";
+        expectedXml += "      <oldPrice>0</oldPrice>\n";
+        expectedXml += "      <price>30</price>\n";
+        expectedXml += "    </org.drools.Cheese>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <modify fact-handle='" + factHandle.toExternalForm() + "'> <set accessor='oldPrice' value='\"42\"' /><set accessor='price' value='50' /></modify>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <get-object out-identifier='outCheddar' fact-handle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese cheddar = (Cheese) result.getValue( "outCheddar" );
+        assertEquals( 42,
+                      cheddar.getOldPrice() );
+        assertEquals( 55,
+                      cheddar.getPrice() );
+
+        //now test for code injection:
+        ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = false;
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <modify fact-handle='" + factHandle.toExternalForm() + "'> <set accessor='type' value='44\"; System.exit(1);' /><set accessor='price' value='50' /></modify>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = true;
+
+    }
+
+    public void testInsertElements() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "     list.add( $c );";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <set-global identifier='list' out='true' return-objects='true'>";
+        inXml += "    <list/>";
+        inXml += "  </set-global>";
+        inXml += "  <insert-elements>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>30</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert-elements>";
+        inXml += "</batch-execution>";
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier='list'>\n";
+        expectedXml += "    <list>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>35</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>30</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "    </list>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+        List list = (List) result.getValue( "list" );
+        Cheese stilton25 = new Cheese( "stilton",
+                                       30 );
+        Cheese stilton30 = new Cheese( "stilton",
+                                       35 );
+
+        Set expectedList = new HashSet();
+        expectedList.add( stilton25 );
+        expectedList.add( stilton30 );
+
+        assertEquals( expectedList,
+                      new HashSet( list ) );
+    }
+
+    public void testFactHandleReturn() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    System.err.println(42); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <get-global identifier='list' out-identifier='out-list'/>";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        FactHandle fh = ksession.insert( new Person( "mic",
+                                                     42 ) );
+        List<FactHandle> list = new ArrayList<FactHandle>();
+        list.add( fh );
+
+        ksession.setGlobal( "list",
+                            list );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        System.err.println( outXml );
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n" + "  <result identifier=\"out-list\">\n" + "    <list>\n" + "      <fact-handle external-form=\"" + fh.toExternalForm() + "\"/>\n" + "    </list>\n" + "  </result>\n" + "</execution-results>";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+    }
+
+    public void testInsertElementsWithReturnObjects() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "     list.add( $c );";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <set-global identifier='list' out='true' >";
+        inXml += "    <list/>";
+        inXml += "  </set-global>";
+        inXml += "  <insert-elements out-identifier='myfacts' return-objects='true'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>30</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert-elements>";
+        inXml += "  <fire-all-rules/>";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        Collection< ? extends FactHandle> factHandles = ksession.getFactHandles();
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier='list'>\n";
+        expectedXml += "    <list>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>35</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>30</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "    </list>\n";
+        expectedXml += "  </result>\n";
+
+        expectedXml += "  <result identifier=\"myfacts\">\n";
+        expectedXml += "  <list>\n";
+        expectedXml += "    <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese[2]\"/>\n";
+        expectedXml += "    <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese\"/>\n";
+        expectedXml += "  </list>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <fact-handles identifier=\"myfacts\">\n";
+        for ( FactHandle factHandle : factHandles ) {
+            if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 30 ) {
+                expectedXml += "  <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
+            }
+        }
+
+        for ( FactHandle factHandle : factHandles ) {
+            if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 35 ) {
+                expectedXml += "  <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
+            }
+        }
+        expectedXml += "  </fact-handles>\n";
+
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+        List list = (List) result.getValue( "list" );
+        Cheese stilton25 = new Cheese( "stilton",
+                                       30 );
+        Cheese stilton30 = new Cheese( "stilton",
+                                       35 );
+
+        Set expectedList = new HashSet();
+        expectedList.add( stilton25 );
+        expectedList.add( stilton30 );
+
+        assertEquals( expectedList,
+                      new HashSet( list ) );
+    }
+
+    public void testSetGlobal() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list1 \n";
+        str += "global java.util.List list2 \n";
+        str += "global java.util.List list3 \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( 30 ); \n";
+        str += "    list1.add( $c ); \n";
+        str += "    list2.add( $c ); \n";
+        str += "    list3.add( $c ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <set-global identifier='list1'>";
+        inXml += "    <list/>";
+        inXml += "  </set-global>";
+        inXml += "  <set-global identifier='list2' out='true'>";
+        inXml += "    <list/>";
+        inXml += "  </set-global>";
+        inXml += "  <set-global identifier='list3' out-identifier='outList3'>";
+        inXml += "    <list/>";
+        inXml += "  </set-global>";
+        inXml += "  <insert>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>5</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "  </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "</batch-execution>";
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+
+        String outXml = (String) resultHandler.getObject();
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier='list2'>\n";
+        expectedXml += "    <list>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>30</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "    </list>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <result identifier='outList3'>\n";
+        expectedXml += "    <list>\n";
+        expectedXml += "      <org.drools.Cheese reference='../../../result/list/org.drools.Cheese'/>\n";
+        expectedXml += "    </list>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = new Cheese( "stilton",
+                                     30 );
+
+        assertNull( result.getValue( "list1" ) );
+
+        List list2 = (List) result.getValue( "list2" );
+        assertEquals( 1,
+                      list2.size() );
+        assertEquals( stilton,
+                      list2.get( 0 ) );
+
+        List list3 = (List) result.getValue( "outList3" );
+        assertEquals( 1,
+                      list3.size() );
+        assertEquals( stilton,
+                      list3.get( 0 ) );
+    }
+
+    public void testGetGlobal() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    list.add( $c ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <set-global identifier='list'>";
+        inXml += "    <list/>";
+        inXml += "  </set-global>";
+        inXml += "  <insert>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <get-global identifier='list' out-identifier='out-list'/>";
+        inXml += "</batch-execution>";
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier=\"out-list\">\n";
+        expectedXml += "    <list>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>25</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "    </list>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+    }
+
+    public void testGetObjects() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert-elements>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>30</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert-elements>";
+        inXml += "  <get-objects out-identifier='list' />";
+        inXml += "</batch-execution>";
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>";
+        expectedXml += "  <result identifier='list'>";
+        expectedXml += "    <list>";
+        expectedXml += "      <org.drools.Cheese>";
+        expectedXml += "        <type>stilton</type>";
+        expectedXml += "        <price>30</price>";
+        expectedXml += "        <oldPrice>0</oldPrice>";
+        expectedXml += "      </org.drools.Cheese>";
+        expectedXml += "      <org.drools.Cheese>";
+        expectedXml += "        <type>stilton</type>";
+        expectedXml += "        <price>35</price>";
+        expectedXml += "        <oldPrice>0</oldPrice>";
+        expectedXml += "      </org.drools.Cheese>";
+        expectedXml += "    </list>";
+        expectedXml += "  </result>";
+        expectedXml += "</execution-results>";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        List list = (List) result.getValue( "list" );
+        Cheese stilton25 = new Cheese( "stilton",
+                                       30 );
+        Cheese stilton30 = new Cheese( "stilton",
+                                       35 );
+
+        Set expectedList = new HashSet();
+        expectedList.add( stilton25 );
+        expectedList.add( stilton30 );
+
+        assertEquals( expectedList,
+                      new HashSet( list ) );
+    }
+
+    public void testQuery() throws Exception {
+        String str = "";
+        str += "package org.drools.test  \n";
+        str += "import org.drools.Cheese \n";
+        str += "query cheeses \n";
+        str += "    stilton : Cheese(type == 'stilton') \n";
+        str += "    cheddar : Cheese(type == 'cheddar', price == stilton.price) \n";
+        str += "end\n";
+        str += "query cheesesWithParams(String a, String b) \n";
+        str += "    stilton : Cheese(type == a) \n";
+        str += "    cheddar : Cheese(type == b, price == stilton.price) \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>1</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <insert>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>2</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <insert>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>cheddar</type>";
+        inXml += "      <price>1</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <insert>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>cheddar</type>";
+        inXml += "      <price>2</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <query out-identifier='cheeses' name='cheeses'/>";
+        inXml += "  <query out-identifier='cheeses2' name='cheesesWithParams'>";
+        inXml += "    <string>stilton</string>";
+        inXml += "    <string>cheddar</string>";
+        inXml += "  </query>";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        Iterator<QueryResultsRow> it1 = ksession.getQueryResults( "cheeses" ).iterator();
+        Iterator<QueryResultsRow> it2 = ksession.getQueryResults( "cheesesWithParams",
+                                                                  new String[]{"stilton", "cheddar"} ).iterator();
+        QueryResultsRow row = null;
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier='cheeses'>\n";
+        expectedXml += "    <query-results>\n";
+        expectedXml += "      <identifiers>\n";
+        expectedXml += "        <identifier>stilton</identifier>\n";
+        expectedXml += "        <identifier>cheddar</identifier>\n";
+        expectedXml += "      </identifiers>\n";
+        expectedXml += "      <row>\n";
+        row = it1.next();
+        expectedXml += "        <org.drools.Cheese>\n";
+        expectedXml += "          <type>stilton</type>\n";
+        expectedXml += "          <price>1</price>\n";
+        expectedXml += "          <oldPrice>0</oldPrice>\n";
+        expectedXml += "        </org.drools.Cheese>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+        expectedXml += "        <org.drools.Cheese>\n";
+        expectedXml += "          <type>cheddar</type>\n";
+        expectedXml += "          <price>1</price>\n";
+        expectedXml += "          <oldPrice>0</oldPrice>\n";
+        expectedXml += "        </org.drools.Cheese>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        expectedXml += "      </row>\n";
+        expectedXml += "      <row>\n";
+        row = it1.next();
+        expectedXml += "        <org.drools.Cheese>\n";
+        expectedXml += "          <type>stilton</type>\n";
+        expectedXml += "          <price>2</price>\n";
+        expectedXml += "          <oldPrice>0</oldPrice>\n";
+        expectedXml += "        </org.drools.Cheese>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+        expectedXml += "        <org.drools.Cheese>\n";
+        expectedXml += "          <type>cheddar</type>\n";
+        expectedXml += "          <price>2</price>\n";
+        expectedXml += "          <oldPrice>0</oldPrice>\n";
+        expectedXml += "        </org.drools.Cheese>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        expectedXml += "      </row>\n";
+        expectedXml += "    </query-results>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <result identifier='cheeses2'>\n";
+        expectedXml += "    <query-results>\n";
+        expectedXml += "      <identifiers>\n";
+        expectedXml += "        <identifier>stilton</identifier>\n";
+        expectedXml += "        <identifier>cheddar</identifier>\n";
+        expectedXml += "      </identifiers>\n";
+        expectedXml += "      <row>\n";
+        row = it2.next();
+        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese\"/>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese[2]\"/>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        expectedXml += "      </row>\n";
+        expectedXml += "      <row>\n";
+        row = it2.next();
+        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese\"/>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+        expectedXml += "        <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese[2]\"/>\n";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        expectedXml += "      </row>\n";
+        expectedXml += "    </query-results>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+        ExecutionResults batchResult = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+        Cheese stilton1 = new Cheese( "stilton",
+                                      1 );
+        Cheese cheddar1 = new Cheese( "cheddar",
+                                      1 );
+        Cheese stilton2 = new Cheese( "stilton",
+                                      2 );
+        Cheese cheddar2 = new Cheese( "cheddar",
+                                      2 );
+
+        Set set = new HashSet();
+        List list = new ArrayList();
+        list.add( stilton1 );
+        list.add( cheddar1 );
+        set.add( list );
+
+        list = new ArrayList();
+        list.add( stilton2 );
+        list.add( cheddar2 );
+        set.add( list );
+
+        org.drools.runtime.rule.QueryResults results = (org.drools.runtime.rule.QueryResults) batchResult.getValue( "cheeses" );
+        assertEquals( 2,
+                      results.size() );
+        assertEquals( 2,
+                      results.getIdentifiers().length );
+        Set newSet = new HashSet();
+        for ( org.drools.runtime.rule.QueryResultsRow result : results ) {
+            list = new ArrayList();
+            list.add( result.get( "stilton" ) );
+            list.add( result.get( "cheddar" ) );
+            newSet.add( list );
+        }
+        assertEquals( set,
+                      newSet );
+    }
+
+    public void testManualFireAllRules() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "global java.util.List list \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "    list.add( $c );";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <set-global identifier='list' out='true'>";
+        inXml += "    <list/>";
+        inXml += "  </set-global>";
+        inXml += "  <insert-elements>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>30</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert-elements>";
+        inXml += "  <fire-all-rules />";
+        inXml += "  <insert out-identifier='outBrie'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>brie</type>";
+        inXml += "      <price>10</price>";
+        inXml += "      <oldPrice>5</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "</batch-execution>";
+
+        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        FactHandle factHandle = (FactHandle) ((ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml )).getFactHandle( "outBrie" );
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier='list'>\n";
+        expectedXml += "    <list>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>35</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "      <org.drools.Cheese>\n";
+        expectedXml += "        <type>stilton</type>\n";
+        expectedXml += "        <price>30</price>\n";
+        expectedXml += "        <oldPrice>0</oldPrice>\n";
+        expectedXml += "      </org.drools.Cheese>\n";
+        expectedXml += "    </list>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <result identifier='outBrie'>\n";
+        expectedXml += "    <org.drools.Cheese>\n";
+        expectedXml += "      <type>brie</type>\n";
+        expectedXml += "      <price>10</price>\n";
+        expectedXml += "      <oldPrice>5</oldPrice>\n";
+        expectedXml += "    </org.drools.Cheese>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <fact-handle identifier=\"outBrie\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
+        expectedXml += "</execution-results>\n";
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+        // brie should not have been added to the list
+        List list = (List) result.getValue( "list" );
+        Cheese stilton25 = new Cheese( "stilton",
+                                       30 );
+        Cheese stilton30 = new Cheese( "stilton",
+                                       35 );
+
+        Set expectedList = new HashSet();
+        expectedList.add( stilton25 );
+        expectedList.add( stilton30 );
+
+        assertEquals( expectedList,
+                      new HashSet( list ) );
+
+        // brie should not have changed
+        Cheese brie10 = new Cheese( "brie",
+                                    10 );
+        brie10.setOldPrice( 5 );
+        assertEquals( brie10,
+                      result.getValue( "outBrie" ) );
+    }
+
+    public void testProcess() throws SAXException,
+                             IOException {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <imports>\n";
+        str += "      <import name=\"org.drools.TestVariable\" />\n";
+        str += "    </imports>\n";
+        str += "    <globals>\n";
+        str += "      <global identifier=\"list\" type=\"java.util.List\" />\n";
+        str += "    </globals>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"person\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"TestVariable\" />\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <actionNode id=\"2\" name=\"MyActionNode\" >\n";
+        str += "      <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Triggered\");\n";
+        str += "list.add(person.name);\n";
+        str += "</action>\n";
+        str += "    </actionNode>\n";
+        str += "    <end id=\"3\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"2\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "  </connections>\n" + "\n";
+        str += "</process>";
+
+        Reader source = new StringReader( str );
+        kbuilder.add( ResourceFactory.newReaderResource( source ),
+                      ResourceType.DRF );
+        if ( kbuilder.hasErrors() ) {
+            fail( kbuilder.getErrors().toString() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal( "list",
+                            list );
+        TestVariable person = new TestVariable( "John Doe" );
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <start-process processId='org.drools.actions'>";
+        inXml += "    <parameter identifier='person'>";
+        inXml += "       <org.drools.TestVariable>";
+        inXml += "         <name>John Doe</name>";
+        inXml += "    </org.drools.TestVariable>";
+        inXml += "    </parameter>";
+        inXml += "  </start-process>";
+        inXml += "  <get-global identifier='list' out-identifier='out-list'/>";
+        inXml += "</batch-execution>";
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipeline( ksession ).insert( inXml,
+                                        resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        assertEquals( 1,
+                      list.size() );
+        assertEquals( "John Doe",
+                      list.get( 0 ) );
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier=\"out-list\">\n";
+        expectedXml += "    <list>\n";
+        expectedXml += "      <string>John Doe</string>\n";
+        expectedXml += "    </list>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+    }
+
+    public void testProcessInstanceSignalEvent() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"MyVar\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>SomeText</value>\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <eventNode id=\"2\" name=\"Event\" variableName=\"MyVar\" >\n";
+        str += "      <eventFilters>\n";
+        str += "        <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+        str += "      </eventFilters>\n";
+        str += "    </eventNode>\n";
+        str += "    <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+        str += "    <end id=\"4\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"3\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "    <connection from=\"3\" to=\"4\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";
+
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRF );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+
+        String inXml = "";
+        inXml += "<signal-event process-instance-id= '" + processInstance.getId() + "' event-type='MyEvent'>";
+        inXml += "    <string>MyValue</string>";
+        inXml += "</signal-event>";
+
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        assertEquals( "MyValue",
+                      ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+    }
+
+    public void testProcessRuntimeSignalEvent() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"MyVar\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>SomeText</value>\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <eventNode id=\"2\" name=\"Event\" scope=\"external\" variableName=\"MyVar\" >\n";
+        str += "      <eventFilters>\n";
+        str += "        <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+        str += "      </eventFilters>\n";
+        str += "    </eventNode>\n";
+        str += "    <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+        str += "    <end id=\"4\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"3\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "    <connection from=\"3\" to=\"4\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";
+
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRF );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+
+        String inXml = "";
+        inXml += "<signal-event event-type='MyEvent'>";
+        inXml += "    <string>MyValue</string>";
+        inXml += "</signal-event>";
+
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        assertEquals( "MyValue",
+                      ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+    }
+
+    public void testCompleteWorkItem() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"UserName\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>John Doe</value>\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Person\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"MyObject\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Number\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <workItem id=\"2\" name=\"HumanTask\" >\n";
+        str += "      <work name=\"Human Task\" >\n";
+        str += "        <parameter name=\"ActorId\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{UserName}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Content\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{Person.name}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"TaskName\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>Do something</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Priority\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Comment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Attachment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "        </parameter>\n";
+        str += "      </work>\n";
+        str += "      <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+        str += "      <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+        str += "      <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+        str += "      <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+        str += "    </workItem>\n";
+        str += "    <end id=\"3\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"2\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";
+
+        Reader source = new StringReader( str );
+        kbuilder.add( ResourceFactory.newReaderResource( source ),
+                      ResourceType.DRF );
+
+        Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kpkgs );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        TestWorkItemHandler handler = new TestWorkItemHandler();
+        ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+                                                               handler );
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "John Doe" );
+        Person person = new Person();
+        person.setName( "John Doe" );
+        parameters.put( "Person",
+                        person );
+        WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+                                                                                                   parameters );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+        assertEquals( "John Doe",
+                      workItem.getParameter( "ActorId" ) );
+        assertEquals( "John Doe",
+                      workItem.getParameter( "Content" ) );
+        assertEquals( "John Doe",
+                      workItem.getParameter( "Comment" ) );
+
+        assertEquals( WorkItem.PENDING,
+                      workItem.getState() );
+
+        String inXml = "";
+        inXml = "<complete-work-item id='" + workItem.getId() + "' />";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( WorkItem.COMPLETED,
+                      workItem.getState() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+
+        parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "Jane Doe" );
+        parameters.put( "MyObject",
+                        "SomeString" );
+        person = new Person();
+        person.setName( "Jane Doe" );
+        parameters.put( "Person",
+                        person );
+        processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+                                                                           parameters );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+        assertEquals( "Jane Doe",
+                      workItem.getParameter( "ActorId" ) );
+        assertEquals( "SomeString",
+                      workItem.getParameter( "Attachment" ) );
+        assertEquals( "Jane Doe",
+                      workItem.getParameter( "Content" ) );
+        assertEquals( "Jane Doe",
+                      workItem.getParameter( "Comment" ) );
+
+        assertEquals( WorkItem.PENDING,
+                      workItem.getState() );
+
+        inXml = "";
+        inXml += "<complete-work-item id='" + workItem.getId() + "' >";
+        inXml += "    <result identifier='Result'>";
+        inXml += "        <string>SomeOtherString</string>";
+        inXml += "    </result>";
+        inXml += "</complete-work-item>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( WorkItem.COMPLETED,
+                      workItem.getState() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        assertEquals( "SomeOtherString",
+                      processInstance.getVariable( "MyObject" ) );
+        assertEquals( 15,
+                      processInstance.getVariable( "Number" ) );
+    }
+
+    public void testAbortWorkItem() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        String str = "";
+        str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+        str += "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        str += "         xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+        str += "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+        str += "\n";
+        str += "  <header>\n";
+        str += "    <variables>\n";
+        str += "      <variable name=\"UserName\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        <value>John Doe</value>\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Person\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"MyObject\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "      </variable>\n";
+        str += "      <variable name=\"Number\" >\n";
+        str += "        <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+        str += "      </variable>\n";
+        str += "    </variables>\n";
+        str += "  </header>\n";
+        str += "\n";
+        str += "  <nodes>\n";
+        str += "    <start id=\"1\" name=\"Start\" />\n";
+        str += "    <workItem id=\"2\" name=\"HumanTask\" >\n";
+        str += "      <work name=\"Human Task\" >\n";
+        str += "        <parameter name=\"ActorId\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{UserName}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Content\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>#{Person.name}</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"TaskName\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "          <value>Do something</value>\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Priority\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Comment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+        str += "        </parameter>\n";
+        str += "        <parameter name=\"Attachment\" >\n";
+        str += "          <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+        str += "        </parameter>\n";
+        str += "      </work>\n";
+        str += "      <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+        str += "      <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+        str += "      <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+        str += "      <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+        str += "    </workItem>\n";
+        str += "    <end id=\"3\" name=\"End\" />\n";
+        str += "  </nodes>\n";
+        str += "\n";
+        str += "  <connections>\n";
+        str += "    <connection from=\"1\" to=\"2\" />\n";
+        str += "    <connection from=\"2\" to=\"3\" />\n";
+        str += "  </connections>\n";
+        str += "\n";
+        str += "</process>";
+
+        Reader source = new StringReader( str );
+        kbuilder.add( ResourceFactory.newReaderResource( source ),
+                      ResourceType.DRF );
+
+        Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kpkgs );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        TestWorkItemHandler handler = new TestWorkItemHandler();
+        ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+                                                               handler );
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "John Doe" );
+        Person person = new Person();
+        person.setName( "John Doe" );
+        parameters.put( "Person",
+                        person );
+        WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+                                                                                                   parameters );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull( workItem );
+
+        assertEquals( WorkItem.PENDING,
+                      workItem.getState() );
+
+        String inXml = "<abort-work-item id='" + workItem.getId() + "' />";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( WorkItem.ABORTED,
+                      workItem.getState() );
+    }
+
+    public static class TestWorkItemHandler
+        implements
+        WorkItemHandler {
+        private WorkItem workItem;
+
+        public void executeWorkItem(WorkItem workItem,
+                                    WorkItemManager manager) {
+            this.workItem = workItem;
+        }
+
+        public void abortWorkItem(WorkItem workItem,
+                                  WorkItemManager manager) {
+        }
+
+        public WorkItem getWorkItem() {
+            return workItem;
+        }
+    }
+
+    public void testInsertObjectWithDeclaredFact() throws Exception {
+        String str = "";
+        str += "package org.foo \n";
+        str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Whee() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.foo.Whee>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.foo.Whee>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        ClassLoader cl = ((InternalRuleBase) ((StatefulKnowledgeSessionImpl) ksession).getRuleBase()).getRootClassLoader();
+        XStream xstream = BatchExecutionHelper.newXStreamMarshaller();
+        xstream.setClassLoader( cl );
+        FactHandle factHandle = (FactHandle) ((ExecutionResults) xstream.fromXML( outXml )).getFactHandle( "outStilton" );
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier=\"outStilton\">\n";
+        expectedXml += "    <org.foo.Whee>\n";
+        expectedXml += "      <type>stilton</type>\n";
+        expectedXml += "      <oldPrice>0</oldPrice>\n";
+        expectedXml += "      <price>30</price>\n";
+        expectedXml += "    </org.foo.Whee>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+
+    }
+
+    public void testInsertObjectStateful() throws Exception {
+        String str = "";
+        str += "package org.foo \n";
+        str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Whee(price < 30) \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n update($c);\n";
+        str += "end\n";
+        str += "query results\n";
+        str += "    w: Whee(price == 30)";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert>";
+        inXml += "    <org.foo.Whee>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.foo.Whee>";
+        inXml += "  </insert>";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+
+        getPipelineStateful( ksession ).insert( "<batch-execution><query out-identifier='matchingthings' name='results'/></batch-execution>",
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();
+
+        //we have not fired the rules yet
+        assertFalse( outXml.indexOf( "<price>30</price>" ) > -1 );
+
+        //lets send a command to execute them then
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <fire-all-rules max='100'/>";
+        inXml += "</batch-execution>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        //ksession.fireAllRules();
+
+        //ok lets try that again...
+        getPipelineStateful( ksession ).insert( "<batch-execution><query out-identifier='matchingthings' name='results'/></batch-execution>",
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();
+        assertTrue( outXml.indexOf( "<price>30</price>" ) > -1 );
+    }
+
+    public void testVsmPipeline() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution lookup=\"ksession1\" >";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        LocalConnection connection = new LocalConnection();
+        ExecutionNode node = connection.getExecutionNode(null);
+
+        StatefulKnowledgeSession ksession = getExecutionNodeSessionStateful(node, ResourceFactory.newByteArrayResource( str.getBytes() ) );
+
+        node.get(DirectoryLookupFactoryService.class).register("ksession1", ksession);
+
+        XStreamResolverStrategy xstreamStrategy = new XStreamResolverStrategy() {
+            public XStream lookup(String name) {
+                return BatchExecutionHelper.newXStreamMarshaller();
+            }
+        };
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineSessionStateful(node, xstreamStrategy).insert(inXml, resultHandler);
+        String outXml = (String) resultHandler.getObject();
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+        stilton = (Cheese) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );
+
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier=\"outStilton\">\n";
+        expectedXml += "    <org.drools.Cheese>\n";
+        expectedXml += "      <type>stilton</type>\n";
+        expectedXml += "      <oldPrice>0</oldPrice>\n";
+        expectedXml += "      <price>30</price>\n";
+        expectedXml += "    </org.drools.Cheese>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+        expectedXml += "</execution-results>\n";
+
+        assertXMLEqual( expectedXml,
+                        outXml );
+    }
+
+    private Pipeline getPipeline(StatelessKnowledgeSession ksession) {
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        outTransformer.setReceiver( assignResult );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( outTransformer );
+
+        Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        inTransformer.setReceiver( batchExecution );
+
+        Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( inTransformer );
+
+        return pipeline;
+    }
+
+    private Pipeline getPipelineSessionStateful(ExecutionNode node, XStreamResolverStrategy xstreamResolverStrategy) {
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        //Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        Transformer outTransformer = new XStreamToXmlGridTransformer();
+        outTransformer.setReceiver( assignResult );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( outTransformer );
+
+        //Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        Transformer inTransformer = new XStreamFromXmlGridTransformer( xstreamResolverStrategy );
+        inTransformer.setReceiver( batchExecution );
+
+//        Transformer domTransformer = new ToXmlNodeTransformer();
+//        domTransformer.setReceiver( inTransformer );
+
+        //Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        Pipeline pipeline = new ExecutionNodePipelineImpl( node );
+
+        pipeline.setReceiver( inTransformer );
+
+        return pipeline;
+    }
+
+    private Pipeline getPipelineStateful(StatefulKnowledgeSession ksession) {
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        outTransformer.setReceiver( assignResult );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( outTransformer );
+
+        Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+        inTransformer.setReceiver( batchExecution );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( inTransformer );
+
+        return pipeline;
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+
+    private StatelessKnowledgeSession getSession2(Resource resource) throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( resource,
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+        }
+
+        assertFalse( kbuilder.hasErrors() );
+        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        kbase.addKnowledgePackages( pkgs );
+        StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
+
+        return session;
+    }
+
+    private StatefulKnowledgeSession getSessionStateful(Resource resource) throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( resource,
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+        }
+
+        assertFalse( kbuilder.hasErrors() );
+        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        kbase.addKnowledgePackages( pkgs );
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+        return session;
+    }
+
+    private StatefulKnowledgeSession getExecutionNodeSessionStateful(ExecutionNode node, Resource resource) throws Exception {
+        KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+        kbuilder.add( resource,
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+        }
+
+        assertFalse( kbuilder.hasErrors() );
+        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+        KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+
+        kbase.addKnowledgePackages( pkgs );
+        StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+        return session;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,127 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.XStreamStatefulSessionTest.ResultHandlerImpl;
+import org.drools.runtime.rule.FactHandle;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamFactTest extends TestCase {
+    
+    protected void setUp() throws Exception {
+        XMLUnit.setIgnoreComments( true );
+        XMLUnit.setIgnoreWhitespace( true );
+        XMLUnit.setIgnoreAttributeOrder( true );
+        XMLUnit.setNormalizeWhitespace( true );
+        XMLUnit.setNormalize( true );
+    }
+
+    private void assertXMLEqual(String expectedXml,
+                                String resultXml) {
+        try {
+            Diff diff = new Diff( expectedXml,
+                                  resultXml );
+            diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+            XMLAssert.assertXMLEqual( diff,
+                                      true );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "XML Assertion failure",
+                                        e );
+        }
+    }
+    
+    
+    public void testFact() throws Exception {
+        String xml = "";
+        xml += "<list>\n";
+        xml += "  <example.OrderItem>\n";
+        xml += "    <price>8.9</price>\n";        
+        xml += "    <productId>111</productId>\n";
+        xml += "    <quantity>2</quantity>\n";        
+        xml += "  </example.OrderItem>\n";
+        xml += "</list>\n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+                                                            XStreamStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+        
+        XStream xstream = new XStream();
+        Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( xml,
+                         resultHandler );
+        
+        FactHandle factHandle = ( FactHandle ) ((Map)resultHandler.getObject()).keySet().iterator().next();
+        assertNotNull( factHandle );
+
+        // now round trip that fact
+        Action executeResult = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+        assignAsResult.setReceiver( executeResult );
+        
+        transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+        transformer.setReceiver( assignAsResult );
+        
+        KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();      
+        getObject.setReceiver( transformer );
+
+        pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( getObject );
+        
+        resultHandler = new ResultHandlerImpl();
+        pipeline.insert( factHandle, resultHandler );  
+        
+        assertXMLEqual( xml, (String) resultHandler.getObject() );
+    }
+    
+    private static void assertEqualsIgnoreWhitespace(final String expected,
+                                                     final String actual) {
+               final String cleanExpected = expected.replaceAll( "\\s+",
+                                                                 "" );
+               final String cleanActual = actual.replaceAll( "\\s+",
+                                                             "" );
+               assertEquals( cleanExpected,
+                             cleanActual );
+           }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,119 @@
+package org.drools.runtime.pipeline.impl;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.XStreamStatefulSessionTest.ResultHandlerImpl;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamGlobalTest extends TestCase {
+    
+    protected void setUp() throws Exception {
+        XMLUnit.setIgnoreComments( true );
+        XMLUnit.setIgnoreWhitespace( true );
+        XMLUnit.setIgnoreAttributeOrder( true );
+        XMLUnit.setNormalizeWhitespace( true );
+        XMLUnit.setNormalize( true );
+    }
+
+    private void assertXMLEqual(String expectedXml,
+                                String resultXml) {
+        try {
+            Diff diff = new Diff( expectedXml,
+                                  resultXml );
+            diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+            XMLAssert.assertXMLEqual( diff,
+                                      true );
+        } catch ( Exception e ) {
+            throw new RuntimeException( "XML Assertion failure",
+                                        e );
+        }
+    }
+    
+    
+    public void testGlobal() throws Exception {
+        String xml = "";
+        xml += "<list>\n";
+        xml += "  <example.OrderItem>\n";
+        xml += "    <price>8.9</price>\n";        
+        xml += "    <productId>111</productId>\n";
+        xml += "    <quantity>2</quantity>\n";        
+        xml += "  </example.OrderItem>\n";
+        xml += "</list>";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+                                                            XStreamStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        KnowledgeRuntimeCommand setGlobalStage = PipelineFactory.newStatefulKnowledgeSessionSetGlobal( "list" );
+
+        XStream xstream = new XStream();
+        Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+        transformer.setReceiver( setGlobalStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( xml,
+                         resultHandler );
+
+
+        // now round trip that global
+        Action executeResult = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+        assignAsResult.setReceiver( executeResult );
+        
+        transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+        transformer.setReceiver( assignAsResult );
+        
+        KnowledgeRuntimeCommand getGlobalStage = PipelineFactory.newStatefulKnowledgeSessionGetGlobal( );        
+        getGlobalStage.setReceiver( transformer );
+
+        pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( getGlobalStage );
+        
+        resultHandler = new ResultHandlerImpl();
+        pipeline.insert( "list", resultHandler );  
+        
+        assertXMLEqual( xml, (String) resultHandler.getObject() );
+    }
+    
+    private static void assertEqualsIgnoreWhitespace(final String expected,
+                                                     final String actual) {
+               final String cleanExpected = expected.replaceAll( "\\s+",
+                                                                 "" );
+               final String cleanActual = actual.replaceAll( "\\s+",
+                                                             "" );
+               assertEquals( cleanExpected,
+                             cleanActual );
+           }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,144 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamStatefulSessionTest extends TestCase {
+
+    public void testDirectRoot() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+                                                            XStreamStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+
+        XStream xstream = new XStream();
+        Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( getClass().getResourceAsStream( "XStreamDirectRoot.xml" ),
+                         resultHandler );
+        ksession.fireAllRules();
+
+        Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+
+        assertEquals( 1,
+                      handles.size() );
+        assertEquals( 1,
+                      list.size() );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+    }
+
+    public void testNestedIterable() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamNestedIterable.drl",
+                                                            XStreamStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+        insertStage.setReceiver( executeResultHandler );
+
+        Splitter splitter = PipelineFactory.newIterateSplitter();
+        splitter.setReceiver( insertStage );
+
+        XStream xstream = new XStream();
+        Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+        transformer.setReceiver( splitter );
+
+        Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( getClass().getResourceAsStream( "XStreamNestedIterable.xml" ),
+                         resultHandler );
+
+        Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+        ksession.fireAllRules();
+
+        assertEquals( 2,
+                      handles.size() );
+        assertEquals( 2,
+                      list.size() );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+        assertEquals( "example.OrderItem",
+                      list.get( 1 ).getClass().getName() );
+
+        assertNotSame( list.get( 0 ),
+                       list.get( 1 ) );
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,137 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamStatelessSessionTest extends TestCase {
+
+    public void testXstreamDirectRoot() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+                                                            XStreamStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( assignResult );
+        
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newInsertObjectCommand();
+        insertStage.setReceiver( batchExecution );
+
+        XStream xstream = new XStream();
+        Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+        transformer.setReceiver( insertStage );
+
+        Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( getClass().getResourceAsStream( "XStreamDirectRoot.xml" ),
+                         resultHandler );
+
+        assertEquals( 1,
+                      list.size() );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+    }
+
+    public void testXstreamNestedIterable() throws Exception {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamNestedIterable.drl",
+                                                            XStreamStatefulSessionTest.class ),
+                      ResourceType.DRL );
+
+        assertFalse( kbuilder.hasErrors() );
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+        
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver( executeResultHandler );
+
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver( assignResult );
+        
+        KnowledgeRuntimeCommand insertElementsStage = PipelineFactory.newInsertElementsCommand();
+        insertElementsStage.setReceiver( batchExecution );
+        
+        Expression mvelExpression = PipelineFactory.newMvelExpression( "this.children" );
+        mvelExpression.setReceiver( insertElementsStage );
+
+        XStream xstream = new XStream();
+        Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+        transformer.setReceiver( insertElementsStage );
+
+        Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+        pipeline.setReceiver( transformer );
+
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert( getClass().getResourceAsStream( "XStreamNestedIterable.xml" ),
+                         resultHandler );
+
+        assertEquals( "example.OrderItem",
+                      list.get( 0 ).getClass().getName() );
+        assertEquals( "example.OrderItem",
+                      list.get( 1 ).getClass().getName() );
+
+        assertNotSame( list.get( 0 ),
+                       list.get( 1 ) );
+    }
+
+    public static class ResultHandlerImpl
+        implements
+        ResultHandler {
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,5 @@
+<order-item>
+    <product>222</product>
+    <quantity>7</quantity>
+    <price>5.20</price>
+</order-item>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,12 @@
+<root>
+    <order-item>
+        <product>111</product>
+        <quantity>2</quantity>
+        <price>8.90</price>
+    </order-item>
+    <order-item>
+        <product>222</product>
+        <quantity>7</quantity>
+        <price>5.20</price>
+    </order-item>
+</root>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,5 @@
+<example.OrderItem>
+    <productId>222</productId>
+    <quantity>7</quantity>
+    <price>5.20</price>
+</example.OrderItem>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,12 @@
+<java.util.ArrayList>
+    <example.OrderItem>
+        <productId>111</productId>
+        <quantity>2</quantity>
+        <price>8.90</price>
+    </example.OrderItem>
+    <example.OrderItem>
+        <productId>222</productId>
+        <quantity>7</quantity>
+        <price>5.20</price>
+    </example.OrderItem>
+</java.util.ArrayList>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<myAddress xmlns="http://www.oracle.com/sample3/" 
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	     xsi:schemaLocation="http://www.oracle.com/sample3 sample3.xsd">
+	<name>James Bond</name>
+	<doorNumber>420</doorNumber>
+	<street>Oracle parkway</street>
+	<city>Redwood shores</city>
+	<state>CA</state>
+	<zip>94065</zip>
+	<country>United States</country>
+</myAddress>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departmentData.xls
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departmentData.xls
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<workbook>
+    <worksheet name="Sheet1">
+    
+        <section startRow="0" endRow="6">
+            <mapping cell="B1">company.name</mapping>
+        </section>
+        <loop startRow="7" endRow="7" items="company.employee" var="employee" varType="org.drools.runtime.pipeline.impl.Employee">
+            <section startRow="7" endRow="7">
+                <mapping row="7" col="0">employee.name</mapping>
+                <mapping row="7" col="1">employee.age</mapping>
+                <mapping row="7" col="3">employee.payment</mapping>
+                <mapping row="7" col="4">employee.bonus</mapping>
+            </section>
+            <loopbreakcondition>
+                <rowcheck offset="0">
+                    <cellcheck offset="0">Employee Payment Totals:</cellcheck>
+                </rowcheck>
+            </loopbreakcondition>
+        </loop>
+        
+    </worksheet>
+    <worksheet name="Sheet3">
+        <loop startRow="0" endRow="8" items="departments" var="department" varType="org.drools.runtime.pipeline.impl.Department">
+            <section startRow="0" endRow="6">
+                <mapping row="0" col="1">department.name</mapping>
+            </section>
+            <loop startRow="7" endRow="7" items="department.staff" var="employee" varType="org.drools.runtime.pipeline.impl.Employee">
+                <section startRow="7" endRow="7">
+                    <mapping row="7" col="0">employee.name</mapping>
+                    <mapping row="7" col="1">employee.age</mapping>
+                    <mapping row="7" col="2">employee.payment</mapping>
+                    <mapping row="7" col="3">employee.bonus</mapping>
+                </section>
+                <loopbreakcondition>
+                    <rowcheck offset="0">
+                        <cellcheck offset="0">Employee Payment Totals:</cellcheck>
+                    </rowcheck>
+                </loopbreakcondition>
+            </loop>
+            <section startRow="8" endRow="8"/>
+            <loopbreakcondition>
+                <rowcheck offset="0"/>
+                <rowcheck offset="1"/>
+            </loopbreakcondition>
+        </loop>
+    </worksheet> 
+</workbook>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:order xmlns:ns2="http://drools.org/model/order" >
+    <ns2:order-item>
+        <ns2:product-id>111</ns2:product-id>
+        <ns2:quantity>2</ns2:quantity>
+        <ns2:price>8.90</ns2:price>
+    </ns2:order-item>
+    <ns2:order-item>
+        <ns2:product-id>222</ns2:product-id>
+        <ns2:quantity>7</ns2:quantity>
+        <ns2:price>5.20</ns2:price>
+    </ns2:order-item>
+</ns2:order>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,43 @@
+<xsd:schema xmlns:order="http://drools.org/model/order" 
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	        targetNamespace="http://drools.org/model/order"
+	        elementFormDefault="qualified" >
+	        
+        
+	<xsd:element name="order">
+		<xsd:complexType>
+			<xsd:sequence>
+				<xsd:element name="order-item" minOccurs="0" maxOccurs="unbounded">
+					<xsd:complexType>
+						<xsd:sequence>
+							<xsd:element name="product-id" type="xsd:long" />
+							<xsd:element name="quantity" type="xsd:integer" />
+							<xsd:element name="price" type="xsd:decimal" />
+						</xsd:sequence>	
+					</xsd:complexType>
+				</xsd:element>
+			</xsd:sequence>
+		</xsd:complexType>		
+	</xsd:element>
+
+<!--
+	
+	<xsd:element name="order" type="order:OrderType" />
+	
+	<xsd:complexType name="OrderType">
+		<xsd:sequence>
+			<xsd:element name="orderItem" type="order:orderItemType" minOccurs="0" maxOccurs="unbounded" />
+		</xsd:sequence>
+	</xsd:complexType>	
+	
+	        
+	<xsd:complexType name="orderItem">	
+		<xsd:sequence>
+			<xsd:element name="product-id" type="xsd:long" />
+			<xsd:element name="quantity" type="xsd:integer" />
+			<xsd:element name="price" type="xsd:decimal" />
+		</xsd:sequence>
+	</xsd:complexType>	
+-->
+
+</xsd:schema>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd">
+
+    <!--
+    Create an "example.beans.Order" bean instance when we visit the start of the <order> element.
+    Assign the new bean instance to the beanId of "order".
+    -->
+    <resource-config selector="root">
+        <resource>org.milyn.javabean.BeanPopulator</resource>
+        <param name="beanId">root</param>
+        <param name="beanClass">org.drools.runtime.pipeline.impl.Root</param>
+        <param name="bindings">
+            <binding property="children" selector="${children}" />
+        </param>
+    </resource-config>
+
+    <!--
+    Create an ArrayList bean instance when we visit the start of the <order> element.
+    Call it "orderItems" and seet it on the "order".
+    -->
+    <resource-config selector="root">
+        <resource>org.milyn.javabean.BeanPopulator</resource>
+        <param name="beanId">children</param>
+        <param name="beanClass">java.util.ArrayList</param>
+        <param name="bindings">
+			<binding selector="${orderItem}" />
+		</param>
+    </resource-config>
+
+    <!--
+    Create an "example.beans.OrderItem" bean instance when we visit the start of the <order-item> element.
+    Set the OrderItem instances on the "orderItem".
+    -->
+    <resource-config selector="order-item">
+        <resource>org.milyn.javabean.BeanPopulator</resource>
+        <param name="beanClass">example.OrderItem</param>
+        <param name="bindings">
+            <!-- OrderItem bindings... -->
+            <binding property="productId" type="Long" selector="order-item product" />
+            <binding property="quantity" type="Integer" selector="order-item quantity" />
+            <binding property="price" type="Double" selector="order-item price" />
+        </param>
+    </resource-config>
+
+
+</smooks-resource-list>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,29 @@
+<schema xmlns = "http://www.w3.org/2001/XMLSchema"
+        xmlns:exp="http://www.oracle.com/sample3/"
+        targetNamespace="http://www.oracle.com/sample3/"
+        elementFormDefault="qualified">
+ 
+   <complexType name="Address">
+      <sequence>
+         <element name="name" type="string"/>
+         <element name="doorNumber" type="short"/>
+         <element name="street" type="string"/>
+         <element name="city" type="string"/>
+      </sequence>
+   </complexType>
+ 
+  <complexType name="USAddress">
+    <complexContent>
+     <extension base="exp:Address">
+       <sequence>
+          <element name="state" type="string"/>
+          <element name="zip" type="integer"/>
+          <element name="country" type="string"/>
+       </sequence>
+     </extension>
+    </complexContent>
+  </complexType>
+ 
+  <element name="myAddress" type="exp:USAddress"/>
+ 
+</schema>

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,17 @@
+package sample
+
+import java.util.List
+// this doesn't work, as we don't support default values
+ 
+
+declare Department
+    name : String
+    chief : Employee
+    staff : List
+end
+
+declare Company
+    name : String
+    chief : Employee
+    employee : List
+end

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,31 @@
+package org.drools.xxx
+
+import org.drools.model.order.Order
+import org.drools.model.order.Order.OrderItem
+
+global java.util.List list1;
+global java.util.List list2;
+
+global org.drools.model.order.Order order
+
+
+rule orderRule
+when
+    $i : Order()
+then
+    list1.add( $i );
+end
+
+rule orderItemRule1
+when
+    $i : OrderItem( price > 6)
+then
+    list1.add( $i );
+end
+
+rule orderItemRule2
+when
+    $i : OrderItem( price < 6)
+then
+    list2.add( $i );
+end
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,18 @@
+package example
+
+global java.util.List list;
+
+global org.drools.runtime.pipeline.impl.Root root
+
+declare OrderItem
+    productId : long
+    quantity : Integer
+    price : double
+end
+
+rule someRule
+when
+    $i : OrderItem()
+then
+    list.add( $i );
+end
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,18 @@
+package example
+
+global java.util.List list;
+
+global org.drools.runtime.pipeline.impl.Root root
+
+declare OrderItem
+    productId : long
+    quantity : Integer
+    price : double
+end
+
+rule someRule
+when
+    $i : OrderItem()
+then
+    list.add( $i ); 
+end
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,16 @@
+package example
+
+global java.util.List list;
+
+declare OrderItem
+    productId : long
+    quantity : Integer
+    price : double
+end
+
+rule someRule
+when
+    $i : OrderItem()
+then
+    list.add( $i );
+end
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl	2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,16 @@
+package example
+
+global java.util.List list;
+
+declare OrderItem
+    productId : long
+    quantity : Integer
+    price : double
+end
+
+rule someRule
+when
+    $i : OrderItem()
+then
+    list.add( $i ); 
+end
\ No newline at end of file



More information about the jboss-svn-commits mailing list