[jboss-svn-commits] JBL Code SVN: r33620 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/agent/impl and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jun 24 08:38:12 EDT 2010


Author: eaa
Date: 2010-06-24 08:38:11 -0400 (Thu, 24 Jun 2010)
New Revision: 33620

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
Log:
JBRULES-2350: The order of resources are not preserved when loaded by the KnowledgeAgentImpl
	- KnowledgeAgentImpl: DSL resources are now added to agent's internal kbuilders before any other resource.

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java	2010-06-24 12:38:11 UTC (rev 33620)
@@ -0,0 +1,492 @@
+package org.drools.agent;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.Person;
+import org.drools.core.util.FileManager;
+import org.drools.event.knowledgeagent.AfterChangeSetAppliedEvent;
+import org.drools.event.knowledgeagent.AfterChangeSetProcessedEvent;
+import org.drools.event.knowledgeagent.AfterResourceProcessedEvent;
+import org.drools.event.knowledgeagent.BeforeChangeSetAppliedEvent;
+import org.drools.event.knowledgeagent.BeforeChangeSetProcessedEvent;
+import org.drools.event.knowledgeagent.BeforeResourceProcessedEvent;
+import org.drools.event.knowledgeagent.KnowledgeAgentEventListener;
+import org.drools.event.knowledgeagent.KnowledgeBaseUpdatedEvent;
+import org.drools.event.knowledgeagent.ResourceCompilationFailedEvent;
+import org.drools.io.ResourceChangeScannerConfiguration;
+import org.drools.io.ResourceFactory;
+import org.drools.io.impl.ResourceChangeNotifierImpl;
+import org.drools.io.impl.ResourceChangeScannerImpl;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.handler.ResourceHandler;
+
+public class KnowledgeAgentDSLTest extends TestCase {
+
+    FileManager fileManager;
+    private Server server;
+    private final Object lock = new Object();
+    private volatile boolean kbaseUpdated;
+    private boolean compilationErrors;
+
+
+    @Override
+    protected void setUp() throws Exception {
+        fileManager = new FileManager();
+        fileManager.setUp();
+        ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
+
+        ResourceFactory.getResourceChangeNotifierService().start();
+        ResourceFactory.getResourceChangeScannerService().start();
+
+        this.server = new Server(0);
+        ResourceHandler resourceHandler = new ResourceHandler();
+        resourceHandler.setResourceBase(fileManager.getRootDirectory().getPath());
+
+        server.setHandler(resourceHandler);
+
+        server.start();
+
+        this.kbaseUpdated = false;
+    }
+
+    private int getPort() {
+        return this.server.getConnectors()[0].getLocalPort();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        fileManager.tearDown();
+        ResourceFactory.getResourceChangeNotifierService().stop();
+        ResourceFactory.getResourceChangeScannerService().stop();
+        ((ResourceChangeNotifierImpl) ResourceFactory.getResourceChangeNotifierService()).reset();
+        ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
+
+        server.stop();
+    }
+
+    public void testDSLAndIncrementalChangeSet() throws Exception {
+
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "import org.drools.Person\n\n";
+        header += "global java.util.List list\n\n";
+
+        //create a basic dsl file
+        File f1 = fileManager.newFile("myExpander.dsl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(this.createCommonDSL(null));
+        output.close();
+
+        //create a basic dslr file
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        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:" + this.getPort() + "/rules.drl' type='DSLR' />";
+        xml += "        <resource source='http://localhost:" + this.getPort() + "/myExpander.dsl' type='DSL' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File fxml = fileManager.newFile("changeset.xml");
+        output = new BufferedWriter(new FileWriter(fxml));
+        output.write(xml);
+        output.close();
+
+        List<String> list = new ArrayList<String>();
+
+        //Create a new Agent with newInstace=true
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        KnowledgeAgent kagent = this.createKAgent(kbase, false);
+
+        //Agent: take care of them!
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+
+        ksession.setGlobal("list", list);
+        ksession.insert(new Person());
+        ksession.fireAllRules();
+
+        //The rule should be fired
+        assertEquals(1, list.size());
+        assertTrue(list.contains("Rule1"));
+
+        list.clear();
+        kbaseUpdated = false;
+        
+        Thread.sleep(2000);
+        //the dsl is now modified.
+        f1 = fileManager.newFile("myExpander.dsl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(this.createCommonDSL("name == \"John\""));
+        output.close();
+
+        //We also need to mark the dslr file as modified, so the rules could
+        //be regenerated
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        output.close();
+
+
+        this.waitUntilKBaseUpdate();
+
+        ksession.insert(new Person());
+        ksession.fireAllRules();
+
+        //The rule was modified then no rule got fired.
+        assertEquals(0, list.size());
+
+        Person p = new Person();
+        p.setName("John");
+        ksession.insert(p);
+        ksession.fireAllRules();
+
+        //The new fact activated and fired the modified rule
+        Thread.sleep(2000);
+        assertEquals(1, list.size());
+        assertTrue(list.contains("Rule1"));
+
+        //let's add a new rule
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        output.write(this.createCommonDSLRRule("Rule2"));
+        output.close();
+
+        this.waitUntilKBaseUpdate();
+
+        list.clear();
+        ksession.fireAllRules();
+
+        //because we already had a John inserted, Rule2 gets fired.
+        assertEquals(1, list.size());
+        assertTrue(list.contains("Rule2"));
+
+        //let's remove Rule1 and Rule2 and add a new rule: Rule3
+        Thread.sleep(2000);
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule3"));
+        output.close();
+
+        this.waitUntilKBaseUpdate();
+
+        //we don't want to use a new ksession.
+        ksession.dispose();
+        ksession = kbase.newStatefulKnowledgeSession();
+
+        //insert John
+        list.clear();
+        ksession.setGlobal("list", list);
+        ksession.insert(p);
+        ksession.fireAllRules();
+
+        //The only existing rule must be fired
+        assertEquals(1, list.size());
+        assertTrue(list.contains("Rule3"));
+
+        //let's delete the dsl file (errors are expected)
+        Thread.sleep(2000);
+        f1 = fileManager.newFile("myExpander.dsl");
+        f1.delete();
+
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        output.close();
+
+        this.waitUntilKBaseUpdate();
+
+        //Compilation errors should occurred
+        assertTrue(this.compilationErrors);
+        this.compilationErrors=false;
+
+        ksession.dispose();
+        kagent.monitorResourceChangeEvents(false);
+    }
+
+    public void testDSLAndNewInstance() throws Exception {
+
+        System.out.println("\n\ntestDSLAndNewInstance\n\n");
+
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "import org.drools.Person\n\n";
+        header += "global java.util.List list\n\n";
+
+        //create a basic dsl file
+        File f1 = fileManager.newFile("myExpander.dsl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(this.createCommonDSL(null));
+        output.close();
+
+        //create a basic dslr file
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        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:" + this.getPort() + "/rules.drl' type='DSLR' />";
+        xml += "        <resource source='http://localhost:" + this.getPort() + "/myExpander.dsl' type='DSL' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File fxml = fileManager.newFile("changeset.xml");
+        output = new BufferedWriter(new FileWriter(fxml));
+        output.write(xml);
+        output.close();
+
+        List<String> list = new ArrayList<String>();
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+        //Create a new Agent with newInstace=true
+        KnowledgeAgent kagent = this.createKAgent(kbase,true);
+
+        //Agent: take care of them!
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        this.kbaseUpdated = false;
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+
+
+        ksession.setGlobal("list", list);
+        ksession.insert(new Person());
+        ksession.fireAllRules();
+
+        //The rule should be fired
+        assertEquals(1, list.size());
+        assertTrue(list.contains("Rule1"));
+        list.clear();
+
+        ksession.dispose();
+
+        Thread.sleep(2000);
+        //Let's modify the dsl file
+        f1 = fileManager.newFile("myExpander.dsl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(this.createCommonDSL("name == \"John\""));
+        output.close();
+
+        //We need to mark the dslr file as modified (even when it was not) so
+        //the agent could recreate the rules it contains using the new dsl.
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        output.close();
+
+        this.waitUntilKBaseUpdate();
+
+        //get a new ksession
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+
+        //A Person without name shouldn't fire any rule now (because it was
+        //modified)
+        ksession.setGlobal("list", list);
+        ksession.insert(new Person());
+        ksession.fireAllRules();
+
+        assertEquals(0, list.size());
+
+        //A "John" Person should fire the modified rule
+        Person p = new Person();
+        p.setName("John");
+        ksession.insert(p);
+        ksession.fireAllRules();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("Rule1"));
+
+        ksession.dispose();
+
+        Thread.sleep(2000);
+        //Let's add a new Rule
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        output.write(this.createCommonDSLRRule("Rule2"));
+        output.close();
+
+        this.waitUntilKBaseUpdate();
+
+        //get a new ksession
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+
+        //A "John" Person now should fire 2 rules
+        list.clear();
+        ksession.setGlobal("list", list);
+        ksession.insert(p);
+        ksession.fireAllRules();
+
+        assertEquals(2, list.size());
+        assertTrue(list.contains("Rule1"));
+        assertTrue(list.contains("Rule2"));
+
+        ksession.dispose();
+
+        Thread.sleep(2000);
+        //Let's remove both rules and add a new one: Rule3
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule3"));
+        output.close();
+
+        this.waitUntilKBaseUpdate();
+
+        //get a new ksession
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+
+        //A "John" Person now should only Rule3 (the other two rules were removes)
+        list.clear();
+        ksession.setGlobal("list", list);
+        ksession.insert(p);
+        ksession.fireAllRules();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("Rule3"));
+
+        ksession.dispose();
+
+        Thread.sleep(2000);
+        //let's delete the dsl file (errors are expected)
+        f1 = fileManager.newFile("myExpander.dsl");
+        f1.delete();
+
+        f1 = fileManager.newFile("rules.drl");
+        output = new BufferedWriter(new FileWriter(f1));
+
+        output.write(header);
+        output.write(this.createCommonDSLRRule("Rule1"));
+        output.close();
+
+        this.waitUntilKBaseUpdate();
+
+        //Compilation errors should occurred
+        assertTrue(this.compilationErrors);
+        this.compilationErrors=false;
+
+
+        kagent.monitorResourceChangeEvents(false);
+    }
+
+    private KnowledgeAgent createKAgent(KnowledgeBase kbase, boolean newInstance) {
+        ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
+        sconf.setProperty("drools.resource.scanner.interval", "2");
+        ResourceFactory.getResourceChangeScannerService().configure(sconf);
+
+        //System.setProperty(KnowledgeAgentFactory.PROVIDER_CLASS_NAME_PROPERTY_NAME, "org.drools.agent.impl.KnowledgeAgentProviderImpl");
+
+        KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
+        aconf.setProperty("drools.agent.scanDirectories", "true");
+        aconf.setProperty("drools.agent.scanResources", "true");
+        // Testing incremental build here
+        aconf.setProperty("drools.agent.newInstance", "" + newInstance);
+
+        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
+                "test agent", kbase, aconf);       
+
+        final KnowledgeAgentDSLTest test = this;
+        kagent.addEventListener(new KnowledgeAgentEventListener() {
+
+            public void beforeChangeSetApplied(BeforeChangeSetAppliedEvent event) {
+            }
+
+            public void afterChangeSetApplied(AfterChangeSetAppliedEvent event) {
+            }
+
+            public void beforeChangeSetProcessed(BeforeChangeSetProcessedEvent event) {
+            }
+
+            public void afterChangeSetProcessed(AfterChangeSetProcessedEvent event) {
+            }
+
+            public void beforeResourceProcessed(BeforeResourceProcessedEvent event) {
+            }
+
+            public void afterResourceProcessed(AfterResourceProcessedEvent event) {
+            }
+
+            public void knowledgeBaseUpdated(KnowledgeBaseUpdatedEvent event) {
+                System.out.println("KBase was updated");
+                synchronized (lock) {
+                    kbaseUpdated = true;
+                    lock.notifyAll();
+                }
+            }
+
+            public void resourceCompilationFailed(ResourceCompilationFailedEvent event) {
+                compilationErrors = true;
+            }
+        });
+
+        assertEquals("test agent", kagent.getName());
+
+        return kagent;
+    }
+
+    private String createCommonDSLRRule(String ruleName) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("rule ");
+        sb.append(ruleName);
+        sb.append("\n");
+        sb.append("when\n");
+        sb.append("There is a Person\n");
+        sb.append("then\n");
+        sb.append("add rule's name to list;\n");
+        sb.append("end\n");
+
+        return sb.toString();
+    }
+
+    private String createCommonDSL(String restriction) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[condition][]There is a Person = Person(");
+        if (restriction != null) {
+            sb.append(restriction);
+        }
+        sb.append(")\n");
+        sb.append("[consequence][]add rule's name to list = list.add( drools.getRule().getName() );\n");
+        return sb.toString();
+    }
+
+    private void waitUntilKBaseUpdate() {
+        synchronized (lock) {
+            while (!kbaseUpdated) {
+                try {
+                    lock.wait();
+                } catch (InterruptedException e) {
+                }
+                System.out.println("Waking up!");
+            }
+            kbaseUpdated = false;
+        }
+    }
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java	2010-06-24 10:23:30 UTC (rev 33619)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java	2010-06-24 12:38:11 UTC (rev 33620)
@@ -15,6 +15,7 @@
 
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
+import org.drools.Person;
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
@@ -50,7 +51,6 @@
         this.server = new Server(0);
         ResourceHandler resourceHandler = new ResourceHandler();
         resourceHandler.setResourceBase(fileManager.getRootDirectory().getPath());
