[jboss-svn-commits] JBL Code SVN: r28011 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/testframework and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Jul 14 11:43:44 EDT 2009
Author: tirelli
Date: 2009-07-14 11:43:44 -0400 (Tue, 14 Jul 2009)
New Revision: 28011
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicWithEntryPoint.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.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/InternalWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/DroolsObjectIOTest.java
Log:
JBRULES-2207: fixing NPE when dynamically adding entry points
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java 2009-07-14 15:12:36 UTC (rev 28010)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java 2009-07-14 15:43:44 UTC (rev 28011)
@@ -25,6 +25,7 @@
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
+import org.drools.StockTick;
import org.drools.WorkingMemory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
@@ -39,6 +40,7 @@
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.rule.Package;
import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.WorkingMemoryEntryPoint;
public class DynamicRulesTest extends TestCase {
protected RuleBase getRuleBase() throws Exception {
@@ -142,7 +144,7 @@
ruleBase.addPackage( pkg4 );
workingMemory.fireAllRules();
ruleBase = SerializationHelper.serializeObject( ruleBase );
-
+
Assert.assertEquals( "Rule from package 4 should have been fired",
"Who likes Stilton ok",
bob.getStatus() );
@@ -356,7 +358,7 @@
StatefulSession session = ruleBase.newStatefulSession();
session.insert( new Precondition( "genericcode",
- "genericvalue" ) );
+ "genericvalue" ) );
session.fireAllRules();
RuleBase ruleBaseWM = session.getRuleBase();
@@ -562,7 +564,7 @@
final Package pkg2 = builder2.getPackage();
ruleBase.addPackage( pkg2 );
workingMemory.fireAllRules();
-
+
ruleBase = SerializationHelper.serializeObject( ruleBase );
// fire all rules is automatic
@@ -574,13 +576,15 @@
}
public void testDynamicNotNode() throws Exception {
- KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
- kbuilder.add( ResourceFactory.newClassPathResource( "test_CollectDynamicRules1.drl", getClass() ), ResourceType.DRL );
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_CollectDynamicRules1.drl",
+ getClass() ),
+ ResourceType.DRL );
if ( kbuilder.hasErrors() ) {
- fail ( kbuilder.getErrors().toString() );
- }
+ fail( kbuilder.getErrors().toString() );
+ }
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
- Collection<KnowledgePackage> kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
+ Collection<KnowledgePackage> kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
kbase.addKnowledgePackages( kpkgs );
kbase = SerializationHelper.serializeObject( kbase );
@@ -598,18 +602,22 @@
ksession.insert( a );
ksession.insert( b );
ksession.insert( c );
-
- kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
- kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl", getClass() ), ResourceType.DRL );
+
+ kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl",
+ getClass() ),
+ ResourceType.DRL );
if ( kbuilder.hasErrors() ) {
- fail ( kbuilder.getErrors().toString() );
- }
- kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
+ fail( kbuilder.getErrors().toString() );
+ }
+ kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
kbase.addKnowledgePackages( kpkgs );
- kbase = SerializationHelper.serializeObject( kbase );
-
- ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), false );
-
+ kbase = SerializationHelper.serializeObject( kbase );
+
+ ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+ MarshallerFactory.newIdentityMarshallingStrategy(),
+ false );
+
results = (List) ksession.getGlobal( "results" );
ksession.fireAllRules();
@@ -620,18 +628,22 @@
kbase.removeKnowledgePackage( "org.drools" );
ksession.retract( ksession.getFactHandle( b ) );
-
- kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
- kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl", getClass() ), ResourceType.DRL );
+
+ kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl",
+ getClass() ),
+ ResourceType.DRL );
if ( kbuilder.hasErrors() ) {
- fail ( kbuilder.getErrors().toString() );
- }
- kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
+ fail( kbuilder.getErrors().toString() );
+ }
+ kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
kbase.addKnowledgePackages( kpkgs );
kbase = SerializationHelper.serializeObject( kbase );
-
- ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), false );
-
+
+ ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+ MarshallerFactory.newIdentityMarshallingStrategy(),
+ false );
+
results = (List) ksession.getGlobal( "results" );
ksession.fireAllRules();
@@ -739,7 +751,7 @@
final List list = new ArrayList();
session.setGlobal( "results",
- list );
+ list );
Order order = new Order();
@@ -956,6 +968,45 @@
}
}
+ public void testDynamicRuleAdditionsWithEntryPoints() throws Exception {
+ Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_DynamicWithEntryPoint.drl" ) );
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newReaderResource( reader ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.getErrors().toString(),
+ kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ // now lets add some knowledge to the kbase
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ List<StockTick> results = new ArrayList<StockTick>();
+ ksession.setGlobal( "results",
+ results );
+
+ WorkingMemoryEntryPoint ep = ksession.getWorkingMemoryEntryPoint( "in-channel" );
+ ep.insert( new StockTick( 1,
+ "RHT",
+ 20,
+ 10000 ) );
+ ep.insert( new StockTick( 2,
+ "RHT",
+ 21,
+ 15000 ) );
+ ep.insert( new StockTick( 3,
+ "RHT",
+ 22,
+ 20000 ) );
+
+ ksession.fireAllRules();
+ assertEquals( 3,
+ results.size() );
+
+ }
+
public class SubvertedClassLoader extends URLClassLoader {
private static final long serialVersionUID = 400L;
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 2009-07-14 15:12:36 UTC (rev 28010)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java 2009-07-14 15:43:44 UTC (rev 28011)
@@ -577,4 +577,14 @@
}
+ public long getTimeToNextJob() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public void updateEntryPointsCache() {
+ // TODO Auto-generated method stub
+
+ }
+
}
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicWithEntryPoint.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicWithEntryPoint.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_DynamicWithEntryPoint.drl 2009-07-14 15:43:44 UTC (rev 28011)
@@ -0,0 +1,19 @@
+package org.drools;
+
+# default dialect
+dialect "mvel"
+
+# flag as event
+declare StockTick
+ @role( event )
+end
+
+global java.util.List results
+
+# simple rule
+rule "stream input test"
+when
+ $st: StockTick() from entry-point "in-channel"
+then
+ results.add( $st );
+end
\ No newline at end of file
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 2009-07-14 15:12:36 UTC (rev 28010)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2009-07-14 15:43:44 UTC (rev 28011)
@@ -374,9 +374,20 @@
this );
this.entryPoint = EntryPoint.DEFAULT;
- for ( EntryPointNode entryPointNode : this.ruleBase.getRete().getEntryPointNodes().values() ) {
+ updateEntryPointsCache();
+ }
+
+ public void updateEntryPointsCache() {
+ Map<EntryPoint, EntryPointNode> reteEPs = this.ruleBase.getRete().getEntryPointNodes();
+
+ // first create a temporary cache to find which entry points were removed from the network
+ Map<String, WorkingMemoryEntryPoint> cache = new HashMap<String, WorkingMemoryEntryPoint>(this.entryPoints);
+
+ // now, add any entry point that was added to the knowledge base
+ for ( EntryPointNode entryPointNode : reteEPs.values() ) {
EntryPoint id = entryPointNode.getEntryPoint();
- if ( !EntryPoint.DEFAULT.equals( id ) ) {
+ cache.remove( id.getEntryPointId() );
+ if ( !EntryPoint.DEFAULT.equals( id ) && !this.entryPoints.containsKey( id ) ) {
WorkingMemoryEntryPoint wmEntryPoint = new NamedEntryPoint( id,
entryPointNode,
this );
@@ -384,6 +395,9 @@
wmEntryPoint );
}
}
+
+ // now, if there is any element left in the cache, remove them as they were removed from the network
+ this.entryPoints.keySet().removeAll( cache.keySet() );
}
/**
@@ -1557,8 +1571,13 @@
public void queueWorkingMemoryAction(final WorkingMemoryAction action) {
synchronized ( this.actionQueue ) {
- this.actionQueue.add( action );
- this.agenda.notifyHalt();
+ try {
+ startOperation();
+ this.actionQueue.add( action );
+ this.agenda.notifyHalt();
+ } finally {
+ endOperation();
+ }
}
}
@@ -2040,4 +2059,15 @@
return lastIdle > -1 ? timerManager.getTimerService().getCurrentTime() - lastIdle : -1;
}
+ /**
+ * Returns the number of time units (usually ms) to
+ * the next scheduled job
+ *
+ * @return the number of time units until the next scheduled job or -1 if
+ * there is no job scheduled
+ */
+ public long getTimeToNextJob() {
+ return this.timerManager.getTimerService().getTimeToNextJob();
+ }
+
}
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 2009-07-14 15:12:36 UTC (rev 28010)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java 2009-07-14 15:43:44 UTC (rev 28011)
@@ -11,14 +11,12 @@
import org.drools.event.AgendaEventSupport;
import org.drools.event.RuleFlowEventSupport;
import org.drools.event.WorkingMemoryEventSupport;
-import org.drools.impl.StatelessKnowledgeSessionImpl;
import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.ProcessInstanceManager;
import org.drools.reteoo.LIANodePropagation;
import org.drools.reteoo.PartitionTaskManager;
import org.drools.rule.Rule;
import org.drools.rule.TimeMachine;
-import org.drools.runtime.ExecutionResults;
import org.drools.runtime.ExitPoint;
import org.drools.runtime.KnowledgeRuntime;
import org.drools.runtime.impl.ExecutionResultImpl;
@@ -170,4 +168,14 @@
*/
public long getIdleTime();
+ /**
+ * Returns the number of time units (usually ms) to
+ * the next scheduled job
+ *
+ * @return the number of time units until the next scheduled job or -1 if
+ * there is no job scheduled
+ */
+ public long getTimeToNextJob();
+
+ public void updateEntryPointsCache();
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2009-07-14 15:12:36 UTC (rev 28010)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java 2009-07-14 15:43:44 UTC (rev 28011)
@@ -227,6 +227,7 @@
for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
final InternalWorkingMemory workingMemory = workingMemories[i];
+ workingMemory.updateEntryPointsCache();
final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
PropagationContext.RULE_ADDITION,
null,
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/DroolsObjectIOTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/DroolsObjectIOTest.java 2009-07-14 15:12:36 UTC (rev 28010)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/DroolsObjectIOTest.java 2009-07-14 15:43:44 UTC (rev 28011)
@@ -18,6 +18,7 @@
import org.drools.rule.GroupElement;
import org.drools.rule.Package;
import org.drools.util.DroolsStreamUtils;
+import org.junit.Ignore;
/**
* Created by IntelliJ IDEA. User: SG0521861 Date: Mar 3, 2008 Time: 11:19:44 AM To change this template use File |
@@ -28,6 +29,7 @@
private static final String TEST_FILE = "test.dat";
private static final GroupElement testGroupElement = new GroupElement();
+ @Ignore
static class Test implements Serializable {
public Test() {
More information about the jboss-svn-commits
mailing list