[jboss-svn-commits] JBL Code SVN: r15855 - in labs/jbossrules/trunk: drools-compiler/src/test/resources/org/drools/integrationtests and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Oct 16 12:37:39 EDT 2007


Author: tirelli
Date: 2007-10-16 12:37:39 -0400 (Tue, 16 Oct 2007)
New Revision: 15855

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/OutOfMemoryTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OutOfMemoryError.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AsyncFireAllRulesRuleBaseUpdateListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.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/InternalRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/CommandExecutor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/DefaultExecutorService.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
   labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
Log:
JBRULES-1279: fixing memory leak

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	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -50,6 +50,7 @@
 import org.drools.Guess;
 import org.drools.IndexedNumber;
 import org.drools.InsertedObject;
+import org.drools.Message;
 import org.drools.Order;
 import org.drools.OrderItem;
 import org.drools.Person;
@@ -97,7 +98,6 @@
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.facttemplates.Fact;
 import org.drools.facttemplates.FactTemplate;
-import org.drools.Message;
 import org.drools.lang.DrlDumper;
 import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.PackageDescr;
@@ -3609,24 +3609,6 @@
         }
     }
 
-    public void testOutOfMemory() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_OutOfMemory.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        workingMemory.insert( new Cheese( "stilton",
-                                          1 ) );
-
-        workingMemory.fireAllRules( 3000000 );
-
-        // just for profiling
-        //Thread.currentThread().wait();
-    }
-
     public void testBindingsOnConnectiveExpressions() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_bindings.drl" ) ) );

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/OutOfMemoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/OutOfMemoryTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/OutOfMemoryTest.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -0,0 +1,89 @@
+package org.drools.integrationtests;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.InputStreamReader;
+
+import junit.framework.TestCase;
+
+import org.drools.Cheese;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.WorkingMemory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.rule.Package;
+
+
+/** Run all the tests with the ReteOO engine implementation */
+public class OutOfMemoryTest extends TestCase {
+
+    protected RuleBase getRuleBase() throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            null );
+    }
+
+    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            config );
+    }
+
+    public void testStatefulSessionsCreation() throws Exception {
+
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_OutOfMemoryError.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        
+        int i = 0;
+        
+        try {
+            for( i = 0; i < 300000; i++ ) {
+                final StatefulSession session = ruleBase.newStatefulSession( true );
+                session.dispose();
+            } 
+        } catch ( Throwable e ) {
+            System.out.println("Error at: "+i);
+            e.printStackTrace();
+            fail("Should not raise any error or exception.");
+        }
+
+    }
+    
+    public void testAgendaLoop() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_OutOfMemory.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        workingMemory.insert( new Cheese( "stilton",
+                                          1 ) );
+
+        workingMemory.fireAllRules( 3000000 );
+
+        // just for profiling
+        //Thread.currentThread().wait();
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OutOfMemoryError.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OutOfMemoryError.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_OutOfMemoryError.drl	2007-10-16 16:37:39 UTC (rev 15855)
@@ -0,0 +1,6 @@
+package org.drools
+
+rule "empty rule"
+when
+then
+end

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-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -29,7 +29,6 @@
 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;
 
 /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -70,5 +70,6 @@
      * to check on the status of the task.
      */
     Future asyncFireAllRules(AgendaFilter agendaFilter);
-
+    
+    public List getRuleBaseUpdateListeners();
 }

Modified: 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	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AsyncFireAllRulesRuleBaseUpdateListener.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -4,6 +4,7 @@
 package org.drools.base;
 
 import org.drools.StatefulSession;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.event.BeforeRuleBaseUnlockedEvent;
 import org.drools.event.DefaultRuleBaseEventListener;
 import org.drools.spi.RuleBaseUpdateListener;
@@ -17,7 +18,7 @@
     }
     
     public void setSession(StatefulSession session) {
-        this.session = session;
+        this.session = (StatefulSession) session;
     }
     
     public void beforeRuleBaseUnlocked(BeforeRuleBaseUnlockedEvent event) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -261,6 +261,9 @@
 
     public synchronized void disposeStatefulSession(final StatefulSession statefulSession) {
         this.statefulSessions.remove( statefulSession );
+        for( Iterator it = statefulSession.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
+            this.removeEventListener( (RuleBaseEventListener) it.next() );
+        }
     }
 
     /**

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-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -87,69 +87,69 @@
     // ------------------------------------------------------------
     // Constants
     // ------------------------------------------------------------
-    protected static final Class[]         ADD_REMOVE_PROPERTY_CHANGE_LISTENER_ARG_TYPES = new Class[]{PropertyChangeListener.class};
+    protected static final Class[]                  ADD_REMOVE_PROPERTY_CHANGE_LISTENER_ARG_TYPES = new Class[]{PropertyChangeListener.class};
 
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
-    protected final long                   id;
+    protected final long                            id;
 
     /** The arguments used when adding/removing a property change listener. */
