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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Apr 15 00:01:20 EDT 2009


Author: mark.proctor at jboss.com
Date: 2009-04-15 00:01:20 -0400 (Wed, 15 Apr 2009)
New Revision: 26032

Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatelessKnowledgeSessionImpl.java
Log:
JBRULES-2059 StatelessKnowledgeSessions should have special behaviour for KnowledgeAgents

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java	2009-04-14 22:43:00 UTC (rev 26031)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/agent/KnowledgeAgent.java	2009-04-15 04:01:20 UTC (rev 26032)
@@ -3,6 +3,8 @@
 import org.drools.KnowledgeBase;
 import org.drools.SystemEventListener;
 import org.drools.io.Resource;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatelessKnowledgeSession;
 
 /**
  * The KnolwedgeAgentFactory provides detailed information on how to create and use the KnowledgeAgent.
@@ -25,6 +27,19 @@
      *     The KnowledgeBase
      */
     KnowledgeBase getKnowledgeBase();
+    
+    
+    /**
+     * StatelessKnowledgeSession created from here will always have the execute() method called against the latest built KnowledgeBase
+     * @return
+     */
+    StatelessKnowledgeSession newStatelessKnowledgeSession();
+    
+    /**
+     * StatelessKnowledgeSession created from here will always have the execute() method called against the latest built KnowledgeBase
+     * @return
+     */    
+    StatelessKnowledgeSession newStatelessKnowledgeSession(KnowledgeSessionConfiguration conf);
 
     void monitorResourceChangeEvents(boolean monitor);
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java	2009-04-14 22:43:00 UTC (rev 26031)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java	2009-04-15 04:01:20 UTC (rev 26032)
@@ -29,6 +29,7 @@
 import org.drools.io.ResourceFactory;
 import org.drools.io.impl.ResourceChangeScannerImpl;
 import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.StatelessKnowledgeSession;
 import org.drools.util.DroolsStreamUtils;
 import org.drools.util.FileManager;
 import org.mortbay.jetty.Server;
@@ -171,7 +172,108 @@
         assertTrue( list.contains( "rule2" ) );
         kagent.monitorResourceChangeEvents( false );        
     }
+    
+    public void  testModifyFileUrlWithStateless() throws Exception {
+        String rule1 = "";
+        rule1 += "package org.drools.test\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule rule1\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "list.add( drools.getRule().getName() );\n";
+        rule1 += "end\n";
+        File f1 = fileManager.newFile( "rule1.drl" );
+        Writer output = new BufferedWriter( new FileWriter( f1 ) );
+        output.write( rule1 );
+        output.close();
 
+        String rule2 = "";
+        rule2 += "package org.drools.test\n";
+        rule2 += "global java.util.List list\n";
+        rule2 += "rule rule2\n";
+        rule2 += "when\n";
+        rule2 += "then\n";
+        rule2 += "list.add( drools.getRule().getName() );\n";
+        rule2 += "end\n";
+        File f2 = fileManager.newFile( "rule2.drl" );
+        output = new BufferedWriter( new FileWriter( f2 ) );
+        output.write( rule2 );
+        output.close();
+
+        String xml = "";
+        xml += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
+        xml += "    xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
+        xml += "    xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd' >";
+        xml += "    <add> ";
+        xml += "        <resource source='http://localhost:9000/rule1.drl' type='DRL' />";
+        xml += "        <resource source='http://localhost:9000/rule2.drl' type='DRL' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File fxml = fileManager.newFile( "changeset.xml" );
+        output = new BufferedWriter( new FileWriter( fxml ) );
+        output.write( xml );
+        output.close();
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
+        sconf.setProperty( "drools.resource.scanner.interval",
+                           "2" );
+        ResourceFactory.getResourceChangeScannerService().configure( sconf );
+
+        KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
+        aconf.setProperty( "drools.agent.scanDirectories",
+                           "true" );
+        aconf.setProperty( "drools.agent.scanResources",
+                           "true" );
+        aconf.setProperty( "drools.agent.newInstance",
+                           "true" );
+        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "test agent",
+                                                                         kbase,
+                                                                         aconf );
+
+        kagent.applyChangeSet( ResourceFactory.newUrlResource( fxml.toURI().toURL() ) );
+
+        StatelessKnowledgeSession ksession = kagent.newStatelessKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+        ksession.execute( "hello" );
+
+        assertEquals( 2,
+                      list.size() );
+        assertTrue( list.contains( "rule1" ) );
+        assertTrue( list.contains( "rule2" ) );
+
+        list.clear();
+
+        // have to sleep here as linux lastModified does not do milliseconds http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=019789
+        Thread.sleep( 2000 );
+
+        rule1 = "";
+        rule1 += "package org.drools.test\n";
+        rule1 += "global java.util.List list\n";
+        rule1 += "rule rule3\n";
+        rule1 += "when\n";
+        rule1 += "then\n";
+        rule1 += "list.add( drools.getRule().getName() );\n";
+        rule1 += "end\n";
+        output = new BufferedWriter( new FileWriter( f1 ) );
+        output.write( rule1 );
+        output.close();
+        Thread.sleep( 3000 );
+
+
+        ksession.execute( "hello" );
+
+        assertEquals( 2,
+                      list.size() );
+
+        assertTrue( list.contains( "rule3" ) );
+        assertTrue( list.contains( "rule2" ) );
+        kagent.monitorResourceChangeEvents( false );        
+    }    
+
     public void  testModifyPackageUrl() throws Exception {
         String rule1 = "";
         rule1 += "package org.drools.test\n";

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java	2009-04-14 22:43:00 UTC (rev 26031)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java	2009-04-15 04:01:20 UTC (rev 26032)
@@ -29,6 +29,7 @@
 import org.drools.definitions.impl.KnowledgePackageImp;
 import org.drools.event.io.ResourceChangeListener;
 import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.impl.StatelessKnowledgeSessionImpl;
 import org.drools.io.InternalResource;
 import org.drools.io.Resource;
 import org.drools.io.ResourceFactory;
@@ -38,6 +39,8 @@
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
 import org.drools.rule.TypeDeclaration;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatelessKnowledgeSession;
 import org.drools.util.DroolsStreamUtils;
 import org.drools.xml.ChangeSetSemanticModule;
 import org.drools.xml.SemanticModules;
@@ -316,6 +319,14 @@
         }
     }
 
