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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jan 16 17:38:52 EST 2008


Author: tirelli
Date: 2008-01-16 17:38:51 -0500 (Wed, 16 Jan 2008)
New Revision: 17908

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NodeMemories.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseEventManager.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.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/BaseNode.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/common/InternalWorkingMemoryActions.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleBaseEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.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/BetaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.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/ReteooBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.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/ReteooWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AddRemoveTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/PropertyChangeListenerTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
   labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java
Log:
JBRULES-1424: merging changes for revisions 17269:17906 from temporal branch into trunk

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -48,7 +48,6 @@
 import org.drools.rule.Rule;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.RuleBuilder;
-import org.drools.xml.SemanticModules;
 import org.drools.xml.XmlPackageReader;
 import org.drools.xml.XmlProcessReader;
 import org.xml.sax.SAXException;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -35,8 +35,6 @@
 import org.drools.util.ClassUtils;
 import org.drools.util.ConfFileUtils;
 import org.drools.workflow.core.Node;
-import org.drools.workflow.instance.impl.NodeInstanceFactory;
-import org.drools.workflow.instance.impl.NodeInstanceFactoryRegistry;
 import org.drools.xml.DefaultSemanticModule;
 import org.drools.xml.Handler;
 import org.drools.xml.ProcessSemanticModule;

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -126,6 +126,12 @@
         final List results_met_by = new ArrayList();
         final List results_overlaps = new ArrayList();
         final List results_overlapped_by = new ArrayList();
+        final List results_during = new ArrayList();
+        final List results_includes = new ArrayList();
+        final List results_starts = new ArrayList();
+        final List results_started_by = new ArrayList();
+        final List results_finishes = new ArrayList();
+        final List results_finished_by = new ArrayList();
 
         wm.setGlobal( "results_coincides",
                 results_coincides );
@@ -137,6 +143,22 @@
                 results_meets );
         wm.setGlobal( "results_met_by",
                       results_met_by );
+        wm.setGlobal( "results_overlaps",
+                	  results_overlaps );
+        wm.setGlobal( "results_overlapped_by",
+                      results_overlapped_by );
+        wm.setGlobal( "results_during",
+          	  results_during );
+        wm.setGlobal( "results_includes",
+                results_includes );
+        wm.setGlobal( "results_starts",
+          	  results_starts );
+        wm.setGlobal( "results_started_by",
+                results_started_by );
+        wm.setGlobal( "results_finishes",
+            	  results_finishes );
+        wm.setGlobal( "results_finished_by",
+                  results_finished_by );
 
         StockTick tick1 = new StockTick( 1,
                                          "DROO",
@@ -158,27 +180,49 @@
                 						 "ACME",
                 						 10,
                 						 System.currentTimeMillis() );
+        StockTick tick6 = new StockTick( 6,
+										 "ACME",
+										 10,
+										 System.currentTimeMillis() );
+        StockTick tick7 = new StockTick( 7,
+				 						 "ACME",
+				 						 10,
+				 						 System.currentTimeMillis() );
+        StockTick tick8 = new StockTick( 8,
+										 "ACME",
+										 10,
+										 System.currentTimeMillis() );
 
-        InternalFactHandle handle1 = (InternalFactHandle) wm.insert( tick1 );
+        InternalFactHandle handle1 = (InternalFactHandle) wm.insert( tick1, 3 );
         clock.advanceTime( 4 );
-        InternalFactHandle handle2 = (InternalFactHandle) wm.insert( tick2 );
+        InternalFactHandle handle2 = (InternalFactHandle) wm.insert( tick2, 3 );
         clock.advanceTime( 4 );
-        InternalFactHandle handle3 = (InternalFactHandle) wm.insert( tick3 );
+        InternalFactHandle handle3 = (InternalFactHandle) wm.insert( tick3, 3 );
         clock.advanceTime( 4 );
-        InternalFactHandle handle4 = (InternalFactHandle) wm.insert( tick4 );
-        InternalFactHandle handle5 = (InternalFactHandle) wm.insert( tick5 );
-
+        InternalFactHandle handle4 = (InternalFactHandle) wm.insert( tick4, 5 );
+        InternalFactHandle handle5 = (InternalFactHandle) wm.insert( tick5, 5 );
+        clock.advanceTime( 1 );
+        InternalFactHandle handle6 = (InternalFactHandle) wm.insert( tick6, 3 );
+        InternalFactHandle handle7 = (InternalFactHandle) wm.insert( tick7, 5 );
+        clock.advanceTime( 2 );
+        InternalFactHandle handle8 = (InternalFactHandle) wm.insert( tick8, 3 );
+        
         assertNotNull( handle1 );
         assertNotNull( handle2 );
         assertNotNull( handle3 );
         assertNotNull( handle4 );
         assertNotNull( handle5 );
+        assertNotNull( handle6 );
+        assertNotNull( handle7 );
+        assertNotNull( handle8 );
 
         assertTrue( handle1.isEvent() );
         assertTrue( handle2.isEvent() );
         assertTrue( handle3.isEvent() );
         assertTrue( handle4.isEvent() );
-        assertTrue( handle5.isEvent() );
+        assertTrue( handle6.isEvent() );
+        assertTrue( handle7.isEvent() );
+        assertTrue( handle8.isEvent() );
 
         wm.fireAllRules();
 
@@ -197,12 +241,10 @@
         assertEquals( tick3,
                       results_after.get( 0 ) );
         
-        assertEquals( 2,
+        assertEquals( 1,
                 results_meets.size() );
-        assertEquals( tick5,
+        assertEquals( tick3,
                 results_meets.get( 0 ) );
-        assertEquals( tick3,
-                results_meets.get( 1 ) );
         
         assertEquals( 1,
                       results_met_by.size() );
@@ -213,6 +255,47 @@
                 results_met_by.size() );
         assertEquals( tick2,
                 results_met_by.get( 0 ) );
+        
+        assertEquals( 1,
+                results_overlaps.size() );
+        assertEquals( tick4,
+                results_overlaps.get( 0 ) );
+        
+        assertEquals( 1,
+                results_overlapped_by.size() );
+        assertEquals( tick7,
+                results_overlapped_by.get( 0 ) );
+        
+        assertEquals( 1,
+                results_during.size() );
+        assertEquals( tick6,
+                results_during.get( 0 ) );
+        
+        assertEquals( 1,
+                results_includes.size() );
+        assertEquals( tick4,
+                results_includes.get( 0 ) );
+        
+        assertEquals( 1,
+                results_starts.size() );
+        assertEquals( tick6,
+                results_starts.get( 0 ) );
+        
+        assertEquals( 1,
+                results_started_by.size() );
+        assertEquals( tick7,
+                results_started_by.get( 0 ) );
+        
+        assertEquals( 1,
+                results_finishes.size() );
+        assertEquals( tick8,
+                results_finishes.get( 0 ) );
+        
+        assertEquals( 1,
+                results_finished_by.size() );
+        assertEquals( tick7,
+                results_finished_by.get( 0 ) );
+
     }
 
     public void testSimpleTimeWindow() throws Exception {

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -3208,7 +3208,7 @@
         assertEquals( sum,
                       stilton.getPrice() );
         assertEquals( 1,
-                      workingMemory.getFactHandleMap().size() );
+                      workingMemory.getObjectStore().size() );
         assertNotNull( workingMemory.getObject( stiltonHandle ) );
         assertNotNull( workingMemory.getFactHandle( stilton ) );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -18,6 +18,7 @@
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
+import org.drools.common.ObjectStore;
 import org.drools.common.TruthMaintenanceSystem;
 import org.drools.common.WorkingMemoryAction;
 import org.drools.event.AgendaEventListener;
@@ -246,12 +247,24 @@
 		this.facts .add(object);
 		return new MockFactHandle(object.hashCode());
 	}
+	
+	public FactHandle insert(Object object, long duration)
+		throws FactException {
+		// TODO Auto-generated method stub
+		return null;
+	}
 
 	public FactHandle insert(Object object, boolean dynamic)
 			throws FactException {
 		// TODO Auto-generated method stub
 		return null;
 	}
+	
+	public FactHandle insert(Object object, long duration, boolean dynamic)
+			throws FactException {
+		// TODO Auto-generated method stub
+		return null;
+	}
 
 	public Iterator iterateFactHandles() {
 		// TODO Auto-generated method stub
@@ -460,4 +473,9 @@
         
     }
 
+    public ObjectStore getObjectStore() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl	2008-01-16 22:38:51 UTC (rev 17908)
@@ -7,19 +7,19 @@
 global java.util.List results_before;
 global java.util.List results_meets;
 global java.util.List results_met_by;
-/*global java.util.List results_overlaps;
+global java.util.List results_overlaps;
 global java.util.List results_overlapped_by;
 global java.util.List results_during;
 global java.util.List results_includes;
 global java.util.List results_starts;
 global java.util.List results_started_by;
 global java.util.List results_finishes;
-global java.util.List results_finished_by;*/
+global java.util.List results_finished_by;
 
 rule "coincides operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~coincides[2] $a )
+    $b : StockTick( company == "ACME", this ~coincides $a )
 then
     results_coincides.add( $b );
 end
@@ -27,7 +27,7 @@
 rule "before operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~before[5,10] $a )
+    $b : StockTick( company == "ACME", this ~before[5,8] $a )
 then
     results_before.add( $b );
 end
@@ -35,7 +35,7 @@
 rule "after operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~after[5,10] $a )
+    $b : StockTick( company == "ACME", this ~after[5,8] $a )
 then
     results_after.add( $b );
 end
@@ -43,7 +43,7 @@
 rule "meets operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~meets[4] $a )
+    $b : StockTick( company == "ACME", this ~meets[1] $a )
 then
     results_meets.add( $b );
 end
@@ -51,16 +51,16 @@
 rule "met-by operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~metby[4] $a )
+    $b : StockTick( company == "ACME", this ~metby[1] $a )
 then
     results_met_by.add( $b );
 end
 
-/*
+
 rule "overlaps operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "DROO", this ~overlaps[4] $a )
+    $b : StockTick( company == "DROO", this ~overlaps[1] $a )
 then
     results_overlaps.add( $b );
 end
@@ -68,7 +68,7 @@
 rule "overlapped-by operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~overlappedby[4] $a )
+    $b : StockTick( company == "ACME", this ~overlappedby[1] $a )
 then
     results_overlapped_by.add( $b );
 end
@@ -76,7 +76,7 @@
 rule "during operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~during[2,0] $a )
+    $b : StockTick( company == "ACME", this ~during[1] $a )
 then
     results_during.add( $b );
 end
@@ -84,15 +84,15 @@
 rule "includes operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "DROO", this ~includes[2,0] $a )
+    $b : StockTick( company == "DROO", this ~includes[1] $a )
 then
     results_includes.add( $b );
 end
 
 rule "starts operator"
 when
-    $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~starts[2,0,1] $a )
+    $a : StockTick( company == "ACME" )
+    $b : StockTick( company == "ACME", this ~starts[2] $a )
 then
     results_starts.add( $b );
 end
@@ -100,14 +100,14 @@
 rule "started-by operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "DROO", this ~startedby[2,0,1] $a )
+    $b : StockTick( company == "ACME", this ~startedby[2] $a )
 then
     results_started_by.add( $b );
 end
 
 rule "finishes operator"
 when
-    $a : StockTick( company == "DROO" )
+    $a : StockTick( company == "ACME" )
     $b : StockTick( company == "ACME", this ~finishes[2] $a )
 then
     results_finishes.add( $b );
@@ -116,7 +116,7 @@
 rule "finished-by operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "DROO", this ~finishedby[2] $a )
+    $b : StockTick( company == "ACME", this ~finishedby[2] $a )
 then
     results_finished_by.add( $b );
-end*/
\ No newline at end of file
+end
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseEventManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseEventManager.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseEventManager.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -49,6 +49,6 @@
      * 
      * @return listeners The listeners.
      */
-    public List getRuleBaseEventListeners();
+    public List<RuleBaseEventListener> getRuleBaseEventListeners();
 
 }
\ No newline at end of file

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -142,6 +142,8 @@
      */
     FactHandle getFactHandle(Object object);
 
+    FactHandle getFactHandleByIdentity(final Object object);
+        
     /**
      * Returns an Iterator for the Objects in the Working Memory. This Iterator is not thread safe. 
      * This means that any working memory actions during iteration may invalidate the iterator.
@@ -214,6 +216,21 @@
      *             If a RuntimeException error occurs.
      */
     FactHandle insert(Object object) throws FactException;
+    
+    /**
+     * Assert a fact with inherent duration.
+     * 
+     * @param object
+     *            The fact object.
+     * @param duration
+     *            The duration of the fact.
+     * 
+     * @return The new fact-handle associated with the object.
+     * 
+     * @throws FactException
+     *             If a RuntimeException error occurs.
+     */
+    FactHandle insert(Object object, long duration) throws FactException;
 
     /**
      * Retrieve the QueryResults of the specified query.
@@ -264,6 +281,29 @@
      */
     FactHandle insert(Object object,
                             boolean dynamic) throws FactException;
+    
+    /**
+     * Insert a fact with inherent duration registering JavaBean 
+     * <code>PropertyChangeListeners</code> on the Object to 
+     * automatically trigger <code>update</code> calls
+     * if <code>dynamic</code> is <code>true</code>.
+     * 
+     * @param object
+     *            The fact object.
+     * @param duration
+     *            The duration of the fact.
+     * @param dynamic
+     *            true if Drools should add JavaBean
+     *            <code>PropertyChangeListeners</code> to the object.
+     * 
+     * @return The new fact-handle associated with the object.
+     * 
+     * @throws FactException
+     *             If a RuntimeException error occurs.
+     */
+    FactHandle insert(Object object,
+    				  long duration,
+                      boolean dynamic) throws FactException;
 
     /**
      * Retract a fact.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -59,31 +59,70 @@
 
     public void insert(final Object object) throws FactException {
         insert( object,
+        		0,
                 false );
     }
 
+    public void insert(final Object object, 
+    				   final long duration) throws FactException {
+        insert( object,
+        		duration,
+                false );
+    }
+    
     public void insert(final Object object,
                        final boolean dynamic) throws FactException {
         this.workingMemory.insert( object,
+        						   0,
                                    dynamic,
                                    false,
                                    this.rule,
                                    this.activation );
     }
+    
+    public void insert(final Object object,
+    				   final long duration,
+    				   final boolean dynamic) throws FactException {
+		this.workingMemory.insert( object,
+								duration,
+		                        dynamic,
+		                        false,
+		                        this.rule,
+		                        this.activation );
+	}
 
     public void insertLogical(final Object object) throws FactException {
         insertLogical( object,
+        			   0,
                        false );
     }
 
+    public void insertLogical(final Object object, final long duration) throws FactException {
+        insertLogical( object,
+        			   duration,
+                       false );
+    }
+    
     public void insertLogical(final Object object,
                               final boolean dynamic) throws FactException {
         this.workingMemory.insert( object,
+        						   0,
                                    dynamic,
                                    true,
                                    this.rule,
                                    this.activation );
     }
+    
+    public void insertLogical(final Object object,
+    						  final long duration,
+    						  final boolean dynamic) throws FactException {
+		this.workingMemory.insert( object,
+								   duration,
+								   dynamic,
+								   true,
+								   this.rule,
+								   this.activation );
+	}
 
     public void update(final FactHandle handle,
                        final Object newObject) throws FactException {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -64,17 +64,33 @@
 
     public void insert(final Object object) throws FactException {        
     }
+    
+    public void insert(final Object object, final long duration) throws FactException {        
+    }
 
     public void insert(final Object object,
                        final boolean dynamic) throws FactException {
     }
+    
+    public void insert(final Object object,
+    				   final long duration,
+    				   final boolean dynamic) throws FactException {
+    }
 
     public void insertLogical(final Object object) throws FactException {
     }
+    
+    public void insertLogical(final Object object, final long duration) throws FactException {
+    }
 
     public void insertLogical(final Object object,
                               final boolean dynamic) throws FactException {
     }
+    
+    public void insertLogical(final Object object,
+    						  final long duration,
+            				  final boolean dynamic) throws FactException {
+    }
 
     public void update(final FactHandle handle,
                        final Object newObject) throws FactException {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -45,15 +45,36 @@
             return newFactHandle( this.factHandlePool.pop(),
                                   object, 
                                   isEvent,
+                                  0,
                                   workingMemory );
         }
 
         return newFactHandle( this.id++,
                               object,
                               isEvent,
+                              0,
                               workingMemory );
     }
+    
+    /* (non-Javadoc)
+     * @see org.drools.reteoo.FactHandleFactory#newFactHandle()
+     */
+    public final InternalFactHandle newFactHandle( final Object object, final boolean isEvent, long duration, final WorkingMemory workingMemory ) {
+        if ( !this.factHandlePool.isEmpty() ) {
+            return newFactHandle( this.factHandlePool.pop(),
+                                  object, 
+                                  isEvent,
+                                  duration,
+                                  workingMemory );
+        }
 
+        return newFactHandle( this.id++,
+                              object,
+                              isEvent,
+                              duration,
+                              workingMemory );
+    }
+
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
      */
@@ -65,8 +86,25 @@
                               object,
                               this.counter++,
                               isEvent,
