[jboss-svn-commits] JBL Code SVN: r33359 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/base and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Jun 5 00:26:31 EDT 2010


Author: mark.proctor at jboss.com
Date: 2010-06-05 00:26:28 -0400 (Sat, 05 Jun 2010)
New Revision: 33359

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
Removed:
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java
Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
Log:
JBRULES-2537 JSon Marshaller
-Added JSon marshaller using xstream, with unit tests.

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -239,6 +239,10 @@
     public static XStream newXStreamMarshaller() {
         return getBatchExecutionHelperProvider().newXStreamMarshaller();
     }
+    
+    public static XStream newJSonMarshaller() {
+        return getBatchExecutionHelperProvider().newJSonMarshaller();
+    }    
 
     private static synchronized void setBatchExecutionHelperProvider(BatchExecutionHelperProvider provider) {
         BatchExecutionHelper.provider = provider;

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -9,4 +9,5 @@
  */
 public interface BatchExecutionHelperProvider {
     XStream newXStreamMarshaller();
+    XStream newJSonMarshaller();
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -142,13 +142,12 @@
                     final Object[] params = {index, fieldType, valueType};
                     return (BaseClassFieldReader) newClass.getConstructors()[0].newInstance( params );
                 } else {
-                    throw new RuntimeDroolsException( "Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'" );
+                    throw new RuntimeDroolsException( "Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'\n" );
                 }
             }
         } catch ( final RuntimeDroolsException e ) {
             throw e;
         } catch ( final Exception e ) {
-//            e.printStackTrace();
             throw new RuntimeDroolsException( e );
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -41,7 +41,13 @@
     public String getIdentifier() {
         return identifier;
     }
+    
+    
 
+    public void setIdentifier(String identifier) {
+        this.identifier = identifier;
+    }
+
     public Object execute(Context context) {
         StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -54,6 +54,10 @@
     public String getIdentifier() {
         return this.identifier;
     }
+    
+    public void setIdentifier(String identifier) {
+        this.identifier = identifier;
+    }
 
     public Object getObject() {
         return this.object;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -1,5 +1,7 @@
 package org.drools.command.runtime.rule;
 
+import java.io.ObjectStreamException;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -89,5 +91,10 @@
     public String toString() {
         return "session.insert(" + object + ");";
     }
+    
+//    private Object readResolve() throws ObjectStreamException {
+//        this.returnObject = true;
+//        return this;
+//    }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -17,7 +17,10 @@
  * limitations under the License.
  */
 
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.Reader;
 import java.io.StringWriter;
 import java.io.Writer;
@@ -1184,4 +1187,29 @@
         }
         return out.toString();
     } 
+    
+    public static String toString(Reader reader) throws IOException {
+        if ( reader instanceof BufferedReader ) {
+            return toString( (BufferedReader) reader );
+        } else {
+            return toString( new BufferedReader( reader ) );
+        }    
+    }
+    
+    public static String toString(InputStream is) throws IOException {
+        return toString( new BufferedReader(new InputStreamReader(is, "UTF-8") ) );
+    }    
+    
+    public static String toString(BufferedReader reader) throws IOException {
+        StringBuilder sb = new StringBuilder();
+        try {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line).append("\n");
+            }
+        } finally {
+            reader.close();
+        }
+        return sb.toString();
+    }     
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -1,1052 +1,23 @@
 package org.drools.runtime.help.impl;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.drools.base.ClassObjectType;
-import org.drools.base.DroolsQuery;
-import org.drools.command.Command;
-import org.drools.command.CommandFactory;
-import org.drools.command.Setter;
-import org.drools.command.runtime.BatchExecutionCommand;
-import org.drools.command.runtime.GetGlobalCommand;
-import org.drools.command.runtime.SetGlobalCommand;
-import org.drools.command.runtime.process.AbortWorkItemCommand;
-import org.drools.command.runtime.process.CompleteWorkItemCommand;
-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.GetObjectCommand;
-import org.drools.command.runtime.rule.GetObjectsCommand;
-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.drools.command.runtime.rule.RetractCommand;
-import org.drools.common.DefaultFactHandle;
-import org.drools.common.DisconnectedFactHandle;
-import org.drools.rule.Declaration;
-import org.drools.runtime.ExecutionResults;
 import org.drools.runtime.help.BatchExecutionHelperProvider;