-        System.out.println("root : " + fileManager.getRootDirectory().getPath());
 
         server.setHandler(resourceHandler);
 
@@ -1257,6 +1257,93 @@
         kagent.monitorResourceChangeEvents(false);
     }
 
+    public void testStatefulSessionReuse() throws Exception {
+
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "import org.drools.Person\n";
+        header += "global java.util.List list\n\n";
+
+        Person john = new Person("John");
+        Person peter = new Person("Peter");
+
+        String ruleJohn =  this.createPatternRule("ruleJohn","Person(name==\"John\")\n");
+        String rulePeter =  this.createPatternRule("rulePeter","Person(name==\"Peter\")\n");
+        String ruleJohnPeter =  this.createPatternRule("ruleJohnPeter","Person(name==\"John\")\nPerson(name==\"Peter\")\n");
+        String ruleTmp =  this.createCommonRule("ruleTmp");
+
+        File f1 = fileManager.newFile("rules.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(ruleJohn);
+        output.write(rulePeter);
+        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:"+this.getPort()+"/rules.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();
+        KnowledgeAgent kagent = this.createKAgent(kbase);
+
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+
+        ksession.insert(john);
+
+        ksession.fireAllRules();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("ruleJohn"));
+
+        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);
+
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(ruleJohn);
+        output.write(rulePeter);
+        output.write(ruleJohnPeter);
+        output.write(ruleTmp);
+        output.close();
+        Thread.sleep(3000);
+
+        list.clear();
+
+        // Use the same session for incremental build test
+        // ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        //ksession.setGlobal("list", list);
+        ksession.insert(peter);
+
+        ksession.fireAllRules();
+        ksession.dispose();
+
+        assertEquals(3, list.size());
+
+        //becuase we inserted a peter
+        assertTrue(list.contains("rulePeter"));
+        //there was already a john. Even after the rule exists in kbase
+        assertTrue(list.contains("ruleJohnPeter"));
+        assertTrue(list.contains("ruleTmp"));
+        kagent.monitorResourceChangeEvents(false);
+    }
+
     private static void writePackage(Object pkg, File p1file)
             throws IOException, FileNotFoundException {
         FileOutputStream out = new FileOutputStream(p1file);
@@ -1331,21 +1418,19 @@
         return sb.toString();
     }
 