+    public StatelessKnowledgeSession newStatelessKnowledgeSession() {
+        return new StatelessKnowledgeSessionImpl( null, this, null );
+    }
+
+    public StatelessKnowledgeSession newStatelessKnowledgeSession(KnowledgeSessionConfiguration conf) {
+        return new StatelessKnowledgeSessionImpl( null, this, conf );
+    }
+    
     //    public void resourceModified(ResourceModifiedEvent event) {
     //        ResourceMapping mapping = this.resources.get( event.getResource() );
     //        System.out.println( "modified : " + event.getResource() );
@@ -411,6 +422,13 @@
                     }
                 }
             }
+            
+            InternalRuleBase ruleBase = ( InternalRuleBase ) ((KnowledgeBaseImpl)this.kbase).ruleBase;
+            synchronized ( ruleBase.getPackagesMap() ) {
+                if ( ruleBase.getConfiguration().isSequential() ) {
+                    ruleBase.getReteooBuilder().order();
+                }
+            } 
 
             //            for ( Resource child : changeSetState.pkgs ) {
             //                try {
@@ -554,4 +572,6 @@
             this.changeSetNotificationDetector.monitor = false;
         }
     }
+
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java	2009-04-14 22:43:00 UTC (rev 26031)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/KnowledgeBaseImpl.java	2009-04-15 04:01:20 UTC (rev 26032)
@@ -155,11 +155,11 @@
     }    
     
     public StatelessKnowledgeSession newStatelessKnowledgeSession() {
-        return new StatelessKnowledgeSessionImpl( (InternalRuleBase) this.ruleBase, null );
+        return new StatelessKnowledgeSessionImpl( (InternalRuleBase) this.ruleBase, null, null );
     }
     
     public StatelessKnowledgeSession newStatelessKnowledgeSession(KnowledgeSessionConfiguration conf) {        
-        return new StatelessKnowledgeSessionImpl( (InternalRuleBase) this.ruleBase, conf );
+        return new StatelessKnowledgeSessionImpl( (InternalRuleBase) this.ruleBase, null, conf );
     } 
 
     public void removeKnowledgePackage(String packageName) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatelessKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatelessKnowledgeSessionImpl.java	2009-04-14 22:43:00 UTC (rev 26031)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatelessKnowledgeSessionImpl.java	2009-04-15 04:01:20 UTC (rev 26032)
@@ -10,6 +10,7 @@
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.SessionConfiguration;
+import org.drools.agent.KnowledgeAgent;
 import org.drools.base.MapGlobalResolver;
 import org.drools.command.Command;
 import org.drools.common.InternalRuleBase;
@@ -43,6 +44,7 @@
     StatelessKnowledgeSession {
 
     private InternalRuleBase                                                  ruleBase;
+    private KnowledgeAgent                                                     kagent;
     private AgendaFilter                                                      agendaFilter;
     private MapGlobalResolver                                                 sessionGlobals            = new MapGlobalResolver();
 
@@ -63,16 +65,20 @@
     }
 
     public StatelessKnowledgeSessionImpl(final InternalRuleBase ruleBase,
+                                         final KnowledgeAgent kagent,
                                          final KnowledgeSessionConfiguration conf) {
         this.ruleBase = ruleBase;
+        this.kagent = kagent;
         this.conf = (conf != null) ? conf : new SessionConfiguration();
         this.environment = EnvironmentFactory.newEnvironment();
         
-        synchronized ( this.ruleBase.getPackagesMap() ) {
-            if ( ruleBase.getConfiguration().isSequential() ) {
-                this.ruleBase.getReteooBuilder().order();
-            }
-        }        
+        if ( this.ruleBase != null ) {
+            synchronized ( this.ruleBase.getPackagesMap() ) {
+                if ( ruleBase.getConfiguration().isSequential() ) {
+                    this.ruleBase.getReteooBuilder().order();
+                }
+            }    
+        }
     }
 
     public InternalRuleBase getRuleBase() {
@@ -80,6 +86,10 @@
     }
 
     public InternalWorkingMemory newWorkingMemory() {
+        if ( this.kagent != null ) {
+            // if we have an agent always get the rulebase from there
+            this.ruleBase = ( InternalRuleBase ) ((KnowledgeBaseImpl)this.kagent.getKnowledgeBase()).ruleBase;
+        }
         synchronized ( this.ruleBase.getPackagesMap() ) {
             ReteooWorkingMemory wm = new ReteooWorkingMemory( this.ruleBase.nextWorkingMemoryCounter(),
                                                                 this.ruleBase,




More information about the jboss-svn-commits mailing list