-import org.drools.runtime.impl.ExecutionResultImpl;
-import org.drools.runtime.rule.FactHandle;
-import org.drools.runtime.rule.QueryResults;
-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 com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.converters.Converter;
-import com.thoughtworks.xstream.converters.MarshallingContext;
-import com.thoughtworks.xstream.converters.UnmarshallingContext;
-import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
-import com.thoughtworks.xstream.io.HierarchicalStreamReader;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import com.thoughtworks.xstream.mapper.Mapper;
 
 public class BatchExecutionHelperProviderImpl
     implements
     BatchExecutionHelperProvider {
-    
+
     public XStream newXStreamMarshaller() {
-        return newXStreamMarshaller( new XStream());
+        return newXStreamMarshaller( new XStream() );
     }
 
-    public XStream newXStreamMarshaller(XStream xstream) {
-        ElementNames names = new XmlElementNames();
-        
-        // xstream.setMode( XStream.NO_REFERENCES );
-        xstream.processAnnotations( BatchExecutionCommand.class );
-        xstream.addImplicitCollection( BatchExecutionCommand.class,
-                                       "commands" );
-        
-        xstream.alias( "batch-execution",
-        		BatchExecutionCommand.class );
-        xstream.alias( "insert",
-                       InsertObjectCommand.class );
-        xstream.alias( "modify",
-                       ModifyCommand.class );
-        xstream.alias( "retract",
-                       RetractCommand.class );
-        xstream.alias( "insert-elements",
-                       InsertElementsCommand.class );
-        xstream.alias( "start-process",
-                       StartProcessCommand.class );
-        xstream.alias( "signal-event",
-                       SignalEventCommand.class );
-        xstream.alias( "complete-work-item",
-                       CompleteWorkItemCommand.class );
-        xstream.alias( "abort-work-item",
-                       AbortWorkItemCommand.class );
-        xstream.alias( "set-global",
-                       SetGlobalCommand.class );
-        xstream.alias( "get-global",
-                       GetGlobalCommand.class );
-        xstream.alias( "get-object",
-                       GetObjectCommand.class );
-        xstream.alias( "get-objects",
-                       GetObjectsCommand.class );
-        xstream.alias( "execution-results",
-                       ExecutionResultImpl.class );
-        xstream.alias( "fire-all-rules",
-                       FireAllRulesCommand.class );
-        xstream.alias( "query",
-                       QueryCommand.class );
-        xstream.alias( "query-results",
-                       FlatQueryResults.class );
-        xstream.alias( "query-results",
-                       NativeQueryResults.class );
-        xstream.alias("fact-handle", DefaultFactHandle.class);
-
-        xstream.registerConverter( new InsertConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new RetractConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new ModifyConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new GetObjectConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new InsertElementsConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new FireAllRulesConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new StartProcessConvert( xstream.getMapper() ) );
-        xstream.registerConverter( new SignalEventConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new CompleteWorkItemConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new AbortWorkItemConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new QueryConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new SetGlobalConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new GetGlobalConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new GetObjectsConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new BatchExecutionResultConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new QueryResultsConverter( xstream.getMapper() ) );
-        xstream.registerConverter( new FactHandleConverter(xstream.getMapper()));
-
-        return xstream;
+    public XStream newJSonMarshaller() {
+        return XStreamJSon.newJSonMarshaller();
     }
 
-    public static interface ElementNames {
-        public String getIn();
-
-        public String getInOut();
-
-        public String getOut();
+    public XStream newXStreamMarshaller(XStream xstream) {
+        return XStreamXML.newXStreamMarshaller(xstream);
     }
-
-    public static class JsonElementNames
-        implements
-        ElementNames {
-        private String in    = "in";
-        private String inOut = "inOut";
-        private String out   = "out";
-
-        public String getIn() {
-            return in;
-        }
-
-        public String getInOut() {
-            return inOut;
-        }
-
-        public String getOut() {
-            return out;
-        }
-    }
-
-    public static class XmlElementNames
-        implements
-        ElementNames {
-        private String in    = "in";
-        private String inOut = "in-out";
-        private String out   = "out";
-
-        public String getIn() {
-            return in;
-        }
-
-        public String getInOut() {
-            return inOut;
-        }
-
-        public String getOut() {
-            return out;
-        }
-    }
-
-    public static class InsertConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public InsertConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            InsertObjectCommand cmd = (InsertObjectCommand) object;
-            if ( cmd.getOutIdentifier() != null ) {
-                writer.addAttribute( "out-identifier",
-                                     cmd.getOutIdentifier() );
-
-                writer.addAttribute( "return-object",
-                                     Boolean.toString( cmd.isReturnObject() ) );
-
-            }
-            writeItem( cmd.getObject(),
-                       context,
-                       writer );
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String identifierOut = reader.getAttribute( "out-identifier" );
-            String returnObject = reader.getAttribute( "return-object" );
-
-            reader.moveDown();
-            Object object = readItem( reader,
-                                      context,
-                                      null );
-            reader.moveUp();
-            InsertObjectCommand cmd = new InsertObjectCommand( object );
-            if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );
-                if ( returnObject != null ) {
-                    cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
-                }
-            }
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( InsertObjectCommand.class );
-        }
-
-    }
-
-    public static class FactHandleConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-        public FactHandleConverter(Mapper mapper) {
-            super(mapper);
-        }
-
-        public boolean canConvert(Class aClass) {
-            return FactHandle.class.isAssignableFrom(aClass);
-        }
-
-        public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext marshallingContext) {
-            FactHandle fh = (FactHandle) object;
-            //writer.startNode("fact-handle");
-            writer.addAttribute("externalForm", fh.toExternalForm());
-            //writer.endNode();
-        }
-
-        public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
-            throw new UnsupportedOperationException("Unable to unmarshal fact handles.");
-        }
-    }
-
-    public static class ModifyConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public ModifyConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            ModifyCommand cmd = (ModifyCommand) object;
-
-            writer.addAttribute( "factHandle",
-                                 cmd.getFactHandle().toExternalForm() );
-
-            for ( Setter setter : cmd.getSetters() ) {
-                writer.startNode( "set" );
-                writer.addAttribute( "accessor",
-                                     setter.getAccessor() );
-                writer.addAttribute( "value",
-                                     setter.getValue() );
-                writer.endNode();
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "factHandle" ) );
-
-            List<Setter> setters = new ArrayList();
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                Setter setter = CommandFactory.newSetter( reader.getAttribute( "accessor" ),
-                                                          reader.getAttribute( "value" ) );
-                setters.add( setter );
-                reader.moveUp();
-            }
-
-            Command cmd = CommandFactory.newModify( factHandle,
-                                                    setters );
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( ModifyCommand.class );
-        }
-
-    }
-
-    public static class RetractConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public RetractConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            RetractCommand cmd = (RetractCommand) object;
-
-            writer.addAttribute( "factHandle",
-                                 cmd.getFactHandle().toExternalForm() );
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "factHandle" ) );
-
-            Command cmd = CommandFactory.newRetract( factHandle );
-
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( RetractCommand.class );
-        }
-    }
-
-    public static class InsertElementsConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public InsertElementsConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            InsertElementsCommand cmd = (InsertElementsCommand) object;
-
-            if ( cmd.getOutIdentifier() != null ) {
-                writer.addAttribute( "out-identifier",
-                                     cmd.getOutIdentifier() );
-
-                writer.addAttribute( "return-objects",
-                                     Boolean.toString( cmd.isReturnObject() ) );
-
-            }
-
-            for ( Object element : cmd.getObjects() ) {
-                writeItem( element,
-                           context,
-                           writer );
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String identifierOut = reader.getAttribute( "out-identifier" );
-            String returnObject = reader.getAttribute( "return-objects" );
-
-            List objects = new ArrayList();
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                Object object = readItem( reader,
-                                          context,
-                                          null );
-                reader.moveUp();
-                objects.add( object );
-            }
-
-            InsertElementsCommand cmd = new InsertElementsCommand( objects );
-            if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );
-                if ( returnObject != null ) {
-                    cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
-                }
-            }
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( InsertElementsCommand.class );
-        }
-
-    }
-
-    public static class SetGlobalConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public SetGlobalConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            SetGlobalCommand cmd = (SetGlobalCommand) object;
-
-            writer.addAttribute( "identifier",
-                                 cmd.getIdentifier() );
-
-            if ( cmd.getOutIdentifier() != null ) {
-                writer.addAttribute( "out-identifier",
-                                     cmd.getOutIdentifier() );
-            } else if ( cmd.isOut() ) {
-                writer.addAttribute( "out",
-                                     Boolean.toString( cmd.isOut() ) );
-            }
-
-            writeItem( cmd.getObject(),
-                       context,
-                       writer );
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String identifier = reader.getAttribute( "identifier" );
-            String out = reader.getAttribute( "out" );
-            String identifierOut = reader.getAttribute( "out-identifier" );
-
-            reader.moveDown();
-            Object object = readItem( reader,
-                                      context,
-                                      null );
-            reader.moveUp();
-            SetGlobalCommand cmd = new SetGlobalCommand( identifier,
-                                                         object );
-            if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );
-            } else if ( out != null ) {
-                cmd.setOut( Boolean.parseBoolean( out ) );
-            }
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( SetGlobalCommand.class );
-        }
-    }
-
-    public static class GetObjectConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public GetObjectConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            GetObjectCommand cmd = (GetObjectCommand) object;
-
-            writer.addAttribute( "factHandle",
-                                 cmd.getFactHandle().toExternalForm() );
-
-            if ( cmd.getOutIdentifier() != null ) {
-                writer.addAttribute( "out-identifier",
-                                     cmd.getOutIdentifier() );
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "factHandle" ) );
-            String identifierOut = reader.getAttribute( "out-identifier" );
-
-            GetObjectCommand cmd = new GetObjectCommand( factHandle );
-            if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );
-            }
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( GetObjectCommand.class );
-        }
-    }
-
-    public static class GetGlobalConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public GetGlobalConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            GetGlobalCommand cmd = (GetGlobalCommand) object;
-
-            writer.addAttribute( "identifier",
-                                 cmd.getIdentifier() );
-
-            if ( cmd.getOutIdentifier() != null ) {
-                writer.addAttribute( "out-identifier",
-                                     cmd.getOutIdentifier() );
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String identifier = reader.getAttribute( "identifier" );
-            String identifierOut = reader.getAttribute( "out-identifier" );
-
-            GetGlobalCommand cmd = new GetGlobalCommand( identifier );
-            if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );
-            }
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( GetGlobalCommand.class );
-        }
-    }
-
-    public static class GetObjectsConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public GetObjectsConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            GetObjectsCommand cmd = (GetObjectsCommand) object;
-
-            if ( cmd.getOutIdentifier() != null ) {
-                writer.addAttribute( "out-identifier",
-                                     cmd.getOutIdentifier() );
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String identifierOut = reader.getAttribute( "out-identifier" );
-
-            GetObjectsCommand cmd = new GetObjectsCommand();
-            if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );
-            }
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( GetObjectsCommand.class );
-        }
-    }
-
-    public static class FireAllRulesConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public FireAllRulesConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            FireAllRulesCommand cmd = (FireAllRulesCommand) object;
-
-            if ( cmd.getMax() != -1 ) {
-                writer.addAttribute( "max",
-                                     Integer.toString( cmd.getMax() ) );
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String max = reader.getAttribute( "max" );
-
-            FireAllRulesCommand cmd = null;
-
-            if ( max != null ) {
-                cmd = new FireAllRulesCommand( Integer.parseInt( max ) );
-            } else {
-                cmd = new FireAllRulesCommand();
-            }
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( FireAllRulesCommand.class );
-        }
-    }
-
-    public static class QueryConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public QueryConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            QueryCommand cmd = (QueryCommand) object;
-            writer.addAttribute( "out-identifier",
-                                 cmd.getOutIdentifier() );
-            writer.addAttribute( "name",
-                                 cmd.getName() );
-            if ( cmd.getArguments() != null ) {
-                for ( Object arg : cmd.getArguments() ) {
-                    writeItem( arg,
-                               context,
-                               writer );
-                }
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            List<String> outs = new ArrayList<String>();
-
-            // Query cmd = null;
-            String outIdentifier = reader.getAttribute( "out-identifier" );
-            String name = reader.getAttribute( "name" );
-            List<Object> args = new ArrayList<Object>();
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                Object arg = readItem( reader,
-                                       context,
-                                       null );
-                args.add( arg );
-                reader.moveUp();
-            }
-            QueryCommand cmd = new QueryCommand( outIdentifier,
-                                                 name,
-                                                 args.toArray( new Object[args.size()] ) );
-
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( QueryCommand.class );
-        }
-    }
-
-    public static class StartProcessConvert extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public StartProcessConvert(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            StartProcessCommand cmd = (StartProcessCommand) object;
-            writer.addAttribute( "processId",
-                                 cmd.getProcessId() );
-
-            for ( Entry<String, Object> entry : cmd.getParameters().entrySet() ) {
-                writer.startNode( "parameter" );
-                writer.addAttribute( "identifier",
-                                     entry.getKey() );
-                writeItem( entry.getValue(),
-                           context,
-                           writer );
-                writer.endNode();
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String processId = reader.getAttribute( "processId" );
-
-            HashMap<String, Object> params = new HashMap<String, Object>();
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                String identifier = reader.getAttribute( "identifier" );
-                reader.moveDown();
-                Object value = readItem( reader,
-                                         context,
-                                         null );
-                reader.moveUp();
-                params.put( identifier,
-                            value );
-                reader.moveUp();
-            }
-            StartProcessCommand cmd = new StartProcessCommand();
-            cmd.setProcessId( processId );
-            cmd.setParameters( params );
-
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( StartProcessCommand.class );
-        }
-    }
-
-    public static class SignalEventConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public SignalEventConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            SignalEventCommand cmd = (SignalEventCommand) object;
-            long processInstanceId = cmd.getProcessInstanceId();
-            String eventType = cmd.getEventType();
-            Object event = cmd.getEvent();
-
-            if ( processInstanceId != -1 ) {
-                writer.addAttribute( "process-instance-id",
-                                     Long.toString( processInstanceId ) );
-            }
-
-            writer.addAttribute( "event-type",
-                                 eventType );
-
-            writeItem( event,
-                       context,
-                       writer );
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String processInstanceId = reader.getAttribute( "process-instance-id" );
-            String eventType = reader.getAttribute( "event-type" );
-
-            reader.moveDown();
-            Object event = readItem( reader,
-                                     context,
-                                     null );
-            reader.moveUp();
-
-            Command cmd;
-            if ( processInstanceId != null ) {
-                cmd = CommandFactory.newSignalEvent( Long.parseLong( processInstanceId ),
-                                                     eventType,
-                                                     event );
-            } else {
-                cmd = CommandFactory.newSignalEvent( eventType,
-                                                     event );
-            }
-
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( SignalEventCommand.class );
-        }
-
-    }
-
-    public static class CompleteWorkItemConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public CompleteWorkItemConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            CompleteWorkItemCommand cmd = (CompleteWorkItemCommand) object;
-            writer.addAttribute( "id",
-                                 Long.toString( cmd.getWorkItemId() ) );
-
-            for ( Entry<String, Object> entry : cmd.getResults().entrySet() ) {
-                writer.startNode( "result" );
-                writer.addAttribute( "identifier",
-                                     entry.getKey() );
-                writeItem( entry.getValue(),
-                           context,
-                           writer );
-                writer.endNode();
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String id = reader.getAttribute( "id" );
-
-            Map<String, Object> results = new HashMap<String, Object>();
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                String identifier = reader.getAttribute( "identifier" );
-                reader.moveDown();
-                Object value = readItem( reader,
-                                         context,
-                                         null );
-                reader.moveUp();
-                results.put( identifier,
-                             value );
-                reader.moveUp();
-            }
-
-            Command cmd = CommandFactory.newCompleteWorkItem( Long.parseLong( id ),
-                                                              results );
-
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( CompleteWorkItemCommand.class );
-        }
-    }
-
-    public static class AbortWorkItemConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public AbortWorkItemConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            AbortWorkItemCommand cmd = (AbortWorkItemCommand) object;
-            writer.addAttribute( "id",
-                                 Long.toString( cmd.getWorkItemId() ) );
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            String id = reader.getAttribute( "id" );
-            Command cmd = CommandFactory.newAbortWorkItem( Long.parseLong( id ) );
-
-            return cmd;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return clazz.equals( AbortWorkItemCommand.class );
-        }
-    }
-
-    public static class BatchExecutionResultConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public BatchExecutionResultConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            ExecutionResults result = (ExecutionResults) object;
-            for ( String identifier : result.getIdentifiers() ) {
-                writer.startNode( "result" );
-                writer.addAttribute( "identifier",
-                                     identifier );
-                Object value = result.getValue( identifier );
-                writeItem( value,
-                           context,
-                           writer );
-                writer.endNode();
-            }
-
-            for ( String identifier : ((ExecutionResultImpl) result).getFactHandles().keySet() ) {
-
-                Object handle = result.getFactHandle( identifier );
-                if ( handle instanceof FactHandle ) {
-                    writer.startNode( "fact-handle" );
-                    writer.addAttribute( "identifier",
-                                         identifier );
-                    writer.addAttribute( "externalForm",
-                                         ((FactHandle) handle).toExternalForm() );
-
-                    writer.endNode();
-                } else if ( handle instanceof Collection ) {
-                    writer.startNode( "fact-handles" );
-                    writer.addAttribute( "identifier",
-                                         identifier );
-                    for ( FactHandle factHandle : (Collection<FactHandle>) handle ) {
-                        writer.startNode( "fact-handle" );
-                        writer.addAttribute( "externalForm",
-                                             ((FactHandle) factHandle).toExternalForm() );
-                        writer.endNode();
-                    }
-
-                    writer.endNode();
-                }
-
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            ExecutionResultImpl result = new ExecutionResultImpl();
-            Map results = result.getResults();
-            Map facts = result.getFactHandles();
-
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                if ( reader.getNodeName().equals( "result" ) ) {
-                    String identifier = reader.getAttribute( "identifier" );
-                    reader.moveDown();
-                    Object value = readItem( reader,
-                                             context,
-                                             null );
-                    results.put( identifier,
-                                 value );
-                    reader.moveUp();
-                    reader.moveUp();
-                } else if ( reader.getNodeName().equals( "fact-handle" ) ) {
-                    String identifier = reader.getAttribute( "identifier" );
-                    facts.put( identifier,
-                               new DisconnectedFactHandle( reader.getAttribute( "externalForm" ) ) );
-                } else if ( reader.getNodeName().equals( "fact-handles" ) ) {
-                    String identifier = reader.getAttribute( "identifier" );
-                    List<FactHandle> list = new ArrayList();
-                    while ( reader.hasMoreChildren() ) {
-                        reader.moveDown();
-                        list.add( new DisconnectedFactHandle( reader.getAttribute( "externalForm" ) ) );
-                        reader.moveUp();
-                    }
-                    facts.put( identifier,
-                               list );
-                } else {
-                    throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
-                }
-            }
-
-            return result;
-        }
-
-        public boolean canConvert(Class clazz) {
-            return ExecutionResults.class.isAssignableFrom( clazz );
-        }
-    }
-
-    public static class QueryResultsConverter extends AbstractCollectionConverter
-        implements
-        Converter {
-
-        public QueryResultsConverter(Mapper mapper) {
-            super( mapper );
-        }
-
-        public void marshal(Object object,
-                            HierarchicalStreamWriter writer,
-                            MarshallingContext context) {
-            QueryResults results = (QueryResults) object;
-
-            // write out identifiers
-            List<String> originalIds = Arrays.asList( results.getIdentifiers() );
-            List<String> actualIds = new ArrayList();
-            if ( results instanceof NativeQueryResults ) {
-                for ( String identifier : originalIds ) {
-                    // we don't want to marshall the query parameters
-                    Declaration declr = ((NativeQueryResults) results).getDeclarations().get( identifier );
-                    ObjectType objectType = declr.getPattern().getObjectType();
-                    if ( objectType instanceof ClassObjectType ) {
-                        if ( ((ClassObjectType) objectType).getClassType() == DroolsQuery.class ) {
-                            continue;
-                        }
-                    }
-                    actualIds.add( identifier );
-                }
-            }
-
-            String[] identifiers = actualIds.toArray( new String[actualIds.size()] );
-
-            writer.startNode( "identifiers" );
-            for ( int i = 0; i < identifiers.length; i++ ) {
-                writer.startNode( "identifier" );
-                writer.setValue( identifiers[i] );
-                writer.endNode();
-            }
-            writer.endNode();
-
-            for ( QueryResultsRow result : results ) {
-                writer.startNode( "row" );
-                for ( int i = 0; i < identifiers.length; i++ ) {
-                    Object value = result.get( identifiers[i] );
-                    FactHandle factHandle = result.getFactHandle( identifiers[i] );
-                    writeItem( value,
-                               context,
-                               writer );
-                    writer.startNode( "fact-handle" );
-                    writer.addAttribute( "externalForm",
-                                         ((FactHandle) factHandle).toExternalForm() );
-                    writer.endNode();                   
-                }
-                writer.endNode();
-            }
-        }
-
-        public Object unmarshal(HierarchicalStreamReader reader,
-                                UnmarshallingContext context) {
-            reader.moveDown();
-            List<String> list = new ArrayList<String>();
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                list.add( reader.getValue() );
-                reader.moveUp();
-            }
-            reader.moveUp();
-
-            HashMap<String, Integer> identifiers = new HashMap<String, Integer>();
-            for ( int i = 0; i < list.size(); i++ ) {
-                identifiers.put( list.get( i ),
-                                 i );
-            }
-
-            ArrayList<ArrayList<Object>> results = new ArrayList();      
-            ArrayList<ArrayList<FactHandle>> resultHandles = new ArrayList();
-            while ( reader.hasMoreChildren() ) {
-                reader.moveDown();
-                ArrayList objects = new ArrayList();
-                ArrayList<FactHandle> handles = new ArrayList();
-                while ( reader.hasMoreChildren() ) {
-                    reader.moveDown();
-                    Object object = readItem( reader,
-                                              context,
-                                              null );
-                    reader.moveUp();
-                    
-                    reader.moveDown();
-                    FactHandle handle = new DisconnectedFactHandle( reader.getAttribute( "externalForm" ) );
-                    reader.moveUp();                    
-                  
-                    objects.add( object );
-                    handles.add(  handle  );
-                }
-                results.add( objects );
-                resultHandles.add( handles );
-                reader.moveUp();
-            }
-        
-            return new FlatQueryResults( identifiers,
-                                         results,
-                                         resultHandles );
-        }
-
-        public boolean canConvert(Class clazz) {
-            return QueryResults.class.isAssignableFrom( clazz );
-        }
-    }
+    
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,17 @@
+package org.drools.runtime.help.impl;
+
+import java.util.List;
+
+public class CommandsList {
+    private List<CommandsObjectContainer> commands;
+
+    public List<CommandsObjectContainer> getCommands() {
+        return commands;
+    }
+
+    public void setCommands(List<CommandsObjectContainer> commands) {
+        this.commands = commands;
+    }
+    
+    
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,14 @@
+package org.drools.runtime.help.impl;
+
+public class CommandsObjectContainer {
+    
+    private Object containedObject;
+    
+    public CommandsObjectContainer(Object object) {
+        this.containedObject = object;
+    }
+
+    public Object getContainedObject() {
+        return containedObject;
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,28 @@
+package org.drools.runtime.help.impl;
+
+import org.drools.runtime.rule.FactHandle;
+
+public class IdentifiersContainer {
+
+    private String identifier;
+    private int    index;
+
+    public IdentifiersContainer() {
+
+    }
+
+    public IdentifiersContainer(String identifier,
+                                int index) {
+        this.identifier = identifier;
+        this.index = index;
+    }
+
+    public String getIdentifier() {
+        return identifier;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,14 @@
+package org.drools.runtime.help.impl;
+
+public class ObjectsObjectContainer {
+    
+    private Object containedObject;
+    
+    public ObjectsObjectContainer(Object object) {
+        this.containedObject = object;
+    }
+
+    public Object getContainedObject() {
+        return containedObject;
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,34 @@
+package org.drools.runtime.help.impl;
+
+public class ParameterContainer {
+    
+    private String identifier;
+    private Object object;
+    
+    public ParameterContainer() {
+        
+    }
+    
+    public ParameterContainer(String identifier,
+                            Object object) {
+        this.identifier = identifier;
+        this.object = object;
+    }
+
+    public String getIdentifier() {
+        return identifier;
+    }
+
+    public void setIdentifier(String identifier) {
+        this.identifier = identifier;
+    }
+
+    public Object getObject() {
+        return object;
+    }
+
+    public void setObject(Object object) {
+        this.object = object;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,37 @@
+package org.drools.runtime.help.impl;
+
+import org.drools.runtime.rule.FactHandle;
+
+
+public class RowItemContainer {
+    
+    private FactHandle factHandle;
+    private Object object;
+    
+    public RowItemContainer() {
+        
+    }
+    
+    public RowItemContainer(FactHandle factHandle,
+                            Object object) {
+        super();
+        this.factHandle = factHandle;
+        this.object = object;
+    }
+
+    public FactHandle getFactHandle() {
+        return factHandle;
+    }
+
+    public void setFactHandle(FactHandle factHandle) {
+        this.factHandle = factHandle;
+    }
+
+    public Object getObject() {
+        return object;
+    }
+
+    public void setObject(Object object) {
+        this.object = object;
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,34 @@
+package org.drools.runtime.help.impl;
+
+public class WorkItemResultsContainer {
+    
+    private String identifier;
+    private Object object;
+    
+    public WorkItemResultsContainer() {
+        
+    }
+    
+    public WorkItemResultsContainer(String identifier,
+                            Object object) {
+        this.identifier = identifier;
+        this.object = object;
+    }
+
+    public String getIdentifier() {
+        return identifier;
+    }
+
+    public void setIdentifier(String identifier) {
+        this.identifier = identifier;
+    }
+
+    public Object getObject() {
+        return object;
+    }
+
+    public void setObject(Object object) {
+        this.object = object;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,72 @@
+package org.drools.runtime.help.impl;
+
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.GetGlobalCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.AbortWorkItemCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+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.GetObjectCommand;
+import org.drools.command.runtime.rule.GetObjectsCommand;
+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.drools.command.runtime.rule.RetractCommand;
+import org.drools.command.runtime.rule.ModifyCommand.SetterImpl;
+import org.drools.common.DefaultFactHandle;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.impl.FlatQueryResults;
+import org.drools.runtime.rule.impl.NativeQueryResults;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamHelper {
+    public static void setAliases(XStream xstream) {
+        xstream.alias( "batch-execution",
+                       BatchExecutionCommand.class );
+        xstream.alias( "insert",
+                       InsertObjectCommand.class );
+        xstream.alias( "modify",
+                       ModifyCommand.class );
+        xstream.alias( "setters",
+                       SetterImpl.class );
+        xstream.alias( "retract",
+                       RetractCommand.class );
+        xstream.alias( "insert-elements",
+                       InsertElementsCommand.class );
+        xstream.alias( "start-process",
+                       StartProcessCommand.class );
+        xstream.alias( "signal-event",
+                       SignalEventCommand.class );
+        xstream.alias( "complete-work-item",
+                       CompleteWorkItemCommand.class );
+        xstream.alias( "abort-work-item",
+                       AbortWorkItemCommand.class );
+        xstream.alias( "set-global",
+                       SetGlobalCommand.class );
+        xstream.alias( "get-global",
+                       GetGlobalCommand.class );
+        xstream.alias( "get-object",
+                       GetObjectCommand.class );
+        xstream.alias( "get-objects",
+                       GetObjectsCommand.class );
+        xstream.alias( "execution-results",
+                       ExecutionResultImpl.class );
+        xstream.alias( "fire-all-rules",
+                       FireAllRulesCommand.class );
+        xstream.alias( "query",
+                       QueryCommand.class );
+        xstream.alias( "query-results",
+                       FlatQueryResults.class );
+        xstream.alias( "query-results",
+                       NativeQueryResults.class );
+        xstream.alias( "fact-handle",
+                       DefaultFactHandle.class );
+        xstream.alias( "fact-handle",
+                       DisconnectedFactHandle.class );
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,1355 @@
+package org.drools.runtime.help.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.command.Command;
+import org.drools.command.CommandFactory;
+import org.drools.command.Setter;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.GetGlobalCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.AbortWorkItemCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+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.GetObjectCommand;
+import org.drools.command.runtime.rule.GetObjectsCommand;
+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.drools.command.runtime.rule.RetractCommand;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.QueryResults;
+import org.drools.runtime.rule.QueryResultsRow;
+import org.drools.runtime.rule.impl.FlatQueryResults;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
+import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
+import com.thoughtworks.xstream.core.util.HierarchicalStreams;
+import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+public class XStreamJSon {
+    public static XStream newJSonMarshaller() {
+        JettisonMappedXmlDriver jet = new JettisonMappedXmlDriver();
+        XStream xstream = new XStream( jet );
+
+        XStreamHelper.setAliases( xstream );
+
+        xstream.alias( "commands",
+                       CommandsObjectContainer.class );
+        xstream.alias( "objects",
+                       ObjectsObjectContainer.class );
+        xstream.alias( "item",
+                       RowItemContainer.class );
+        xstream.alias( "parameters",
+                       ParameterContainer.class );
+        xstream.alias( "results",
+                       WorkItemResultsContainer.class );
+
+        xstream.setMode( XStream.NO_REFERENCES );
+
+        xstream.registerConverter( new JSonFactHandleConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonBatchExecutionResultConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonInsertConverter( xstream.getMapper(),
+                                                            xstream.getReflectionProvider() ) );
+        xstream.registerConverter( new JSonFireAllRulesConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonBatchExecutionCommandConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new CommandsContainerConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonGetObjectConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonRetractConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonModifyConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonSetGlobalConverter( xstream.getMapper(),
+                                                               xstream.getReflectionProvider() ) );
+        xstream.registerConverter( new JSonInsertElementsConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonGetGlobalConverter( xstream.getMapper(),
+                                                               xstream.getReflectionProvider() ) );
+        xstream.registerConverter( new JSonGetObjectsConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonQueryConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonQueryResultsConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new RowItemConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonStartProcessConvert( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonSignalEventConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonCompleteWorkItemConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new JSonAbortWorkItemConverter( xstream.getMapper() ) );
+
+        return xstream;
+    }
+
+    public static class CommandsContainerConverter extends AbstractCollectionConverter {
+        public CommandsContainerConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public boolean canConvert(Class type) {
+            return CommandsObjectContainer.class.isAssignableFrom( type );
+
+        }
+
+        @Override
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            CommandsObjectContainer container = (CommandsObjectContainer) object;
+
+            writeItem( container.getContainedObject(),
+                       context,
+                       writer );
+        }
+
+        @Override
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+    public static class RowItemConverter extends AbstractCollectionConverter {
+        public RowItemConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public boolean canConvert(Class type) {
+            return RowItemContainer.class.isAssignableFrom( type );
+
+        }
+
+        @Override
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            RowItemContainer container = (RowItemContainer) object;
+
+            writer.startNode( "external-form" );
+            writer.setValue( container.getFactHandle().toExternalForm() );
+            writer.endNode();
+
+            writer.startNode( "object" );
+            writeItem( container.getObject(),
+                       context,
+                       writer );
+            writer.endNode();
+        }
+
+        @Override
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String externalForm = null;
+            Object object = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "external-form".equals( nodeName ) ) {
+                    externalForm = reader.getValue();
+                } else if ( "object".equals( nodeName ) ) {
+                    reader.moveDown();
+                    object = readItem( reader,
+                                       context,
+                                       null );
+                    reader.moveUp();
+                }
+                reader.moveUp();
+            }
+            return new RowItemContainer( new DisconnectedFactHandle( externalForm ),
+                                         object );
+        }
+
+    }
+
+    //    public static class ModifyEntriesContainerConverter extends AbstractCollectionConverter {
+    //        public ModifyEntriesContainerConverter(Mapper mapper) {
+    //            super( mapper );
+    //        }
+    //
+    //        public boolean canConvert(Class type) {
+    //            return ModifyEntriesContainer.class.isAssignableFrom( type );
+    //
+    //        }
+    //
+    //        @Override
+    //        public void marshal(Object object,
+    //                            HierarchicalStreamWriter writer,
+    //                            MarshallingContext context) {
+    //            ModifyEntriesContainer container = (ModifyEntriesContainer) object;
+    //
+    //            writer.startNode( "accessor" );
+    //            writer.setValue( container.getAccessor() );
+    //            writer.endNode();
+    //            
+    //            writer.startNode( "value" );
+    //            writer.setValue( container.getValue() );
+    //            writer.endNode();
+    //        }
+    //
+    //        @Override
+    //        public Object unmarshal(HierarchicalStreamReader reader,
+    //                                UnmarshallingContext context) {
+    //            throw new UnsupportedOperationException();
+    //        }
+    //
+    //    }    
+
+    public static class JSonBatchExecutionCommandConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonBatchExecutionCommandConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            BatchExecutionCommand cmds = (BatchExecutionCommand) object;
+            if ( cmds.getLookup() != null ) {
+                writer.startNode( "lookup" );
+                writer.setValue( cmds.getLookup() );
+                writer.endNode();
+            }
+            List<GenericCommand< ? >> list = cmds.getCommands();
+
+            for ( GenericCommand cmd : list ) {
+                writeItem( new CommandsObjectContainer( cmd ),
+                           context,
+                           writer );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            List<GenericCommand< ? >> list = new ArrayList<GenericCommand< ? >>();
+            String lookup = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                if ( "commands".equals( reader.getNodeName() ) ) {
+                    while ( reader.hasMoreChildren() ) {
+                        reader.moveDown();
+                        GenericCommand cmd = (GenericCommand) readItem( reader,
+                                                                        context,
+                                                                        null );
+                        list.add( cmd );
+                        reader.moveUp();
+                    }
+                } else if ( "lookup".equals( reader.getNodeName() ) ) {
+                    lookup = reader.getValue();
+                } else {
+                    throw new IllegalArgumentException( "batch-execution does not support the child element name=''" + reader.getNodeName() + "' value=" + reader.getValue() + "'" );
+                }
+                reader.moveUp();
+            }
+            return new BatchExecutionCommand( list,
+                                              lookup );
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( BatchExecutionCommand.class );
+        }
+    }
+
+    public static class JSonInsertConverter extends BaseConverter
+        implements
+        Converter {
+
+        public JSonInsertConverter(Mapper mapper,
+                                   ReflectionProvider reflectionProvider) {
+            super( mapper,
+                   reflectionProvider );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            InsertObjectCommand cmd = (InsertObjectCommand) object;
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.startNode( "out-identifier" );
+                writer.setValue( cmd.getOutIdentifier() );
+                writer.endNode();
+
+                writer.startNode( "return-object" );
+                writer.setValue( Boolean.toString( cmd.isReturnObject() ) );
+                writer.endNode();
+            }
+            writeValue( writer,
+                        context,
+                        "object",
+                        cmd.getObject() );
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            InsertObjectCommand cmd = new InsertObjectCommand();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "out-identifier".equals( nodeName ) ) {
+                    cmd.setOutIdentifier( reader.getValue() );
+                } else if ( "return-object".equals( nodeName ) ) {
+                    cmd.setReturnObject( Boolean.parseBoolean( reader.getValue() ) );
+                } else if ( "object".equals( nodeName ) ) {
+                    cmd.setObject( readValue( reader,
+                                              context,
+                                              cmd.getObject(),
+                                              "object" ) );
+                }
+                reader.moveUp();
+
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( InsertObjectCommand.class );
+        }
+
+    }
+
+    public static class JSonFactHandleConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+        public JSonFactHandleConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public boolean canConvert(Class aClass) {
+            return FactHandle.class.isAssignableFrom( aClass );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext marshallingContext) {
+            FactHandle fh = (FactHandle) object;
+            writer.startNode( "external-form" );
+            writer.setValue( fh.toExternalForm() );
+            writer.endNode();
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext unmarshallingContext) {
+            reader.moveDown();
+            DisconnectedFactHandle factHandle = new DisconnectedFactHandle( reader.getValue() );
+            reader.moveUp();
+            return factHandle;
+        }
+    }
+
+    public static class JSonFireAllRulesConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonFireAllRulesConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            FireAllRulesCommand cmd = (FireAllRulesCommand) object;
+
+            if ( cmd.getMax() != -1 ) {
+                writer.startNode( "max" );
+                writer.setValue( Integer.toString( cmd.getMax() ) );
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String max = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                if ( "max".equals( reader.getNodeName() ) ) {
+                    max = reader.getValue();
+                } else {
+                    throw new IllegalArgumentException( "fire-all-rules does not support the child element name=''" + reader.getNodeName() + "' value=" + reader.getValue() + "'" );
+                }
+                reader.moveUp();
+            }
+
+            FireAllRulesCommand cmd = null;
+
+            if ( max != null ) {
+                cmd = new FireAllRulesCommand( Integer.parseInt( max ) );
+            } else {
+                cmd = new FireAllRulesCommand();
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( FireAllRulesCommand.class );
+        }
+    }
+
+    public static class JSonGetObjectConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonGetObjectConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            GetObjectCommand cmd = (GetObjectCommand) object;
+            writer.startNode( "fact-handle" );
+            writer.setValue( cmd.getFactHandle().toExternalForm() );
+            writer.endNode();
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.startNode( "out-identifier" );
+                writer.setValue( cmd.getOutIdentifier() );
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            FactHandle factHandle = null;
+            String outIdentifier = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String name = reader.getNodeName();
+                if ( "fact-handle".equals( name ) ) {
+                    factHandle = new DisconnectedFactHandle( reader.getValue() );
+                } else if ( "out-identifier".equals( "out-identifier" ) ) {
+                    outIdentifier = reader.getValue();
+                }
+                reader.moveUp();
+            }
+
+            GetObjectCommand cmd = new GetObjectCommand( factHandle );
+            if ( outIdentifier != null ) {
+                cmd.setOutIdentifier( outIdentifier );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( GetObjectCommand.class );
+        }
+    }
+
+    public static class JSonRetractConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonRetractConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            RetractCommand cmd = (RetractCommand) object;
+            writer.startNode( "fact-handle" );
+            writer.setValue( cmd.getFactHandle().toExternalForm() );
+            writer.endNode();
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            reader.moveDown();
+            FactHandle factHandle = new DisconnectedFactHandle( reader.getValue() );
+            reader.moveUp();
+
+            Command cmd = CommandFactory.newRetract( factHandle );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( RetractCommand.class );
+        }
+    }
+
+    public static class JSonModifyConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonModifyConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            ModifyCommand cmd = (ModifyCommand) object;
+
+            writer.startNode( "fact-handle" );
+            writer.setValue( cmd.getFactHandle().toExternalForm() );
+            writer.endNode();
+
+            List<Setter> setters = cmd.getSetters();
+            for ( Setter setter : setters ) {
+                writeItem( setter,
+                           context,
+                           writer );
+
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            reader.moveDown();
+            FactHandle factHandle = new DisconnectedFactHandle( reader.getValue() );
+            reader.moveUp();
+
+            List<Setter> setters = new ArrayList();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+
+                reader.moveDown();
+                String accessor = reader.getValue();
+                reader.moveUp();
+
+                reader.moveDown();
+                String value = reader.getValue();
+                reader.moveUp();
+
+                Setter setter = CommandFactory.newSetter( accessor,
+                                                          value );
+                setters.add( setter );
+
+                reader.moveUp();
+            }
+
+            Command cmd = CommandFactory.newModify( factHandle,
+                                                    setters );
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( ModifyCommand.class );
+        }
+
+    }
+
+    public static class JSonInsertElementsConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonInsertElementsConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            InsertElementsCommand cmd = (InsertElementsCommand) object;
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.startNode( "out-identifier" );
+                writer.setValue( cmd.getOutIdentifier() );
+                writer.endNode();
+
+                writer.startNode( "return-objects" );
+                writer.setValue( Boolean.toString( cmd.isReturnObject() ) );
+                writer.endNode();
+
+            }
+
+            for ( Object element : cmd.getObjects() ) {
+                writeItem( new ObjectsObjectContainer( element ),
+                           context,
+                           writer );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            List objects = new ArrayList();
+            String outIdentifier = null;
+            String returnObjects = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "objects".equals( nodeName ) ) {
+                    while ( reader.hasMoreChildren() ) {
+                        reader.moveDown();
+                        Object o = readItem( reader,
+                                             context,
+                                             null );
+                        objects.add( o );
+                        reader.moveUp();
+                    }
+                } else if ( "out-identifier".equals( nodeName ) ) {
+                    outIdentifier = reader.getValue();
+                } else if ( "return-objects".equals( nodeName ) ) {
+                    returnObjects = reader.getValue();
+                } else {
+                    throw new IllegalArgumentException( "insert-elements does not support the child element name=''" + reader.getNodeName() + "' value=" + reader.getValue() + "'" );
+                }
+                reader.moveUp();
+            }
+            InsertElementsCommand cmd = new InsertElementsCommand( objects );
+            if ( outIdentifier != null ) {
+                cmd.setOutIdentifier( outIdentifier );
+                if ( outIdentifier != null ) {
+                    cmd.setReturnObject( Boolean.parseBoolean( returnObjects ) );
+                }
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( InsertElementsCommand.class );
+        }
+    }
+
+    public static class JSonBatchExecutionResultConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonBatchExecutionResultConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            ExecutionResults result = (ExecutionResults) object;
+            writer.startNode( "results" );
+            if ( !result.getIdentifiers().isEmpty() ) {
+                for ( String identifier : result.getIdentifiers() ) {
+                    writer.startNode( "result" );
+
+                    writer.startNode( "identifier" );
+                    writer.setValue( identifier );
+                    writer.endNode();
+
+                    writer.startNode( "value" );
+                    Object value = result.getValue( identifier );
+                    writeItem( value,
+                               context,
+                               writer );
+                    writer.endNode();
+
+                    writer.endNode();
+                }
+            }
+
+            for ( String identifier : ((ExecutionResultImpl) result).getFactHandles().keySet() ) {
+                Object handle = result.getFactHandle( identifier );
+                if ( handle instanceof FactHandle ) {
+                    writer.startNode( "fact-handle" );
+
+                    writer.startNode( "identifier" );
+                    writer.setValue( identifier );
+                    writer.endNode();
+
+                    writer.startNode( "external-form" );
+                    writer.setValue( ((FactHandle) handle).toExternalForm() );
+                    writer.endNode();
+
+                    writer.endNode();
+                } else if ( handle instanceof Collection ) {
+                    writer.startNode( "fact-handles" );
+
+                    writer.startNode( "identifier" );
+                    writer.setValue( identifier );
+                    writer.endNode();
+
+                    //writer.startNode( "xxx" );
+                    for ( FactHandle factHandle : (Collection<FactHandle>) handle ) {
+                        writeItem( factHandle.toExternalForm(),
+                                   context,
+                                   writer );
+                    }
+                    //writer.endNode();
+
+                    writer.endNode();
+                }
+            }
+
+            writer.endNode();
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            ExecutionResultImpl result = new ExecutionResultImpl();
+            Map results = result.getResults();
+            Map facts = result.getFactHandles();
+
+            reader.moveDown();
+            if ( "results".equals( reader.getNodeName() ) ) {
+                while ( reader.hasMoreChildren() ) {
+                    reader.moveDown();
+
+                    if ( reader.getNodeName().equals( "result" ) ) {
+                        reader.moveDown();
+                        String identifier = reader.getValue();
+                        reader.moveUp();
+
+                        reader.moveDown();
+                        reader.moveDown();
+                        Object value = readItem( reader,
+                                                 context,
+                                                 null );
+                        results.put( identifier,
+                                     value );
+                        reader.moveUp();
+                        reader.moveUp();
+                    } else if ( reader.getNodeName().equals( "fact-handle" ) ) {
+                        reader.moveDown();
+                        String identifier = reader.getValue();
+                        reader.moveUp();
+
+                        reader.moveDown();
+                        String externalForm = reader.getValue();
+                        reader.moveUp();
+
+                        facts.put( identifier,
+                                   new DisconnectedFactHandle( externalForm ) );
+                    } else if ( reader.getNodeName().equals( "fact-handles" ) ) {
+                        List list = new ArrayList();
+                        String identifier = null;
+                        while ( reader.hasMoreChildren() ) {
+                            reader.moveDown();
+                            identifier = reader.getValue();
+                            reader.moveUp();
+                            while ( reader.hasMoreChildren() ) {
+                                reader.moveDown();
+                                FactHandle factHandle = new DisconnectedFactHandle( (String) readItem( reader,
+                                                                                                       context,
+                                                                                                       null ) );
+                                list.add( factHandle );
+                                reader.moveUp();
+                            }
+                        }
+                        facts.put( identifier,
+                                   list );
+                    } else {
+                        throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
+                    }
+                    reader.moveUp();
+                }
+            } else {
+                throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
+            }
+            reader.moveUp();
+
+            return result;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return ExecutionResults.class.isAssignableFrom( clazz );
+        }
+    }
+
+    public static abstract class BaseConverter {
+        protected Mapper             mapper;
+        protected ReflectionProvider reflectionProvider;
+
+        public BaseConverter(Mapper mapper,
+                             ReflectionProvider reflectionProvider) {
+            super();
+            this.mapper = mapper;
+            this.reflectionProvider = reflectionProvider;
+        }
+
+        protected void writeValue(HierarchicalStreamWriter writer,
+                                  MarshallingContext context,
+                                  String fieldName,
+                                  Object object) {
+            writer.startNode( fieldName );
+            String name = this.mapper.serializedClass( object.getClass() );
+            ExtendedHierarchicalStreamWriterHelper.startNode( writer,
+                                                              name,
+                                                              Mapper.Null.class );
+            context.convertAnother( object );
+            writer.endNode();
+            writer.endNode();
+        }
+
+        protected Object readValue(HierarchicalStreamReader reader,
+                                   UnmarshallingContext context,
+                                   Object object,
+                                   Object fieldName) {
+            reader.moveDown();
+            Class type = HierarchicalStreams.readClassType( reader,
+                                                            this.mapper );
+            Object o = context.convertAnother( null,
+                                               type );
+
+            reader.moveUp();
+            return o;
+        }
+    }
+
+    public static class JSonSetGlobalConverter extends BaseConverter
+        implements
+        Converter {
+
+        public JSonSetGlobalConverter(Mapper mapper,
+                                      ReflectionProvider reflectionProvider) {
+            super( mapper,
+                   reflectionProvider );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            SetGlobalCommand cmd = (SetGlobalCommand) object;
+
+            writer.startNode( "identifier" );
+            writer.setValue( cmd.getIdentifier() );
+            writer.endNode();
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.startNode( "out-identifier" );
+                writer.setValue( cmd.getOutIdentifier() );
+                writer.endNode();
+            } else if ( cmd.isOut() ) {
+                writer.startNode( "out" );
+                writer.setValue( Boolean.toString( cmd.isOut() ) );
+                writer.endNode();
+            }
+            writeValue( writer,
+                        context,
+                        "object",
+                        cmd.getObject() );
+
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String identifier = null;
+            String out = null;
+            String outIdentifier = null;
+            Object object = null;
+            SetGlobalCommand cmd = new SetGlobalCommand();
+
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "identifier".equals( nodeName ) ) {
+                    identifier = reader.getValue();
+                } else if ( "out".equals( nodeName ) ) {
+                    out = reader.getValue();
+                } else if ( "out-identifier".equals( nodeName ) ) {
+                    outIdentifier = reader.getValue();
+                } else if ( "object".equals( nodeName ) ) {
+                    cmd.setObject( readValue( reader,
+                                              context,
+                                              cmd.getObject(),
+                                              "object" ) );
+                }
+                reader.moveUp();
+            }
+
+            cmd.setIdentifier( identifier );
+
+            if ( outIdentifier != null ) {
+                cmd.setOutIdentifier( outIdentifier );
+            } else if ( out != null ) {
+                cmd.setOut( Boolean.parseBoolean( out ) );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( SetGlobalCommand.class );
+        }
+
+    }
+
+    public static class JSonGetGlobalConverter extends BaseConverter
+        implements
+        Converter {
+
+        public JSonGetGlobalConverter(Mapper mapper,
+                                      ReflectionProvider reflectionProvider) {
+            super( mapper,
+                   reflectionProvider );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            GetGlobalCommand cmd = (GetGlobalCommand) object;
+
+            writer.startNode( "identifier" );
+            writer.setValue( cmd.getIdentifier() );
+            writer.endNode();
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.startNode( "out-identifier" );
+                writer.setValue( cmd.getOutIdentifier() );
+                writer.endNode();
+            }
+
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String identifier = null;
+            String outIdentifier = null;
+            GetGlobalCommand cmd = new GetGlobalCommand();
+
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "identifier".equals( nodeName ) ) {
+                    identifier = reader.getValue();
+                } else if ( "out-identifier".equals( nodeName ) ) {
+                    outIdentifier = reader.getValue();
+                }
+                reader.moveUp();
+            }
+
+            cmd.setIdentifier( identifier );
+
+            if ( outIdentifier != null ) {
+                cmd.setOutIdentifier( outIdentifier );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( GetGlobalCommand.class );
+        }
+    }
+
+    public static class JSonGetObjectsConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonGetObjectsConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            GetObjectsCommand cmd = (GetObjectsCommand) object;
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.startNode( "out-identifier" );
+                writer.setValue( cmd.getOutIdentifier() );
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String outIdentifier = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                if ( "out-identifier".equals( reader.getNodeName() ) ) {
+                    outIdentifier = reader.getValue();
+                }
+                reader.moveUp();
+            }
+
+            GetObjectsCommand cmd = new GetObjectsCommand();
+            if ( outIdentifier != null ) {
+                cmd.setOutIdentifier( outIdentifier );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( GetObjectsCommand.class );
+        }
+    }
+
+    public static class JSonQueryConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonQueryConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            QueryCommand cmd = (QueryCommand) object;
+
+            writer.startNode( "out-identifier" );
+            writer.setValue( cmd.getOutIdentifier() );
+            writer.endNode();
+
+            writer.startNode( "name" );
+            writer.setValue( cmd.getName() );
+            writer.endNode();
+
+            if ( cmd.getArguments() != null && cmd.getArguments().size() > 0 ) {
+                writer.startNode( "args" );
+                for ( Object arg : cmd.getArguments() ) {
+                    writeItem( arg,
+                               context,
+                               writer );
+                }
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            List<String> outs = new ArrayList<String>();
+
+            String outIdentifier = null;
+            String name = null;
+            List<Object> args = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "out-identifier".equals( nodeName ) ) {
+                    outIdentifier = reader.getValue();
+                } else if ( "name".equals( nodeName ) ) {
+                    name = reader.getValue();
+                } else if ( "args".equals( nodeName ) ) {
+                    reader.moveDown();
+                    args = new ArrayList<Object>();
+                    while ( reader.hasMoreChildren() ) {
+                        reader.moveDown();
+                        Object arg = readItem( reader,
+                                               context,
+                                               null );
+                        args.add( arg );
+                        reader.moveUp();
+                    }
+                    reader.moveUp();
+                }
+                reader.moveUp();
+            }
+
+            QueryCommand cmd = new QueryCommand( outIdentifier,
+                                                 name,
+                                                 (args != null) ? args.toArray( new Object[args.size()] ) : null );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( QueryCommand.class );
+        }
+    }
+
+    public static class JSonQueryResultsConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonQueryResultsConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            QueryResults results = (QueryResults) object;
+
+            // write out identifiers
+            String[] identifiers = results.getIdentifiers();
+
+            writer.startNode( "identifiers" );
+            for ( int i = 0; i < identifiers.length; i++ ) {
+                writeItem( identifiers[i],
+                           context,
+                           writer );
+            }
+            writer.endNode();
+
+            for ( QueryResultsRow result : results ) {
+                writer.startNode( "row" );
+                for ( int i = 0; i < identifiers.length; i++ ) {
+                    Object value = result.get( identifiers[i] );
+                    FactHandle factHandle = result.getFactHandle( identifiers[i] );
+                    writeItem( new RowItemContainer( factHandle,
+                                                     value ),
+                               context,
+                               writer );
+                }
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            reader.moveDown();
+            List<String> list = new ArrayList<String>();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                list.add( (String) readItem( reader,
+                                             context,
+                                             null ) );
+                reader.moveUp();
+            }
+            reader.moveUp();
+
+            HashMap<String, Integer> identifiers = new HashMap<String, Integer>();
+            for ( int i = 0; i < list.size(); i++ ) {
+                identifiers.put( list.get( i ),
+                                 i );
+            }
+
+            ArrayList<ArrayList<Object>> results = new ArrayList();
+            ArrayList<ArrayList<FactHandle>> resultHandles = new ArrayList();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                ArrayList objects = new ArrayList();
+                ArrayList<FactHandle> handles = new ArrayList();
+                while ( reader.hasMoreChildren() ) {
+                    reader.moveDown();
+                    RowItemContainer container = (RowItemContainer) readItem( reader,
+                                                                              context,
+                                                                              null );
+
+                    objects.add( container.getObject() );
+                    handles.add( container.getFactHandle() );
+                    reader.moveUp();
+                }
+                results.add( objects );
+                resultHandles.add( handles );
+                reader.moveUp();
+            }
+
+            return new FlatQueryResults( identifiers,
+                                         results,
+                                         resultHandles );
+        }
+
+        public boolean canConvert(Class clazz) {
+            return QueryResults.class.isAssignableFrom( clazz );
+        }
+    }
+
+    public static class JSonStartProcessConvert extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonStartProcessConvert(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            StartProcessCommand cmd = (StartProcessCommand) object;
+            writer.startNode( "process-id" );
+            writer.setValue( cmd.getProcessId() );
+            writer.endNode();
+
+            for ( Entry<String, Object> entry : cmd.getParameters().entrySet() ) {
+                writeItem( new ParameterContainer( entry.getKey(),
+                                                   entry.getValue() ),
+                           context,
+                           writer );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            reader.moveDown();
+            String processId = reader.getValue();
+            reader.moveUp();
+
+            HashMap<String, Object> params = new HashMap<String, Object>();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                ParameterContainer parameterContainer = (ParameterContainer) readItem( reader,
+                                                                                       context,
+                                                                                       null );
+                params.put( parameterContainer.getIdentifier(),
+                            parameterContainer.getObject() );
+                reader.moveUp();
+            }
+
+            StartProcessCommand cmd = new StartProcessCommand();
+            cmd.setProcessId( processId );
+            cmd.setParameters( params );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( StartProcessCommand.class );
+        }
+    }
+
+    public static class JSonSignalEventConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonSignalEventConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            SignalEventCommand cmd = (SignalEventCommand) object;
+            long processInstanceId = cmd.getProcessInstanceId();
+            String eventType = cmd.getEventType();
+            Object event = cmd.getEvent();
+
+            if ( processInstanceId != -1 ) {
+                writer.startNode( "process-instance-id" );
+                writer.setValue( Long.toString( processInstanceId ) );
+                writer.endNode();
+            }
+
+            writer.addAttribute( "event-type",
+                                 eventType );
+
+            writer.startNode( "event-type" );
+            writer.setValue( eventType );
+            writer.endNode();
+
+            writer.startNode( "object" );
+            writeItem( event,
+                       context,
+                       writer );
+            writer.endNode();
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String processInstanceId = null;
+            String eventType = null;
+            Object event = null;
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "process-instance-id".equals( nodeName ) ) {
+                    processInstanceId = reader.getValue();
+                } else if ( "event-type".equals( nodeName ) ) {
+                    eventType = reader.getValue();
+                } else if ( "object".equals( nodeName ) ) {
+                    reader.moveDown();
+                    event = readItem( reader,
+                                      context,
+                                      null );
+                    reader.moveUp();
+                }
+                reader.moveUp();
+            }
+
+            Command cmd;
+            if ( processInstanceId != null ) {
+                cmd = CommandFactory.newSignalEvent( Long.parseLong( processInstanceId ),
+                                                     eventType,
+                                                     event );
+            } else {
+                cmd = CommandFactory.newSignalEvent( eventType,
+                                                     event );
+            }
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( SignalEventCommand.class );
+        }
+
+    }
+
+    public static class JSonCompleteWorkItemConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonCompleteWorkItemConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            CompleteWorkItemCommand cmd = (CompleteWorkItemCommand) object;
+
+            writer.startNode( "id" );
+            writer.setValue( Long.toString( cmd.getWorkItemId() ) );
+            writer.endNode();
+
+            for ( Entry<String, Object> entry : cmd.getResults().entrySet() ) {
+                writeItem( new WorkItemResultsContainer( entry.getKey(),
+                                                         entry.getValue() ),
+                           context,
+                           writer );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String id = null;
+            Map<String, Object> results = new HashMap<String, Object>();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String nodeName = reader.getNodeName();
+                if ( "id".equals( nodeName ) ) {
+                    id = reader.getValue();
+                } else if ( "results".equals( nodeName ) ) {
+                    while ( reader.hasMoreChildren() ) {
+                        WorkItemResultsContainer res = (WorkItemResultsContainer) readItem( reader,
+                                                                                            context,
+                                                                                            null );
+                        results.put( res.getIdentifier(),
+                                     res.getObject() );
+                    }
+                }
+                reader.moveUp();
+            }
+
+            return new CompleteWorkItemCommand( Long.parseLong( id ),
+                                                results );
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( CompleteWorkItemCommand.class );
+        }
+    }
+
+    public static class JSonAbortWorkItemConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public JSonAbortWorkItemConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            AbortWorkItemCommand cmd = (AbortWorkItemCommand) object;
+            writer.startNode( "id" );
+            writer.setValue( Long.toString( cmd.getWorkItemId() ) );
+            writer.endNode();
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            reader.moveDown();
+            String id = reader.getValue();
+            reader.moveUp();
+
+            Command cmd = CommandFactory.newAbortWorkItem( Long.parseLong( id ) );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( AbortWorkItemCommand.class );
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,964 @@
+package org.drools.runtime.help.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
+import org.drools.command.Command;
+import org.drools.command.CommandFactory;
+import org.drools.command.Setter;
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.GetGlobalCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.AbortWorkItemCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+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.GetObjectCommand;
+import org.drools.command.runtime.rule.GetObjectsCommand;
+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.drools.command.runtime.rule.RetractCommand;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.rule.Declaration;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.QueryResults;
+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 com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+public class XStreamXML {
+    
+    public static XStream newXStreamMarshaller(XStream xstream) {
+        XStreamHelper.setAliases( xstream );
+        
+        xstream.processAnnotations( BatchExecutionCommand.class );
+        xstream.addImplicitCollection( BatchExecutionCommand.class,
+                                       "commands" );
+        
+        xstream.registerConverter( new InsertConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new RetractConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new ModifyConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new GetObjectConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new InsertElementsConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new FireAllRulesConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new StartProcessConvert( xstream.getMapper() ) );
+        xstream.registerConverter( new SignalEventConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new CompleteWorkItemConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new AbortWorkItemConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new QueryConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new SetGlobalConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new GetGlobalConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new GetObjectsConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new BatchExecutionResultConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new QueryResultsConverter( xstream.getMapper() ) );
+        xstream.registerConverter( new FactHandleConverter( xstream.getMapper() ) );
+    
+        return xstream;
+    }
+    
+    
+    public static class InsertConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public InsertConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            InsertObjectCommand cmd = (InsertObjectCommand) object;
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.addAttribute( "out-identifier",
+                                     cmd.getOutIdentifier() );
+
+                writer.addAttribute( "return-object",
+                                     Boolean.toString( cmd.isReturnObject() ) );
+
+            }
+            writeItem( cmd.getObject(),
+                       context,
+                       writer );
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String identifierOut = reader.getAttribute( "out-identifier" );
+            String returnObject = reader.getAttribute( "return-object" );
+
+            reader.moveDown();
+            Object object = readItem( reader,
+                                      context,
+                                      null );
+            reader.moveUp();
+            InsertObjectCommand cmd = new InsertObjectCommand( object );
+            if ( identifierOut != null ) {
+                cmd.setOutIdentifier( identifierOut );
+                if ( returnObject != null ) {
+                    cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
+                }
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( InsertObjectCommand.class );
+        }
+
+    }
+
+    public static class FactHandleConverter
+        implements
+        Converter {
+        private Mapper mapper;
+
+        public FactHandleConverter(Mapper mapper) {
+            this.mapper = mapper;
+        }
+
+        public boolean canConvert(Class aClass) {
+            return FactHandle.class.isAssignableFrom( aClass );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext marshallingContext) {
+            FactHandle fh = (FactHandle) object;
+            //writer.startNode("fact-handle");
+            writer.addAttribute( "external-form",
+                                 fh.toExternalForm() );
+            //writer.endNode();
+        }
+
+        public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader,
+                                UnmarshallingContext unmarshallingContext) {
+            throw new UnsupportedOperationException( "Unable to unmarshal fact handles." );
+        }
+    }
+
+    public static class ModifyConverter
+        implements
+        Converter {
+
+        public ModifyConverter(Mapper mapper) {
+
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            ModifyCommand cmd = (ModifyCommand) object;
+
+            writer.addAttribute( "fact-handle",
+                                 cmd.getFactHandle().toExternalForm() );
+
+            for ( Setter setter : cmd.getSetters() ) {
+                writer.startNode( "set" );
+                writer.addAttribute( "accessor",
+                                     setter.getAccessor() );
+                writer.addAttribute( "value",
+                                     setter.getValue() );
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "fact-handle" ) );
+
+            List<Setter> setters = new ArrayList();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                Setter setter = CommandFactory.newSetter( reader.getAttribute( "accessor" ),
+                                                          reader.getAttribute( "value" ) );
+                setters.add( setter );
+                reader.moveUp();
+            }
+
+            Command cmd = CommandFactory.newModify( factHandle,
+                                                    setters );
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( ModifyCommand.class );
+        }
+
+    }
+
+    public static class RetractConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public RetractConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            RetractCommand cmd = (RetractCommand) object;
+
+            writer.addAttribute( "fact-handle",
+                                 cmd.getFactHandle().toExternalForm() );
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "fact-handle" ) );
+
+            Command cmd = CommandFactory.newRetract( factHandle );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( RetractCommand.class );
+        }
+    }
+
+    public static class InsertElementsConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public InsertElementsConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            InsertElementsCommand cmd = (InsertElementsCommand) object;
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.addAttribute( "out-identifier",
+                                     cmd.getOutIdentifier() );
+
+                writer.addAttribute( "return-objects",
+                                     Boolean.toString( cmd.isReturnObject() ) );
+
+            }
+
+            for ( Object element : cmd.getObjects() ) {
+                writeItem( element,
+                           context,
+                           writer );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String identifierOut = reader.getAttribute( "out-identifier" );
+            String returnObject = reader.getAttribute( "return-objects" );
+
+            List objects = new ArrayList();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                Object object = readItem( reader,
+                                          context,
+                                          null );
+                reader.moveUp();
+                objects.add( object );
+            }
+
+            InsertElementsCommand cmd = new InsertElementsCommand( objects );
+            if ( identifierOut != null ) {
+                cmd.setOutIdentifier( identifierOut );
+                if ( returnObject != null ) {
+                    cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
+                }
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( InsertElementsCommand.class );
+        }
+
+    }
+
+    public static class SetGlobalConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public SetGlobalConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            SetGlobalCommand cmd = (SetGlobalCommand) object;
+
+            writer.addAttribute( "identifier",
+                                 cmd.getIdentifier() );
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.addAttribute( "out-identifier",
+                                     cmd.getOutIdentifier() );
+            } else if ( cmd.isOut() ) {
+                writer.addAttribute( "out",
+                                     Boolean.toString( cmd.isOut() ) );
+            }
+
+            writeItem( cmd.getObject(),
+                       context,
+                       writer );
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String identifier = reader.getAttribute( "identifier" );
+            String out = reader.getAttribute( "out" );
+            String identifierOut = reader.getAttribute( "out-identifier" );
+
+            reader.moveDown();
+            Object object = readItem( reader,
+                                      context,
+                                      null );
+            reader.moveUp();
+            SetGlobalCommand cmd = new SetGlobalCommand( identifier,
+                                                         object );
+            if ( identifierOut != null ) {
+                cmd.setOutIdentifier( identifierOut );
+            } else if ( out != null ) {
+                cmd.setOut( Boolean.parseBoolean( out ) );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( SetGlobalCommand.class );
+        }
+    }
+
+    public static class GetObjectConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public GetObjectConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            GetObjectCommand cmd = (GetObjectCommand) object;
+
+            writer.addAttribute( "fact-handle",
+                                 cmd.getFactHandle().toExternalForm() );
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.addAttribute( "out-identifier",
+                                     cmd.getOutIdentifier() );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "fact-handle" ) );
+            String identifierOut = reader.getAttribute( "out-identifier" );
+
+            GetObjectCommand cmd = new GetObjectCommand( factHandle );
+            if ( identifierOut != null ) {
+                cmd.setOutIdentifier( identifierOut );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( GetObjectCommand.class );
+        }
+    }
+
+    public static class GetGlobalConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public GetGlobalConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            GetGlobalCommand cmd = (GetGlobalCommand) object;
+
+            writer.addAttribute( "identifier",
+                                 cmd.getIdentifier() );
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.addAttribute( "out-identifier",
+                                     cmd.getOutIdentifier() );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String identifier = reader.getAttribute( "identifier" );
+            String identifierOut = reader.getAttribute( "out-identifier" );
+
+            GetGlobalCommand cmd = new GetGlobalCommand( identifier );
+            if ( identifierOut != null ) {
+                cmd.setOutIdentifier( identifierOut );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( GetGlobalCommand.class );
+        }
+    }
+
+    public static class GetObjectsConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public GetObjectsConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            GetObjectsCommand cmd = (GetObjectsCommand) object;
+
+            if ( cmd.getOutIdentifier() != null ) {
+                writer.addAttribute( "out-identifier",
+                                     cmd.getOutIdentifier() );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String identifierOut = reader.getAttribute( "out-identifier" );
+
+            GetObjectsCommand cmd = new GetObjectsCommand();
+            if ( identifierOut != null ) {
+                cmd.setOutIdentifier( identifierOut );
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( GetObjectsCommand.class );
+        }
+    }
+
+    public static class FireAllRulesConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public FireAllRulesConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            FireAllRulesCommand cmd = (FireAllRulesCommand) object;
+
+            if ( cmd.getMax() != -1 ) {
+                writer.addAttribute( "max",
+                                     Integer.toString( cmd.getMax() ) );
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String max = reader.getAttribute( "max" );
+
+            FireAllRulesCommand cmd = null;
+
+            if ( max != null ) {
+                cmd = new FireAllRulesCommand( Integer.parseInt( max ) );
+            } else {
+                cmd = new FireAllRulesCommand();
+            }
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( FireAllRulesCommand.class );
+        }
+    }
+
+    public static class QueryConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public QueryConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            QueryCommand cmd = (QueryCommand) object;
+            writer.addAttribute( "out-identifier",
+                                 cmd.getOutIdentifier() );
+            writer.addAttribute( "name",
+                                 cmd.getName() );
+            if ( cmd.getArguments() != null ) {
+                for ( Object arg : cmd.getArguments() ) {
+                    writeItem( arg,
+                               context,
+                               writer );
+                }
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            List<String> outs = new ArrayList<String>();
+
+            // Query cmd = null;
+            String outIdentifier = reader.getAttribute( "out-identifier" );
+            String name = reader.getAttribute( "name" );
+            List<Object> args = new ArrayList<Object>();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                Object arg = readItem( reader,
+                                       context,
+                                       null );
+                args.add( arg );
+                reader.moveUp();
+            }
+            QueryCommand cmd = new QueryCommand( outIdentifier,
+                                                 name,
+                                                 args.toArray( new Object[args.size()] ) );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( QueryCommand.class );
+        }
+    }
+
+    public static class StartProcessConvert extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public StartProcessConvert(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            StartProcessCommand cmd = (StartProcessCommand) object;
+            writer.addAttribute( "processId",
+                                 cmd.getProcessId() );
+
+            for ( Entry<String, Object> entry : cmd.getParameters().entrySet() ) {
+                writer.startNode( "parameter" );
+                writer.addAttribute( "identifier",
+                                     entry.getKey() );
+                writeItem( entry.getValue(),
+                           context,
+                           writer );
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String processId = reader.getAttribute( "processId" );
+
+            HashMap<String, Object> params = new HashMap<String, Object>();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String identifier = reader.getAttribute( "identifier" );
+                reader.moveDown();
+                Object value = readItem( reader,
+                                         context,
+                                         null );
+                reader.moveUp();
+                params.put( identifier,
+                            value );
+                reader.moveUp();
+            }
+            StartProcessCommand cmd = new StartProcessCommand();
+            cmd.setProcessId( processId );
+            cmd.setParameters( params );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( StartProcessCommand.class );
+        }
+    }
+
+    public static class SignalEventConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public SignalEventConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            SignalEventCommand cmd = (SignalEventCommand) object;
+            long processInstanceId = cmd.getProcessInstanceId();
+            String eventType = cmd.getEventType();
+            Object event = cmd.getEvent();
+
+            if ( processInstanceId != -1 ) {
+                writer.addAttribute( "process-instance-id",
+                                     Long.toString( processInstanceId ) );
+            }
+
+            writer.addAttribute( "event-type",
+                                 eventType );
+
+            writeItem( event,
+                       context,
+                       writer );
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String processInstanceId = reader.getAttribute( "process-instance-id" );
+            String eventType = reader.getAttribute( "event-type" );
+
+            reader.moveDown();
+            Object event = readItem( reader,
+                                     context,
+                                     null );
+            reader.moveUp();
+
+            Command cmd;
+            if ( processInstanceId != null ) {
+                cmd = CommandFactory.newSignalEvent( Long.parseLong( processInstanceId ),
+                                                     eventType,
+                                                     event );
+            } else {
+                cmd = CommandFactory.newSignalEvent( eventType,
+                                                     event );
+            }
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( SignalEventCommand.class );
+        }
+
+    }
+
+    public static class CompleteWorkItemConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public CompleteWorkItemConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            CompleteWorkItemCommand cmd = (CompleteWorkItemCommand) object;
+            writer.addAttribute( "id",
+                                 Long.toString( cmd.getWorkItemId() ) );
+
+            for ( Entry<String, Object> entry : cmd.getResults().entrySet() ) {
+                writer.startNode( "result" );
+                writer.addAttribute( "identifier",
+                                     entry.getKey() );
+                writeItem( entry.getValue(),
+                           context,
+                           writer );
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String id = reader.getAttribute( "id" );
+
+            Map<String, Object> results = new HashMap<String, Object>();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                String identifier = reader.getAttribute( "identifier" );
+                reader.moveDown();
+                Object value = readItem( reader,
+                                         context,
+                                         null );
+                reader.moveUp();
+                results.put( identifier,
+                             value );
+                reader.moveUp();
+            }
+
+            Command cmd = CommandFactory.newCompleteWorkItem( Long.parseLong( id ),
+                                                              results );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( CompleteWorkItemCommand.class );
+        }
+    }
+
+    public static class AbortWorkItemConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public AbortWorkItemConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            AbortWorkItemCommand cmd = (AbortWorkItemCommand) object;
+            writer.addAttribute( "id",
+                                 Long.toString( cmd.getWorkItemId() ) );
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            String id = reader.getAttribute( "id" );
+            Command cmd = CommandFactory.newAbortWorkItem( Long.parseLong( id ) );
+
+            return cmd;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( AbortWorkItemCommand.class );
+        }
+    }
+
+    public static class BatchExecutionResultConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public BatchExecutionResultConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            ExecutionResults result = (ExecutionResults) object;
+            for ( String identifier : result.getIdentifiers() ) {
+                writer.startNode( "result" );
+                writer.addAttribute( "identifier",
+                                     identifier );
+                Object value = result.getValue( identifier );
+                writeItem( value,
+                           context,
+                           writer );
+                writer.endNode();
+            }
+
+            for ( String identifier : ((ExecutionResultImpl) result).getFactHandles().keySet() ) {
+                Object handle = result.getFactHandle( identifier );
+                if ( handle instanceof FactHandle ) {
+                    writer.startNode( "fact-handle" );
+                    writer.addAttribute( "identifier",
+                                         identifier );
+                    writer.addAttribute( "external-form",
+                                         ((FactHandle) handle).toExternalForm() );
+
+                    writer.endNode();
+                } else if ( handle instanceof Collection ) {
+                    writer.startNode( "fact-handles" );
+                    writer.addAttribute( "identifier",
+                                         identifier );
+                    for ( FactHandle factHandle : (Collection<FactHandle>) handle ) {
+                        writer.startNode( "fact-handle" );
+                        writer.addAttribute( "external-form",
+                                             ((FactHandle) factHandle).toExternalForm() );
+                        writer.endNode();
+                    }
+
+                    writer.endNode();
+                }
+
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            ExecutionResultImpl result = new ExecutionResultImpl();
+            Map results = result.getResults();
+            Map facts = result.getFactHandles();
+
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                if ( reader.getNodeName().equals( "result" ) ) {
+                    String identifier = reader.getAttribute( "identifier" );
+                    reader.moveDown();
+                    Object value = readItem( reader,
+                                             context,
+                                             null );
+                    results.put( identifier,
+                                 value );
+                    reader.moveUp();
+                    reader.moveUp();
+                } else if ( reader.getNodeName().equals( "fact-handle" ) ) {
+                    String identifier = reader.getAttribute( "identifier" );
+                    facts.put( identifier,
+                               new DisconnectedFactHandle( reader.getAttribute( "external-form" ) ) );
+                } else if ( reader.getNodeName().equals( "fact-handles" ) ) {
+                    String identifier = reader.getAttribute( "identifier" );
+                    List<FactHandle> list = new ArrayList();
+                    while ( reader.hasMoreChildren() ) {
+                        reader.moveDown();
+                        list.add( new DisconnectedFactHandle( reader.getAttribute( "external-form" ) ) );
+                        reader.moveUp();
+                    }
+                    facts.put( identifier,
+                               list );
+                } else {
+                    throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
+                }
+            }
+
+            return result;
+        }
+
+        public boolean canConvert(Class clazz) {
+            return ExecutionResults.class.isAssignableFrom( clazz );
+        }
+    }
+
+    public static class QueryResultsConverter extends AbstractCollectionConverter
+        implements
+        Converter {
+
+        public QueryResultsConverter(Mapper mapper) {
+            super( mapper );
+        }
+
+        public void marshal(Object object,
+                            HierarchicalStreamWriter writer,
+                            MarshallingContext context) {
+            QueryResults results = (QueryResults) object;
+
+            // write out identifiers
+            List<String> originalIds = Arrays.asList( results.getIdentifiers() );
+            List<String> actualIds = new ArrayList();
+            if ( results instanceof NativeQueryResults ) {
+                for ( String identifier : originalIds ) {
+                    // we don't want to marshall the query parameters
+                    Declaration declr = ((NativeQueryResults) results).getDeclarations().get( identifier );
+                    ObjectType objectType = declr.getPattern().getObjectType();
+                    if ( objectType instanceof ClassObjectType ) {
+                        if ( ((ClassObjectType) objectType).getClassType() == DroolsQuery.class ) {
+                            continue;
+                        }
+                    }
+                    actualIds.add( identifier );
+                }
+            }
+
+            String[] identifiers = actualIds.toArray( new String[actualIds.size()] );
+
+            writer.startNode( "identifiers" );
+            for ( int i = 0; i < identifiers.length; i++ ) {
+                writer.startNode( "identifier" );
+                writer.setValue( identifiers[i] );
+                writer.endNode();
+            }
+            writer.endNode();
+
+            for ( QueryResultsRow result : results ) {
+                writer.startNode( "row" );
+                for ( int i = 0; i < identifiers.length; i++ ) {
+                    Object value = result.get( identifiers[i] );
+                    FactHandle factHandle = result.getFactHandle( identifiers[i] );
+                    writeItem( value,
+                               context,
+                               writer );
+                    writer.startNode( "fact-handle" );
+                    writer.addAttribute( "external-form",
+                                         ((FactHandle) factHandle).toExternalForm() );
+                    writer.endNode();
+                }
+                writer.endNode();
+            }
+        }
+
+        public Object unmarshal(HierarchicalStreamReader reader,
+                                UnmarshallingContext context) {
+            reader.moveDown();
+            List<String> list = new ArrayList<String>();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                list.add( reader.getValue() );
+                reader.moveUp();
+            }
+            reader.moveUp();
+
+            HashMap<String, Integer> identifiers = new HashMap<String, Integer>();
+            for ( int i = 0; i < list.size(); i++ ) {
+                identifiers.put( list.get( i ),
+                                 i );
+            }
+
+            ArrayList<ArrayList<Object>> results = new ArrayList();
+            ArrayList<ArrayList<FactHandle>> resultHandles = new ArrayList();
+            while ( reader.hasMoreChildren() ) {
+                reader.moveDown();
+                ArrayList objects = new ArrayList();
+                ArrayList<FactHandle> handles = new ArrayList();
+                while ( reader.hasMoreChildren() ) {
+                    reader.moveDown();
+                    Object object = readItem( reader,
+                                              context,
+                                              null );
+                    reader.moveUp();
+
+                    reader.moveDown();
+                    FactHandle handle = new DisconnectedFactHandle( reader.getAttribute( "external-form" ) );
+                    reader.moveUp();
+
+                    objects.add( object );
+                    handles.add( handle );
+                }
+                results.add( objects );
+                resultHandles.add( handles );
+                reader.moveUp();
+            }
+
+            return new FlatQueryResults( identifiers,
+                                         results,
+                                         resultHandles );
+        }
+
+        public boolean canConvert(Class clazz) {
+            return QueryResults.class.isAssignableFrom( clazz );
+        }
+    }    
+}

Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -3,15 +3,24 @@
  */
 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;
