[jboss-svn-commits] JBL Code SVN: r15565 - 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
Wed Oct 3 19:24:44 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-10-03 19:24:44 -0400 (Wed, 03 Oct 2007)
New Revision: 15565

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AsyncFireAllRulesRuleBaseUpdateListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FireAllRulesRuleBaseUpdateListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListenerFactory.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf
Log:
JBRULES-1241 Dynamic rules should be able to lock for a series of updates and fireAllRules should be optional
-the RuleBaseUpdateHandler is now configurable

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2007-10-03 23:24:34 UTC (rev 15564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2007-10-03 23:24:44 UTC (rev 15565)
@@ -29,6 +29,7 @@
 import org.drools.concurrent.ExecutorService;
 import org.drools.spi.ConflictResolver;
 import org.drools.spi.ConsequenceExceptionHandler;
+import org.drools.spi.RuleBaseUpdateListener;
 import org.drools.util.ChainedProperties;
 
 /**
@@ -47,7 +48,8 @@
  */
 
 /**
- * drools.shadowproxy = <true|false>
+ * drools.maintainTms = <true|false>
+ * drools.shadowproxy = <true|false> // sequentail=true always overrides setting this to false
  * drools.shadowproxy.exclude = org.domainy.* org.domainx.ClassZ
  * drools.sequential = <true|false>
  * drools.sequential.agenda = <sequential|dynamic>
@@ -63,7 +65,8 @@
  * drools.logicalOverride = <discard|preserve>
  * drools.executorService = <qualified class name>
  * drools.conflictResolver = <qualified class name>
- * drools.conflictExceptionHandler = <qualified class name>
+ * drools.consequenceExceptionHandler = <qualified class name>
+ * drools.ruleBaseUpdateHandler = <qualified class name>
  * 
  */
 public class RuleBaseConfiguration
@@ -91,6 +94,7 @@
     private LogicalOverride             logicalOverride;
     private ExecutorService             executorService;
     private ConsequenceExceptionHandler consequenceExceptionHandler;
+    private String                      ruleBaseUpdateHandler;
 
     private ConflictResolver            conflictResolver;
 
@@ -214,12 +218,16 @@
 
         setConsequenceExceptionHandler( RuleBaseConfiguration.determineConsequenceExceptionHandler( this.chainedProperties.getProperty( "drools.consequenceExceptionHandler",
                                                                                                                                         "org.drools.base.DefaultConsequenceExceptionHandler" ) ) );
+        
+        setRuleBaseUpdateHandler( this.chainedProperties.getProperty( "drools.ruleBaseUpdateHandler",
+                                                                      "org.drools.base.FireAllRulesRuleBaseUpdateListener" ) );        
 
         setConflictResolver( RuleBaseConfiguration.determineConflictResolver( this.chainedProperties.getProperty( "drools.conflictResolver",
                                                                                                                   "org.drools.conflict.DepthConflictResolver" ) ) );
 
+        // sequential mode always overrides and sets this to false
         setShadowProxy( determineShadowProxy( this.chainedProperties.getProperty( "drools.shadowproxy",
-                                                                                  null ) ) );
+                                                                                  "true" ) ) );
 
         setShadowProxyExcludes( this.chainedProperties.getProperty( "drools.shadowProxyExcludes",
                                                                     "" ) );
@@ -378,7 +386,16 @@
         checkCanChange(); // throws an exception if a change isn't possible;        
         this.consequenceExceptionHandler = consequenceExceptionHandler;
     }
+    
+    public String getRuleBaseUpdateHandler() {
+        return ruleBaseUpdateHandler;
+    }
 
