[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