-    private String createCommonDSL() {
+    private String createPatternRule(String ruleName,String patterns) {
         StringBuilder sb = new StringBuilder();
-        sb.append("[condition][]There is a String = String()\n");
-        sb.append("[consequence][]add rule's name to list = list.add( drools.getRule().getName() );\n");
-        return sb.toString();
-    }
+        sb.append("rule ");
+        sb.append(ruleName);
+        sb.append("\n");
+        sb.append("when\n");
+        if (patterns != null){
+            sb.append(patterns);
+        }
+        sb.append("then\n");
+        sb.append("list.add( drools.getRule().getName() );\n");
+        sb.append("end\n");
 
-    private String createDummyFunction(String functionName) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("function void  ");
-        sb.append(functionName);
-        sb.append("(){\n");
-        sb.append(" System.out.println(\"Function executed\");\n");
-        sb.append("}\n");
-
         return sb.toString();
     }
 

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	2010-06-24 10:23:30 UTC (rev 33619)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java	2010-06-24 12:38:11 UTC (rev 33620)
@@ -1,5 +1,6 @@
 package org.drools.agent.impl;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -39,6 +40,8 @@
 import org.drools.io.internal.InternalResource;
 import org.drools.agent.ResourceDiffProducer;
 import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.event.knowledgeagent.KnowledgeAgentEventListener;
