[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