[jboss-svn-commits] JBL Code SVN: r26282 - in labs/jbossrules/trunk: drools-api/src/main/java/org/drools/runtime and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Apr 27 23:06:17 EDT 2009


Author: mark.proctor at jboss.com
Date: 2009-04-27 23:06:15 -0400 (Mon, 27 Apr 2009)
New Revision: 26282

Added:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/Setter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/ModifyCommand.java
Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/ExecutionResults.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/FactHandle.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StatefulSessionTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DisconnectedFactHandle.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetObjectCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/RetractCommand.java
   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/impl/BatchExecutionResultImpl.java
   labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
Log:
-fact handles with inerts now supports
-retract, modify and getObject now implemented.

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -5,6 +5,7 @@
 
 import org.drools.ProviderInitializationException;
 import org.drools.runtime.ObjectFilter;
+import org.drools.runtime.rule.FactHandle;
 
 /**
  * <p>
@@ -57,9 +58,25 @@
         return getCommandFactoryProvider().newInsertElements( objects );
     }
     
+    public static Command newRetract(FactHandle factHandle) {
+        return getCommandFactoryProvider().newRetract( factHandle );
+    }
+    
+    public static Setter newSetter(String accessor, String value) {
+        return getCommandFactoryProvider().newSetter(accessor, value);
+    }
+    
+    public static Command newModify(FactHandle factHandle, List<Setter> setters) {
+        return getCommandFactoryProvider().newModify(factHandle, setters);
+    }
+    
+    public static Command newGetObject(FactHandle factHandle) {
+        return getCommandFactoryProvider().newGetObject( factHandle );
+    }
+    
     public static Command newGetObjects() {
     	return getCommandFactoryProvider().newGetObjects( );
-    }
+    }    
     
     public static Command newGetObjects(ObjectFilter filter) {
     	return getCommandFactoryProvider().newGetObjects( filter );

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -4,6 +4,7 @@
 import java.util.Map;
 
 import org.drools.runtime.ObjectFilter;
+import org.drools.runtime.rule.FactHandle;
 
 public interface CommandFactoryProvider {
     Command newInsertObject(Object object);
@@ -12,15 +13,25 @@
                             String outIdentifier);
 
     Command newInsertElements(Iterable iterable);
-    
+
+    Command newRetract(FactHandle factHandle);
+
+    Setter newSetter(String accessor,
+                     String value);
+
+    Command newModify(FactHandle factHandle,
+                      List<Setter> setters);
+
     Command newFireAllRules();
 
-    Command newFireAllRules(int max);    
-    
-	Command newGetObjects();
+    Command newFireAllRules(int max);
 
-    public Command newGetObjects(ObjectFilter filter);
-    
+    Command newGetObject(FactHandle factHandle);
+
+    Command newGetObjects();
+
+    Command newGetObjects(ObjectFilter filter);
+
     Command newSetGlobal(String identifie,
                          Object object);
 
@@ -48,7 +59,7 @@
     Command newQuery(String identifier,
                      String name,
                      Object[] arguments);
-    
-    Command newBatchExecution(List<? extends Command> commands);
-		
+
+    Command newBatchExecution(List< ? extends Command> commands);
+
 }

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/Setter.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/Setter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/Setter.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -0,0 +1,7 @@
+package org.drools.command;
+
+public interface Setter {
+    String getAccessor();
+
+    String getValue();
+}

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/ExecutionResults.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/ExecutionResults.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/ExecutionResults.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -15,5 +15,7 @@
     Collection<String> getIdentifiers();
 
     Object getValue(String identifier);
+    
+    Object getFactHandle(String identifier); 
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/FactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/FactHandle.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/FactHandle.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -1,5 +1,5 @@
 package org.drools.runtime.rule;
 
 public interface FactHandle {
-
+    String toExternalForm();
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -1678,7 +1678,7 @@
         DefaultFactHandle helloHandle = ( DefaultFactHandle ) ksession.insert( "hello" );
         DefaultFactHandle goodbyeHandle = ( DefaultFactHandle ) ksession.insert( "goodbye" );
         
-        FactHandle key = new DisconnectedFactHandle( helloHandle.toExternalForm() );
+        org.drools.runtime.rule.FactHandle key = new DisconnectedFactHandle( helloHandle.toExternalForm() );
         assertEquals( "hello", ksession.getObject( key ) );
         
         key = new DisconnectedFactHandle( goodbyeHandle.toExternalForm() );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StatefulSessionTest.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StatefulSessionTest.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -3,16 +3,30 @@
 import junit.framework.TestCase;
 import org.drools.Cheese;
 import org.drools.FactHandle;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.command.Command;
+import org.drools.command.CommandFactory;
+import org.drools.common.DisconnectedFactHandle;
 import org.drools.compiler.PackageBuilder;
 import org.drools.concurrent.Future;
+import org.drools.io.ResourceFactory;
 import org.drools.rule.Package;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.impl.BatchExecutionResultImpl;
 
 import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public class StatefulSessionTest extends TestCase {
@@ -53,6 +67,41 @@
         
     }
     
+    public void testInsertObject() 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( 30 ); \n";
+        str += "end\n";
+        
+        Cheese stilton = new Cheese( "stilton", 5 );
+        
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();        
+        
+        Command insertCmd = CommandFactory.newInsertObject( stilton, "outStilton" );
+        Command fireCmd = CommandFactory.newFireAllRules();
+        
+        Command cmds = CommandFactory.newBatchExecution( Arrays.asList( new Command[] { insertCmd,fireCmd} ) );
+        
+        ExecutionResults result = ksession.execute( cmds );
+        stilton = ( Cheese ) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );      
+        
+        Object o = ksession.getObject( (FactHandle) result.getFactHandle( "outStilton" ) );
+        assertSame( o, stilton );
+    }    
+    
     public void testArrayObjectAssert() throws Exception {
         StatefulSession session = getSession();
 
@@ -215,4 +264,5 @@
                            this.list );
         return session;
     }
+      
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -5,16 +5,22 @@
 
 import org.drools.command.Command;
 import org.drools.command.CommandFactoryProvider;
+import org.drools.command.Setter;
 import org.drools.process.command.FireAllRulesCommand;
 import org.drools.process.command.GetGlobalCommand;
+import org.drools.process.command.GetObjectCommand;
 import org.drools.process.command.GetObjectsCommand;
 import org.drools.process.command.InsertElementsCommand;
 import org.drools.process.command.InsertObjectCommand;
+import org.drools.process.command.ModifyCommand;
 import org.drools.process.command.QueryCommand;
+import org.drools.process.command.RetractCommand;
 import org.drools.process.command.SetGlobalCommand;
 import org.drools.process.command.StartProcessCommand;
+import org.drools.process.command.ModifyCommand.SetterImpl;
 import org.drools.runtime.ObjectFilter;
 import org.drools.runtime.impl.BatchExecutionImpl;
+import org.drools.runtime.rule.FactHandle;
 
 public class CommandFactoryProviderImpl implements CommandFactoryProvider {
 
@@ -41,6 +47,24 @@
 		cmd.setOutIdentifier(outIdentifier);
 		return cmd;
 	}
+	
+    public Command newRetract(FactHandle factHandle) {
+        return new RetractCommand( factHandle );
+    }
+    
+    public Setter newSetter(String accessor,
+                             String value) {
+        return new SetterImpl(accessor, value);
+    }    
+    
+    public Command newModify(FactHandle factHandle,
+                             List<Setter> setters) {
+        return new ModifyCommand(factHandle, setters);
+    }    
+	
+    public Command newGetObject(FactHandle factHandle) {
+        return new GetObjectCommand(factHandle);
+    }	
 
 	public Command newGetObjects() {
 		return newGetObjects(null);
@@ -102,4 +126,7 @@
 		return new BatchExecutionImpl(
 				(List<org.drools.process.command.Command>) commands);
 	}
+
+
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -1147,11 +1147,17 @@
             this.lock.lock();
             this.ruleBase.executeQueuedActions();
 
-            final InternalFactHandle handle = (InternalFactHandle) factHandle;
+            InternalFactHandle handle = (InternalFactHandle) factHandle;
             if ( handle.getId() == -1 ) {
                 // can't retract an already retracted handle
                 return;
             }
+            
+            // the handle might have been disconnected, so reconnect if it has
+            if ( factHandle instanceof DisconnectedFactHandle ) {
+                handle = this.objectStore.reconnect( handle );
+            }
+            
             removePropertyChangeListener( handle );
 
             if ( activation != null ) {
@@ -1224,8 +1230,13 @@
             this.lock.lock();
             this.ruleBase.executeQueuedActions();
 
-            final InternalFactHandle handle = (InternalFactHandle) factHandle;
-
+            InternalFactHandle handle = (InternalFactHandle) factHandle;
+            
+            // the handle might have been disconnected, so reconnect if it has
+            if ( factHandle instanceof DisconnectedFactHandle ) {
+                handle = this.objectStore.reconnect( handle );
+            }
+            
             if ( handle.getId() == -1 ) {
                 // the handle is invalid, most likely already retracted, so
                 // return
@@ -1290,7 +1301,13 @@
             this.lock.lock();
             this.ruleBase.executeQueuedActions();
 
-            final InternalFactHandle handle = (InternalFactHandle) factHandle;
+            InternalFactHandle handle = (InternalFactHandle) factHandle;
+            
+            // the handle might have been disconnected, so reconnect if it has
+            if ( factHandle instanceof DisconnectedFactHandle ) {
+                handle = this.objectStore.reconnect( handle );
+            }
+            
             final Object originalObject = handle.getObject();
 
             if ( this.maintainTms ) {
@@ -1363,13 +1380,18 @@
      * 
      * @see WorkingMemory
      */