+import org.drools.event.KnowledgeAgentEventSupport;
 import org.drools.reteoo.ReteooRuleBase;
 import org.drools.rule.Function;
 import org.drools.rule.Package;
@@ -74,6 +77,8 @@
     private ChangeSetNotificationDetector changeSetNotificationDetector;
     private SemanticModules semanticModules;
     private final RegisteredResourceMap registeredResources = new RegisteredResourceMap();
+    private Map<Resource,String> dslResources = new HashMap<Resource, String>();
+    private KnowledgeAgentEventSupport eventSupport = new KnowledgeAgentEventSupport();
 
     private KnowledgeBuilderConfiguration builderConfiguration;
 
@@ -139,6 +144,8 @@
 
     public void applyChangeSet(ChangeSet changeSet) {
         synchronized (this.registeredResources) {
+            this.eventSupport.fireBeforeChangeSetApplied(changeSet);
+
             this.listener.info("KnowledgeAgent applying ChangeSet");
 
             ChangeSetState changeSetState = new ChangeSetState();
@@ -152,6 +159,8 @@
             buildKnowledgeBase(changeSetState);
             // Rebuild the resource mapping
             //buildResourceMapping();
+
+            this.eventSupport.fireAfterChangeSetApplied(changeSet);
         }
     }
 
