[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