-    public void update(final org.drools.FactHandle factHandle,
+    public void update(org.drools.FactHandle factHandle,
                        final Object object,
                        final Rule rule,
                        final Activation activation) throws FactException {
         try {
             this.lock.lock();
             this.ruleBase.executeQueuedActions();
+            
+            // the handle might have been disconnected, so reconnect if it has
+            if ( factHandle instanceof DisconnectedFactHandle ) {
+                factHandle = this.objectStore.reconnect( factHandle );
+            }
 
             // only needed if we maintain tms, but either way we must get it
             // before we do the retract

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DisconnectedFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DisconnectedFactHandle.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DisconnectedFactHandle.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -112,7 +112,7 @@
     }
 
     public String toExternalForm() {
-        return "0" + this.id + ":" + this.identityHashCode + ":" + this.objectHashCode + ":" + this.recency;
+        return "0:" + this.id + ":" + this.identityHashCode + ":" + this.objectHashCode + ":" + this.recency;
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -3,28 +3,31 @@
 import java.util.Iterator;
 
 import org.drools.runtime.ObjectFilter;
+import org.drools.runtime.rule.FactHandle;
 
 public interface ObjectStore {
 
-    public abstract int size();
+    int size();
 
-    public abstract boolean isEmpty();
+    boolean isEmpty();
     
-    public void clear();    
+    void clear();    
 
-    public abstract Object getObjectForHandle(InternalFactHandle handle);
+    Object getObjectForHandle(FactHandle handle);
+    
+    InternalFactHandle reconnect(FactHandle factHandle);
 
-    public abstract InternalFactHandle getHandleForObject(Object object);
+    InternalFactHandle getHandleForObject(Object object);
     
-    public abstract InternalFactHandle getHandleForObjectIdentity(Object object);
+    InternalFactHandle getHandleForObjectIdentity(Object object);
 
-    public abstract void updateHandle(InternalFactHandle handle,
+    void updateHandle(InternalFactHandle handle,
                                       Object object);
 
     public abstract void addHandle(InternalFactHandle handle,
                                    Object object);
 
-    public abstract void removeHandle(final InternalFactHandle handle);
+    public abstract void removeHandle(final FactHandle handle);
 
     /**
      * This class is not thread safe, changes to the working memory during iteration may give unexpected results

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -11,6 +11,7 @@
 import java.util.concurrent.locks.Lock;
 
 import org.drools.runtime.ObjectFilter;
+import org.drools.runtime.rule.FactHandle;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseConfiguration.AssertBehaviour;
 import org.drools.util.JavaIteratorAdapter;
@@ -80,7 +81,7 @@
     /* (non-Javadoc)
      * @see org.drools.common.ObjectStore#getObjectForHandle(org.drools.common.InternalFactHandle)
      */
-    public Object getObjectForHandle(InternalFactHandle handle) {
+    public Object getObjectForHandle(FactHandle handle) {
         try {
             this.lock.lock();
 
@@ -104,6 +105,10 @@
     public InternalFactHandle getHandleForObject(Object object){
         return (InternalFactHandle) this.assertMap.get( object );
     }
+    
+    public InternalFactHandle reconnect(FactHandle factHandle) {
+        return (InternalFactHandle) this.assertMap.get( factHandle );
+    }
 
     /* (non-Javadoc)
      * @see org.drools.common.ObjectStore#getHandleForObject(java.lang.Object)
@@ -141,7 +146,7 @@
     /* (non-Javadoc)
      * @see org.drools.common.ObjectStore#removeHandle(org.drools.common.InternalFactHandle)
      */
-    public void removeHandle(final InternalFactHandle handle) {
+    public void removeHandle(final FactHandle handle) {
         this.assertMap.remove( handle );
         if ( AssertBehaviour.EQUALITY.equals(this.behaviour) ) {
             this.identityMap.remove( handle );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetObjectCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetObjectCommand.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetObjectCommand.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -8,14 +8,31 @@
     Command<Object> {
 
     private FactHandle factHandle;
+    private String     outIdentifier;
 
     public GetObjectCommand(FactHandle factHandle) {
         this.factHandle = factHandle;
     }
 
+    public String getOutIdentifier() {
+        return outIdentifier;
+    }
+
+    public void setOutIdentifier(String outIdentifier) {
+        this.outIdentifier = outIdentifier;
+    }
+
     public Object execute(ReteooWorkingMemory session) {
-        return session.getObject( factHandle );
+        Object object = session.getObject( factHandle );
+        session.getExecutionResult().getResults().put( this.outIdentifier,
+                                                       object );
+
+        return object;
     }
+    
+    public FactHandle getFactHandle() {
+        return this.factHandle;
+    }
 
     public String toString() {
         return "session.getObject( " + factHandle + " );";

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -1,29 +1,42 @@
 package org.drools.process.command;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.runtime.rule.FactHandle;
 
-public class InsertObjectCommand implements Command<FactHandle> {
-	
-	private Object object;
-	
-    private String outIdentifier;
-	
-	public InsertObjectCommand(Object object) {
-		this.object = object;
-	}
-	
-	public FactHandle execute(ReteooWorkingMemory session) {
-	    if ( outIdentifier != null ) {
-	        session.getExecutionResult().getResults().put( this.outIdentifier, object );
-	    }
-		return session.insert(object);
-	}
-	
-	public Object getObject() {
-	    return this.object;
-	}
+public class InsertObjectCommand
+    implements
+    Command<FactHandle> {
 
+    private Object  object;
+
+    private String  outIdentifier;
+
+    private boolean returnObject = true;
+
+    public InsertObjectCommand(Object object) {
+        this.object = object;
+    }
+
+    public FactHandle execute(ReteooWorkingMemory session) {
+        FactHandle factHandle = session.insert( object );
+
+        if ( outIdentifier != null ) {
+            if ( this.returnObject ) {
+                session.getExecutionResult().getResults().put( this.outIdentifier,
+                                                               object );
+            }
+            session.getExecutionResult().getFacts().put( this.outIdentifier,
+                                                         factHandle );
+        }
+
+        return factHandle;
+    }
+
+    public Object getObject() {
+        return this.object;
+    }
+
     public String getOutIdentifier() {
         return this.outIdentifier;
     }
@@ -32,8 +45,16 @@
         this.outIdentifier = outIdentifier;
     }
 
+    public boolean isReturnObject() {
+        return returnObject;
+    }
+
+    public void setReturnObject(boolean returnObject) {
+        this.returnObject = returnObject;
+    }
+
     public String toString() {
-		return "session.insert(" + object + ");";
-	}
+        return "session.insert(" + object + ");";
+    }
 
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/ModifyCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/ModifyCommand.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/ModifyCommand.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -0,0 +1,82 @@
+package org.drools.process.command;
+
+import java.util.List;
+
+import org.drools.command.Setter;
+import org.drools.reteoo.ReteooWorkingMemory;
+import org.drools.runtime.rule.FactHandle;
+import org.mvel2.MVEL;
+
+public class ModifyCommand
+    implements
+    Command<Object> {
+
+    private FactHandle       handle;
+    private List<Setter> setters;
+
+    public ModifyCommand(FactHandle handle,
+                         List<Setter> setters) {
+        this.handle = handle;
+        this.setters = setters;
+    }
+
+    public Object execute(ReteooWorkingMemory session) {
+        Object object = session.getObject( this.handle );
+        System.out.println( object );
+        System.out.println( getMvelExpr() );
+        MVEL.eval( getMvelExpr(),
+                   object );
+
+        session.update( handle,
+                        object );
+        return object;
+    }
+
+    public FactHandle getFactHandle() {
+        return this.handle;
+    }
+
+    public List<Setter> getSetters() {
+        return this.setters;
+    }
+
+    private String getMvelExpr() {
+        StringBuilder sbuilder = new StringBuilder();
+        sbuilder.append( "with (this) {\n" );
+        int i = 0;
+        for ( Setter setter : this.setters ) {
+            if ( i++ > 0 ) {
+                sbuilder.append( "," );
+            }
+            sbuilder.append( setter.getAccessor() + " = " + setter.getValue() + "\n" );
+        }
+        sbuilder.append( "}" );
+        return sbuilder.toString();
+    }
+
+    public String toString() {
+        return "modify() " + getMvelExpr();
+    }
+
+    public static class SetterImpl
+        implements
+        Setter {
+        private String accessor;
+        private String value;
+
+        public SetterImpl(String accessor,
+                          String value) {
+            this.accessor = accessor;
+            this.value = value;
+        }
+
+        public String getAccessor() {
+            return accessor;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/RetractCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/RetractCommand.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/RetractCommand.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -17,6 +17,10 @@
         session.retract( handle );
         return null;
     }
+    
+    public FactHandle getFactHandle() {
+        return this.handle;
+    }
 
     public String toString() {
         return "session.retract( " + handle + " );";

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	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -9,19 +9,29 @@
 
 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.common.DisconnectedFactHandle;
+import org.drools.common.InternalFactHandle;
 import org.drools.process.command.FireAllRulesCommand;
 import org.drools.process.command.GetGlobalCommand;
+import org.drools.process.command.GetObjectCommand;
 import org.drools.process.command.GetObjectsCommand;
 import org.drools.process.command.InsertElementsCommand;
 import org.drools.process.command.InsertObjectCommand;
+import org.drools.process.command.ModifyCommand;
 import org.drools.process.command.QueryCommand;
+import org.drools.process.command.RetractCommand;
 import org.drools.process.command.SetGlobalCommand;
 import org.drools.process.command.StartProcessCommand;
+import org.drools.process.command.ModifyCommand.SetterImpl;
 import org.drools.rule.Declaration;
 import org.drools.runtime.ExecutionResults;
 import org.drools.runtime.help.BatchExecutionHelperProvider;
 import org.drools.runtime.impl.BatchExecutionImpl;
 import org.drools.runtime.impl.BatchExecutionResultImpl;
+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;
@@ -56,6 +66,10 @@
                        BatchExecutionImpl.class );
         xstream.alias( "insert",
                        InsertObjectCommand.class );
+        xstream.alias( "modify",
+                       ModifyCommand.class );
+        xstream.alias( "retract",
+                       RetractCommand.class );
         xstream.alias( "insert-elements",
                        InsertElementsCommand.class );
         xstream.alias( "startProcess",
@@ -64,6 +78,8 @@
                        SetGlobalCommand.class );
         xstream.alias( "get-global",
                        GetGlobalCommand.class );
+        xstream.alias( "get-object",
+                       GetObjectCommand.class );
         xstream.alias( "get-objects",
                        GetObjectsCommand.class );
         xstream.alias( "execution-results",
@@ -78,6 +94,9 @@
                        NativeQueryResults.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() ) );
@@ -154,6 +173,9 @@
             if ( cmd.getOutIdentifier() != null ) {
                 writer.addAttribute( "out-identifier",
                                      cmd.getOutIdentifier() );
+                
+                writer.addAttribute( "return-object", Boolean.toString( cmd.isReturnObject() ) );
+                
             }
             writeItem( cmd.getObject(),
                        context,
@@ -163,6 +185,7 @@
         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,
@@ -171,7 +194,10 @@
             reader.moveUp();
             InsertObjectCommand cmd = new InsertObjectCommand( object );
             if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );
+                cmd.setOutIdentifier( identifierOut );                
+                if ( returnObject != null ) {
+                    cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
+                }
             }
             return cmd;
         }
@@ -182,6 +208,87 @@
 
     }
 
+    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 {
@@ -278,6 +385,45 @@
         }
     }
 
+    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 {
@@ -374,13 +520,13 @@
         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( );
+                cmd = new FireAllRulesCommand();
             }
             return cmd;
         }
@@ -520,28 +666,44 @@
                            writer );
                 writer.endNode();
             }
+
+            for ( String identifier : ((BatchExecutionResultImpl) result).getFacts().keySet() ) {
+                writer.startNode( "fact-handle" );
+                writer.addAttribute( "identifier",
+                                     identifier );
+                writer.addAttribute( "externalForm",
+                                     ((InternalFactHandle) result.getFactHandle( identifier )).toExternalForm() );
+                writer.endNode();
+            }
         }
 
         public Object unmarshal(HierarchicalStreamReader reader,
                                 UnmarshallingContext context) {
-            Map map = new HashMap();
+            BatchExecutionResultImpl result = new BatchExecutionResultImpl();
+            Map results = result.getResults();
+            Map facts = result.getFacts();
 
             while ( reader.hasMoreChildren() ) {
                 reader.moveDown();
-                String identifier = reader.getAttribute( "identifier" );
-                reader.moveDown();
-                Object value = readItem( reader,
-                                         context,
-                                         null );
-                map.put( identifier,
-                         value );
-                reader.moveUp();
-                reader.moveUp();
+                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 {
+                    throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
+                }
             }
 
-            BatchExecutionResultImpl result = new BatchExecutionResultImpl();
-            result.setResults( map );
-
             return result;
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/impl/BatchExecutionResultImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/impl/BatchExecutionResultImpl.java	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/impl/BatchExecutionResultImpl.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -7,7 +7,8 @@
 import org.drools.runtime.ExecutionResults;
 
 public class BatchExecutionResultImpl implements ExecutionResults {
-    Map<String, Object> results = new HashMap<String, Object>();
+    Map<String, Object> results = new HashMap<String, Object>();    
+    Map<String, Object> facts = new HashMap<String, Object>();
     
     /* (non-Javadoc)
      * @see org.drools.batchexecution.BatchExecutionResult#getIdentifiers()
@@ -19,6 +20,10 @@
     public Object getValue(String identifier) {
         return this.results.get( identifier );
     }
+    
+    public Object getFactHandle(String identifier) {
+        return this.facts.get( identifier );
+    }
 
     /* (non-Javadoc)
      * @see org.drools.batchexecution.BatchExecutionResult#getResults()
@@ -30,4 +35,12 @@
     public void setResults(Map<String, Object> results) {
         this.results = results;
     }
+    
+    public Map<String, Object> getFacts() {
+        return this.facts;
+    }    
+    
+    public void setFacts(Map<String, Object> facts) {
+        this.facts = facts;
+    }
 }

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	2009-04-27 19:39:23 UTC (rev 26281)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java	2009-04-28 03:06:15 UTC (rev 26282)
@@ -23,7 +23,10 @@
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
 import org.drools.definition.KnowledgePackage;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.io.Resource;
 import org.drools.io.ResourceFactory;
 import org.drools.runtime.ExecutionResults;
@@ -36,8 +39,11 @@
 import org.drools.runtime.pipeline.PipelineFactory;
 import org.drools.runtime.pipeline.ResultHandler;
 import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
 import org.xml.sax.SAXException;
 
+import com.thoughtworks.xstream.XStream;
+
 public class XStreamBatchExecutionTest extends TestCase {
 
     protected void setUp() throws Exception {
@@ -62,7 +68,7 @@
         }
     }
 
-    public void testInsertObject() throws Exception {
+    public void testInsertObjectWithDefaults() throws Exception {
         String str = "";
         str += "package org.drools \n";
         str += "import org.drools.Cheese \n";
@@ -83,14 +89,25 @@
         inXml += "      <oldPrice>0</oldPrice>";
         inXml += "    </org.drools.Cheese>";
         inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
         inXml += "</batch-execution>";
 
-        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
         ResultHandlerImpl resultHandler = new ResultHandlerImpl();
-        getPipeline( ksession ).insert( inXml,
-                                        resultHandler );
-        String outXml = (String) resultHandler.getObject();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();      
 
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+        
+        FactHandle factHandle = ( FactHandle ) result.getFactHandle( "outStilton" );
+        stilton = ( Cheese ) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );          
+        
         String expectedXml = "";
         expectedXml += "<execution-results>\n";
         expectedXml += "  <result identifier=\"outStilton\">\n";
@@ -100,17 +117,240 @@
         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 );
+    }
+    
+    public void testInsertObjectWithReturnObjectFalse() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
 
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton' return-object='false'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();      
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        assertNull( result.getValue( "outStilton" ) );
+        
+        FactHandle factHandle = ( FactHandle ) result.getFactHandle( "outStilton" );
+        Cheese stilton = ( Cheese ) ksession.getObject( factHandle );
+        assertEquals( 30,
+                      stilton.getPrice() );       
+        
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" 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>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();      
+
         ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
         Cheese stilton = (Cheese) result.getValue( "outStilton" );
         assertEquals( 30,
                       stilton.getPrice() );
-    }
+        
+        FactHandle factHandle = ( FactHandle ) result.getFactHandle( "outStilton" );
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <get-object out-identifier='outStilton' factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();   
+        result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );        
+    }    
+    
+    public void testRetractObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
 
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();      
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+        
+        FactHandle factHandle = ( FactHandle ) result.getFactHandle( "outStilton" );
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <retract factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <get-object out-identifier='outStilton' factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();   
+        result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        assertNull( result.getValue( "outStilton" ) );
+    }        
+    
+    public void testModifyObject() throws Exception {
+        String str = "";
+        str += "package org.drools \n";
+        str += "import org.drools.Cheese \n";
+        str += "rule rule1 \n";
+        str += "  when \n";
+        str += "    $c : Cheese() \n";
+        str += " \n";
+        str += "  then \n";
+        str += "    $c.setPrice( $c.getPrice() + 5 ); \n";
+        str += "end\n";
+
+        String inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <insert out-identifier='outStilton'>";
+        inXml += "    <org.drools.Cheese>";
+        inXml += "      <type>stilton</type>";
+        inXml += "      <price>25</price>";
+        inXml += "      <oldPrice>0</oldPrice>";
+        inXml += "    </org.drools.Cheese>";
+        inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
+        inXml += "</batch-execution>";
+
+
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        String outXml = (String) resultHandler.getObject();      
+
+        ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese stilton = (Cheese) result.getValue( "outStilton" );
+        assertEquals( 30,
+                      stilton.getPrice() );
+        
+        FactHandle factHandle = ((FactHandle) result.getFactHandle( "outStilton" ));
+        
+        String expectedXml = "";
+        expectedXml += "<execution-results>\n";
+        expectedXml += "  <result identifier=\"outStilton\">\n";
+        expectedXml += "    <org.drools.Cheese>\n";
+        expectedXml += "      <type>stilton</type>\n";
+        expectedXml += "      <oldPrice>0</oldPrice>\n";
+        expectedXml += "      <price>30</price>\n";
+        expectedXml += "    </org.drools.Cheese>\n";
+        expectedXml += "  </result>\n";
+        expectedXml += "  <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+        expectedXml += "</execution-results>\n";
+                
+        assertXMLEqual( expectedXml,
+                        outXml );
+        
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <modify factHandle='" + factHandle.toExternalForm() + "'> <set accessor='type' value='\"cheddar\"' /><set accessor='price' value='50' /></modify>";
+        inXml += "  <fire-all-rules />";        
+        inXml += "</batch-execution>";        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+
+        inXml = "";
+        inXml += "<batch-execution>";
+        inXml += "  <get-object out-identifier='outCheddar' factHandle='" + factHandle.toExternalForm() + "' />";
+        inXml += "</batch-execution>";        
+        getPipelineStateful( ksession ).insert( inXml,
+                                                resultHandler );
+        outXml = (String) resultHandler.getObject();   
+        result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+        Cheese cheddar = (Cheese) result.getValue( "outCheddar" );
+        assertEquals( "cheddar", cheddar.getType() );
+        assertEquals( 55,
+                      cheddar.getPrice() );            
+        
+        
+    }       
+
     public void testInsertElements() throws Exception {
         String str = "";
         str += "package org.drools \n";
@@ -499,7 +739,7 @@
         expectedXml += "      </row>\n";
         expectedXml += "    </query-results>\n";
         expectedXml += "  </result>\n";
-        expectedXml += "</execution-results>\n";;
+        expectedXml += "</execution-results>\n";
 
         assertXMLEqual( expectedXml,
                         outXml );
@@ -588,6 +828,8 @@
         getPipeline( ksession ).insert( inXml,
                                         resultHandler );
         String outXml = (String) resultHandler.getObject();
+        
+        FactHandle factHandle = ( FactHandle ) ((ExecutionResults)BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml )).getFactHandle( "outBrie" );
 
         String expectedXml = "";
         expectedXml += "<execution-results>\n";
@@ -612,6 +854,7 @@
         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 );
@@ -722,14 +965,20 @@
         inXml += "      <oldPrice>0</oldPrice>";
         inXml += "    </org.foo.Whee>";
         inXml += "  </insert>";
+        inXml += "  <fire-all-rules />";
         inXml += "</batch-execution>";
 
-        StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+        StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
         ResultHandlerImpl resultHandler = new ResultHandlerImpl();
-        getPipeline( ksession ).insert( inXml,
+        getPipelineStateful( ksession ).insert( inXml,
                                         resultHandler );
         String outXml = (String) resultHandler.getObject();
-
+        
+        ClassLoader cl = ((InternalRuleBase) ((StatefulKnowledgeSessionImpl) ksession).getRuleBase()).getRootClassLoader();
+        XStream xstream = BatchExecutionHelper.newXStreamMarshaller();
+        xstream.setClassLoader( cl );
+        FactHandle factHandle = ( FactHandle ) ((ExecutionResults)xstream.fromXML( outXml )).getFactHandle( "outStilton" );
+        
         String expectedXml = "";
         expectedXml += "<execution-results>\n";
         expectedXml += "  <result identifier=\"outStilton\">\n";
@@ -739,7 +988,11 @@
         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";
+        
+        System.out.println( expectedXml );
+        System.out.println( outXml );
 
         assertXMLEqual( expectedXml,
                         outXml );




More information about the jboss-svn-commits mailing list