@@ -171,12 +180,24 @@
     public void processChangeSet(ChangeSet changeSet,
             ChangeSetState changeSetState) {
         synchronized (this.registeredResources) {
+            this.eventSupport.fireBeforeChangeSetProcessed(changeSet);
+
             /*
              * Process the added resources from a ChangeSet by subscribing to
              * the notifier and inserting a new ResourceMapping.
              */
             for (Resource resource : changeSet.getResourcesAdded()) {
-                if (((InternalResource) resource).getResourceType() == ResourceType.CHANGE_SET) {
+                this.eventSupport.fireBeforeResourceProcessed(changeSet, resource, ((InternalResource) resource).getResourceType(), ResourceStatus.RESOURCE_ADDED);
+                if (((InternalResource) resource).getResourceType() == ResourceType.DSL){
+                    this.notifier.subscribeResourceChangeListener(this,
+                            resource);
+                    try {
+                        this.retrieveDSLResource(resource);
+                    } catch (IOException ex) {
+                        this.listener.exception("KnowledgeAgent Fails trying to read DSL Resource: "
+                            + resource,ex);
+                    }
+                } else if (((InternalResource) resource).getResourceType() == ResourceType.CHANGE_SET) {
                     // @TODO We should not ignore an added change set
                     this.listener.debug("KnowledgeAgent processing sub ChangeSet="
                             + resource);
@@ -210,6 +231,7 @@
 
                     }
                 }
+                this.eventSupport.fireAfterResourceProcessed(changeSet, resource, ((InternalResource) resource).getResourceType(), ResourceStatus.RESOURCE_ADDED);
             }
 
             /*
@@ -218,7 +240,12 @@
              * incremental building process knows what to remove.
              */
             for (Resource resource : changeSet.getResourcesRemoved()) {
-                if (((InternalResource) resource).getResourceType() == ResourceType.CHANGE_SET) {
+                this.eventSupport.fireBeforeResourceProcessed(changeSet, resource, ((InternalResource) resource).getResourceType(), ResourceStatus.RESOURCE_MODIFIED);
+                if (((InternalResource) resource).getResourceType() == ResourceType.DSL){
+                    this.notifier.unsubscribeResourceChangeListener(this,
+                            resource);
+                    this.dslResources.remove(resource);
+                } else if (((InternalResource) resource).getResourceType() == ResourceType.CHANGE_SET) {
                     // @TODO Is this true? Shouldn't we just ignore it in
                     // removed?
                     processChangeSet(resource, changeSetState);
@@ -237,6 +264,7 @@
                         changeSetState.removedResourceMappings.put(resource, definitions);
                     }
                 }
+                this.eventSupport.fireAfterResourceProcessed(changeSet, resource, ((InternalResource) resource).getResourceType(), ResourceStatus.RESOURCE_MODIFIED);
             }
 
             /*
@@ -246,7 +274,15 @@
              * Process any modified ChangeSets - treat them as if they were new.
              */
             for (Resource resource : changeSet.getResourcesModified()) {
-                if (((InternalResource) resource).getResourceType() == ResourceType.CHANGE_SET) {
+                this.eventSupport.fireBeforeResourceProcessed(changeSet, resource, ((InternalResource) resource).getResourceType(), ResourceStatus.RESOURCE_REMOVED);
+                if (((InternalResource) resource).getResourceType() == ResourceType.DSL){
+                    try {
+                        this.retrieveDSLResource(resource);
+                    } catch (IOException ex) {
+                        this.listener.exception("KnowledgeAgent Fails trying to read DSL Resource: "
+                            + resource,ex);
+                    }
+                } else if (((InternalResource) resource).getResourceType() == ResourceType.CHANGE_SET) {
                     // processChangeSet(resource, changeSetState);
                     continue;
                 } else if (((InternalResource) resource).isDirectory()) {
@@ -296,8 +332,10 @@
                         }
                     }
                 }
+                this.eventSupport.fireAfterResourceProcessed(changeSet, resource, ((InternalResource) resource).getResourceType(), ResourceStatus.RESOURCE_REMOVED);
             }
 
+            this.eventSupport.fireAfterChangeSetProcessed(changeSet, changeSetState.addedResources, changeSetState.modifiedResourceMappings, changeSetState.removedResourceMappings);
         }
     }
 