@@ -24,6 +33,8 @@
     private Object payload;
     private PipelineContext context;
     
+    private static Pattern p = Pattern.compile("[\"']?lookup[\"']?\\s*[:=]\\s*[\"']([^\"']+)[\"']");
+    
     public XStreamFromXmlGridTransformer(XStreamResolverStrategy strategy) {
         this.strategy = strategy;
     }
@@ -38,8 +49,25 @@
     public Object processPayload(Object object, PipelineContext context) {
         
         try {
-            Document d = (Document) object;
-            String name = d.getDocumentElement().getAttribute("lookup");
+            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 + "'");
@@ -62,7 +90,7 @@
             }
             xstream.setClassLoader(cl);
             executionNodeContext.setClassLoader(cl);
-            payload = xstream.unmarshal(new DomReader(d));
+            payload = xstream.fromXML( ((String) object) );
             context.getProperties().put("xstream-instance", xstream);
             this.context = context;
         } catch (Exception e) {

Added: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -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 );          
+        
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -1,52 +0,0 @@
-package org.drools.runtime.pipeline.impl;
-
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.StringReader;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.drools.io.Resource;
-import org.drools.runtime.pipeline.PipelineContext;
-import org.drools.runtime.pipeline.Transformer;
-import org.w3c.dom.Document;
-import org.xml.sax.InputSource;
-
-public class ToXmlNodeTransformer extends BaseEmitter
-    implements
-    Transformer {
-
-    public void receive(Object object,
-                        PipelineContext context) {
-        // Create a DOM builder and parse the fragment
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        Document d = null;
-        try {
-            d = factory.newDocumentBuilder().parse( (InputSource) null );
-        } catch ( Exception e ) {
-        }
-
-        try {
-            if ( object instanceof String ) {
-                d = factory.newDocumentBuilder().parse( new InputSource( new StringReader( (String) object ) ) );
-            } else if ( object instanceof Reader ) {
-                d = factory.newDocumentBuilder().parse( new InputSource( (Reader) object ) );
-            } else if ( object instanceof InputStream ) {
-                d = factory.newDocumentBuilder().parse( (InputStream) object );
-            } else if ( object instanceof Resource ) {
-                d = factory.newDocumentBuilder().parse( new InputSource( ((Resource) object).getReader() ) );
-            } else {
-                throw new IllegalArgumentException( "signal object must be instance of InputStream or Resource" );
-            }
-        } catch ( Exception e ) {
-            handleException( this,
-                             object,
-                             e );
-        }
-
-        emit( d,
-              context );
-
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java	2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java	2010-06-05 04:26:28 UTC (rev 33359)
@@ -244,7 +244,7 @@
         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 += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
         expectedXml += "</execution-results>\n";
 
         assertXMLEqual( expectedXml,
@@ -291,7 +291,7 @@
 
         String expectedXml = "";
         expectedXml += "<execution-results>\n";
-        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
         expectedXml += "</execution-results>\n";
 
         assertXMLEqual( expectedXml,
@@ -336,7 +336,7 @@
         FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
         inXml = "";
         inXml += "<batch-execution>";
-        inXml += "  <get-object out-identifier='outStilton' factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "  <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
         inXml += "</batch-execution>";
         getPipelineStateful( ksession ).insert( inXml,
                                                 resultHandler );
@@ -385,14 +385,14 @@
         FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
         inXml = "";
         inXml += "<batch-execution>";
-        inXml += "  <retract factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "  <retract fact-handle='" + factHandle.toExternalForm() + "' />";
         inXml += "</batch-execution>";
         getPipelineStateful( ksession ).insert( inXml,
                                                 resultHandler );
 
         inXml = "";
         inXml += "<batch-execution>";
-        inXml += "  <get-object out-identifier='outStilton' factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "  <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
         inXml += "</batch-execution>";
         getPipelineStateful( ksession ).insert( inXml,
                                                 resultHandler );
@@ -447,7 +447,7 @@
         expectedXml += "      <price>30</price>\n";
         expectedXml += "    </org.drools.Cheese>\n";
         expectedXml += "  </result>\n";
-        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
         expectedXml += "</execution-results>\n";
 
         assertXMLEqual( expectedXml,
@@ -455,7 +455,7 @@
 
         inXml = "";
         inXml += "<batch-execution>";
-        inXml += "  <modify factHandle='" + factHandle.toExternalForm() + "'> <set accessor='oldPrice' value='\"42\"' /><set accessor='price' value='50' /></modify>";
+        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,
@@ -463,7 +463,7 @@
 
         inXml = "";
         inXml += "<batch-execution>";
-        inXml += "  <get-object out-identifier='outCheddar' factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "  <get-object out-identifier='outCheddar' fact-handle='" + factHandle.toExternalForm() + "' />";
         inXml += "</batch-execution>";
         getPipelineStateful( ksession ).insert( inXml,
                                                 resultHandler );
@@ -479,7 +479,7 @@
         ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = false;
         inXml = "";
         inXml += "<batch-execution>";
-        inXml += "  <modify factHandle='" + factHandle.toExternalForm() + "'> <set accessor='type' value='44\"; System.exit(1);' /><set accessor='price' value='50' /></modify>";
+        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,
@@ -602,7 +602,7 @@
 
         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>";
+        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 );
@@ -677,13 +677,13 @@
         expectedXml += "  <fact-handles identifier=\"myfacts\">\n";
         for ( FactHandle factHandle : factHandles ) {
             if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 30 ) {
-                expectedXml += "  <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+                expectedXml += "  <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
             }
         }
 
         for ( FactHandle factHandle : factHandles ) {
             if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 35 ) {
-                expectedXml += "  <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+                expectedXml += "  <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
             }
         }
         expectedXml += "  </fact-handles>\n";
@@ -992,13 +992,13 @@
         expectedXml += "          <price>1</price>\n";
         expectedXml += "          <oldPrice>0</oldPrice>\n";
         expectedXml += "        </org.drools.Cheese>\n";
-        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+        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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
         expectedXml += "      </row>\n";
         expectedXml += "      <row>\n";
         row = it1.next();
@@ -1007,13 +1007,13 @@
         expectedXml += "          <price>2</price>\n";
         expectedXml += "          <oldPrice>0</oldPrice>\n";
         expectedXml += "        </org.drools.Cheese>\n";
-        expectedXml += "        <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+        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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
         expectedXml += "      </row>\n";
         expectedXml += "    </query-results>\n";
         expectedXml += "  </result>\n";
@@ -1026,16 +1026,16 @@
         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 += "        <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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        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 externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+        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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+        expectedXml += "        <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
         expectedXml += "      </row>\n";
         expectedXml += "    </query-results>\n";
         expectedXml += "  </result>\n";
@@ -1154,7 +1154,7 @@
         expectedXml += "      <oldPrice>5</oldPrice>\n";
         expectedXml += "    </org.drools.Cheese>\n";
         expectedXml += "  </result>\n";
-        expectedXml += "  <fact-handle identifier=\"outBrie\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+        expectedXml += "  <fact-handle identifier=\"outBrie\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
         expectedXml += "</execution-results>\n";
         assertXMLEqual( expectedXml,
                         outXml );
@@ -1732,7 +1732,7 @@
         expectedXml += "      <price>30</price>\n";
         expectedXml += "    </org.foo.Whee>\n";
         expectedXml += "  </result>\n";
-        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
         expectedXml += "</execution-results>\n";
 
         assertXMLEqual( expectedXml,
@@ -1854,7 +1854,7 @@
         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 += "  <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
         expectedXml += "</execution-results>\n";
 
         assertXMLEqual( expectedXml,
@@ -1899,13 +1899,13 @@
         Transformer inTransformer = new XStreamFromXmlGridTransformer( xstreamResolverStrategy );
         inTransformer.setReceiver( batchExecution );
 
-        Transformer domTransformer = new ToXmlNodeTransformer();
-        domTransformer.setReceiver( inTransformer );
+//        Transformer domTransformer = new ToXmlNodeTransformer();
+//        domTransformer.setReceiver( inTransformer );
 
         //Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
         Pipeline pipeline = new ExecutionNodePipelineImpl( node );
 
-        pipeline.setReceiver( domTransformer );
+        pipeline.setReceiver( inTransformer );
 
         return pipeline;
     }



More information about the jboss-svn-commits mailing list