[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