[jboss-svn-commits] JBL Code SVN: r14966 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools: base and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Sep 9 11:02:23 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-09-09 11:02:23 -0400 (Sun, 09 Sep 2007)
New Revision: 14966
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/CopyIdentifiersGlobalExporter.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ReferenceOriginalGlobalExporter.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExporter.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSession.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSessionResult.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/InternalWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteStatelessSessionResult.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java
Log:
JBRULES-1165 StatelessSessionResult should have getGlobal
-Added an Export capability, with unit tests, for a StatelessSession to export globals.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSession.java 2007-09-09 14:20:33 UTC (rev 14965)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSession.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -7,6 +7,7 @@
import org.drools.event.RuleFlowEventListener;
import org.drools.event.WorkingMemoryEventListener;
import org.drools.spi.AgendaFilter;
+import org.drools.spi.GlobalExporter;
import org.drools.spi.GlobalResolver;
/**
@@ -16,6 +17,9 @@
* provided all the data in one hit, and a conclusion reached by the engine.
* (there is no accumulation of facts/knowledge - each invocation is on a fresh session).
*
+ * Each created StatelessSession can be call execute() any number of times, in a stateless manner
+ * however the GlobalResolver, unless set each time, is shared between each execute() method call.
+ *
* Care should be used when using the async versions of the methods, consult the javadoc for
* the specific information.
*/
@@ -29,9 +33,25 @@
*/
void setGlobalResolver(GlobalResolver globalResolver);
- void setGlobal(String identifer, Object value);
+ /**
+ * Sets a global value
+ * @param identifer
+ * @param value
+ */
+ void setGlobal(String identifer, Object value);
/**
+ * Used to specify a global exporting strategy
+ * so that global variables can be available to StatelessSessionResults.
+ *
+ * If this is not set, then StatelessSessionResult will have no globals.
+ * @param globalExporter
+ * The GlobalExporter instance
+ */
+ public void setGlobalExporter(GlobalExporter globalExporter);
+
+
+ /**
* Insert a single fact, an fire the rules, returning when finished.
*/
void execute(Object object);
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSessionResult.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSessionResult.java 2007-09-09 14:20:33 UTC (rev 14965)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatelessSessionResult.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -2,10 +2,32 @@
import java.util.Iterator;
+import org.drools.spi.GlobalResolver;
+
+/**
+ * StatelessSessionResults allow inspection of session after it has executed. Querries can still be executed, unless you serialise at which point the
+ * WorkingMemory and RuleBase it references to execute thosa querries are lost due to being transient.
+ *
+ * Globals must be explicitely imported into the StatelessSessionResult to be accessible, otherwise getGlobal and getGlobalResolver return null.
+ * @author mproctor
+ *
+ */
public interface StatelessSessionResult {
+ /**
+ * Iterator all Objects inserted into the StatelessSession.
+ * @return
+ * java.util.Iterators.
+ */
Iterator iterateObjects();
+ /**
+ * Iterate only those objects that match the provided ObjectFilter.
+ * @param filter
+ * The ObjectFilter instance.
+ * @return
+ * java.util.Iterators.
+ */
Iterator iterateObjects(ObjectFilter filter);
/**
@@ -15,11 +37,38 @@
* The name of the query.
*
* @return The QueryResults of the specified query.
- * If no results match the query it is empty.
+ * If no results match the query it is empty..
*
- * @throws IllegalArgumentException
- * if no query named "query" is found in the rulebase
+ * @throws IllegalArgumentException.
+ * if no query named "query" is found in the rulebase.
*/
public QueryResults getQueryResults(String query);
+
+ /**
+ * Allows for parameters to be passed to a query.
+ * @param query
+ * The name of the query.
+ * @param arguments
+ * The Object[] of arguments to pass to the query's parameters.
+ * @return
+ * java.util.Iterator.
+ */
+ public QueryResults getQueryResults(final String query, final Object[] arguments);
+
+ /**
+ * Retrieves the global value for the given identifier, note that globals must be exported from the StatelessSession to be accessible.
+ * @param identifier
+ * The global identifier.
+ * @return
+ * The instance the global identifier points to.
+ */
+ public Object getGlobal(String identifier);
+
+ /**
+ * The GlobalResolver returned from the GlobalExporter by the StatelessSessoin
+ * @return
+ * The GlobalResolver used for this StatelessSessionResult
+ */
+ public GlobalResolver getGlobalResolver();
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/CopyIdentifiersGlobalExporter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/CopyIdentifiersGlobalExporter.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/CopyIdentifiersGlobalExporter.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -0,0 +1,54 @@
+/**
+ *
+ */
+package org.drools.base;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalRuleBase;
+import org.drools.spi.GlobalExporter;
+import org.drools.spi.GlobalResolver;
+
+/**
+ * Creates a new GlobalResolver consisting of just the identifiers specified in the String[].
+ * If the String[] is null, or the default constructor is used, then all globals defined in the RuleBase
+ * will be copied.
+ *
+ */
+public class CopyIdentifiersGlobalExporter implements GlobalExporter {
+ private String[] identifiers;
+
+ /**
+ * All identifiers will be copied
+ *
+ */
+ public CopyIdentifiersGlobalExporter() {
+ this.identifiers = null;
+ }
+
+ /**
+ * Specified identifiers will be copied
+ * @param identifiers
+ */
+ public CopyIdentifiersGlobalExporter(String[] identifiers) {
+ this.identifiers = identifiers;
+ }
+
+ public GlobalResolver export(WorkingMemory workingMemory) {
+ if ( this.identifiers == null ) {
+ // no identifiers, to get all the identifiers from that defined in
+ // the rulebase
+ Map map = ((InternalRuleBase)workingMemory.getRuleBase()).getGlobals();
+ this.identifiers = new String[ map.size() ];
+ this.identifiers = (String[]) map.keySet().toArray( this.identifiers );
+ }
+
+ Map map = new HashMap(identifiers.length);
+ for ( int i = 0, length = identifiers.length; i < length; i++ ) {
+ map.put( identifiers[i], workingMemory.getGlobal( identifiers[i] ) );
+ }
+ return new MapGlobalResolver(map);
+ }
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ReferenceOriginalGlobalExporter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ReferenceOriginalGlobalExporter.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ReferenceOriginalGlobalExporter.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -0,0 +1,20 @@
+/**
+ *
+ */
+package org.drools.base;
+
+import org.drools.WorkingMemory;
+import org.drools.spi.GlobalExporter;
+import org.drools.spi.GlobalResolver;
+
+/**
+ * This implementation does nothing other than pass by reference the original GlobalResolver as used in the StatelessSession.
+ * Care should be taken if you use this strategy, as later executes may change those globals. The GlobalResolver of the StatelessSession
+ * may also not be serialisable friendly.
+ *
+ */
+public class ReferenceOriginalGlobalExporter implements GlobalExporter {
+ public GlobalResolver export(WorkingMemory workingMemory) {
+ return workingMemory.getGlobalResolver();
+ }
+}
\ No newline at end of file
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 2007-09-09 14:20:33 UTC (rev 14965)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -539,6 +539,10 @@
}
}
+
+ public ObjectHashMap getAssertMap() {
+ return this.assertMap;
+ }
/**
* @see WorkingMemory
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java 2007-09-09 14:20:33 UTC (rev 14965)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -22,6 +22,8 @@
public long getId();
public void setWorkingMemoryEventSupport(WorkingMemoryEventSupport workingMemoryEventSupport);
+
+ public ObjectHashMap getAssertMap();
public void setAgendaEventSupport(AgendaEventSupport agendaEventSupport);
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2007-09-09 14:20:33 UTC (rev 14965)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -87,7 +87,6 @@
} else {
this.objectMemoryEnabled = false;
}
-
}
/**
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteStatelessSessionResult.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteStatelessSessionResult.java 2007-09-09 14:20:33 UTC (rev 14965)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteStatelessSessionResult.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -5,25 +5,55 @@
import org.drools.ObjectFilter;
import org.drools.QueryResults;
import org.drools.StatelessSessionResult;
-import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.GlobalResolver;
+import org.drools.util.JavaIteratorAdapter;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.AbstractHashTable.HashTableIterator;
public class ReteStatelessSessionResult implements StatelessSessionResult {
- private WorkingMemory workingMemory;
+ private transient InternalWorkingMemory workingMemory;
+ private ObjectHashMap assertMap;
+ private GlobalResolver globalResolver;
- public ReteStatelessSessionResult(WorkingMemory workingMemory) {
+ public ReteStatelessSessionResult(InternalWorkingMemory workingMemory, GlobalResolver globalResolver) {
this.workingMemory = workingMemory;
+ this.assertMap = workingMemory.getAssertMap();
+ this.globalResolver = globalResolver;
}
public QueryResults getQueryResults(String query) {
return this.workingMemory.getQueryResults( query );
}
+
+ public QueryResults getQueryResults(final String query, final Object[] arguments) {
+ return this.workingMemory.getQueryResults( query,
+ arguments );
+ }
public Iterator iterateObjects() {
- return this.workingMemory.iterateObjects();
+ HashTableIterator iterator = new HashTableIterator( this.assertMap );
+ iterator.reset();
+ return new JavaIteratorAdapter( iterator,
+ JavaIteratorAdapter.OBJECT );
}
public Iterator iterateObjects(ObjectFilter filter) {
- return this.workingMemory.iterateObjects(filter);
+ HashTableIterator iterator = new HashTableIterator( this.assertMap );
+ iterator.reset();
+ return new JavaIteratorAdapter( iterator,
+ JavaIteratorAdapter.OBJECT,
+ filter );
}
-
+
+ public Object getGlobal(String identifier) {
+ if ( this.globalResolver == null ) {
+ return null;
+ }
+ return this.globalResolver.resolveGlobal( identifier );
+ }
+
+ public GlobalResolver getGlobalResolver() {
+ return this.globalResolver;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java 2007-09-09 14:20:33 UTC (rev 14965)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -28,6 +28,7 @@
import org.drools.reteoo.ReteooRuleBase.InitialFactHandleDummyObject;
import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
import org.drools.spi.AgendaFilter;
+import org.drools.spi.GlobalExporter;
import org.drools.spi.GlobalResolver;
public class ReteooStatelessSession
@@ -38,6 +39,8 @@
private InternalRuleBase ruleBase;
private AgendaFilter agendaFilter;
private GlobalResolver globalResolver = new MapGlobalResolver();
+
+ private GlobalExporter globalExporter;
/** The eventSupport */
protected WorkingMemoryEventSupport workingMemoryEventSupport = new WorkingMemoryEventSupport();
@@ -120,6 +123,10 @@
public void setGlobalResolver(GlobalResolver globalResolver) {
this.globalResolver = globalResolver;
}
+
+ public void setGlobalExporter(GlobalExporter globalExporter) {
+ this.globalExporter = globalExporter;
+ }
public void execute(Object object) {
InternalWorkingMemory wm = newWorkingMemory();
@@ -181,7 +188,13 @@
wm.insert( object );
wm.fireAllRules( this.agendaFilter );
- return new ReteStatelessSessionResult( wm );
+
+ GlobalResolver globalResolver = null;
+ if ( this.globalExporter != null ) {
+ globalResolver = this.globalExporter.export( wm );
+ }
+ return new ReteStatelessSessionResult( wm,
+ globalResolver );
}
public StatelessSessionResult executeWithResults(Object[] array) {
@@ -191,7 +204,13 @@
wm.insert( array[i] );
}
wm.fireAllRules( this.agendaFilter );
- return new ReteStatelessSessionResult( wm );
+
+ GlobalResolver globalResolver = null;
+ if ( this.globalExporter != null ) {
+ globalResolver = this.globalExporter.export( wm );
+ }
+ return new ReteStatelessSessionResult( wm,
+ globalResolver );
}
public StatelessSessionResult executeWithResults(Collection collection) {
@@ -201,6 +220,12 @@
wm.insert( it.next() );
}
wm.fireAllRules( this.agendaFilter );
- return new ReteStatelessSessionResult( wm );
+
+ GlobalResolver globalResolver = null;
+ if ( this.globalExporter != null ) {
+ globalResolver = this.globalExporter.export( wm );
+ }
+ return new ReteStatelessSessionResult( wm,
+ globalResolver );
}
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExporter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExporter.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExporter.java 2007-09-09 15:02:23 UTC (rev 14966)
@@ -0,0 +1,25 @@
+/**
+ *
+ */
+package org.drools.spi;
+
+import java.io.Serializable;
+
+import org.drools.WorkingMemory;
+
+/**
+ * Used to provide a strategy for the StatelessSession global exportation, so that StatelessSessionResult can have accesso to
+ * globals using during the execute(...) method that returned the StatelessSessionResult.
+ *
+ */
+public interface GlobalExporter extends Serializable {
+
+ /**
+ * This method is called internally by the StatelessSession, which will provide the WorkingMemory.
+ * The returned GlobalResolver is used by the StatefulSessionResult
+ * @param workingMemory
+ * @return
+ * The GlobalResolver instance as used by the StatefulSessionResult
+ */
+ public GlobalResolver export(WorkingMemory workingMemory);
+}
\ No newline at end of file
More information about the jboss-svn-commits
mailing list