@@ -533,6 +571,7 @@
                 }
             }
         }
+        this.eventSupport.fireKnowledgeBaseUpdated(this.kbase);
         this.listener.debug("KnowledgeAgent finished rebuilding KnowledgeBase using ChangeSet");
     }
 
@@ -566,6 +605,7 @@
         if (((InternalResource) resource).getResourceType() != ResourceType.PKG) {
             kbuilder.add(resource, ((InternalResource) resource).getResourceType());
             if (kbuilder.hasErrors()) {
+                this.eventSupport.fireResourceCompilationFailed(kbuilder, resource, ((InternalResource) resource).getResourceType());
                 this.listener.warning(
                         "KnowledgeAgent has KnowledgeBuilder errors ", kbuilder.getErrors());
             }
@@ -613,7 +653,6 @@
      *            The ChangeSetState
      */
     private void rebuildResources(ChangeSetState changeSetState) {
-
         if (!this.newInstance) {
             listener.warning("KnowledgeAgent rebuilding KnowledgeBase when newInstance is false");
         }
@@ -815,6 +854,11 @@
             changeSetState.createdPackages.put(resource, createdPackage);
         }
 
+        //createPackageFromResource already log this
+//        if (kbuilder.hasErrors()) {
+//            this.listener.warning(
+//                    "KnowledgeAgent has KnowledgeBuilder errors ", kbuilder.getErrors());
+//        }
 
         for (Map.Entry<Resource, KnowledgePackage> entry : changeSetState.createdPackages.entrySet()) {
             // For PKG (.pks) just add them
@@ -837,16 +881,16 @@
             }
         }
 