-    protected final Object[]               addRemovePropertyChangeListenerArgs           = new Object[]{this};
+    protected final Object[]                        addRemovePropertyChangeListenerArgs           = new Object[]{this};
 
     /** The actual memory for the <code>JoinNode</code>s. */
-    protected final PrimitiveLongMap       nodeMemories                                  = new PrimitiveLongMap( 32,
-                                                                                                                 8 );
+    protected final PrimitiveLongMap                nodeMemories                                  = new PrimitiveLongMap( 32,
+                                                                                                                          8 );
     /** Object-to-handle mapping. */
-    private final ObjectHashMap            assertMap;
-    private final ObjectHashMap            identityMap;
+    private final ObjectHashMap                     assertMap;
+    private final ObjectHashMap                     identityMap;
 
-    protected Map                          queryResults                                  = Collections.EMPTY_MAP;
+    protected Map                                   queryResults                                  = Collections.EMPTY_MAP;
 
     /** Global values which are associated with this memory. */
-    protected GlobalResolver               globalResolver;
+    protected GlobalResolver                        globalResolver;
 
-    protected static final Object          NULL                                          = new Serializable() {
-                                                                                             private static final long serialVersionUID = 400L;
-                                                                                         };
+    protected static final Object                   NULL                                          = new Serializable() {
+                                                                                                      private static final long serialVersionUID = 400L;
+                                                                                                  };
 
     /** The eventSupport */
-    protected WorkingMemoryEventSupport    workingMemoryEventSupport                     = new WorkingMemoryEventSupport();
+    protected WorkingMemoryEventSupport             workingMemoryEventSupport                     = new WorkingMemoryEventSupport();
 
-    protected AgendaEventSupport           agendaEventSupport                            = new AgendaEventSupport();
+    protected AgendaEventSupport                    agendaEventSupport                            = new AgendaEventSupport();
 
-    protected RuleFlowEventSupport         ruleFlowEventSupport                          = new RuleFlowEventSupport();
+    protected RuleFlowEventSupport                  ruleFlowEventSupport                          = new RuleFlowEventSupport();
 
     /** The <code>RuleBase</code> with which this memory is associated. */
-    protected transient InternalRuleBase   ruleBase;
+    protected transient InternalRuleBase            ruleBase;
 
-    protected final FactHandleFactory      handleFactory;
+    protected final FactHandleFactory               handleFactory;
 
-    protected final TruthMaintenanceSystem tms;
+    protected final TruthMaintenanceSystem          tms;
 
     /** Rule-firing agenda. */
-    protected DefaultAgenda                agenda;
+    protected DefaultAgenda                         agenda;
 
-    protected final List                   actionQueue                                   = new ArrayList();
+    protected final List                            actionQueue                                   = new ArrayList();
 
-    protected final ReentrantLock          lock                                          = new ReentrantLock();
+    protected final ReentrantLock                   lock                                          = new ReentrantLock();
 
-    protected final boolean                discardOnLogicalOverride;
+    protected final boolean                         discardOnLogicalOverride;
 
-    protected long                         propagationIdCounter;
+    protected long                                  propagationIdCounter;
 
-    private final boolean                  maintainTms;
+    private final boolean                           maintainTms;
 
-    private final boolean                  sequential;
+    private final boolean                           sequential;
 
-    private List                           liaPropagations                               = Collections.EMPTY_LIST;
+    private List                                    liaPropagations                               = Collections.EMPTY_LIST;
 
     /** Flag to determine if a rule is currently being fired. */
-    protected boolean                      firing;
+    protected boolean                               firing;
 
-    protected boolean                      halt;
+    protected boolean                               halt;
 
-    private int                            processCounter;
+    private int                                     processCounter;
 
     // ------------------------------------------------------------
     // Constructors
@@ -566,7 +566,7 @@
         }
 
     }
