[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