+    public void setRuleBaseUpdateHandler(String ruleBaseUpdateHandler) {
+        checkCanChange(); // throws an exception if a change isn't possible;        
+        this.ruleBaseUpdateHandler = ruleBaseUpdateHandler;
+    }    
+
     public AgendaGroupFactory getAgendaGroupFactory() {
         if ( isSequential() ) {
             if ( this.sequentialAgenda == SequentialAgenda.SEQUENTIAL ) {
@@ -401,14 +418,15 @@
     }
 
     private boolean determineShadowProxy(String userValue) {
+        if ( this.isSequential() ) {
+            // sequential never needs shadowing, so always override
+            return false;
+        }
+        
         if ( userValue != null ) {
             return Boolean.valueOf( userValue ).booleanValue();
         } else {
-            if ( this.isSequential() ) {
-                return false;
-            } else {
-                return true;
-            }
+            return true;
         }
     }
 
@@ -533,7 +551,7 @@
     private static ConsequenceExceptionHandler determineConsequenceExceptionHandler(String className) {
         return (ConsequenceExceptionHandler) instantiateClass( "ConsequenceExceptionHandler",
                                                                className );
-    }
+    }   
 
     private static Object instantiateClass(String type,
                                            String className) {

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AsyncFireAllRulesRuleBaseUpdateListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AsyncFireAllRulesRuleBaseUpdateListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AsyncFireAllRulesRuleBaseUpdateListener.java	2007-10-03 23:24:44 UTC (rev 15565)
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package org.drools.base;
+
+import org.drools.StatefulSession;
+import org.drools.event.BeforeRuleBaseUnlockedEvent;
+import org.drools.event.DefaultRuleBaseEventListener;
+import org.drools.spi.RuleBaseUpdateListener;
+
+public class AsyncFireAllRulesRuleBaseUpdateListener extends DefaultRuleBaseEventListener 
+implements RuleBaseUpdateListener {
+    private StatefulSession session;
+    
+    public AsyncFireAllRulesRuleBaseUpdateListener() {
+        
+    }
+    
+    public void setSession(StatefulSession session) {
+        this.session = session;
+    }
+    
+    public void beforeRuleBaseUnlocked(BeforeRuleBaseUnlockedEvent event) {
+        if ( session.getRuleBase().getAdditionsSinceLock() > 0 ) { 
+            session.asyncFireAllRules();
+        }
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FireAllRulesRuleBaseUpdateListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FireAllRulesRuleBaseUpdateListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FireAllRulesRuleBaseUpdateListener.java	2007-10-03 23:24:44 UTC (rev 15565)
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package org.drools.base;
+
+import org.drools.StatefulSession;
+import org.drools.event.BeforeRuleBaseUnlockedEvent;
+import org.drools.event.DefaultRuleBaseEventListener;
+import org.drools.spi.RuleBaseUpdateListener;
+
+public class FireAllRulesRuleBaseUpdateListener extends DefaultRuleBaseEventListener 
+implements RuleBaseUpdateListener {
+    private StatefulSession session;
+    
+    public FireAllRulesRuleBaseUpdateListener() {
+        
+    }
+    
+    public void setSession(StatefulSession session) {
+        this.session = session;
+    }
+    
+    public void beforeRuleBaseUnlocked(BeforeRuleBaseUnlockedEvent event) {
+        if ( session.getRuleBase().getAdditionsSinceLock() > 0 ) {
+            session.fireAllRules();
+        }
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2007-10-03 23:24:34 UTC (rev 15564)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2007-10-03 23:24:44 UTC (rev 15565)
@@ -29,6 +29,7 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.StatefulSession;
 import org.drools.StatelessSession;
+import org.drools.base.FireAllRulesRuleBaseUpdateListener;
 import org.drools.common.AbstractRuleBase;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
@@ -36,15 +37,14 @@
 import org.drools.concurrent.CommandExecutor;
 import org.drools.concurrent.DefaultExecutorService;
 import org.drools.concurrent.ExecutorService;
-import org.drools.event.BeforeRuleBaseUnlockedEvent;
-import org.drools.event.DefaultRuleBaseEventListener;
-import org.drools.event.RuleBaseEventListener;
 import org.drools.rule.CompositePackageClassLoader;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Rule;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
 import org.drools.spi.FactHandleFactory;
 import org.drools.spi.PropagationContext;
+import org.drools.spi.RuleBaseUpdateListener;
+import org.drools.spi.RuleBaseUpdateListenerFactory;
 import org.drools.util.ObjectHashSet;
 
 import sun.security.x509.IssuerAlternativeNameExtension;
@@ -68,6 +68,8 @@
     private Rete              rete;
 
     private ReteooBuilder     reteooBuilder;
+    
+    private transient RuleBaseUpdateListenerFactory updateListenerFactory;
 
     // ------------------------------------------------------------
     // Constructors
@@ -250,56 +252,19 @@
                                                                                  null ) );
         }
         
-        // setup event listener for fireAllRules on rulebase modifications
-        FireAllRulesBeforeUnlockEventListener listener =  new DefaultFireAllRulesBeforeUnlockEventListener();
-        listener.setSession( session );
-        addEventListener( listener );
-        
-        return session;
-    }
-    
-    public static interface FireAllRulesBeforeUnlockEventListener extends RuleBaseEventListener {
-        public void setSession(StatefulSession session);
-    }
-    
-    public static class DefaultFireAllRulesBeforeUnlockEventListener extends DefaultRuleBaseEventListener 
-    implements FireAllRulesBeforeUnlockEventListener {
-        private StatefulSession session;
-        
-        public DefaultFireAllRulesBeforeUnlockEventListener() {
-            
+        if ( this.updateListenerFactory == null ) {
+            this.updateListenerFactory = new RuleBaseUpdateListenerFactory();
         }
-        
-        public void setSession(StatefulSession session) {
-            this.session = session;
+
+        String listenerName = this.config.getRuleBaseUpdateHandler();
+        if ( listenerName != null && listenerName.length() > 0 ) {
+            RuleBaseUpdateListener listener = this.updateListenerFactory.createListener( listenerName, session );
+            addEventListener( listener );
         }
         
-        public void beforeRuleBaseUnlocked(BeforeRuleBaseUnlockedEvent event) {
-            if ( session.getRuleBase().getAdditionsSinceLock() > 0 ) {
-                session.fireAllRules();
-            }
-        }
+        return session;
     }
     
-    public static class AsyncFireAllRulesBeforeUnlockEventListener extends DefaultRuleBaseEventListener 
-    implements FireAllRulesBeforeUnlockEventListener {
-        private StatefulSession session;
-        
-        public AsyncFireAllRulesBeforeUnlockEventListener() {
-            
-        }
-        
-        public void setSession(StatefulSession session) {
-            this.session = session;
-        }
-        
-        public void beforeRuleBaseUnlocked(BeforeRuleBaseUnlockedEvent event) {
-            if ( session.getRuleBase().getAdditionsSinceLock() > 0 ) { 
-                session.asyncFireAllRules();
-            }
-        }
-    }    
-
     public StatelessSession newStatelessSession() {
 
         //orders the rules

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListener.java	2007-10-03 23:24:44 UTC (rev 15565)
@@ -0,0 +1,11 @@
+/**
+ * 
+ */
+package org.drools.spi;
+
+import org.drools.StatefulSession;
+import org.drools.event.RuleBaseEventListener;
+
+public interface RuleBaseUpdateListener extends RuleBaseEventListener {
+    public void setSession(StatefulSession session);
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListenerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListenerFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleBaseUpdateListenerFactory.java	2007-10-03 23:24:44 UTC (rev 15565)
@@ -0,0 +1,32 @@
+package org.drools.spi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.StatefulSession;
+
+public class RuleBaseUpdateListenerFactory {
+    private Map classes = new HashMap();
+    
+    public RuleBaseUpdateListener createListener(String className, StatefulSession session) {       
+        Class cls = (Class) classes.get( className );
+        if ( cls == null ) {
+            try {
+                cls = Class.forName( className );
+                this.classes.put(  className, cls );
+            } catch ( Throwable e ) {
+                throw new RuntimeException("Unable to load RuleBaseUpdateListener '" + className + "'", e );
+            }            
+        }
+        
+        RuleBaseUpdateListener listener;
+        try {
+            listener = ( RuleBaseUpdateListener ) cls.newInstance();
+            listener.setSession( session );
+            
+            return listener;            
+        } catch ( Throwable e ) {
+            throw new RuntimeException("Unable to instantiate RuleBaseUpdateListener '" + className + "'", e );
+        }        
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf	2007-10-03 23:24:34 UTC (rev 15564)
+++ labs/jbossrules/trunk/drools-core/src/main/resources/META-INF/drools.default.rulebase.conf	2007-10-03 23:24:44 UTC (rev 15565)
@@ -1,8 +1,12 @@
 drools.maintainTms = true
+drools.shadowproxy = true
+drools.shadowproxy.exclude =
+drools.sequential = false
+drools.sequential.agenda = sequential
 drools.removeIdentities = false
-drools.alphaMemory = false
 drools.shareAlphaNodes = true
 drools.shareBetaNodes = true
+drools.alphaMemory = false
 drools.alphaNodeHashingThreshold = 3
 drools.compositeKeyDepth = 3
 drools.indexLeftBetaMemory = true
@@ -11,4 +15,5 @@
 drools.logicalOverride = DISCARD
 drools.executorService = org.drools.concurrent.DefaultExecutorService
 drools.conflictResolver = org.drools.conflict.DepthConflictResolver
-drools.drools.consequenceExceptionHandler = org.drools.base.DefaultConsequenceExceptionHandler
\ No newline at end of file
+drools.consequenceExceptionHandler = org.drools.base.DefaultConsequenceExceptionHandler
+drools.ruleBaseUpdateHandler = org.drools.base.FireAllRulesRuleBaseUpdateListener




More information about the jboss-svn-commits mailing list