-    
+
     public ObjectHashMap getAssertMap() {
         return this.assertMap;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -23,7 +23,6 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.StatefulSession;
-import org.drools.WorkingMemory;
 import org.drools.reteoo.Rete;
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.CompositePackageClassLoader;

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-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -1,7 +1,5 @@
 package org.drools.common;
 
-import java.util.Map;
-
 import org.drools.FactException;
 import org.drools.FactHandle;
 import org.drools.WorkingMemory;
@@ -60,4 +58,5 @@
     public boolean isSequential();
     
     public void addLIANodePropagation(LIANodePropagation liaNodePropagation);
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/CommandExecutor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/CommandExecutor.java	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/CommandExecutor.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -16,6 +16,9 @@
  *
  */
 public class CommandExecutor implements Runnable, Serializable {
+
+    private static final long serialVersionUID = 5924295088331461167L;
+    
     private WorkingMemory workingMemory;
     private BlockingQueue queue;
     

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/DefaultExecutorService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/DefaultExecutorService.java	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/concurrent/DefaultExecutorService.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -3,9 +3,10 @@
  */
 package org.drools.concurrent;
 
-import org.drools.WorkingMemory;
 
 public class DefaultExecutorService implements ExecutorService {   
+
+    private static final long serialVersionUID = 7860812696865293690L;
     private Thread thread;
     private CommandExecutor executor;
     private boolean running;
@@ -27,6 +28,7 @@
     public void shutDown() {
         this.executor.shutdown();
         this.running = false;
+        this.thread = null;
     }             
     
     public Future submit(Command command) {

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-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -20,8 +20,7 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
-import java.util.HashMap;
-import java.util.WeakHashMap;
+import java.util.Iterator;
 
 import org.drools.FactException;
 import org.drools.FactHandle;
@@ -29,26 +28,19 @@
 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;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.concurrent.CommandExecutor;
-import org.drools.concurrent.DefaultExecutorService;
 import org.drools.concurrent.ExecutorService;
-import org.drools.rule.CompositePackageClassLoader;
+import org.drools.event.RuleBaseEventListener;
+import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
 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;
-
 /**
  * Implementation of <code>RuleBase</code>.
  * 
@@ -69,8 +61,6 @@
 
     private ReteooBuilder     reteooBuilder;
     
-    private transient RuleBaseUpdateListenerFactory updateListenerFactory;
-
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -241,6 +231,9 @@
 
             if ( keepReference ) {
                 super.addStatefulSession( session );
+                for( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
+                    addEventListener( (RuleBaseEventListener) it.next() ); 
+                }
             }
 
             final InitialFactHandle handle = new InitialFactHandle( session.getFactHandleFactory().newFactHandle( new InitialFactHandleDummyObject() ) );
@@ -252,16 +245,6 @@
                                                                                  null ) );
         }
         
-        if ( this.updateListenerFactory == null ) {
-            this.updateListenerFactory = new RuleBaseUpdateListenerFactory();
-        }
-
-        String listenerName = this.config.getRuleBaseUpdateHandler();
-        if ( listenerName != null && listenerName.length() > 0 ) {
-            RuleBaseUpdateListener listener = this.updateListenerFactory.createListener( listenerName, session );
-            addEventListener( listener );
-        }
-        
         return session;
     }
     

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -1,6 +1,7 @@
 package org.drools.reteoo;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import org.drools.FactHandle;
@@ -11,15 +12,22 @@
 import org.drools.concurrent.ExecutorService;
 import org.drools.concurrent.FireAllRules;
 import org.drools.concurrent.Future;
+import org.drools.concurrent.RetractObject;
 import org.drools.concurrent.UpdateObject;
-import org.drools.concurrent.RetractObject;
 import org.drools.spi.AgendaFilter;
+import org.drools.spi.RuleBaseUpdateListener;
+import org.drools.spi.RuleBaseUpdateListenerFactory;
 
 public class ReteooStatefulSession extends ReteooWorkingMemory
     implements
     StatefulSession {
-    private final ExecutorService executor;
 
+    private static final long serialVersionUID = -5360554247241558374L;
+    private ExecutorService executor;
+    
+    private transient List                          ruleBaseListeners;
+    private transient RuleBaseUpdateListenerFactory updateListenerFactory;
+
     public ReteooStatefulSession(final int id,
                                  final InternalRuleBase ruleBase,
                                  final ExecutorService executorService) {
@@ -70,5 +78,24 @@
     
     public void dispose() {
         this.ruleBase.disposeStatefulSession( this );
-    }    
+        this.executor.shutDown();
+    }
+
+    public List getRuleBaseUpdateListeners() {
+        if ( this.ruleBaseListeners == null || this.ruleBaseListeners == Collections.EMPTY_LIST ) {
+            String listenerName = this.ruleBase.getConfiguration().getRuleBaseUpdateHandler();
+            if ( listenerName != null && listenerName.length() > 0 ) {
+                if ( this.updateListenerFactory == null ) {
+                    this.updateListenerFactory = new RuleBaseUpdateListenerFactory();
+                }
+                RuleBaseUpdateListener listener = this.updateListenerFactory.createListener( listenerName,
+                                                                                             this );
+                this.ruleBaseListeners = Collections.singletonList( listener );
+            } else {
+                this.ruleBaseListeners = Collections.EMPTY_LIST;
+            }
+        }
+        return this.ruleBaseListeners;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java	2007-10-16 16:14:42 UTC (rev 15854)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java	2007-10-16 16:37:39 UTC (rev 15855)
@@ -382,6 +382,11 @@
                     // TODO Auto-generated method stub
                     
                 }
+
+                public List getRuleBaseUpdateListeners() {
+                    // TODO Auto-generated method stub
+                    return null;
+                }
 			};
 		}
 	}




More information about the jboss-svn-commits mailing list