+                              0,
                               workingMemory );
     }
+    
+    /* (non-Javadoc)
+     * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
+     */
+    protected final InternalFactHandle newFactHandle(final long id,
+                                                     final Object object,
+                                                     final boolean isEvent,
+                                                     final long duration,
+                                                     final WorkingMemory workingMemory ) {
+        return newFactHandle( id,
+                              object,
+                              this.counter++,
+                              isEvent,
+                              duration,
+                              workingMemory );
+    }
 
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
@@ -76,6 +114,16 @@
                                                         final long recency,
                                                         final boolean isEvent, 
                                                         final WorkingMemory workingMemory );
+    
+    /* (non-Javadoc)
+     * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
+     */
+    protected abstract InternalFactHandle newFactHandle(final long id,
+                                                        final Object object,
+                                                        final long recency,
+                                                        final boolean isEvent,
+                                                        final long duration,
+                                                        final WorkingMemory workingMemory );
 
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#increaseFactHandleRecency(org.drools.FactHandle)

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -774,7 +774,7 @@
         this.eventSupport.removeEventListener( listener );
     }
 
-    public List getRuleBaseEventListeners() {
+    public List<RuleBaseEventListener> getRuleBaseEventListeners() {
         // since the event support is thread-safe, no need for locks... right?
         return this.eventSupport.getEventListeners();
     }

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -79,10 +79,6 @@
 import org.drools.spi.GlobalResolver;
 import org.drools.spi.PropagationContext;
 import org.drools.temporal.SessionClock;
-import org.drools.util.JavaIteratorAdapter;
-import org.drools.util.ObjectHashMap;
-import org.drools.util.PrimitiveLongMap;
-import org.drools.util.AbstractHashTable.HashTableIterator;
 
 /**
  * Implementation of <code>WorkingMemory</code>.
@@ -100,6 +96,7 @@
     // Constants
     // ------------------------------------------------------------
     protected static final Class[]                       ADD_REMOVE_PROPERTY_CHANGE_LISTENER_ARG_TYPES = new Class[]{PropertyChangeListener.class};
+    private static final int                             NODE_MEMORIES_ARRAY_GROWTH                    = 32;
 
     // ------------------------------------------------------------
     // Instance members
@@ -110,12 +107,11 @@
     protected final Object[]                             addRemovePropertyChangeListenerArgs           = new Object[]{this};
 
     /** The actual memory for the <code>JoinNode</code>s. */
-    protected final PrimitiveLongMap                     nodeMemories                                  = new PrimitiveLongMap( 32,
-                                                                                                                               8 );
-    /** Object-to-handle mapping. */
-    private final ObjectHashMap                          assertMap;
-    private final ObjectHashMap                          identityMap;
+    protected final NodeMemories                         nodeMemories;
 
+    
+    protected final ObjectStore                          objectStore;
+
     protected Map                                        queryResults                                  = Collections.EMPTY_MAP;
 
     /** Global values which are associated with this memory. */
@@ -196,25 +192,19 @@
         this.globalResolver = new MapGlobalResolver();
         this.maintainTms = this.ruleBase.getConfiguration().isMaintainTms();
         this.sequential = this.ruleBase.getConfiguration().isSequential();
+        
+        this.nodeMemories = new ConcurrentNodeMemories( this.ruleBase );
 
         if ( this.maintainTms ) {
             this.tms = new TruthMaintenanceSystem( this );
         } else {
             this.tms = null;
         }
-
-        this.assertMap = new ObjectHashMap();
+        
         final RuleBaseConfiguration conf = this.ruleBase.getConfiguration();
+        
+        this.objectStore = new SingleThreadedObjectStore(conf, this.lock);        
 
-        if ( conf.getAssertBehaviour() == AssertBehaviour.IDENTITY ) {
-            this.assertMap.setComparator( new IdentityAssertMapComparator() );
-            this.identityMap = assertMap;
-        } else {
-            this.assertMap.setComparator( new EqualityAssertMapComparator() );
-            this.identityMap = new ObjectHashMap();
-            this.identityMap.setComparator( new IdentityAssertMapComparator() );
-        }
-
         // Only takes effect if are using idententity behaviour for assert
         if ( conf.getLogicalOverride() == LogicalOverride.DISCARD ) {
             this.discardOnLogicalOverride = true;
@@ -235,6 +225,7 @@
 
     public void setRuleBase(final InternalRuleBase ruleBase) {
         this.ruleBase = ruleBase;
+        this.nodeMemories.setRuleBaseReference( this.ruleBase );
     }
 
     public void setWorkingMemoryEventSupport(WorkingMemoryEventSupport workingMemoryEventSupport) {
@@ -261,113 +252,53 @@
     }
 
     public void addEventListener(final WorkingMemoryEventListener listener) {
-        try {
-            this.lock.lock();
-            this.workingMemoryEventSupport.addEventListener( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.workingMemoryEventSupport.addEventListener( listener );
     }
 
     public void removeEventListener(final WorkingMemoryEventListener listener) {
-        try {
-            this.lock.lock();
-            this.workingMemoryEventSupport.removeEventListener( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.workingMemoryEventSupport.removeEventListener( listener );
     }
 
     public List getWorkingMemoryEventListeners() {
-        try {
-            this.lock.lock();
-            return this.workingMemoryEventSupport.getEventListeners();
-        } finally {
-            this.lock.unlock();
-        }
+        return this.workingMemoryEventSupport.getEventListeners();
     }
 
     public void addEventListener(final AgendaEventListener listener) {
-        try {
-            this.lock.lock();
-            this.agendaEventSupport.addEventListener( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.agendaEventSupport.addEventListener( listener );
     }
 
     public void removeEventListener(final AgendaEventListener listener) {
-        try {
-            this.lock.lock();
-            this.agendaEventSupport.removeEventListener( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.agendaEventSupport.removeEventListener( listener );
     }
 
     public List getAgendaEventListeners() {
-        try {
-            this.lock.lock();
-            return this.agendaEventSupport.getEventListeners();
-        } finally {
-            this.lock.unlock();
-        }
+        return this.agendaEventSupport.getEventListeners();
     }
 
     public void addEventListener(final RuleFlowEventListener listener) {
-        try {
-            this.lock.lock();
-            this.workflowEventSupport.addEventListener( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.workflowEventSupport.addEventListener( listener );
     }
 
     public void removeEventListener(final RuleFlowEventListener listener) {
-        try {
-            this.lock.lock();
-            this.workflowEventSupport.removeEventListener( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.workflowEventSupport.removeEventListener( listener );
     }
 
     public List getRuleFlowEventListeners() {
-        try {
-            this.lock.lock();
-            return this.workflowEventSupport.getEventListeners();
-        } finally {
-            this.lock.unlock();
-        }
+        return this.workflowEventSupport.getEventListeners();
     }
 
     public void addEventListener(RuleBaseEventListener listener) {
-        try {
-            this.lock.lock();
-            this.ruleBase.addEventListener( listener );
-            this.__ruleBaseEventListeners.add( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.ruleBase.addEventListener( listener );
+        this.__ruleBaseEventListeners.add( listener );
     }
 
     public List getRuleBaseEventListeners() {
-        try {
-            this.lock.lock();
-            return Collections.unmodifiableList( this.__ruleBaseEventListeners );
-        } finally {
-            this.lock.unlock();
-        }
+        return Collections.unmodifiableList( this.__ruleBaseEventListeners );
     }
 
     public void removeEventListener(RuleBaseEventListener listener) {
-        try {
-            this.lock.lock();
-            this.ruleBase.removeEventListener( listener );
-            this.__ruleBaseEventListeners.remove( listener );
-        } finally {
-            this.lock.unlock();
-        }
+        this.ruleBase.removeEventListener( listener );
+        this.__ruleBaseEventListeners.remove( listener );
     }
 
     public FactHandleFactory getFactHandleFactory() {
@@ -586,76 +517,33 @@
      * 
      */
     public Object getObject(final FactHandle handle) {
-        try {
-            this.lock.lock();
-
-            // Make sure the FactHandle is from this WorkingMemory
-            final InternalFactHandle internalHandle = (InternalFactHandle) this.assertMap.get( handle );
-            if ( internalHandle == null ) {
-                return null;
-            }
-
-            Object object = internalHandle.getObject();
-
-            if ( object != null && internalHandle.isShadowFact() ) {
-                object = ((ShadowProxy) object).getShadowedObject();
-            }
-
-            return object;
-        } finally {
-            this.lock.unlock();
-        }
-
+        return this.objectStore.getObjectForHandle( (InternalFactHandle) handle );
     }
-
-    public ObjectHashMap getAssertMap() {
-        return this.assertMap;
+    
+    public ObjectStore getObjectStore() {
+        return this.objectStore;
     }
 
     /**
      * @see WorkingMemory
      */
     public FactHandle getFactHandle(final Object object) {
-        try {
-            this.lock.lock();
-            final FactHandle factHandle = (FactHandle) this.assertMap.get( object );
-
-            return factHandle;
-        } finally {
-            this.lock.unlock();
-        }
+        return this.objectStore.getHandleForObject( object );
     }
-
+    
     /**
-     * @see InternalWorkingMemory
+     * @see WorkingMemory
      */
     public FactHandle getFactHandleByIdentity(final Object object) {
-        try {
-            this.lock.lock();
-            final FactHandle factHandle = (FactHandle) this.identityMap.get( object );
-
-            return factHandle;
-        } finally {
-            this.lock.unlock();
-        }
+        return this.objectStore.getHandleForObjectIdentity( object );
     }
 
     /**
-     * This is an internal method, used to avoid java.util.Iterator adaptors
-     */
-    public ObjectHashMap getFactHandleMap() {
-        return this.assertMap;
-    }
-
-    /**
      * This class is not thread safe, changes to the working memory during
      * iteration may give unexpected results
      */
     public Iterator iterateObjects() {
-        HashTableIterator iterator = new HashTableIterator( this.assertMap );
-        iterator.reset();
-        return new JavaIteratorAdapter( iterator,
-                                        JavaIteratorAdapter.OBJECT );
+        return this.objectStore.iterateObjects( );
     }
 
     /**
@@ -663,11 +551,7 @@
      * iteration may give unexpected results
      */
     public Iterator iterateObjects(ObjectFilter filter) {
-        HashTableIterator iterator = new HashTableIterator( this.assertMap );
-        iterator.reset();
-        return new JavaIteratorAdapter( iterator,
-                                        JavaIteratorAdapter.OBJECT,
-                                        filter );
+        return this.objectStore.iterateObjects( filter );
     }
 
     /**
@@ -675,10 +559,7 @@
      * iteration may give unexpected results
      */
     public Iterator iterateFactHandles() {
-        HashTableIterator iterator = new HashTableIterator( this.assertMap );
-        iterator.reset();
-        return new JavaIteratorAdapter( iterator,
-                                        JavaIteratorAdapter.FACT_HANDLE );
+        return this.objectStore.iterateFactHandles();
     }
 
     /**
@@ -686,11 +567,7 @@
      * iteration may give unexpected results
      */
     public Iterator iterateFactHandles(ObjectFilter filter) {
-        HashTableIterator iterator = new HashTableIterator( this.assertMap );
-        iterator.reset();
-        return new JavaIteratorAdapter( iterator,
-                                        JavaIteratorAdapter.FACT_HANDLE,
-                                        filter );
+        return this.objectStore.iterateFactHandles( filter );
     }
 
     public abstract QueryResults getQueryResults(String query);
@@ -716,17 +593,39 @@
      */
     public FactHandle insert(final Object object) throws FactException {
         return insert( object, /* Not-Dynamic */
+                       0,
                        false,
                        false,
                        null,
                        null );
     }
 
+    public FactHandle insert(final Object object,
+                             final long duration) throws FactException {
+        return insert( object, /* Not-Dynamic */
+                       duration,
+                       false,
+                       false,
+                       null,
+                       null );
+    }
+
     /**
      * @see WorkingMemory
      */
     public FactHandle insertLogical(final Object object) throws FactException {
+        return insert( object, //Not-Dynamic 
+                       0,
+                       false,
+                       true,
+                       null,
+                       null );
+    }
+
+    public FactHandle insertLogical(final Object object,
+                                    final long duration) throws FactException {
         return insert( object, /* Not-Dynamic */
+                       duration,
                        false,
                        true,
                        null,
@@ -736,21 +635,45 @@
     public FactHandle insert(final Object object,
                              final boolean dynamic) throws FactException {
         return insert( object,
+                       0,
                        dynamic,
                        false,
                        null,
                        null );
     }
 
+    public FactHandle insert(final Object object,
+                             final long duration,
+                             final boolean dynamic) throws FactException {
+        return insert( object,
+                       duration,
+                       dynamic,
+                       false,
+                       null,
+                       null );
+    }
+
     public FactHandle insertLogical(final Object object,
                                     final boolean dynamic) throws FactException {
         return insert( object,
+                       0,
                        dynamic,
                        true,
                        null,
                        null );
     }
 
+    public FactHandle insertLogical(final Object object,
+                                    final long duration,
+                                    final boolean dynamic) throws FactException {
+        return insert( object,
+                       duration,
+                       dynamic,
+                       true,
+                       null,
+                       null );
+    }
+
     public FactHandle insert(final Object object,
                              final boolean dynamic,
                              boolean logical,
@@ -758,6 +681,7 @@
                              final Activation activation) throws FactException {
         return this.insert( EntryPoint.DEFAULT,
                             object,
+                            0,
                             dynamic,
                             logical,
                             rule,
@@ -765,12 +689,43 @@
 
     }
 
+    public FactHandle insert(final Object object,
+                             final long duration,
+                             final boolean dynamic,
+                             boolean logical,
+                             final Rule rule,
+                             final Activation activation) throws FactException {
+        return this.insert( EntryPoint.DEFAULT,
+                            object,
+                            duration,
+                            dynamic,
+                            logical,
+                            rule,
+                            activation );
+    }
+
     protected FactHandle insert(final EntryPoint entryPoint,
                                 final Object object,
                                 final boolean dynamic,
                                 boolean logical,
                                 final Rule rule,
                                 final Activation activation) throws FactException {
+        return this.insert( entryPoint,
+                            object,
+                            0,
+                            dynamic,
+                            logical,
+                            rule,
+                            activation );
+    }
+
+    protected FactHandle insert(final EntryPoint entryPoint,
+                                final Object object,
+                                final long duration,
+                                final boolean dynamic,
+                                boolean logical,
+                                final Rule rule,
+                                final Activation activation) throws FactException {
         if ( object == null ) {
             // you cannot assert a null object
             return null;
@@ -784,8 +739,9 @@
         if ( isSequential() ) {
             handle = this.handleFactory.newFactHandle( object,
                                                        typeConf.isEvent(),
+                                                       duration,
                                                        this );
-            addHandleToMaps( handle );
+            this.objectStore.addHandle( handle, object );
             insert( entryPoint,
                     handle,
                     object,
@@ -797,7 +753,7 @@
         try {
             this.lock.lock();
             // check if the object already exists in the WM
-            handle = (InternalFactHandle) this.assertMap.get( object );
+            handle = (InternalFactHandle) this.objectStore.getHandleForObject(object);
 
             if ( this.maintainTms ) {
 
@@ -841,8 +797,9 @@
                     // assert
                     handle = this.handleFactory.newFactHandle( object,
                                                                typeConf.isEvent(),
+                                                               duration,
                                                                this );
-                    addHandleToMaps( handle );
+                    this.objectStore.addHandle( handle, object );
 
                     key = new EqualityKey( handle );
                     handle.setEqualityKey( key );
@@ -877,16 +834,7 @@
                                 // before replacing the object
                                 // and then re-add the handle. Otherwise we may
                                 // end up with a leak.
-                                this.assertMap.remove( handle );
-                                Object oldObject = handle.getObject();
-                                if ( oldObject instanceof ShadowProxy ) {
-                                    ((ShadowProxy) oldObject).setShadowedObject( object );
-                                } else {
-                                    handle.setObject( object );
-                                }
-                                this.assertMap.put( handle,
-                                                    handle,
-                                                    false );
+                                this.objectStore.updateHandle( handle, object );
                             } else {
                                 Object oldObject = handle.getObject();
                                 if ( oldObject instanceof ShadowProxy ) {
@@ -902,18 +850,20 @@
                             key.setStatus( EqualityKey.STATED );
                             handle = this.handleFactory.newFactHandle( object,
                                                                        typeConf.isEvent(),
+                                                                       duration,
                                                                        this );
                             handle.setEqualityKey( key );
                             key.addFactHandle( handle );
-                            addHandleToMaps( handle );
+                            this.objectStore.addHandle( handle, object );
 
                         }
 
                     } else {
                         handle = this.handleFactory.newFactHandle( object,
                                                                    typeConf.isEvent(),
+                                                                   duration,
                                                                    this );
-                        addHandleToMaps( handle );
+                        this.objectStore.addHandle( handle, object );
                         key.addFactHandle( handle );
                         handle.setEqualityKey( key );
 
@@ -942,8 +892,9 @@
                 }
                 handle = this.handleFactory.newFactHandle( object,
                                                            typeConf.isEvent(),
+                                                           duration,
                                                            this );
-                addHandleToMaps( handle );
+                this.objectStore.addHandle( handle, object );
 
             }
 
@@ -1142,7 +1093,7 @@
                                                                 object,
                                                                 this );
 
-            removeHandleFromMaps( handle );
+            this.objectStore.removeHandle( handle );
 
             this.handleFactory.destroyFactHandle( handle );
 
@@ -1154,24 +1105,24 @@
         }
     }
 
-    private void addHandleToMaps(InternalFactHandle handle) {
-        this.assertMap.put( handle,
-                            handle,
-                            false );
-        if ( this.ruleBase.getConfiguration().getAssertBehaviour() == AssertBehaviour.EQUALITY ) {
-            this.identityMap.put( handle,
-                                  handle,
-                                  false );
-        }
-    }
+//    private void addHandleToMaps(InternalFactHandle handle) {
+//        this.assertMap.put( handle,
+//                            handle,
+//                            false );
+//        if ( this.ruleBase.getConfiguration().getAssertBehaviour() == AssertBehaviour.EQUALITY ) {
+//            this.identityMap.put( handle,
+//                                  handle,
+//                                  false );
+//        }
+//    }
+//
+//    private void removeHandleFromMaps(final InternalFactHandle handle) {
+//        this.assertMap.remove( handle );
+//        if ( this.ruleBase.getConfiguration().getAssertBehaviour() == AssertBehaviour.EQUALITY ) {
+//            this.identityMap.remove( handle );
+//        }
+//    }
 
-    private void removeHandleFromMaps(final InternalFactHandle handle) {
-        this.assertMap.remove( handle );
-        if ( this.ruleBase.getConfiguration().getAssertBehaviour() == AssertBehaviour.EQUALITY ) {
-            this.identityMap.remove( handle );
-        }
-    }
-
     public void modifyRetract(final FactHandle factHandle) {
         modifyRetract( factHandle,
                        null,
@@ -1394,11 +1345,11 @@
                        propagationContext );
 
             if ( (originalObject != object) || (this.ruleBase.getConfiguration().getAssertBehaviour() != AssertBehaviour.IDENTITY) ) {
-                removeHandleFromMaps( handle );
+                this.objectStore.removeHandle( handle );
 
                 // set anyway, so that it updates the hashCodes
                 handle.setObject( object );
-                addHandleToMaps( handle );
+                this.objectStore.addHandle( handle, object );
             }
 
             if ( this.maintainTms ) {
@@ -1487,20 +1438,11 @@
      * @return The node's memory.
      */
     public Object getNodeMemory(final NodeMemory node) {
-        Object memory = this.nodeMemories.get( node.getId() );
-
-        if ( memory == null ) {
-            memory = node.createMemory( this.ruleBase.getConfiguration() );
-
-            this.nodeMemories.put( node.getId(),
-                                   memory );
-        }
-
-        return memory;
+        return this.nodeMemories.getNodeMemory( node );
     }
 
     public void clearNodeMemory(final NodeMemory node) {
-        this.nodeMemories.remove( node.getId() );
+        this.nodeMemories.clearNodeMemory( node );
     }
 
     public WorkingMemoryEventSupport getWorkingMemoryEventSupport() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BaseNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -1,5 +1,7 @@
 package org.drools.common;
 
+import org.drools.reteoo.ReteooBuilder;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -57,9 +59,11 @@
 
     /**
      * Removes the node from teh network. Usually from the parent <code>ObjectSource</code> or <code>TupleSource</code>
+     * @param builder TODO
      *
      */
-    public abstract void remove(BaseNode node,
+    public abstract void remove(ReteooBuilder builder,
+                                BaseNode node,
                                 InternalWorkingMemory[] workingMemories);
 
     //    /**
@@ -86,10 +90,14 @@
 
     /**
      * Each time a node is unshared a counter is decreased.
+     * @param builder TODO
      *
      */
-    public void removeShare() {
+    public void removeShare(ReteooBuilder builder) {
         --this.sharedCount;
+        if( !this.isInUse() ) {
+            builder.getIdGenerator().releaseId( this.id );
+        }
     }
 
     /**

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java (from rev 17906, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ConcurrentNodeMemories.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2008 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.
+ *
+ * Created on Jan 15, 2008
+ */
+
+package org.drools.common;
+
+import java.util.concurrent.atomic.AtomicReferenceArray;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * A concurrent implementation for the node memories interface
+ * 
+ * @author etirelli
+ */
+public class ConcurrentNodeMemories
+    implements
+    NodeMemories {
+
+    private static final long serialVersionUID = -2032997426288974117L;
+    
+    private AtomicReferenceArray<Object> memories;
+    private Lock                         lock;
+    private transient InternalRuleBase   rulebase;
+
+    public ConcurrentNodeMemories(InternalRuleBase rulebase) {
+        this.rulebase = rulebase;
+        this.memories = new AtomicReferenceArray<Object>( this.rulebase.getNodeCount() );
+        this.lock = new ReentrantLock();
+    }
+
+    /**
+     * @inheritDoc
+     *
+     * @see org.drools.common.NodeMemories#clearNodeMemory(org.drools.common.NodeMemory)
+     */
+    public void clearNodeMemory(NodeMemory node) {
+        this.memories.set( node.getId(), null );
+    }
+
+    /**
+     * @inheritDoc
+     *
+     * @see org.drools.common.NodeMemories#getNodeMemory(org.drools.common.NodeMemory)
+     */
+    public Object getNodeMemory(NodeMemory node) {
+        if ( node.getId() >= this.memories.length() ) {
+            resize( node );
+        }
+        Object memory = this.memories.get( node.getId() );
+
+        if ( memory == null ) {
+            memory = node.createMemory( this.rulebase.getConfiguration() );
+
+            if( !this.memories.compareAndSet( node.getId(), null, memory ) ) {
+                memory = this.memories.get( node.getId() );
+            }
+        }
+
+        return memory;
+    }
+
+    /**
+     * @param node
+     */
+    private void resize(NodeMemory node) {
+        this.lock.lock();
+        try {
+            if( node.getId() >= this.memories.length() ) {
+                int size = Math.max( this.rulebase.getNodeCount(),
+                                     node.getId() + 1 );
+                AtomicReferenceArray<Object> newMem = new AtomicReferenceArray<Object>( size );
+                for( int i = 0; i < this.memories.length(); i++ ) {
+                    newMem.set( i, this.memories.get( i ) );
+                }
+                this.memories = newMem;
+            }
+        } finally {
+            this.lock.unlock();
+        }
+    }
+
+    public void setRuleBaseReference(InternalRuleBase ruleBase) {
+        this.rulebase = ruleBase;
+    }
+
+}

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -114,4 +114,6 @@
     public boolean isEvent( Class clazz );
 
 	public Objenesis getObjenesis();
+	
+	public int getNodeCount();
 }

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -32,7 +32,7 @@
 
     public void setWorkingMemoryEventSupport(WorkingMemoryEventSupport workingMemoryEventSupport);
 
-    public ObjectHashMap getAssertMap();
+    ///public ObjectHashMap getAssertMap();
 
     public void setAgendaEventSupport(AgendaEventSupport agendaEventSupport);
 
@@ -46,7 +46,9 @@
 
     public long getNextPropagationIdCounter();
 
-    public ObjectHashMap getFactHandleMap();
+    //public ObjectHashMap getFactHandleMap()
+    
+    public ObjectStore getObjectStore();
 
     public TruthMaintenanceSystem getTruthMaintenanceSystem();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemoryActions.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemoryActions.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemoryActions.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -35,14 +35,25 @@
                         Rule rule,
                         Activation activation) throws FactException;
 
-    FactHandle insert(Object object,
+    /*FactHandle insert(Object object,
                       boolean dynamic,
                       boolean logical,
                       Rule rule,
-                      Activation activation) throws FactException;
+                      Activation activation) throws FactException;*/
+    
+    FactHandle insert(Object object,
+    		long duration,
+            boolean dynamic,
+            boolean logical,
+            Rule rule,
+            Activation activation) throws FactException;
 
+    /*public FactHandle insertLogical(Object object,
+                                    boolean dynamic) throws FactException;*/
+    
     public FactHandle insertLogical(Object object,
-                                    boolean dynamic) throws FactException;
+    								long duration,
+    								boolean dynamic) throws FactException;
 
     public void modifyRetract(final FactHandle factHandle,
                               final Rule rule,

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NodeMemories.java (from rev 17906, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/common/NodeMemories.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NodeMemories.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NodeMemories.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2008 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.
+ *
+ * Created on Jan 15, 2008
+ */
+
+package org.drools.common;
+
+import java.io.Serializable;
+
+/**
+ * An interface for node memories implementation
+ * 
+ * @author etirelli
+ */
+public interface NodeMemories extends Serializable {
+    
+    public Object getNodeMemory( NodeMemory node );
+    
+    public void clearNodeMemory( NodeMemory node );
+
+    public void setRuleBaseReference(InternalRuleBase ruleBase);
+
+}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java (from rev 17906, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/common/ObjectStore.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -0,0 +1,47 @@
+package org.drools.common;
+
+import java.util.Iterator;
+
+import org.drools.ObjectFilter;
+
+public interface ObjectStore {
+
+    public abstract int size();
+
+    public abstract boolean isEmpty();
+
+    public abstract Object getObjectForHandle(InternalFactHandle handle);
+
+    public abstract InternalFactHandle getHandleForObject(Object object);
+    
+    public abstract InternalFactHandle getHandleForObjectIdentity(Object object);
+
+    public abstract void updateHandle(InternalFactHandle handle,
+                                      Object object);
+
+    public abstract void addHandle(InternalFactHandle handle,
+                                   Object object);
+
+    public abstract void removeHandle(final InternalFactHandle handle);
+
+    /**
+     * This class is not thread safe, changes to the working memory during iteration may give unexpected results
+     */
+    public abstract Iterator iterateObjects();
+
+    /**
+     * This class is not thread safe, changes to the working memory during iteration may give unexpected results
+     */
+    public abstract Iterator iterateObjects(ObjectFilter filter);
+
+    /**
+     * This class is not thread safe, changes to the working memory during iteration may give unexpected results
+     */
+    public abstract Iterator iterateFactHandles();
+
+    /**
+     * This class is not thread safe, changes to the working memory during iteration may give unexpected results
+     */
+    public abstract Iterator iterateFactHandles(ObjectFilter filter);
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java (from rev 17906, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleThreadedObjectStore.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -0,0 +1,176 @@
+/**
+ * 
+ */
+package org.drools.common;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.concurrent.locks.Lock;
+
+import org.drools.ObjectFilter;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseConfiguration.AssertBehaviour;
+import org.drools.base.ShadowProxy;
+import org.drools.util.JavaIteratorAdapter;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.AbstractHashTable.HashTableIterator;
+
+public class  SingleThreadedObjectStore implements Serializable, ObjectStore {
+    /** Object-to-handle mapping. */
+    private ObjectHashMap                          assertMap;
+    private ObjectHashMap                          identityMap;
+    private AssertBehaviour                        behaviour;
+    private Lock                                   lock;
+    
+    public SingleThreadedObjectStore(RuleBaseConfiguration conf, Lock lock) {
+        this.behaviour = conf.getAssertBehaviour();
+        this.lock = lock;
+        
+        this.assertMap = new ObjectHashMap();            
+
+        if ( this.behaviour == AssertBehaviour.IDENTITY ) {
+            this.assertMap.setComparator( new IdentityAssertMapComparator() );
+            this.identityMap = assertMap;
+        } else {
+            this.assertMap.setComparator( new EqualityAssertMapComparator() );
+            this.identityMap = new ObjectHashMap();
+            this.identityMap.setComparator( new IdentityAssertMapComparator() );
+        }            
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#size()
+     */
+    public int size() {
+        return this.assertMap.size();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#isEmpty()
+     */
+    public boolean isEmpty() {
+        return this.assertMap != null;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#getObjectForHandle(org.drools.common.InternalFactHandle)
+     */
+    public Object getObjectForHandle(InternalFactHandle handle) {
+        try {
+            this.lock.lock();
+
+            // Make sure the FactHandle is from this WorkingMemory
+            final InternalFactHandle internalHandle = (InternalFactHandle) this.assertMap.get( handle );
+            if ( internalHandle == null ) {
+                return null;
+            }
+
+            Object object = internalHandle.getObject();
+
+            if ( object != null && internalHandle.isShadowFact() ) {
+                object = ((ShadowProxy) object).getShadowedObject();
+            }
+
+            return object;
+        } finally {
+            this.lock.unlock();
+        }            
+    }
+            
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#getHandleForObject(java.lang.Object)
+     */
+    public InternalFactHandle getHandleForObject(Object object){
+        return (InternalFactHandle) this.assertMap.get( object );
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#getHandleForObject(java.lang.Object)
+     */
+    public InternalFactHandle getHandleForObjectIdentity(Object object) {
+        return (InternalFactHandle) this.identityMap.get( object );
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#updateHandle(org.drools.common.InternalFactHandle, java.lang.Object)
+     */
+    public void updateHandle(InternalFactHandle handle, Object object){
+        this.assertMap.remove( handle );
+        Object oldObject = handle.getObject();
+        if ( oldObject instanceof ShadowProxy ) {
+            ((ShadowProxy) oldObject).setShadowedObject( object );
+        } else {
+            handle.setObject( object );
+        }
+        this.assertMap.put( handle,
+                            handle,
+                            false );
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#addHandle(org.drools.common.InternalFactHandle, java.lang.Object)
+     */
+    public void addHandle(InternalFactHandle handle, Object object) {
+        this.assertMap.put( handle,
+                            handle,
+                            false );
+        if ( this.behaviour == AssertBehaviour.EQUALITY ) {
+            this.identityMap.put( handle,
+                                  handle,
+                                  false );
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#removeHandle(org.drools.common.InternalFactHandle)
+     */
+    public void removeHandle(final InternalFactHandle handle) {
+        this.assertMap.remove( handle );
+        if ( this.behaviour == AssertBehaviour.EQUALITY ) {
+            this.identityMap.remove( handle );
+        }
+    }      
+    
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#iterateObjects()
+     */
+    public Iterator iterateObjects() {
+        HashTableIterator iterator = new HashTableIterator( this.assertMap );
+        iterator.reset();
+        return new JavaIteratorAdapter( iterator,
+                                        JavaIteratorAdapter.OBJECT );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#iterateObjects(org.drools.ObjectFilter)
+     */
+    public Iterator iterateObjects(ObjectFilter filter) {
+        HashTableIterator iterator = new HashTableIterator( this.assertMap );
+        iterator.reset();
+        return new JavaIteratorAdapter( iterator,
+                                        JavaIteratorAdapter.OBJECT,
+                                        filter );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#iterateFactHandles()
+     */
+    public Iterator iterateFactHandles() {
+        HashTableIterator iterator = new HashTableIterator( this.assertMap );
+        iterator.reset();
+        return new JavaIteratorAdapter( iterator,
+                                        JavaIteratorAdapter.FACT_HANDLE );
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.common.ObjectStore#iterateFactHandles(org.drools.ObjectFilter)
+     */
+    public Iterator iterateFactHandles(ObjectFilter filter) {
+        HashTableIterator iterator = new HashTableIterator( this.assertMap );
+        iterator.reset();
+        return new JavaIteratorAdapter( iterator,
+                                        JavaIteratorAdapter.FACT_HANDLE,
+                                        filter );
+    }        
+    
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventSupport.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -20,6 +20,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.drools.WorkingMemory;
 import org.drools.common.InternalWorkingMemory;
@@ -36,7 +37,7 @@
      * 
      */
     private static final long serialVersionUID = 400L;
-    private final List        listeners        = Collections.synchronizedList( new ArrayList() );
+    private final List<AgendaEventListener>        listeners        = new CopyOnWriteArrayList<AgendaEventListener>();
 
     public AgendaEventSupport() {
     }
@@ -52,6 +53,7 @@
     }
 
     public List getEventListeners() {
+        
         return Collections.unmodifiableList( this.listeners );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleBaseEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleBaseEventSupport.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleBaseEventSupport.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -26,6 +26,7 @@
 import org.drools.rule.Package;
 
 import java.util.Iterator;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
  * 
@@ -37,9 +38,9 @@
     /**
      * 
      */
-    private static final long serialVersionUID = 400L;
-    private final List<EventListener>        listeners        = Collections.synchronizedList( new ArrayList<EventListener>() );
-    private transient RuleBase    ruleBase;
+    private static final long                 serialVersionUID = 400L;
+    private final List<RuleBaseEventListener> listeners        = new CopyOnWriteArrayList<RuleBaseEventListener>();
+    private transient RuleBase                ruleBase;
 
     public RuleBaseEventSupport(final RuleBase ruleBase) {
         this.ruleBase = ruleBase;
@@ -50,25 +51,27 @@
             this.listeners.add( listener );
         }
     }
-    
+
     public void setRuleBase(RuleBase ruleBase) {
         this.ruleBase = ruleBase;
     }
-    
+
     public void removeEventListener(Class cls) {
-        for ( Iterator<EventListener> it = this.listeners.iterator(); it.hasNext(); ) {
-            EventListener listener = it.next();
+        for ( int i = 0; i < this.listeners.size(); ) {
+            RuleBaseEventListener listener = this.listeners.get( i );
             if ( cls.isAssignableFrom( listener.getClass() ) ) {
-                it.remove();
+                this.listeners.remove( i );
+            } else {
+                i++;
             }
-        }        
+        }
     }
 
     public void removeEventListener(final RuleBaseEventListener listener) {
         this.listeners.remove( listener );
     }
 
-    public List<EventListener> getEventListeners() {
+    public List<RuleBaseEventListener> getEventListeners() {
         return Collections.unmodifiableList( this.listeners );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/RuleFlowEventSupport.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -20,6 +20,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.drools.common.InternalWorkingMemory;
 import org.drools.process.instance.ProcessInstance;
@@ -34,8 +35,8 @@
     
     // TODO separate out process level stuff
 
-    private static final long serialVersionUID = 400L;
-    private final List        listeners        = Collections.synchronizedList( new ArrayList() );
+    private static final long                 serialVersionUID = 400L;
+    private final List<RuleFlowEventListener> listeners        = new CopyOnWriteArrayList<RuleFlowEventListener>();
 
     public RuleFlowEventSupport() {
     }
@@ -69,11 +70,11 @@
             return;
         }
 
-        final RuleFlowStartedEvent event = new RuleFlowStartedEvent(instance);
+        final RuleFlowStartedEvent event = new RuleFlowStartedEvent( instance );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .beforeRuleFlowStarted(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).beforeRuleFlowStarted( event,
+                                                                                     workingMemory );
         }
     }
 
@@ -84,11 +85,11 @@
             return;
         }
 
-        final RuleFlowStartedEvent event = new RuleFlowStartedEvent(instance);
+        final RuleFlowStartedEvent event = new RuleFlowStartedEvent( instance );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .afterRuleFlowStarted(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).afterRuleFlowStarted( event,
+                                                                                    workingMemory );
         }
     }
 
@@ -99,12 +100,11 @@
             return;
         }
 
-        final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent(
-                instance);
+        final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent( instance );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .beforeRuleFlowCompleted(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).beforeRuleFlowCompleted( event,
+                                                                                       workingMemory );
         }
     }
 
@@ -115,76 +115,67 @@
             return;
         }
 
-        final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent(
-                instance);
+        final RuleFlowCompletedEvent event = new RuleFlowCompletedEvent( instance );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .afterRuleFlowCompleted(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).afterRuleFlowCompleted( event,
+                                                                                      workingMemory );
         }
     }
 
-    public void fireBeforeRuleFlowGroupActivated(
-            final RuleFlowGroup ruleFlowGroup,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
+    public void fireBeforeRuleFlowGroupActivated(final RuleFlowGroup ruleFlowGroup,
+                                                 final InternalWorkingMemory workingMemory) {
+        if ( this.listeners.isEmpty() ) {
             return;
         }
 
-        final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent(
-                ruleFlowGroup);
+        final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent( ruleFlowGroup );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .beforeRuleFlowGroupActivated(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).beforeRuleFlowGroupActivated( event,
+                                                                                            workingMemory );
         }
     }
 
-    public void fireAfterRuleFlowGroupActivated(
-            final RuleFlowGroup ruleFlowGroup,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
+    public void fireAfterRuleFlowGroupActivated(final RuleFlowGroup ruleFlowGroup,
+                                                final InternalWorkingMemory workingMemory) {
+        if ( this.listeners.isEmpty() ) {
             return;
         }
 
-        final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent(
-                ruleFlowGroup);
+        final RuleFlowGroupActivatedEvent event = new RuleFlowGroupActivatedEvent( ruleFlowGroup );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .afterRuleFlowGroupActivated(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).afterRuleFlowGroupActivated( event,
+                                                                                           workingMemory );
         }
     }
 
-    public void fireBeforeRuleFlowGroupDeactivated(
-            final RuleFlowGroup ruleFlowGroup,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
+    public void fireBeforeRuleFlowGroupDeactivated(final RuleFlowGroup ruleFlowGroup,
+                                                   final InternalWorkingMemory workingMemory) {
+        if ( this.listeners.isEmpty() ) {
             return;
         }
 
-        final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent(
-                ruleFlowGroup);
+        final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent( ruleFlowGroup );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .beforeRuleFlowGroupDeactivated(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).beforeRuleFlowGroupDeactivated( event,
+                                                                                              workingMemory );
         }
     }
 
-    public void fireAfterRuleFlowGroupDeactivated(
-            final RuleFlowGroup ruleFlowGroup,
-            final InternalWorkingMemory workingMemory) {
-        if (this.listeners.isEmpty()) {
+    public void fireAfterRuleFlowGroupDeactivated(final RuleFlowGroup ruleFlowGroup,
+                                                  final InternalWorkingMemory workingMemory) {
+        if ( this.listeners.isEmpty() ) {
             return;
         }
 
-        final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent(
-                ruleFlowGroup);
+        final RuleFlowGroupDeactivatedEvent event = new RuleFlowGroupDeactivatedEvent( ruleFlowGroup );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .afterRuleFlowGroupDeactivated(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).afterRuleFlowGroupDeactivated( event,
+                                                                                             workingMemory );
         }
     }
 
@@ -195,12 +186,11 @@
             return;
         }
 
-        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent(
-                ruleFlowNodeInstance);
+        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent( ruleFlowNodeInstance );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .beforeRuleFlowNodeTriggered(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).beforeRuleFlowNodeTriggered( event,
+                                                                                           workingMemory );
         }
     }
 
@@ -211,12 +201,11 @@
             return;
         }
 
-        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent(
-                ruleFlowNodeInstance);
+        final RuleFlowNodeTriggeredEvent event = new RuleFlowNodeTriggeredEvent( ruleFlowNodeInstance );
 
-        for (int i = 0, size = this.listeners.size(); i < size; i++) {
-            ((RuleFlowEventListener) this.listeners.get(i))
-                    .afterRuleFlowNodeTriggered(event, workingMemory);
+        for ( int i = 0, size = this.listeners.size(); i < size; i++ ) {
+            ((RuleFlowEventListener) this.listeners.get( i )).afterRuleFlowNodeTriggered( event,
+                                                                                          workingMemory );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -20,6 +20,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.drools.FactHandle;
 import org.drools.common.InternalWorkingMemory;
@@ -34,8 +35,8 @@
     /**
      * 
      */
-    private static final long serialVersionUID = 400L;
-    private final List        listeners        = Collections.synchronizedList( new ArrayList() );
+    private static final long                      serialVersionUID = 400L;
+    private final List<WorkingMemoryEventListener> listeners        = new CopyOnWriteArrayList<WorkingMemoryEventListener>();
 
     public WorkingMemoryEventSupport() {
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -381,7 +381,7 @@
 
         // First alpha node filters
         boolean isAllowed = true;
-        final InternalFactHandle createdHandle = workingMemory.getFactHandleFactory().newFactHandle( result, false, workingMemory ); // so far, result is not an event
+        final InternalFactHandle createdHandle = workingMemory.getFactHandleFactory().newFactHandle( result, false, 0, workingMemory ); // so far, result is not an event
         for ( int i = 0, length = this.resultConstraints.length; i < length; i++ ) {
             if ( !this.resultConstraints[i].isAllowed( createdHandle,
                                                        workingMemory ) ) {

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -185,20 +185,20 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
 
         if ( !node.isInUse() ) {
             removeObjectSink( (ObjectSink) node );
         }
-        removeShare();
+        removeShare(builder);
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.objectSource.remove( this,
-                                  workingMemories );
+        this.objectSource.remove( builder,
+                                  this, workingMemories );
     }
 
     public void setObjectMemoryAllowed(boolean objectMemoryAllowed) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -155,22 +155,22 @@
 
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
+        removeShare(builder);
 
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.rightInput.remove( this,
-                                workingMemories );
-        this.leftInput.remove( this,
-                               workingMemories );
+        this.rightInput.remove( builder,
+                                this, workingMemories );
+        this.leftInput.remove( builder,
+                               this, workingMemories );
 
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -33,15 +33,11 @@
 import org.drools.base.ShadowProxyFactory;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.InternalRuleBase;
-import org.drools.objenesis.Objenesis;
-import org.drools.objenesis.ObjenesisStd;
 import org.drools.objenesis.instantiator.ObjectInstantiator;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.reteoo.builder.PatternBuilder;
 import org.drools.rule.EntryPoint;
 import org.drools.spi.ObjectType;
-import org.drools.util.Iterator;
-import org.drools.util.ObjectHashMap.ObjectEntry;
 
 public class ClassObjectTypeConf
     implements
@@ -280,11 +276,9 @@
     }
 
     private ObjectTypeNode[] getMatchingObjectTypes(final Class clazz) throws FactException {
-        final List cache = new ArrayList();
+        final List<ObjectTypeNode> cache = new ArrayList<ObjectTypeNode>();
 
-        final Iterator it = ruleBase.getRete().getObjectTypeNodes( this.entryPoint ).newIterator();
-        for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
-            final ObjectTypeNode node = (ObjectTypeNode) entry.getValue();
+        for( ObjectTypeNode node : ruleBase.getRete().getObjectTypeNodes( this.entryPoint ).values() ) {
             if ( node.isAssignableFrom( clazz ) ) {
                 cache.add( node );
             }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java (from rev 17906, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -0,0 +1,279 @@
+package org.drools.reteoo;
+
+/*
+ * Copyright 2007 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.
+ * 
+ * Created on January 8th, 2007
+ */
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.base.ShadowProxy;
+import org.drools.common.BaseNode;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.NodeMemory;
+import org.drools.common.PropagationContextImpl;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.rule.EntryPoint;
+import org.drools.spi.ObjectType;
+import org.drools.spi.PropagationContext;
+import org.drools.util.FactEntry;
+import org.drools.util.FactHashTable;
+import org.drools.util.Iterator;
+
+/**
+ * A node that is an entry point into the Rete network.
+ *
+ * As we move the design to support network partitions and concurrent processing 
+ * of parts of the network, we also need to support multiple, independent entry
+ * points and this class represents that. 
+ * 
+ * It replaces the function of the Rete Node class in previous designs.
+ * 
+ * @see ObjectTypeNode
+ *
+ * @author <a href="mailto:tirelli at post.com">Edson Tirelli</a>
+ */
+public class EntryPointNode extends ObjectSource
+    implements
+    Serializable,
+    ObjectSink {
+    // ------------------------------------------------------------
+    // Instance members
+    // ------------------------------------------------------------
+
+    private static final long   serialVersionUID = 420L;
+
+    /**
+     * The entry point ID for this node
+     */
+    private final EntryPoint    entryPoint;
+
+    /**
+     * The object type nodes under this node
+     */
+    private final Map<ObjectType, ObjectTypeNode> objectTypeNodes;
+
+    // ------------------------------------------------------------
+    // Constructors
+    // ------------------------------------------------------------
+
+    public EntryPointNode(final int id,
+                          final ObjectSource objectSource,
+                          final BuildContext context) {
+        this( id,
+              objectSource,
+              context.getCurrentEntryPoint() ); // irrelevant for this node, since it overrides sink management
+    }
+
+    public EntryPointNode(final int id,
+                          final ObjectSource objectSource,
+                          final EntryPoint entryPoint) {
+        super( id,
+               objectSource,
+               999 ); // irrelevant for this node, since it overrides sink management
+        this.entryPoint = entryPoint;
+        this.objectTypeNodes = new HashMap<ObjectType, ObjectTypeNode>();
+    }
+
+    // ------------------------------------------------------------
+    // Instance methods
+    // ------------------------------------------------------------
+
+    /**
+     * @return the entryPoint
+     */
+    public EntryPoint getEntryPoint() {
+        return entryPoint;
+    }
+
+    /**
+     * This is the entry point into the network for all asserted Facts. Iterates a cache
+     * of matching <code>ObjectTypdeNode</code>s asserting the Fact. If the cache does not
+     * exist it first iterates and builds the cache.
+     *
+     * @param handle
+     *            The FactHandle of the fact to assert
+     * @param context
+     *            The <code>PropagationContext</code> of the <code>WorkingMemory</code> action
+     * @param workingMemory
+     *            The working memory session.
+     */
+    public void assertObject(final InternalFactHandle handle,
+                             final PropagationContext context,
+                             final InternalWorkingMemory workingMemory) {
+
+        ObjectTypeConf objectTypeConf = workingMemory.getObjectTypeConf( this.entryPoint,
+                                                                         handle.getObject() );
+
+        // checks if shadow is enabled
+        if ( objectTypeConf.isShadowEnabled() ) {
+            // need to improve this
+            if ( !(handle.getObject() instanceof ShadowProxy) ) {
+                // replaces the actual object by its shadow before propagating
+                handle.setObject( objectTypeConf.getShadow( handle.getObject() ) );
+                handle.setShadowFact( true );
+            } else {
+                ((ShadowProxy) handle.getObject()).updateProxy();
+            }
+        }
+
+        ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes();
+
+        for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
+            cachedNodes[i].assertObject( handle,
+                                         context,
+                                         workingMemory );
+        }
+    }
+
+    /**
+     * Retract a fact object from this <code>RuleBase</code> and the specified
+     * <code>WorkingMemory</code>.
+     *
+     * @param handle
+     *            The handle of the fact to retract.
+     * @param workingMemory
+     *            The working memory session.
+     */
+    public void retractObject(final InternalFactHandle handle,
+                              final PropagationContext context,
+                              final InternalWorkingMemory workingMemory) {
+        final Object object = handle.getObject();
+
+        ObjectTypeConf objectTypeConf = workingMemory.getObjectTypeConf( this.entryPoint,
+                                                                         object );
+        ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes();
+
+        if ( cachedNodes == null ) {
+            // it is  possible that there are no ObjectTypeNodes for an  object being retracted
+            return;
+        }
+
+        for ( int i = 0; i < cachedNodes.length; i++ ) {
+            cachedNodes[i].retractObject( handle,
+                                          context,
+                                          workingMemory );
+        }
+    }
+
+    /**
+     * Adds the <code>ObjectSink</code> so that it may receive
+     * <code>Objects</code> propagated from this <code>ObjectSource</code>.
+     *
+     * @param objectSink
+     *            The <code>ObjectSink</code> to receive propagated
+     *            <code>Objects</code>. Rete only accepts <code>ObjectTypeNode</code>s
+     *            as parameters to this method, though.
+     */
+    protected void addObjectSink(final ObjectSink objectSink) {
+        final ObjectTypeNode node = (ObjectTypeNode) objectSink;
+        this.objectTypeNodes.put( node.getObjectType(),
+                                  node );
+    }
+
+    protected void removeObjectSink(final ObjectSink objectSink) {
+        final ObjectTypeNode node = (ObjectTypeNode) objectSink;
+        this.objectTypeNodes.remove( node.getObjectType() );
+    }
+
+    public void attach() {
+        this.objectSource.addObjectSink( this );
+    }
+
+    public void attach(final InternalWorkingMemory[] workingMemories) {
+        attach();
+
+        for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
+            final InternalWorkingMemory workingMemory = workingMemories[i];
+            final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
+                                                                                      PropagationContext.RULE_ADDITION,
+                                                                                      null,
+                                                                                      null );
+            this.objectSource.updateSink( this,
+                                          propagationContext,
+                                          workingMemory );
+        }
+    }
+
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
+        final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
+        removeObjectSink( objectTypeNode );
+        for ( int i = 0; i < workingMemories.length; i++ ) {
+            // clear the node memory for each working memory.
+            workingMemories[i].clearNodeMemory( (NodeMemory) node );
+        }
+    }
+
+    public Map<ObjectType, ObjectTypeNode> getObjectTypeNodes() {
+        return this.objectTypeNodes;
+    }
+
+    public int hashCode() {
+        return this.entryPoint.hashCode();
+    }
+
+    public boolean equals(final Object object) {
+        if ( object == this ) {
+            return true;
+        }
+
+        if ( object == null || !(object instanceof EntryPointNode) ) {
+            return false;
+        }
+
+        final EntryPointNode other = (EntryPointNode) object;
+        return this.entryPoint.equals( other.entryPoint );
+    }
+
+    public void updateSink(final ObjectSink sink,
+                           final PropagationContext context,
+                           final InternalWorkingMemory workingMemory) {
+        // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
+        final ObjectTypeNode node = (ObjectTypeNode) sink;
+        final ObjectType newObjectType = node.getObjectType();
+
+        for ( ObjectTypeConf objectTypeConf : workingMemory.getObjectTypeConfMap( this.entryPoint ).values() ) {
+            if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
+                objectTypeConf.resetCache();
+                ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
+                FactHashTable table = (FactHashTable) workingMemory.getNodeMemory( sourceNode );
+                Iterator factIter = table.iterator();
+                for ( FactEntry factEntry = (FactEntry) factIter.next(); factEntry != null; factEntry = (FactEntry) factIter.next() ) {
+                    sink.assertObject( factEntry.getFactHandle(),
+                                       context,
+                                       workingMemory );
+                }
+            }
+        }
+    }
+
+    public boolean isObjectMemoryEnabled() {
+        return false;
+    }
+
+    public void setObjectMemoryEnabled(boolean objectMemoryEnabled) {
+        throw new UnsupportedOperationException( "Entry Point Node has no Object memory" );
+    }
+    
+    public String toString() {
+        return "[EntryPointNode("+this.id+") "+this.entryPoint+" ]";
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -219,19 +219,19 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
+        removeShare(builder);
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        this.tupleSource.remove( builder,
+                                 this, workingMemories );
 
     }
     

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -32,18 +32,17 @@
     implements
     ObjectTypeConf,
     Serializable {
-    private InternalRuleBase ruleBase;
+
+    private static final long serialVersionUID = 4493660262148247467L;
+
     private FactTemplate     factTemplate;
     private ObjectTypeNode   concreteObjectTypeNode;
     private ObjectTypeNode[] cache;
-    private EntryPoint       entryPoint;
 
     public FactTemplateTypeConf(final EntryPoint entryPoint,
                                 final FactTemplate factTemplate,
                                 final InternalRuleBase ruleBase) {
-        this.ruleBase = ruleBase;
         this.factTemplate = factTemplate;
-        this.entryPoint = entryPoint;
 
         ObjectType objectType = new FactTemplateObjectType( factTemplate );
         this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes( entryPoint ).get( objectType );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -142,21 +142,21 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
 
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
+        removeShare(builder);
 
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        this.tupleSource.remove( builder,
+                                 this, workingMemories );
     }
 
     public void updateSink(final TupleSink sink,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -175,19 +175,19 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
             removeTupleSink( (TupleSink) node );
         }
-        removeShare();
+        removeShare(builder);
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
         }
-        this.objectSource.remove( this,
-                                  workingMemories );
+        this.objectSource.remove( builder,
+                                  this, workingMemories );
     }    
     
     public boolean isObjectMemoryEnabled() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/MemoryVisitor.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -35,9 +35,7 @@
      * Rete visits each of its ObjectTypeNodes.
      */
     public void visitRete(final Rete rete) {
-        final Map<ObjectType, ObjectTypeNode> map = rete.getObjectTypeNodes();
-
-        for( ObjectTypeNode node : map.values() ) {
+        for( ObjectTypeNode node : rete.getObjectTypeNodes() ) {
             visit( node );
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -72,15 +72,10 @@
     /** The <code>ObjectType</code> semantic module. */
     private final ObjectType  objectType;
 
-    /** The parent Rete node */
-    private final Rete        rete;
-
     private boolean           skipOnModify     = false;
 
     private boolean           objectMemoryEnabled;
 
-    private final EntryPoint  entryPoint;
-
     /**
      * Construct given a semantic <code>ObjectType</code> and the provided
      * unique id. All <code>ObjectTypdeNode</code> have node memory.
@@ -91,15 +86,14 @@
      *           The semantic object-type differentiator.
      */
     public ObjectTypeNode(final int id,
+                          final EntryPointNode source,
                           final ObjectType objectType,
                           final BuildContext context) {
         super( id,
-               context.getRuleBase().getRete(),
+               source,
                context.getRuleBase().getConfiguration().getAlphaNodeHashingThreshold() );
-        this.rete = (Rete) this.objectSource;
         this.objectType = objectType;
         setObjectMemoryEnabled( context.isObjectTypeNodeMemoryEnabled() );
-        this.entryPoint = context.getCurrentEntryPoint() == null ? EntryPoint.DEFAULT : context.getCurrentEntryPoint();
     }
 
     /**
@@ -203,7 +197,7 @@
      * Rete needs to know that this ObjectTypeNode has been added
      */
     public void attach() {
-        this.rete.addObjectSink( this );
+        this.objectSource.addObjectSink( this );
     }
 
     public void attach(final InternalWorkingMemory[] workingMemories) {
@@ -218,24 +212,24 @@
                                                                                           PropagationContext.RULE_ADDITION,
                                                                                           null,
                                                                                           null );
-            propagationContext.setEntryPoint( this.entryPoint );
-            this.rete.updateSink( this,
-                                  propagationContext,
-                                  workingMemory );
+            propagationContext.setEntryPoint( ((EntryPointNode) this.objectSource).getEntryPoint() );
+            this.objectSource.updateSink( this,
+                                          propagationContext,
+                                          workingMemory );
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
             removeObjectSink( (ObjectSink) node );
         }
-        removeShare();
+        removeShare(builder);
         if ( !this.isInUse() ) {
             for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
                 workingMemories[i].clearNodeMemory( this );
             }
-            this.rete.removeObjectSink( this );
+            this.objectSource.removeObjectSink( this );
         }
     }
 
@@ -265,14 +259,14 @@
     }
 
     public String toString() {
-        return "[ObjectTypeNode(" + this.id + ") " + this.entryPoint + " objectType=" + this.objectType + "]";
+        return "[ObjectTypeNode(" + this.id + ")::" + ((EntryPointNode)this.objectSource).getEntryPoint() + " objectType=" + this.objectType + "]";
     }
 
     /**
      * Uses he hashCode() of the underlying ObjectType implementation.
      */
     public int hashCode() {
-        return this.objectType.hashCode() ^ this.entryPoint.hashCode();
+        return this.objectType.hashCode() ^ this.objectSource.hashCode();
     }
 
     public boolean equals(final Object object) {
@@ -286,7 +280,7 @@
 
         final ObjectTypeNode other = (ObjectTypeNode) object;
 
-        return this.objectType.equals( other.objectType ) && this.entryPoint.equals( other.entryPoint );
+        return this.objectType.equals( other.objectType ) && this.objectSource.equals( other.objectSource );
     }
 
     /** 
@@ -353,6 +347,6 @@
      * @return the entryPoint
      */
     public EntryPoint getEntryPoint() {
-        return entryPoint;
+        return ((EntryPointNode)this.objectSource).getEntryPoint();
     }
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java (from rev 17906, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -0,0 +1,357 @@
+/*
+ * Copyright 2008 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.
+ */
+package org.drools.reteoo;
+
+import java.io.Serializable;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuntimeDroolsException;
+import org.drools.common.BaseNode;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.NodeMemory;
+import org.drools.common.WorkingMemoryAction;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.spi.PropagationContext;
+
+/**
+ * A node that will add the propagation to the working memory actions queue,
+ * in order to allow multiple threads to concurrently assert objects to multiple
+ * entry points.
+ * 
+ * @author etirelli
+ *
+ */
+public class PropagationQueuingNode extends ObjectSource
+    implements
+    ObjectSinkNode,
+    NodeMemory {
+
+    private static final long serialVersionUID = -615639068150958767L;
+    
+    // should we make this one configurable?
+    private static final int PROPAGATION_SLICE_LIMIT = 1000;
+
+    private ObjectSinkNode    previousObjectSinkNode;
+    private ObjectSinkNode    nextObjectSinkNode;
+    private PropagateAction   action;
+
+    /**
+     * Construct a <code>PropagationQueuingNode</code> that will queue up
+     * propagations until it the engine reaches a safe propagation point,
+     * when all the queued facts are propagated.
+     * 
+     * @param id Node's ID
+     * @param constraint Node's constraints
+     * @param objectSource Node's object source
+     * @param hasMemory true if node shall be configured with local memory. False otherwise.
+     */
+    public PropagationQueuingNode(final int id,
+                                  final ObjectSource objectSource,
+                                  final BuildContext context) {
+        super( id,
+               objectSource,
+               context.getRuleBase().getConfiguration().getAlphaNodeHashingThreshold() );
+        this.action = new PropagateAction( this );
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSource#updateSink(org.drools.reteoo.ObjectSink, org.drools.spi.PropagationContext, org.drools.common.InternalWorkingMemory)
+     */
+    @Override
+    public void updateSink(ObjectSink sink,
+                           PropagationContext context,
+                           InternalWorkingMemory workingMemory) {
+
+        final PropagationQueueingNodeMemory memory = (PropagationQueueingNodeMemory) workingMemory.getNodeMemory( this );
+
+        // this is just sanity code. We may remove it in the future, but keeping it for now.
+        if ( !memory.isEmpty() ) {
+            throw new RuntimeDroolsException( "Error updating sink. Not safe to update sink as the PropagatingQueueingNode memory is not for node: " + this.toString() );
+        }
+
+        // as this node is simply a queue, ask object source to update the child sink directly
+        this.objectSource.updateSink( sink,
+                                      context,
+                                      workingMemory );
+    }
+
+    /**
+     * @see org.drools.common.BaseNode#attach()
+     */
+    @Override
+    public void attach() {
+        this.objectSource.addObjectSink( this );
+    }
+
+    /**
+     * @see org.drools.common.BaseNode#attach(org.drools.common.InternalWorkingMemory[])
+     */
+    @Override
+    public void attach(InternalWorkingMemory[] workingMemories) {
+        attach();
+        // this node does not require update, so nothing else to do.
+    }
+
+    /**
+     * @see org.drools.common.BaseNode#remove(ReteooBuilder, org.drools.common.BaseNode, org.drools.common.InternalWorkingMemory[])
+     */
+    @Override
+    public void remove(ReteooBuilder builder,
+                       BaseNode node, InternalWorkingMemory[] workingMemories) {
+        if ( !node.isInUse() ) {
+            removeObjectSink( (ObjectSink) node );
+        }
+        removeShare(builder);
+        if ( !this.isInUse() ) {
+            for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
+                workingMemories[i].clearNodeMemory( this );
+            }
+        }
+        this.objectSource.remove( builder,
+                                  this, workingMemories );
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSinkNode#getNextObjectSinkNode()
+     */
+    public ObjectSinkNode getNextObjectSinkNode() {
+        return this.nextObjectSinkNode;
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSinkNode#getPreviousObjectSinkNode()
+     */
+    public ObjectSinkNode getPreviousObjectSinkNode() {
+        return this.previousObjectSinkNode;
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSinkNode#setNextObjectSinkNode(org.drools.reteoo.ObjectSinkNode)
+     */
+    public void setNextObjectSinkNode(ObjectSinkNode next) {
+        this.nextObjectSinkNode = next;
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSinkNode#setPreviousObjectSinkNode(org.drools.reteoo.ObjectSinkNode)
+     */
+    public void setPreviousObjectSinkNode(ObjectSinkNode previous) {
+        this.previousObjectSinkNode = previous;
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSink#assertObject(org.drools.common.InternalFactHandle, org.drools.spi.PropagationContext, org.drools.common.InternalWorkingMemory)
+     */
+    public void assertObject(InternalFactHandle handle,
+                             PropagationContext context,
+                             InternalWorkingMemory workingMemory) {
+        final PropagationQueueingNodeMemory memory = (PropagationQueueingNodeMemory) workingMemory.getNodeMemory( this );
+        memory.addAction( new AssertAction( handle,
+                                            context ) );
+
+        // if not queued yet, we need to queue it up
+        if ( memory.isQueued().compareAndSet( false,
+                                              true ) ) {
+            workingMemory.queueWorkingMemoryAction( this.action );
+        }
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSink#isObjectMemoryEnabled()
+     */
+    public boolean isObjectMemoryEnabled() {
+        return true;
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSink#retractObject(org.drools.common.InternalFactHandle, org.drools.spi.PropagationContext, org.drools.common.InternalWorkingMemory)
+     */
+    public void retractObject(InternalFactHandle handle,
+                              PropagationContext context,
+                              InternalWorkingMemory workingMemory) {
+        final PropagationQueueingNodeMemory memory = (PropagationQueueingNodeMemory) workingMemory.getNodeMemory( this );
+        memory.addAction( new RetractAction( handle,
+                                             context ) );
+
+        // if not queued yet, we need to queue it up
+        if ( memory.isQueued().compareAndSet( false,
+                                              true ) ) {
+            workingMemory.queueWorkingMemoryAction( this.action );
+        }
+    }
+
+    /**
+     * Propagate all queued actions (asserts and retracts).
+     * 
+     * This method implementation is based on optimistic behavior to avoid the 
+     * use of locks. There may eventually be a minimum wasted effort, but overall
+     * it will be better than paying for the lock's cost.
+     * 
+     * @param workingMemory
+     */
+    public void propagateActions(InternalWorkingMemory workingMemory) {
+        final PropagationQueueingNodeMemory memory = (PropagationQueueingNodeMemory) workingMemory.getNodeMemory( this );
+
+        // first we clear up the action queued flag
+        memory.isQueued().set( false );
+
+        // we limit the propagation to avoid a hang when this queue is never empty
+        Action next = memory.getNext();
+        for( int counter = 0; next != null && counter < PROPAGATION_SLICE_LIMIT; next = memory.getNext(), counter++ ) {
+            next.execute( this.sink, workingMemory );
+        }
+        
+        if( memory.hasNext() ) {
+            // add action to the queue again.
+            memory.isQueued().set( true );
+            workingMemory.queueWorkingMemoryAction( this.action );
+        }
+    }
+
+    /**
+     * @see org.drools.reteoo.ObjectSink#setObjectMemoryEnabled(boolean)
+     */
+    public void setObjectMemoryEnabled(boolean objectMemoryOn) {
+        throw new UnsupportedOperationException( "PropagationQueueingNode must have its node memory enabled." );
+    }
+
+    public Object createMemory(RuleBaseConfiguration config) {
+        return new PropagationQueueingNodeMemory();
+    }
+
+    /**
+     * Memory implementation for the node
+     * 
+     * @author etirelli
+     */
+    private static class PropagationQueueingNodeMemory
+        implements
+        Serializable {
+
+        private static final long             serialVersionUID = 7372028632974484023L;
+
+        private ConcurrentLinkedQueue<Action> queue;
+
+        // "singleton" action - there is one of this for each node in each working memory
+        private AtomicBoolean                 isQueued;
+
+        public PropagationQueueingNodeMemory() {
+            super();
+            this.queue = new ConcurrentLinkedQueue<Action>();
+            this.isQueued = new AtomicBoolean( false );
+        }
+
+        public boolean isEmpty() {
+            return this.queue.isEmpty();
+        }
+
+        public void addAction(Action action) {
+            this.queue.add( action );
+        }
+
+        public Action getNext() {
+            return this.queue.poll();
+        }
+
+        public boolean hasNext() {
+            return this.queue.peek() != null;
+        }
+
+        public AtomicBoolean isQueued() {
+            return isQueued;
+        }
+    }
+
+    private static abstract class Action
+        implements
+        Serializable {
+
+        protected final InternalFactHandle handle;
+        protected final PropagationContext context;
+
+        public Action(InternalFactHandle handle,
+                      PropagationContext context) {
+            super();
+            this.handle = handle;
+            this.context = context;
+        }
+
+        public abstract void execute(final ObjectSinkPropagator sink,
+                                     final InternalWorkingMemory workingMemory);
+    }
+
+    private static class AssertAction extends Action {
+        private static final long serialVersionUID = -8478488926430845209L;
+
+        public AssertAction(final InternalFactHandle handle,
+                            final PropagationContext context) {
+            super( handle,
+                   context );
+        }
+
+        public void execute(final ObjectSinkPropagator sink,
+                            final InternalWorkingMemory workingMemory) {
+            sink.propagateAssertObject( this.handle,
+                                        this.context,
+                                        workingMemory );
+        }
+    }
+
+    private static class RetractAction extends Action {
+        private static final long serialVersionUID = -84784886430845209L;
+
+        public RetractAction(final InternalFactHandle handle,
+                             final PropagationContext context) {
+            super( handle,
+                   context );
+        }
+
+        public void execute(final ObjectSinkPropagator sink,
+                            final InternalWorkingMemory workingMemory) {
+            sink.propagateRetractObject( this.handle,
+                                         this.context,
+                                         workingMemory,
+                                         true );
+        }
+    }
+
+    /**
+     * This is the action that is added to the working memory actions queue, so that
+     * this node propagation can be triggered at a safe point
+     * 
+     * @author etirelli
+     *
+     */
+    private static class PropagateAction
+        implements
+        WorkingMemoryAction {
+
+        private static final long      serialVersionUID = 6765029029501617115L;
+
+        private PropagationQueuingNode node;
+
+        public PropagateAction(PropagationQueuingNode node) {
+            this.node = node;
+        }
+
+        public void execute(InternalWorkingMemory workingMemory) {
+            this.node.propagateActions( workingMemory );
+        }
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/QueryTerminalNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -150,16 +150,16 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
             workingMemories[i].clearNodeMemory( this );
         }
         
-        removeShare();
+        removeShare(builder);
         
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        this.tupleSource.remove( builder,
+                                 this, workingMemories );
     }
 
     public void updateNewNode(final InternalWorkingMemory workingMemory,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -20,23 +20,22 @@
 import java.io.ObjectInputStream;
 import java.io.Serializable;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
-import org.drools.base.ShadowProxy;
 import org.drools.common.BaseNode;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.common.NodeMemory;
+import org.drools.reteoo.builder.BuildContext;
 import org.drools.rule.EntryPoint;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactEntry;
 import org.drools.util.FactHashTable;
 import org.drools.util.Iterator;
-import org.drools.util.ObjectHashMap;
-import org.drools.util.ObjectHashMap.ObjectEntry;
 
 /**
  * The Rete-OO network.
@@ -68,11 +67,11 @@
     /**
      *
      */
-    private static final long                    serialVersionUID = 400L;
+    private static final long                     serialVersionUID = 400L;
 
-    private final Map<EntryPoint, ObjectHashMap> entryPoints;
+    private final Map<EntryPoint, EntryPointNode> entryPoints;
 
-    private transient InternalRuleBase           ruleBase;
+    private transient InternalRuleBase            ruleBase;
 
     // ------------------------------------------------------------
     // Constructors
@@ -80,9 +79,7 @@
 
     public Rete(InternalRuleBase ruleBase) {
         super( 0 );
-        this.entryPoints = new HashMap<EntryPoint, ObjectHashMap>();
-        this.entryPoints.put( EntryPoint.DEFAULT,
-                              new ObjectHashMap() );
+        this.entryPoints = new HashMap<EntryPoint, EntryPointNode>();
         this.ruleBase = ruleBase;
     }
 
@@ -111,29 +108,10 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-
-        ObjectTypeConf objectTypeConf = workingMemory.getObjectTypeConf( context.getEntryPoint(),
-                                                                         handle.getObject() );
-
-        // checks if shadow is enabled
-        if ( objectTypeConf.isShadowEnabled() ) {
-            // need to improve this
-            if ( !(handle.getObject() instanceof ShadowProxy) ) {
-                // replaces the actual object by its shadow before propagating
-                handle.setObject( objectTypeConf.getShadow( handle.getObject() ) );
-                handle.setShadowFact( true );
-            } else {
-                ((ShadowProxy) handle.getObject()).updateProxy();
-            }
-        }
-
-        ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes();
-
-        for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
-            cachedNodes[i].assertObject( handle,
-                                         context,
-                                         workingMemory );
-        }
+        EntryPointNode node = this.entryPoints.get( context.getEntryPoint() );
+        node.assertObject( handle,
+                           context,
+                           workingMemory );
     }
 
     /**
@@ -148,22 +126,10 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
-        final Object object = handle.getObject();
-
-        ObjectTypeConf objectTypeConf = workingMemory.getObjectTypeConf( context.getEntryPoint(),
-                                                                         object );
-        ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes();
-
-        if ( cachedNodes == null ) {
-            // it is  possible that there are no ObjectTypeNodes for an  object being retracted
-            return;
-        }
-
-        for ( int i = 0; i < cachedNodes.length; i++ ) {
-            cachedNodes[i].retractObject( handle,
-                                          context,
-                                          workingMemory );
-        }
+        EntryPointNode node = this.entryPoints.get( context.getEntryPoint() );
+        node.retractObject( handle,
+                            context,
+                            workingMemory );
     }
 
     /**
@@ -176,21 +142,14 @@
      *            as parameters to this method, though.
      */
     protected void addObjectSink(final ObjectSink objectSink) {
-        final ObjectTypeNode node = (ObjectTypeNode) objectSink;
-        ObjectHashMap map = this.entryPoints.get( node.getEntryPoint() );
-        if ( map == null ) {
-            map = new ObjectHashMap();
-            this.entryPoints.put( node.getEntryPoint(),
-                                  map );
-        }
-        map.put( node.getObjectType(),
-                 node,
-                 true );
+        final EntryPointNode node = (EntryPointNode) objectSink;
+        this.entryPoints.put( node.getEntryPoint(),
+                              node );
     }
 
     protected void removeObjectSink(final ObjectSink objectSink) {
-        final ObjectTypeNode node = (ObjectTypeNode) objectSink;
-        this.entryPoints.get( node.getEntryPoint() ).remove( node.getObjectType() );
+        final EntryPointNode node = (EntryPointNode) objectSink;
+        this.entryPoints.remove( node.getEntryPoint() );
     }
 
     public void attach() {
@@ -201,29 +160,26 @@
         throw new UnsupportedOperationException( "cannot call attach() from the root Rete node" );
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
-        final ObjectTypeNode objectTypeNode = (ObjectTypeNode) node;
-        removeObjectSink( objectTypeNode );
-        for ( int i = 0; i < workingMemories.length; i++ ) {
-            // clear the node memory for each working memory.
-            workingMemories[i].clearNodeMemory( (NodeMemory) node );
-        }
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
+        final EntryPointNode entryPointNode = (EntryPointNode) node;
+        removeObjectSink( entryPointNode );
     }
+    
+    public EntryPointNode getEntryPointNode( final EntryPoint entryPoint ) {
+        return this.entryPoints.get( entryPoint );
+    }
 
-    public Map<ObjectType, ObjectTypeNode> getObjectTypeNodes() {
-        Map<ObjectType, ObjectTypeNode> allNodes = new HashMap<ObjectType, ObjectTypeNode>();
-        for( ObjectHashMap map : this.entryPoints.values() ) {
-            Iterator it = map.iterator();
-            for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
-                allNodes.put( (ObjectType) entry.getKey(), (ObjectTypeNode) entry.getValue() );
-            }
+    public List<ObjectTypeNode> getObjectTypeNodes() {
+        List<ObjectTypeNode> allNodes = new LinkedList<ObjectTypeNode>();
+        for( EntryPointNode node : this.entryPoints.values() ) {
+            allNodes.addAll(node.getObjectTypeNodes().values());
         }
         return allNodes;
     }
 
-    public ObjectHashMap getObjectTypeNodes(EntryPoint entryPoint) {
-        return this.entryPoints.get( entryPoint );
+    public Map<ObjectType, ObjectTypeNode> getObjectTypeNodes(EntryPoint entryPoint) {
+        return this.entryPoints.get( entryPoint ).getObjectTypeNodes();
     }
 
     public InternalRuleBase getRuleBase() {
@@ -250,23 +206,7 @@
     public void updateSink(final ObjectSink sink,
                            final PropagationContext context,
                            final InternalWorkingMemory workingMemory) {
-        // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
-        final ObjectTypeNode node = (ObjectTypeNode) sink;
-        final ObjectType newObjectType = node.getObjectType();
-
-        for ( ObjectTypeConf objectTypeConf : workingMemory.getObjectTypeConfMap( context.getEntryPoint() ).values() ) {
-            if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
-                objectTypeConf.resetCache();
-                ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
-                FactHashTable table = (FactHashTable) workingMemory.getNodeMemory( sourceNode );
-                Iterator factIter = table.iterator();
-                for ( FactEntry factEntry = (FactEntry) factIter.next(); factEntry != null; factEntry = (FactEntry) factIter.next() ) {
-                    sink.assertObject( factEntry.getFactHandle(),
-                                       context,
-                                       workingMemory );
-                }
-            }
-        }
+        // nothing to do, since Rete object itself holds no facts to propagate.
     }
 
     public boolean isObjectMemoryEnabled() {

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteStatelessSessionResult.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -6,6 +6,7 @@
 import org.drools.QueryResults;
 import org.drools.StatelessSessionResult;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.common.ObjectStore;
 import org.drools.spi.GlobalResolver;
 import org.drools.util.JavaIteratorAdapter;
 import org.drools.util.ObjectHashMap;
@@ -13,12 +14,13 @@
 
 public class ReteStatelessSessionResult implements StatelessSessionResult {
     private transient InternalWorkingMemory workingMemory;
-    private ObjectHashMap assertMap;
+    // @TODO ObjectStore is currently too heavy for serialisation, but done to fix for now
+    private ObjectStore objectStore;
     private GlobalResolver globalResolver;
     
     public ReteStatelessSessionResult(InternalWorkingMemory workingMemory, GlobalResolver globalResolver) {
         this.workingMemory = workingMemory;
-        this.assertMap = workingMemory.getAssertMap();
+        this.objectStore = workingMemory.getObjectStore();
         this.globalResolver = globalResolver;
     }
 
@@ -32,18 +34,11 @@
     }
 
     public Iterator iterateObjects() {
-        HashTableIterator iterator = new HashTableIterator( this.assertMap );
-        iterator.reset();
-        return new JavaIteratorAdapter( iterator,
-                                        JavaIteratorAdapter.OBJECT );
+        return this.objectStore.iterateObjects();
     }
 
     public Iterator iterateObjects(ObjectFilter filter) {
-        HashTableIterator iterator = new HashTableIterator( this.assertMap );
-        iterator.reset();
-        return new JavaIteratorAdapter( iterator,
-                                        JavaIteratorAdapter.OBJECT,
-                                        filter );
+        return this.objectStore.iterateObjects( filter );
     }
     
     public Object getGlobal(String identifier) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -24,9 +24,14 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Queue;
 import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.drools.RuleIntegrationException;
 import org.drools.base.SalienceInteger;
@@ -37,7 +42,6 @@
 import org.drools.reteoo.builder.ReteooRuleBuilder;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Rule;
-import org.drools.spi.AgendaGroup;
 import org.drools.spi.Salience;
 
 /**
@@ -62,7 +66,7 @@
     private static final long                 serialVersionUID = 400L;
 
     /** The RuleBase */
-    private transient InternalRuleBase          ruleBase;
+    private transient InternalRuleBase        ruleBase;
 
     private transient InternalWorkingMemory[] workingMemories;
 
@@ -71,7 +75,7 @@
     private transient ReteooRuleBuilder       ruleBuilder;
 
     private IdGenerator                       idGenerator;
-    
+
     private boolean                           ordered;
 
     // ------------------------------------------------------------
@@ -95,7 +99,7 @@
                                                      ClassNotFoundException {
         stream.defaultReadObject();
         this.ruleBase = ((DroolsObjectInputStream) stream).getRuleBase();
-        this.ruleBuilder = new ReteooRuleBuilder();        
+        this.ruleBuilder = new ReteooRuleBuilder();
     }
 
     // ------------------------------------------------------------
@@ -121,84 +125,91 @@
         this.rules.put( rule,
                         terminals.toArray( new BaseNode[terminals.size()] ) );
     }
-    
+
     public IdGenerator getIdGenerator() {
         return this.idGenerator;
     }
-    
+
     public void order() {
         if ( ordered ) {
             // we should only do this on first call, its expected the RuleBase should not change afterwards.
             return;
         }
         Map map = new HashMap();
-        
+
         for ( Iterator it = this.rules.values().iterator(); it.hasNext(); ) {
             BaseNode[] nodes = (BaseNode[]) it.next();
-            for ( int i = 0 ; i < nodes.length; i++ ) {
+            for ( int i = 0; i < nodes.length; i++ ) {
                 if ( nodes[i] instanceof RuleTerminalNode ) {
-                    RuleTerminalNode node = ( RuleTerminalNode ) nodes[i];
+                    RuleTerminalNode node = (RuleTerminalNode) nodes[i];
                     String agendaGroup = node.getRule().getAgendaGroup();
                     if ( agendaGroup == null || agendaGroup.equals( "" ) ) {
                         agendaGroup = "MAIN";
                     }
-                    List rules = ( List ) map.get( agendaGroup );
+                    List rules = (List) map.get( agendaGroup );
                     if ( rules == null ) {
                         rules = new ArrayList();
-                        map.put( agendaGroup, rules );
+                        map.put( agendaGroup,
+                                 rules );
                     }
                     rules.add( node );
                 }
             }
         }
-        
+
         for ( Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
-            Entry entry = ( Entry ) it.next();
+            Entry entry = (Entry) it.next();
             String agendaGroup = (String) entry.getKey();
-            List rules = ( List ) entry.getValue();
-            Collections.sort( rules, RuleSequenceComparator.INSTANCE );
-            
+            List rules = (List) entry.getValue();
+            Collections.sort( rules,
+                              RuleSequenceComparator.INSTANCE );
+
             int i = 0;
             for ( Iterator listIter = rules.iterator(); listIter.hasNext(); ) {
-                RuleTerminalNode node = ( RuleTerminalNode ) listIter.next();
+                RuleTerminalNode node = (RuleTerminalNode) listIter.next();
                 node.setSequence( i++ );
             }
-            
-            ruleBase.getAgendaGroupRuleTotals().put( agendaGroup, new Integer( i ) );
+
+            ruleBase.getAgendaGroupRuleTotals().put( agendaGroup,
+                                                     new Integer( i ) );
         }
         ordered = true;
     }
 
-    public static class RuleSequenceComparator implements Comparator {
+    public static class RuleSequenceComparator
+        implements
+        Comparator {
         public final static RuleSequenceComparator INSTANCE = new RuleSequenceComparator();
 
         public int compare(Object o1,
                            Object o2) {
             RuleTerminalNode r1 = (RuleTerminalNode) o1;
             RuleTerminalNode r2 = (RuleTerminalNode) o2;
-            
+
             Salience so1 = r1.getRule().getSalience();
-            if (so1 != null && !(so1 instanceof SalienceInteger) ) {
-                throw new RuntimeException(r1.getRule().getName() + "must not have a dynamic salience" );
+            if ( so1 != null && !(so1 instanceof SalienceInteger) ) {
+                throw new RuntimeException( r1.getRule().getName() + "must not have a dynamic salience" );
             }
             Salience so2 = r2.getRule().getSalience();
-            if (so2 != null && !(so2 instanceof SalienceInteger) ) {
-                throw new RuntimeException(r2.getRule().getName() + "must not have a dynamic salience" );
+            if ( so2 != null && !(so2 instanceof SalienceInteger) ) {
+                throw new RuntimeException( r2.getRule().getName() + "must not have a dynamic salience" );
             }
-            
-            int s1 = so1.getValue( null, null );
-            int s2 = so2.getValue( null, null );
-            
-            if ( s1 >  s2) {                        
+
+            int s1 = so1.getValue( null,
+                                   null );
+            int s2 = so2.getValue( null,
+                                   null );
+
+            if ( s1 > s2 ) {
                 return -1;
             } else if ( s1 < s2 ) {
                 return 1;
-            } 
-            
-            int id1 =r1.getId();
-            int id2 =r2.getId();
-            
-            if ( id1 <  id2) {                        
+            }
+
+            int id1 = r1.getId();
+            int id2 = r2.getId();
+
+            if ( id1 < id2 ) {
                 return -1;
             } else if ( id1 > id2 ) {
                 return 1;
@@ -206,9 +217,9 @@
                 return 0;
             }
         }
-        
+
     }
-    
+
     public BaseNode[] getTerminalNodes(final Rule rule) {
         return (BaseNode[]) this.rules.get( rule );
     }
@@ -222,7 +233,8 @@
         final BaseNode[] nodes = (BaseNode[]) object;
         for ( int i = 0, length = nodes.length; i < length; i++ ) {
             final BaseNode node = nodes[i];
-            node.remove( null,
+            node.remove( this,
+                         null,
                          this.workingMemories );
         }
     }
@@ -233,20 +245,34 @@
 
         private static final long serialVersionUID = 400L;
 
+        private Queue<Integer>    recycledIds;
         private int               nextId;
 
         public IdGenerator(final int firstId) {
             this.nextId = firstId;
+            this.recycledIds = new LinkedList<Integer>();
         }
 
         public int getNextId() {
-            return this.nextId++;
+            Integer id = this.recycledIds.poll();
+            if( id == null ) {
+                return this.nextId++;
+            }
+            return id.intValue();
         }
 
         public void releaseLastId() {
             this.nextId--;
         }
+        
+        public void releaseId( int id ) {
+            this.recycledIds.add( new Integer(id) );
+        }
 
+        public int getLastId() {
+            return this.nextId-1;
+        }
+
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -50,6 +50,29 @@
                                           recency );
         }
     }
+    
+    /* (non-Javadoc)
+     * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
+     */
+    protected final InternalFactHandle newFactHandle(final long id,
+                                                     final Object object,
+                                                     final long recency,
+                                                     final boolean isEvent,
+                                                     final long duration,
+                                                     final WorkingMemory workingMemory ) {
+        if ( isEvent ) {
+            SessionClock clock = ((TemporalSession) workingMemory).getSessionClock(); 
+            return new EventFactHandle( id,
+                                        object,
+                                        recency,
+                                        clock.getCurrentTime(),
+                                        duration );  // primitive events have 0 duration
+        } else {
+            return new DefaultFactHandle( id,
+                                          object,
+                                          recency );
+        }
+    }
 
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#newInstance()

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -38,6 +38,8 @@
 import org.drools.concurrent.ExecutorService;
 import org.drools.event.RuleBaseEventListener;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.rule.EntryPoint;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
@@ -61,10 +63,10 @@
     private static final long serialVersionUID = 400L;
 
     /** The root Rete-OO for this <code>RuleBase</code>. */
-    private transient Rete              rete;
+    private transient Rete    rete;
 
     private ReteooBuilder     reteooBuilder;
-    
+
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -129,6 +131,13 @@
                factHandleFactory );
         this.rete = new Rete( this );
         this.reteooBuilder = new ReteooBuilder( this );
+        
+        // always add the default entry point
+        EntryPointNode epn = new EntryPointNode( this.reteooBuilder.getIdGenerator().getNextId(), 
+                                                 this.rete,
+                                                 EntryPoint.DEFAULT );
+        epn.attach();
+        
     }
 
     /**
@@ -149,12 +158,12 @@
     public void readExternal(final ObjectInput stream) throws IOException,
                                                       ClassNotFoundException {
         doReadExternal( stream );
-        
+
         // rebuild the Rete network from the pkg information
         this.reteooBuilder = new ReteooBuilder( this );
-        this.rete = new Rete( this );        
-        synchronized ( this.pkgs ) {            
-            for (Package pkg : this.pkgs.values() ) {
+        this.rete = new Rete( this );
+        synchronized ( this.pkgs ) {
+            for ( Package pkg : this.pkgs.values() ) {
                 for ( Rule rule : pkg.getRules() ) {
                     addRule( rule );
                 }
@@ -174,7 +183,7 @@
     public Rete getRete() {
         return this.rete;
     }
-    
+
     public ReteooBuilder getReteooBuilder() {
         return this.reteooBuilder;
     }
@@ -220,50 +229,57 @@
                                  workingMemory );
     }
 
-    public synchronized StatefulSession newStatefulSession( final boolean keepReference ) {
-        return newStatefulSession( keepReference, null );
+    public synchronized StatefulSession newStatefulSession(final boolean keepReference) {
+        return newStatefulSession( keepReference,
+                                   null );
     }
-    
-    public synchronized TemporalSession newTemporalSession( final ClockType clockType ) {
-        return (TemporalSession) newStatefulSession( true, clockType);
+
+    public synchronized TemporalSession newTemporalSession(final ClockType clockType) {
+        return (TemporalSession) newStatefulSession( true,
+                                                     clockType );
     }
-    
-    public synchronized TemporalSession newTemporalSession( final boolean keepReference, final ClockType clockType ) {
-        return (TemporalSession) newStatefulSession( keepReference, clockType );
+
+    public synchronized TemporalSession newTemporalSession(final boolean keepReference,
+                                                           final ClockType clockType) {
+        return (TemporalSession) newStatefulSession( keepReference,
+                                                     clockType );
     }
-    
+
     /**
      * @see RuleBase
      */
-    private StatefulSession newStatefulSession( final boolean keepReference, final ClockType clockType ) {
+    private StatefulSession newStatefulSession(final boolean keepReference,
+                                               final ClockType clockType) {
         if ( this.config.isSequential() ) {
             throw new RuntimeException( "Cannot have a stateful rule session, with sequential configuration set to true" );
         }
         ReteooStatefulSession session = null;
 
         synchronized ( this.pkgs ) {
-            ExecutorService executor = ExecutorServiceFactory.createExecutorService(  this.config.getExecutorService() );;
-            if( clockType == null ) {
+            ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );;
+            if ( clockType == null ) {
                 session = new ReteooStatefulSession( nextWorkingMemoryCounter(),
                                                      this,
                                                      executor );
             } else {
                 session = new ReteooTemporalSession( nextWorkingMemoryCounter(),
-                                                             this,
-                                                             executor,
-                                                             clockType.createInstance() );
+                                                     this,
+                                                     executor,
+                                                     clockType.createInstance() );
             }
 
             executor.setCommandExecutor( new CommandExecutor( session ) );
 
             if ( keepReference ) {
                 super.addStatefulSession( session );
-                for( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
-                    addEventListener( (RuleBaseEventListener) it.next() ); 
+                for ( Iterator it = session.getRuleBaseUpdateListeners().iterator(); it.hasNext(); ) {
+                    addEventListener( (RuleBaseEventListener) it.next() );
                 }
             }
 
-            final InitialFactHandle handle = new InitialFactHandle( session.getFactHandleFactory().newFactHandle( new InitialFactHandleDummyObject(), false, session ) );
+            final InitialFactHandle handle = new InitialFactHandle( session.getFactHandleFactory().newFactHandle( new InitialFactHandleDummyObject(),
+                                                                                                                  false,
+                                                                                                                  session ) );
 
             session.queueWorkingMemoryAction( new WorkingMemoryReteAssertAction( handle,
                                                                                  false,
@@ -271,10 +287,10 @@
                                                                                  null,
                                                                                  null ) );
         }
-        
+
         return session;
     }
-    
+
     public StatelessSession newStatelessSession() {
 
         //orders the rules
@@ -295,11 +311,15 @@
     protected synchronized void removeRule(final Rule rule) {
         this.reteooBuilder.removeRule( rule );
     }
+    
+    public int getNodeCount() {
+        return this.reteooBuilder.getIdGenerator().getLastId();
+    }
 
     public static class InitialFactHandleDummyObject
         implements
         Serializable {
         private static final long serialVersionUID = 400L;
     }
-    
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -89,7 +89,7 @@
     public QueryResults getQueryResults(final String query, final Object[] arguments) {
 
         Object object = new DroolsQuery( query, arguments );
-        InternalFactHandle handle = this.handleFactory.newFactHandle( object, false, this );
+        InternalFactHandle handle = this.handleFactory.newFactHandle( object, false, 0, this );
         
         insert( EntryPoint.DEFAULT, // query dummy objects always use default entry point
                 handle,
@@ -119,10 +119,12 @@
             }
             list = Collections.EMPTY_LIST;
         } else {
-            list = (List) this.nodeMemories.remove( node.getId() );
+            list = (List) this.getNodeMemory( node );
             
             if ( list == null ) {
                 list = Collections.EMPTY_LIST;
+            } else {
+                this.clearNodeMemory( node );
             }
             queryObj = (Query) node.getRule();
             

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -165,14 +165,14 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         if ( !node.isInUse() ) {
             removeObjectSink( (ObjectSink) node );
         }
-        removeShare();
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        removeShare(builder);
+        this.tupleSource.remove( builder,
+                                 this, workingMemories );
     }
     
     public boolean isTupleMemoryEnabled() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -432,8 +432,8 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
             final InternalWorkingMemory workingMemory = workingMemories[i];
 
@@ -461,10 +461,10 @@
             workingMemory.clearNodeMemory( this );
         }
 
-        removeShare();
+        removeShare(builder);
 
-        this.tupleSource.remove( this,
-                                 workingMemories );
+        this.tupleSource.remove( builder,
+                                 this, workingMemories );
     }
 
     public Object createMemory(final RuleBaseConfiguration config) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -31,6 +31,7 @@
 import org.drools.common.QuadroupleBetaConstraints;
 import org.drools.common.SingleBetaConstraints;
 import org.drools.common.TripleBetaConstraints;
+import org.drools.reteoo.EntryPointNode;
 import org.drools.reteoo.ObjectSink;
 import org.drools.reteoo.ObjectSource;
 import org.drools.reteoo.ObjectTypeNode;
@@ -40,7 +41,7 @@
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.RuleConditionElement;
 import org.drools.spi.BetaNodeFieldConstraint;
-import org.drools.util.ObjectHashMap;
+import org.drools.spi.ObjectType;
 
 /**
  * Utility functions for reteoo build
@@ -83,17 +84,23 @@
      *            The node to attach.
      *            
      * @return the actual attached node that may be the one given as parameter
-     *         or eventualy one that was already in the cache if sharing is enabled
+     *         or eventually one that was already in the cache if sharing is enabled
      */
     public BaseNode attachNode(final BuildContext context,
                                final BaseNode candidate) {
         BaseNode node = null;
-        if( candidate instanceof ObjectTypeNode ) {
+        if( candidate instanceof EntryPointNode ) {
+            // entry point nodes are always shared
+            EntryPointNode epn = context.getRuleBase().getRete().getEntryPointNode( ((EntryPointNode)candidate).getEntryPoint() );
+            if( epn != null ) {
+                node = epn;
+            }
+        } else if( candidate instanceof ObjectTypeNode ) {
             // object type nodes are always shared
             ObjectTypeNode otn = (ObjectTypeNode) candidate;
-            ObjectHashMap map = context.getRuleBase().getRete().getObjectTypeNodes( context.getCurrentEntryPoint() );
+            Map<ObjectType, ObjectTypeNode> map = context.getRuleBase().getRete().getObjectTypeNodes( context.getCurrentEntryPoint() );
             if( map != null ) {
-                otn = (ObjectTypeNode) map.get( otn.getObjectType() );
+                otn = map.get( otn.getObjectType() );
                 if ( otn != null ) {
                     node = otn;
                 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -25,8 +25,10 @@
 import org.drools.common.InstanceNotEqualsConstraint;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.AlphaNode;
+import org.drools.reteoo.EntryPointNode;
 import org.drools.reteoo.ObjectSource;
 import org.drools.reteoo.ObjectTypeNode;
+import org.drools.reteoo.PropagationQueuingNode;
 import org.drools.rule.Declaration;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.InvalidPatternException;
@@ -93,15 +95,23 @@
                            source );
             // restoring offset
             context.setCurrentPatternOffset( currentOffset );
-            
+
         }
-        
-        if( pattern.getSource() == null || context.getCurrentEntryPoint() != EntryPoint.DEFAULT ) {
+
+        if ( pattern.getSource() == null || context.getCurrentEntryPoint() != EntryPoint.DEFAULT ) {
             attachAlphaNodes( context,
                               utils,
                               pattern,
                               alphaConstraints );
-            context.setCurrentEntryPoint( EntryPoint.DEFAULT );
+
+            if ( context.getCurrentEntryPoint() != EntryPoint.DEFAULT ) {
+                context.setObjectSource( (ObjectSource) utils.attachNode( context,
+                                                                          new PropagationQueuingNode( context.getNextId(),
+                                                                                                      context.getObjectSource(),
+                                                                                                      context ) ) );
+                // the entry-point specific network nodes are attached, so, set context to default entry-point 
+                context.setCurrentEntryPoint( EntryPoint.DEFAULT );
+            }
         }
 
         // last thing to do is increment the offset, since if the pattern has a source,
@@ -152,20 +162,34 @@
 
     public static ObjectTypeNode attachObjectTypeNode(BuildContext context,
                                                       ObjectType objectType) {
-        synchronized ( context.getRuleBase().getPackagesMap() ) {                           
+        synchronized ( context.getRuleBase().getPackagesMap() ) {
+            InternalWorkingMemory[] wms = context.getWorkingMemories();
+
+            EntryPointNode epn = context.getRuleBase().getRete().getEntryPointNode( context.getCurrentEntryPoint() );
+            if ( epn == null ) {
+                epn = new EntryPointNode( context.getNextId(),
+                                          context.getRuleBase().getRete(),
+                                          context );
+                if ( wms.length > 0 ) {
+                    epn.attach( wms );
+                } else {
+                    epn.attach();
+                }
+            }
+
             ObjectTypeNode otn = new ObjectTypeNode( context.getNextId(),
+                                                     epn,
                                                      objectType,
                                                      context );
-    
-            InternalWorkingMemory[] wms = context.getWorkingMemories();
+
             if ( wms.length > 0 ) {
                 otn.attach( wms );
             } else {
                 otn.attach();
             }
-    
+
             return otn;
-        } 
+        }
     }
 
     public void attachAlphaNodes(final BuildContext context,
@@ -175,10 +199,10 @@
 
         // Drools Query ObjectTypeNode never has memory, but other ObjectTypeNode/AlphaNoesNodes may (if not in sequential), 
         //so need to preserve, so we can resotre after this node is added. LeftMemory  and Terminal remain the same once set.
-        
-        boolean objectMemory = context.isObjectTypeNodeMemoryEnabled(); 
+
+        boolean objectMemory = context.isObjectTypeNodeMemoryEnabled();
         boolean alphaMemory = context.isAlphaMemoryAllowed();
-                
+
         if ( pattern.getObjectType() instanceof ClassObjectType ) {
             // Is this the query node, if so we don't want any memory
             if ( DroolsQuery.class == ((ClassObjectType) pattern.getObjectType()).getClassType() ) {
@@ -190,7 +214,13 @@
         }
 
         context.setObjectSource( (ObjectSource) utils.attachNode( context,
+                                                                  new EntryPointNode( context.getNextId(),
+                                                                                      context.getRuleBase().getRete(),
+                                                                                      context ) ) );
+
+        context.setObjectSource( (ObjectSource) utils.attachNode( context,
                                                                   new ObjectTypeNode( context.getNextId(),
+                                                                                      (EntryPointNode) context.getObjectSource(),
                                                                                       pattern.getObjectType(),
                                                                                       context ) ) );
 
@@ -203,7 +233,7 @@
                                                                                      context.getObjectSource(),
                                                                                      context ) ) );
         }
-        
+
         // now restore back to original values
         context.setObjectTypeNodeMemoryEnabled( objectMemory );
         context.setAlphaNodeMemoryAllowed( alphaMemory );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -33,12 +33,19 @@
 public interface FactHandleFactory
     extends
     Serializable {
-    /**
+   /**
      * Construct a handle with a new id.
      * 
      * @return The handle.
      */
     InternalFactHandle newFactHandle(Object object, boolean isEvent, WorkingMemory workingMemory );
+    
+    /**
+     * Construct a handle with a new id and a duration.
+     * 
+     * @return The handle.
+     */
+    InternalFactHandle newFactHandle(Object object, boolean isEvent, long duration, WorkingMemory workingMemory );
 
     /**
      * Increases the recency of the FactHandle

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -56,6 +56,17 @@
      *             returned as a FactException
      */
     void insert(Object object) throws FactException;
+    
+    /**
+     * Asserts an object, notice that it does not return the FactHandle
+     * 
+     * @param object -
+     *            the object to be asserted
+     * @throws FactException -
+     *             Exceptions can be thrown by conditions which are wrapped and
+     *             returned as a FactException
+     */
+    void insert(Object object, long duration) throws FactException;
 
     /**
      * Asserts an object specifying that it implement the onPropertyChange
@@ -71,11 +82,33 @@
      */
     void insert(Object object,
                       boolean dynamic) throws FactException;
+    
+    /**
+     * Asserts an object specifying that it implement the onPropertyChange
+     * listener, notice that it does not return the FactHandle.
+     * 
+     * @param object -
+     *            the object to be asserted
+     * @param dynamic -
+     *            specifies the object implements onPropertyChangeListener
+     * @throws FactException -
+     *             Exceptions can be thrown by conditions which are wrapped and
+     *             returned as a FactException
+     */
+    void insert(Object object,
+    			long duration,
+                boolean dynamic) throws FactException;
 
     public void insertLogical(Object object) throws FactException;
+    
+    public void insertLogical(Object object, long duration) throws FactException;
 
     public void insertLogical(Object object,
                                     boolean dynamic) throws FactException;
+    
+    public void insertLogical(Object object,
+    						  long duration,
+    						  boolean dynamic) throws FactException;
 
     void update(FactHandle handle,
                       Object newObject) throws FactException;

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AddRemoveTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AddRemoveTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AddRemoveTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -17,10 +17,8 @@
  */
 
 import org.drools.DroolsTestCase;
-import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassObjectType;
-import org.drools.common.InternalRuleBase;
 import org.drools.reteoo.builder.BuildContext;
 
 public class AddRemoveTest extends DroolsTestCase {
@@ -31,8 +29,14 @@
          */
         final ReteooRuleBase ruleBase = ( ReteooRuleBase ) RuleBaseFactory.newRuleBase();        
         BuildContext context = new BuildContext(ruleBase, ruleBase.getReteooBuilder().getIdGenerator() );
+        
+        final EntryPointNode entryPoint = new EntryPointNode( -1,
+                                                              ruleBase.getRete(),
+                                                              context );
+        entryPoint.attach();
                         
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
+                                                                  entryPoint,
                                                                   new ClassObjectType( Object.class ),
                                                                   context );
         objectTypeNode.attach();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/BaseNodeTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -60,8 +60,8 @@
 
         }
 
-        public void remove(final BaseNode node,
-                           final InternalWorkingMemory[] workingMemories) {
+        public void remove(ReteooBuilder builder,
+                           final BaseNode node, final InternalWorkingMemory[] workingMemories) {
             // TODO Auto-generated method stub
 
         }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -21,7 +21,6 @@
 import org.drools.DroolsTestCase;
 import org.drools.FactException;
 import org.drools.FactHandle;
-import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
@@ -30,8 +29,6 @@
 import org.drools.base.ShadowProxy;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalAgenda;
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.reteoo.ReteooBuilder.IdGenerator;
 import org.drools.reteoo.builder.BuildContext;
@@ -43,10 +40,15 @@
 public class LogicalAssertionTest extends DroolsTestCase {
     private ReteooRuleBase ruleBase;
     private BuildContext buildContext;
+    private EntryPointNode entryPoint;
     
     protected void setUp() throws Exception {
         ruleBase = ( ReteooRuleBase ) RuleBaseFactory.newRuleBase();
         buildContext = new BuildContext( ruleBase, ((ReteooRuleBase)ruleBase).getReteooBuilder().getIdGenerator() );
+        this.entryPoint = new EntryPointNode( 0,
+                                              this.ruleBase.getRete(),
+                                              buildContext );
+        this.entryPoint.attach();
     }
     
     public void testSingleLogicalRelationship() throws Exception {
@@ -56,6 +58,7 @@
         // create a RuleBase with a single ObjectTypeNode we attach a
         // MockObjectSink so we can detect assertions and retractions
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -158,6 +161,7 @@
 
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -248,6 +252,7 @@
 
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -389,7 +394,13 @@
         IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
 
         final Rete rete = ruleBase.getRete();
+        final EntryPointNode entryPoint = new EntryPointNode( 0,
+                                                              rete,
+                                                              buildContext );
+        entryPoint.attach();
+        
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -478,6 +489,7 @@
 
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -578,6 +590,7 @@
         // Create a RuleBase with a single ObjectTypeNode we attach a
         // MockObjectSink so we can detect assertions and retractions
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -708,6 +721,7 @@
 
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -809,6 +823,7 @@
 
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         objectTypeNode.attach();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockObjectSource.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -71,8 +71,8 @@
         }
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         // TODO Auto-generated method stub
 
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSink.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -96,8 +96,8 @@
 
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         // TODO Auto-generated method stub
 
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/MockTupleSource.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -53,8 +53,8 @@
         this.updated++;
     }
 
-    public void remove(final BaseNode node,
-                       final InternalWorkingMemory[] workingMemories) {
+    public void remove(ReteooBuilder builder,
+                       final BaseNode node, final InternalWorkingMemory[] workingMemories) {
         // TODO Auto-generated method stub
 
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -45,10 +45,15 @@
 public class ObjectTypeNodeTest extends DroolsTestCase {
     private ReteooRuleBase ruleBase;
     private BuildContext buildContext;
+    private EntryPointNode entryPoint;
     
     protected void setUp() throws Exception {
         this.ruleBase = ( ReteooRuleBase ) RuleBaseFactory.newRuleBase();
         this.buildContext = new BuildContext( ruleBase, ((ReteooRuleBase)ruleBase).getReteooBuilder().getIdGenerator() );
+        this.entryPoint = new EntryPointNode( 0,
+                                              this.ruleBase.getRete(),
+                                              buildContext );
+        this.entryPoint.attach();
     }
     
     public void testAttach() throws Exception {
@@ -60,13 +65,14 @@
 
         int id = idGenerator.getNextId();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( id,
+                                                                  this.entryPoint,
                                                                   objectType,
                                                                   buildContext );
 
         assertEquals( id,
                       objectTypeNode.getId() );
 
-        ObjectHashMap map = source.getObjectTypeNodes( EntryPoint.DEFAULT );
+        Map<ObjectType, ObjectTypeNode> map = source.getObjectTypeNodes( EntryPoint.DEFAULT );
 
         assertEquals( 0,
                       map.size() );
@@ -93,7 +99,13 @@
 
         final Rete source = ruleBase.getRete();
 
+        final EntryPointNode entryPoint = new EntryPointNode( 0,
+                                                              source, 
+                                                              buildContext );
+        entryPoint.attach();
+
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
 
@@ -140,7 +152,13 @@
 
         final Rete source = ruleBase.getRete();
 
+        final EntryPointNode entryPoint = new EntryPointNode( 0,
+                                                              source, 
+                                                              buildContext );
+        entryPoint.attach();
+
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
 
@@ -176,6 +194,7 @@
         final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) ruleBase.newStatefulSession();
 
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
 
@@ -190,6 +209,7 @@
         final Rete source = new Rete((InternalRuleBase) ruleBase);
 
         ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                            this.entryPoint,
                                                             new ClassObjectType( String.class ),
                                                             buildContext );
 
@@ -198,6 +218,7 @@
         assertTrue( objectTypeNode.matches( "string" ) );
 
         objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                             this.entryPoint,
                                              new ClassObjectType( Object.class ),
                                              buildContext );
 
@@ -220,6 +241,7 @@
         final Rete source = new Rete((InternalRuleBase) ruleBase);
 
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
 
@@ -271,6 +293,7 @@
         final Rete source = new Rete( (InternalRuleBase)ruleBase);
 
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
 
@@ -335,13 +358,19 @@
 
         final Rete source = ruleBase.getRete();
 
+        final EntryPointNode entryPoint = new EntryPointNode( 0,
+                                                              source, 
+                                                              buildContext );
+        entryPoint.attach();
+
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( Cheese.class  ),
                                                                   buildContext );
 
         final MockObjectSink sink = new MockObjectSink();
         objectTypeNode.addObjectSink( sink );
-        source.addObjectSink( objectTypeNode );
+        entryPoint.addObjectSink( objectTypeNode );
 
         final Object cheese = new Cheese( "muzzarela",
                                           5 );
@@ -374,9 +403,15 @@
         final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) ruleBase.newStatefulSession();
 
         final Rete source = ruleBase.getRete();
+        
+        final EntryPointNode entryPoint = new EntryPointNode( 0,
+                                                              source, 
+                                                              buildContext );
+        entryPoint.attach();
 
         final Class shadowClass = ShadowProxyFactory.getProxy( Person.class );
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                  entryPoint,
                                                                   new ClassObjectType( Person.class ),
                                                                   buildContext );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/PropertyChangeListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/PropertyChangeListenerTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/PropertyChangeListenerTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -12,16 +12,22 @@
 public class PropertyChangeListenerTest extends TestCase {
     private ReteooRuleBase ruleBase;
     private BuildContext buildContext;
+    private EntryPointNode entryPoint;
     
     protected void setUp() throws Exception {
         this.ruleBase = ( ReteooRuleBase ) RuleBaseFactory.newRuleBase();
         this.buildContext = new BuildContext( ruleBase, ((ReteooRuleBase)ruleBase).getReteooBuilder().getIdGenerator() );
+        this.entryPoint = new EntryPointNode( 0,
+                                              this.ruleBase.getRete(),
+                                              buildContext );
+        this.entryPoint.attach();
     }
     
     public void test1() {
         final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
 
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( State.class ),
                                                                   buildContext );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -46,6 +46,7 @@
 public class QueryTerminalNodeTest extends TestCase {
     private ReteooRuleBase   ruleBase;
     private BuildContext     buildContext;
+    private EntryPointNode   entryPoint;
 
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
     private EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
@@ -54,11 +55,16 @@
         this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         this.buildContext = new BuildContext( ruleBase,
                                               ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
+        this.entryPoint = new EntryPointNode( 0,
+                                              this.ruleBase.getRete(),
+                                              buildContext );
+        this.entryPoint.attach();
     }
 
     public void testQueryTerminalNode() {
         final ClassObjectType queryObjectType = new ClassObjectType( DroolsQuery.class );
         final ObjectTypeNode queryObjectTypeNode = new ObjectTypeNode( this.buildContext.getNextId(),
+                                                                       this.entryPoint,
                                                                        queryObjectType,
                                                                        buildContext );
         queryObjectTypeNode.attach();
@@ -87,6 +93,7 @@
 
         final ClassObjectType cheeseObjectType = new ClassObjectType( Cheese.class );
         final ObjectTypeNode cheeseObjectTypeNode = new ObjectTypeNode( this.buildContext.getNextId(),
+                                                                        this.entryPoint,
                                                                         cheeseObjectType,
                                                                         buildContext );
         cheeseObjectTypeNode.attach();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -40,7 +39,6 @@
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.rule.EntryPoint;
 import org.drools.spi.PropagationContext;
-import org.drools.util.ObjectHashMap;
 
 /**
  * @author mproctor
@@ -48,13 +46,20 @@
  */
 public class ReteTest extends DroolsTestCase {
     private ReteooRuleBase ruleBase;
-    private BuildContext buildContext;
-    
+    private BuildContext   buildContext;
+    private EntryPointNode entryPoint;
+
     protected void setUp() throws Exception {
-        this.ruleBase = ( ReteooRuleBase ) RuleBaseFactory.newRuleBase();
-        this.buildContext = new BuildContext( ruleBase, ((ReteooRuleBase)ruleBase).getReteooBuilder().getIdGenerator() );
+        this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+        this.buildContext = new BuildContext( ruleBase,
+                                              ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
+        this.entryPoint = new EntryPointNode( 0,
+                                              this.ruleBase.getRete(),
+                                              buildContext );
+        this.entryPoint.attach();
+
     }
-    
+
     /**
      * Tests ObjectTypeNodes are correctly added to the Rete object
      * 
@@ -64,23 +69,25 @@
         final Rete rete = ruleBase.getRete();
 
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( Object.class ),
                                                                   buildContext );
         objectTypeNode.attach();
 
         final ObjectTypeNode stringTypeNode = new ObjectTypeNode( 2,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( String.class ),
                                                                   buildContext );
         stringTypeNode.attach();
 
-        final Map map = rete.getObjectTypeNodes();
+        final List<ObjectTypeNode> list = rete.getObjectTypeNodes();
 
         // Check the ObjectTypeNodes are correctly added to Rete
         assertEquals( 2,
-                      map.size() );
+                      list.size() );
 
-        assertNotNull( map.get( new ClassObjectType( Object.class ) ) );
-        assertNotNull( map.get( new ClassObjectType( String.class ) ) );
+        assertTrue( list.contains( objectTypeNode ) );
+        assertTrue( list.contains( stringTypeNode ) );
     }
 
     /**
@@ -89,11 +96,12 @@
      * @throws FactException
      */
     public void testCache() throws FactException {
-        final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) this.ruleBase.newStatefulSession();
+        final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) this.ruleBase.newStatefulSession();
 
         // Create a Rete network with ObjectTypeNodes for List, Collection and ArrayList
         final Rete rete = ruleBase.getRete();
         ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                            this.entryPoint,
                                                             new ClassObjectType( List.class ),
                                                             buildContext );
         objectTypeNode.attach();
@@ -101,6 +109,7 @@
         objectTypeNode.addObjectSink( sink );
 
         objectTypeNode = new ObjectTypeNode( 1,
+                                             this.entryPoint,
                                              new ClassObjectType( Collection.class ),
                                              buildContext );
         objectTypeNode.attach();
@@ -108,6 +117,7 @@
         objectTypeNode.addObjectSink( sink );
 
         objectTypeNode = new ObjectTypeNode( 1,
+                                             this.entryPoint,
                                              new ClassObjectType( ArrayList.class ),
                                              buildContext );
         objectTypeNode.attach();
@@ -150,11 +160,12 @@
      * @throws Exception
      */
     public void testAssertObject() throws Exception {
-        final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) this.ruleBase.newStatefulSession();
+        final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) this.ruleBase.newStatefulSession();
 
         // Create a Rete network with ObjectTypeNodes for List, Collection and ArrayList
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( List.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -199,7 +210,7 @@
     }
 
     public void testAssertObjectWithNoMatchingObjectTypeNode() {
-        final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) this.ruleBase.newStatefulSession();
+        final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) this.ruleBase.newStatefulSession();
 
         final Rete rete = ruleBase.getRete();
         assertEquals( 0,
@@ -214,13 +225,14 @@
     }
 
     public void testHierarchy() {
-        final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) this.ruleBase.newStatefulSession();
+        final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) this.ruleBase.newStatefulSession();
 
         final Rete rete = ruleBase.getRete();
         final IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
 
         // Attach a List ObjectTypeNode
         final ObjectTypeNode listOtn = new ObjectTypeNode( idGenerator.getNextId(),
+                                                           this.entryPoint,
                                                            new ClassObjectType( List.class ),
                                                            buildContext );
         listOtn.attach();
@@ -234,7 +246,7 @@
 
         // double check that the Listreference is the same as the one we created, i.e. engine should try and recreate it
         assertSame( listOtn,
-                    rete.getObjectTypeNodes().get( new ClassObjectType( List.class ) ) );
+                    rete.getObjectTypeNodes( EntryPoint.DEFAULT ).get( new ClassObjectType( List.class ) ) );
 
         // ArrayConf should match two ObjectTypenodes for List and ArrayList
         Map memory = workingMemory.getObjectTypeConfMap( EntryPoint.DEFAULT );
@@ -242,13 +254,14 @@
         final ObjectTypeNode arrayOtn = arrayConf.getConcreteObjectTypeNode();
         assertEquals( 2,
                       arrayConf.getObjectTypeNodes().length );
-        
+
         // Check it contains List and ArrayList
         List nodes = Arrays.asList( arrayConf.getObjectTypeNodes() );
-        assertEquals(2, nodes.size() );
+        assertEquals( 2,
+                      nodes.size() );
         assertTrue( nodes.contains( arrayOtn ) );
         assertTrue( nodes.contains( listOtn ) );
-        
+
         // Nodes are there, retract the fact so we can check both nodes are populated
         workingMemory.retract( handle );
 
@@ -267,6 +280,7 @@
 
         // Add a Collection ObjectTypeNode, so that we can check that the data from ArrayList is sent to it
         final ObjectTypeNode collectionOtn = new ObjectTypeNode( idGenerator.getNextId(),
+                                                                 this.entryPoint,
                                                                  new ClassObjectType( Collection.class ),
                                                                  buildContext );
         final MockObjectSink collectionSink = new MockObjectSink();
@@ -274,11 +288,12 @@
         collectionOtn.attach( new InternalWorkingMemory[]{workingMemory} );
 
         assertEquals( 1,
-                      collectionSink.getAsserted().size() );       
-        
+                      collectionSink.getAsserted().size() );
+
         // check that ArrayListConf was updated with the new ObjectTypeNode
         nodes = Arrays.asList( arrayConf.getObjectTypeNodes() );
-        assertEquals(3, nodes.size() );
+        assertEquals( 3,
+                      nodes.size() );
         assertTrue( nodes.contains( arrayOtn ) );
         assertTrue( nodes.contains( listOtn ) );
         assertTrue( nodes.contains( collectionOtn ) );
@@ -289,11 +304,12 @@
      * ObjectTypeNodes.
      */
     public void testRetractObject() throws Exception {
-        final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) this.ruleBase.newStatefulSession();
+        final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) this.ruleBase.newStatefulSession();
 
         // Create a Rete network with ObjectTypeNodes for List, Collection and ArrayList
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( List.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -346,11 +362,12 @@
     }
 
     public void testIsShadowed() {
-        final ReteooWorkingMemory workingMemory = ( ReteooWorkingMemory ) this.ruleBase.newStatefulSession();
+        final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) this.ruleBase.newStatefulSession();
 
         // Create a Rete network with ObjectTypeNodes for List, Collection and ArrayList
         final Rete rete = ruleBase.getRete();
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  this.entryPoint,
                                                                   new ClassObjectType( Cheese.class ),
                                                                   buildContext );
         objectTypeNode.attach();
@@ -384,13 +401,20 @@
                                 "org.drools.Cheese" );
         RuleBaseConfiguration conf = new RuleBaseConfiguration( properties );
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase( conf );
-        buildContext = new BuildContext( ruleBase, ((ReteooRuleBase)ruleBase).getReteooBuilder().getIdGenerator() );
+        buildContext = new BuildContext( ruleBase,
+                                         ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                            ruleBase );
 
         // Create a Rete network with ObjectTypeNodes for List, Collection and ArrayList
         final Rete rete = ruleBase.getRete();
+        final EntryPointNode entryPoint = new EntryPointNode( 0,
+                                                              rete,
+                                                              buildContext );
+        entryPoint.attach();
+        
         final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
+                                                                  entryPoint,
                                                                   new ClassObjectType( Cheese.class ),
                                                                   buildContext );
         objectTypeNode.attach();

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	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -421,6 +421,23 @@
                     // TODO Auto-generated method stub
                     return null;
                 }
+
+				public FactHandle insert(Object object, long duration)
+						throws FactException {
+					// TODO Auto-generated method stub
+					return null;
+				}
+
+				public FactHandle insert(Object object, long duration,
+						boolean dynamic) throws FactException {
+					// TODO Auto-generated method stub
+					return null;
+				}
+
+                public FactHandle getFactHandleByIdentity(Object object) {
+                    // TODO Auto-generated method stub
+                    return null;
+                }
 			};
 		}
 	}

Modified: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java	2008-01-16 22:35:40 UTC (rev 17907)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java	2008-01-16 22:38:51 UTC (rev 17908)
@@ -25,43 +25,48 @@
 
 /**
  * A factory for creating <code>Handle</code>s.
+ * 
  * @author <a href="mailto:michael.frandsen at syngenio.de">michael frandsen </a>
  */
 public final class Jsr94FactHandleFactory extends AbstractFactHandleFactory {
 
+	private static final long serialVersionUID = 4964273923122006124L;
 
-    private static final long serialVersionUID = 4964273923122006124L;
+	protected final InternalFactHandle newFactHandle(final long id,
+			final Object object, final long recency, final boolean isEvent,
+			final WorkingMemory workingMemory) {
+		return this.newFactHandle(id, object, recency, isEvent, 0,
+				workingMemory);
+	}
 
-    /* (non-Javadoc)
-     * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
-     */
-    protected final InternalFactHandle newFactHandle(final long id,
-                                                     final Object object,
-                                                     final long recency,
-                                                     final boolean isEvent,
-                                                     final WorkingMemory workingMemory ) {
-        if ( isEvent ) {
-            SessionClock clock = ((TemporalSession) workingMemory).getSessionClock(); 
-            return new Jsr94EventFactHandle( id,
-                                             object,
-                                             recency,
-                                             clock.getCurrentTime(),
-                                             0 ); // for now, we are only handling primitive events
-        } else {
-            return new Jsr94FactHandle( id,
-                                        object,
-                                        recency );
-        }
-    }
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
+	 */
+	protected final InternalFactHandle newFactHandle(final long id,
+			final Object object, final long recency, final boolean isEvent,
+			final long duration, final WorkingMemory workingMemory) {
+		if (isEvent) {
+			SessionClock clock = ((TemporalSession) workingMemory)
+					.getSessionClock();
+			return new Jsr94EventFactHandle(id, object, recency, clock
+					.getCurrentTime(), duration);
+		} else {
+			return new Jsr94FactHandle(id, object, recency);
+		}
+	}
 
-    /* (non-Javadoc)
-     * @see org.drools.reteoo.FactHandleFactory#newInstance()
-     */
-    public FactHandleFactory newInstance() {
-        return new Jsr94FactHandleFactory();
-    }
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.drools.reteoo.FactHandleFactory#newInstance()
+	 */
+	public FactHandleFactory newInstance() {
+		return new Jsr94FactHandleFactory();
+	}
 
-    public Class getFactHandleType() {
-        return Jsr94FactHandle.class;
-    }
+	public Class getFactHandleType() {
+		return Jsr94FactHandle.class;
+	}
 }




More information about the jboss-svn-commits mailing list