[jboss-svn-commits] JBL Code SVN: r5939 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools main/java/org/drools/common main/java/org/drools/spi test/java/org/drools/reteoo

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Aug 18 08:36:14 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-08-18 08:36:10 -0400 (Fri, 18 Aug 2006)
New Revision: 5939

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalResolver.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooWorkingMemoryTest.java
Log:
JBRULES-438 Global Resolver

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java	2006-08-18 11:39:03 UTC (rev 5938)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java	2006-08-18 12:36:10 UTC (rev 5939)
@@ -25,6 +25,7 @@
 import org.drools.spi.AgendaFilter;
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.AsyncExceptionHandler;
+import org.drools.spi.GlobalResolver;
 
 /**
  * A knowledge session for a <code>RuleBase</code>.
@@ -94,12 +95,12 @@
     Map getGlobals();
 
     /**
-     * Set a specific piece of global in this working memory.
+     * Set a specific piece of global in this working memory. Null values will return doing nothign
      * 
      * @param name
      *            the name under which to populate the data
      * @param value
-     *            the application data
+     *            the global value, cannot be null
      */
     void setGlobal(String name,
                    Object value);
@@ -110,6 +111,12 @@
      * @return application data or null if nothing is set under this name
      */
     Object getGlobal(String name);
+    
+    /**
+     * Delegate used to resolve any global names not found in the global map.
+     * @param globalResolver
+     */
+    void setGlobalResolver(GlobalResolver globalResolver);
 
     /**
      * Retrieve the <code>RuleBase</code> of this working memory.

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	2006-08-18 11:39:03 UTC (rev 5938)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2006-08-18 12:36:10 UTC (rev 5939)
@@ -18,6 +18,7 @@
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -46,6 +47,7 @@
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.AsyncExceptionHandler;
 import org.drools.spi.FactHandleFactory;
+import org.drools.spi.GlobalResolver;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FastMap;
 import org.drools.util.PrimitiveLongMap;
@@ -89,6 +91,11 @@
 
     protected Map                             queryResults                                  = Collections.EMPTY_MAP;
 
+    protected GlobalResolver                  globalResolver;
+
+    protected static final Object             NULL                                          = new Serializable() {
+                                                                                            };
+
     /** The eventSupport */
     protected final WorkingMemoryEventSupport workingMemoryEventSupport                     = new WorkingMemoryEventSupport( this );
 
@@ -231,7 +238,12 @@
      * @see WorkingMemory
      */
     public void setGlobal(final String name,
-                          final Object value) {
+                          Object value) {
+        // Cannot set null values
+        if ( value == null ) {
+            return;
+        }
+        
         try {
             lock.lock();
             // Make sure the global has been declared in the RuleBase
@@ -250,6 +262,10 @@
             lock.unlock();
         }
     }
+    
+    public void setGlobalResolver(GlobalResolver globalResolver) {
+        this.globalResolver = globalResolver;
+    }
 
     public long getId() {
         return this.id;
@@ -261,7 +277,10 @@
     public Object getGlobal(final String name) {
         try {
             lock.lock();
-            final Object object = this.globals.get( name );
+            Object object = this.globals.get( name );
+            if ( object == null && this.globalResolver != null ) {
+                object = this.globalResolver.resolve( name );
+            }
             return object;
         } finally {
             lock.unlock();
@@ -311,7 +330,7 @@
         // the firing for any other assertObject(..) that get
         // nested inside, avoiding concurrent-modification
         // exceptions, depending on code paths of the actions.
-        
+
         if ( !this.factQueue.isEmpty() ) {
             propagateQueuedActions();
         }
@@ -797,8 +816,8 @@
         }
 
     }
-    
-    public void queueWorkingMemoryAction( WorkingMemoryAction action ) {
+
+    public void queueWorkingMemoryAction(WorkingMemoryAction action) {
         this.factQueue.add( action );
     }
 
@@ -811,7 +830,7 @@
                                                                   false,
                                                                   true,
                                                                   ruleOrigin,
-                                                                  activationOrigin ) );        
+                                                                  activationOrigin ) );
     }
 
     /**
@@ -927,5 +946,5 @@
                            this.activationOrigin );
         }
     }
-      
+
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalResolver.java	2006-08-18 11:39:03 UTC (rev 5938)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalResolver.java	2006-08-18 12:36:10 UTC (rev 5939)
@@ -0,0 +1,5 @@
+package org.drools.spi;
+
+public interface GlobalResolver {
+    public Object resolve(String name);
+}

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooWorkingMemoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooWorkingMemoryTest.java	2006-08-18 11:39:03 UTC (rev 5938)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooWorkingMemoryTest.java	2006-08-18 12:36:10 UTC (rev 5939)
@@ -1,5 +1,8 @@
 package org.drools.reteoo;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import junit.framework.TestCase;
 
 import org.drools.FactHandle;
@@ -7,6 +10,8 @@
 import org.drools.common.EqualityKey;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.TruthMaintenanceSystem;
+import org.drools.rule.Package;
+import org.drools.spi.GlobalResolver;
 
 public class ReteooWorkingMemoryTest extends TestCase {
     /*
@@ -60,4 +65,22 @@
         assertEquals( 1,
                       workingMemory.getId() );        
     }
+    
+    public void testGlobalResolver() {
+        final Map map = new HashMap();
+        map.put( "global1", "value1" );
+        map.put( "global2", "value2" );
+        GlobalResolver resolver = new GlobalResolver() {
+            
+            public Object resolve(String name) {
+                return map.get( name );
+            }
+            
+        };
+        ReteooRuleBase ruleBase =  (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+        InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newWorkingMemory();
+        workingMemory.setGlobalResolver( resolver );
+        assertEquals( "value1", workingMemory.getGlobal( "global1" ) );
+        assertEquals( "value2", workingMemory.getGlobal( "global2" ) );
+    }
 }




More information about the jboss-svn-commits mailing list