-        if (kbuilder
-                != null) {
-            // Log any errors we come across
-            if (kbuilder.hasErrors()) {
-                this.listener.warning(
-                        "KnowledgeAgent has KnowledgeBuilder errors ", kbuilder.getErrors());
-            }
-            this.listener.debug("KnowledgeAgent adding KnowledgePackages from KnowledgeBuilder");
-            this.kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
-        }
+//        if (kbuilder
+//                != null) {
+//            // Log any errors we come across
+//            if (kbuilder.hasErrors()) {
+//                this.listener.warning(
+//                        "KnowledgeAgent has KnowledgeBuilder errors ", kbuilder.getErrors());
+//            }
+//            this.listener.debug("KnowledgeAgent adding KnowledgePackages from KnowledgeBuilder");
+//            this.kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+//        }
         /*
          * Add all the packages we found, but did not build, from the resources
          * now
@@ -1080,18 +1124,40 @@
     }
 
     private KnowledgeBuilder createKBuilder(){
+        KnowledgeBuilder kbuilder = null;
         if (this.builderConfiguration != null){
-            return KnowledgeBuilderFactory.newKnowledgeBuilder(this.builderConfiguration);
+            kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(this.builderConfiguration);
+        }else if (this.useKBaseClassLoaderForCompiling){
+            kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, ((ReteooRuleBase)((KnowledgeBaseImpl)this.getKnowledgeBase()).getRuleBase()).getRootClassLoader()));
+        }else{
+            kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         }
 
-        if (this.useKBaseClassLoaderForCompiling){
-            return  KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, ((ReteooRuleBase)((KnowledgeBaseImpl)this.getKnowledgeBase()).getRuleBase()).getRootClassLoader()));
+        if (this.dslResources != null){
+            for (Map.Entry<Resource, String> entry : this.dslResources.entrySet()) {
+                kbuilder.add(ResourceFactory.newByteArrayResource(entry.getValue().getBytes()), ResourceType.DSL);
+            }
         }
 
-        return KnowledgeBuilderFactory.newKnowledgeBuilder();
+        return kbuilder;
+    }
 
+    private void retrieveDSLResource(Resource resource) throws IOException{
+        BufferedReader bufferedReader = new BufferedReader(resource.getReader());
+        String line = null;
+        StringBuilder content = new StringBuilder();
+        while((line = bufferedReader.readLine()) != null){
+            content.append(line);
+            content.append("\n");
+        }
+
+        this.dslResources.put(resource, content.toString());
     }
 
+    public void addEventListener(KnowledgeAgentEventListener listener) {
+        this.eventSupport.addEventListener(listener);
+    }
+
     /*
      * (non-Javadoc)
      *



More information about the jboss-svn-commits mailing list