[jboss-svn-commits] JBL Code SVN: r33877 - labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jul 14 11:24:53 EDT 2010


Author: eaa
Date: 2010-07-14 11:24:53 -0400 (Wed, 14 Jul 2010)
New Revision: 33877

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java
Log:
Fixed some race conditions in KnowledgeAgent's test.

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	2010-07-14 12:19:27 UTC (rev 33876)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java	2010-07-14 15:24:53 UTC (rev 33877)
@@ -24,6 +24,15 @@
 import org.drools.core.util.DroolsStreamUtils;
 import org.drools.core.util.FileManager;
 import org.drools.definition.KnowledgePackage;
+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;
@@ -39,1123 +48,900 @@
 import org.mortbay.jetty.handler.ResourceHandler;
 
 public class KnowledgeAgentTest extends TestCase {
-	FileManager fileManager;
 
-	private Server server;
+    FileManager fileManager;
+    private Server server;
+    private final Object lock = new Object();
+    private volatile boolean kbaseUpdated;
 
-	protected void setUp() throws Exception {
-		fileManager = new FileManager();
-		fileManager.setUp();
-		((ResourceChangeScannerImpl) ResourceFactory
-				.getResourceChangeScannerService()).reset();
-		ResourceFactory.getResourceChangeNotifierService().start();
-		ResourceFactory.getResourceChangeScannerService().start();
+    @Override
+    protected void setUp() throws Exception {
+        fileManager = new FileManager();
+        fileManager.setUp();
+        ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
 
-		this.server = new Server(0);
-                
-		ResourceHandler resourceHandler = new ResourceHandler();
-		resourceHandler.setResourceBase(fileManager.getRootDirectory()
-				.getPath());
-		System.out
-				.println("root : " + fileManager.getRootDirectory().getPath());
+        ResourceFactory.getResourceChangeNotifierService().start();
+        ResourceFactory.getResourceChangeScannerService().start();
 
-		server.setHandler(resourceHandler);
+        this.server = new Server(0);
+        ResourceHandler resourceHandler = new ResourceHandler();
+        resourceHandler.setResourceBase(fileManager.getRootDirectory().getPath());
 
-		server.start();
-                System.out.println("Server running on port "+this.getPort());
-	}
+        server.setHandler(resourceHandler);
 
-        private int getPort(){
-            return this.server.getConnectors()[0].getLocalPort();
-        }
+        server.start();
 
-	protected void tearDown() throws Exception {
-		fileManager.tearDown();
-		ResourceFactory.getResourceChangeNotifierService().stop();
-		ResourceFactory.getResourceChangeScannerService().stop();
-		((ResourceChangeNotifierImpl) ResourceFactory
-				.getResourceChangeNotifierService()).reset();
-		((ResourceChangeScannerImpl) ResourceFactory
-				.getResourceChangeScannerService()).reset();
+        this.kbaseUpdated = false;
+    }
 
-		server.stop();
-	}
+    private int getPort() {
+        return this.server.getConnectors()[0].getLocalPort();
+    }
 
-	public void testModifyFileUrl() 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();
+    @Override
+    protected void tearDown() throws Exception {
+        fileManager.tearDown();
+        ResourceFactory.getResourceChangeNotifierService().stop();
+        ResourceFactory.getResourceChangeScannerService().stop();
+        ((ResourceChangeNotifierImpl) ResourceFactory.getResourceChangeNotifierService()).reset();
+        ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
 
-		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();
+        server.stop();
+    }
 
-		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()+"/rule1.drl' type='DRL' />";
-		xml += "        <resource source='http://localhost:"+this.getPort()+"/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();
+    public void testModifyFileUrl() throws Exception {
+        String rule1 = this.createDefaultRule("rule1");
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        String rule2 = this.createDefaultRule("rule2");
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        File f2 = fileManager.newFile("rule2.drl");
+        output = new BufferedWriter(new FileWriter(f2));
+        output.write(rule2);
+        output.close();
 
-		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);
+        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() + "/rule1.drl' type='DRL' />";
+        xml += "        <resource source='http://localhost:" + this.getPort() + "/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();
 
-		assertEquals("test agent", kagent.getName());
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI()
-				.toURL()));
+        ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
+        sconf.setProperty("drools.resource.scanner.interval", "2");
+        ResourceFactory.getResourceChangeScannerService().configure(sconf);
 
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        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);
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        assertEquals("test agent", kagent.getName());
 
-		list.clear();
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        kbaseUpdated = false;
 
-		// 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);
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		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);
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-		list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        list.clear();
 
-		assertEquals(2, list.size());
+        // 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);
 
-		assertTrue(list.contains("rule3"));
-		assertTrue(list.contains("rule2"));
-		kagent.monitorResourceChangeEvents(false);
-	}
+        rule1 = this.createDefaultRule("rule3");
 
-	/**
-	 * Tests that if we change a ChangeSet that is referenced by another change
-	 * set or added by another ChangeSet, that the changes are picked up.
-	 *
-	 * @throws Exception
-	 *             If an unexpected exception occurs.
-	 */
-	public void testChangeSetInChangeSet() 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();
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
+        Thread.sleep(3000);
 
-		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();
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		String xml1 = "";
-		xml1 += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
-		xml1 += "    xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
-		xml1 += "    xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd' >";
-		xml1 += "    <add> ";
-		xml1 += "        <resource source='http://localhost:"+this.getPort()+"/rule1.drl' type='DRL' />";
-		xml1 += "        <resource source='http://localhost:"+this.getPort()+"/rule2.drl' type='DRL' />";
-		xml1 += "    </add> ";
-		xml1 += "</change-set>";
-		File fxml1 = fileManager.newFile("changeset2.xml");
-		output = new BufferedWriter(new FileWriter(fxml1));
-		output.write(xml1);
-		output.close();
+        assertEquals(2, list.size());
 
-		String xml2 = "";
-		xml2 += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
-		xml2 += "    xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
-		xml2 += "    xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd' >";
-		xml2 += "    <add> ";
-		xml2 += "        <resource source='http://localhost:"+this.getPort()+"/changeset2.xml' type='CHANGE_SET' />";
-		xml2 += "    </add> ";
-		xml2 += "</change-set>";
-		File fxml2 = fileManager.newFile("changeset.xml");
-		output = new BufferedWriter(new FileWriter(fxml2));
-		output.write(xml2);
-		output.close();
+        assertTrue(list.contains("rule3"));
+        assertTrue(list.contains("rule2"));
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+    /**
+     * Tests that if we change a ChangeSet that is referenced by another change
+     * set or added by another ChangeSet, that the changes are picked up.
+     *
+     * @throws Exception
+     *             If an unexpected exception occurs.
+     */
+    public void testChangeSetInChangeSet() throws Exception {
+        String rule1 = this.createDefaultRule("rule1");
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        String rule2 = this.createDefaultRule("rule2");
+        File f2 = fileManager.newFile("rule2.drl");
+        output = new BufferedWriter(new FileWriter(f2));
+        output.write(rule2);
+        output.close();
 
-		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);
+        String xml1 = "";
+        xml1 += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
+        xml1 += "    xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
+        xml1 += "    xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd' >";
+        xml1 += "    <add> ";
+        xml1 += "        <resource source='http://localhost:" + this.getPort() + "/rule1.drl' type='DRL' />";
+        xml1 += "        <resource source='http://localhost:" + this.getPort() + "/rule2.drl' type='DRL' />";
+        xml1 += "    </add> ";
+        xml1 += "</change-set>";
+        File fxml1 = fileManager.newFile("changeset2.xml");
+        output = new BufferedWriter(new FileWriter(fxml1));
+        output.write(xml1);
+        output.close();
 
-		assertEquals("test agent", kagent.getName());
+        String xml2 = "";
+        xml2 += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
+        xml2 += "    xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
+        xml2 += "    xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd' >";
+        xml2 += "    <add> ";
+        xml2 += "        <resource source='http://localhost:" + this.getPort() + "/changeset2.xml' type='CHANGE_SET' />";
+        xml2 += "    </add> ";
+        xml2 += "</change-set>";
+        File fxml2 = fileManager.newFile("changeset.xml");
+        output = new BufferedWriter(new FileWriter(fxml2));
+        output.write(xml2);
+        output.close();
 
-		kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml2.toURI()
-				.toURL()));
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml2.toURI().toURL()));
+        kbaseUpdated = false;
 
-		list.clear();
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		// 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);
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		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);
+        list.clear();
 
-		ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-		list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        // 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);
 
-		assertEquals(2, list.size());
+        rule1 = this.createDefaultRule("rule3");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-		assertTrue(list.contains("rule3"));
-		assertTrue(list.contains("rule2"));
-		kagent.monitorResourceChangeEvents(false);
-	}
+        this.waitUntilKBaseUpdate();
 
-	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();
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		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();
+        assertEquals(2, list.size());
 
-		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()+"/rule1.drl' type='DRL' />";
-		xml += "        <resource source='http://localhost:"+this.getPort()+"/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();
+        assertTrue(list.contains("rule3"));
+        assertTrue(list.contains("rule2"));
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+    public void testModifyFileUrlWithStateless() throws Exception {
+        String rule1 = this.createDefaultRule("rule1");
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-		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);
+        String rule2 = this.createDefaultRule("rule2");
+        File f2 = fileManager.newFile("rule2.drl");
+        output = new BufferedWriter(new FileWriter(f2));
+        output.write(rule2);
+        output.close();
 
-		kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI()
-				.toURL()));
+        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() + "/rule1.drl' type='DRL' />";
+        xml += "        <resource source='http://localhost:" + this.getPort() + "/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();
 
-		StatelessKnowledgeSession ksession = kagent
-				.newStatelessKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.execute("hello");
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		list.clear();
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        kbaseUpdated = false;
 
-		// 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);
+        StatelessKnowledgeSession ksession = kagent.newStatelessKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.execute("hello");
 
-		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";
-		System.out.println("root : " + f1.getPath());
-		output = new BufferedWriter(new FileWriter(f1));
-		output.write(rule1);
-		output.close();
-		Thread.sleep(3000);
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		ksession.execute("hello");
+        list.clear();
 
-		assertEquals(2, list.size());
+        // 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);
 
-		assertTrue(list.contains("rule3"));
-		assertTrue(list.contains("rule2"));
-		kagent.monitorResourceChangeEvents(false);
-	}
+        rule1 = this.createDefaultRule("rule3");
+        System.out.println("root : " + f1.getPath());
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-	public void testModifyPackageUrl() 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";
+        this.waitUntilKBaseUpdate();
 
-		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";
+        ksession.execute("hello");
 
-		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
-				.newKnowledgeBuilder();
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
-				ResourceType.DRL);
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
-				ResourceType.DRL);
-		if (kbuilder.hasErrors()) {
-			fail(kbuilder.getErrors().toString());
-		}
-		KnowledgePackage pkg = (KnowledgePackage) kbuilder
-				.getKnowledgePackages().iterator().next();
-		writePackage(pkg, fileManager.newFile("pkg1.pkg"));
+        assertEquals(2, list.size());
 
-		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()+"/pkg1.pkg' type='PKG' />";
-		xml += "    </add> ";
-		xml += "</change-set>";
-		File fxml = fileManager.newFile("changeset.xml");
-		Writer output = new BufferedWriter(new FileWriter(fxml));
-		output.write(xml);
-		output.close();
+        assertTrue(list.contains("rule3"));
+        assertTrue(list.contains("rule2"));
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+    public void testModifyPackageUrl() throws Exception {
+        String rule1 = this.createDefaultRule("rule1");
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        String rule2 = this.createDefaultRule("rule2");
 
-		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);
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
+                ResourceType.DRL);
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
+                ResourceType.DRL);
+        if (kbuilder.hasErrors()) {
+            fail(kbuilder.getErrors().toString());
+        }
+        KnowledgePackage pkg = (KnowledgePackage) kbuilder.getKnowledgePackages().iterator().next();
+        writePackage(pkg, fileManager.newFile("pkg1.pkg"));
 
-		kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI()
-				.toURL()));
+        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() + "/pkg1.pkg' type='PKG' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File fxml = fileManager.newFile("changeset.xml");
+        Writer output = new BufferedWriter(new FileWriter(fxml));
+        output.write(xml);
+        output.close();
 
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		list.clear();
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        kbaseUpdated = false;
 
-		// 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);
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		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";
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
-				ResourceType.DRL);
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
-				ResourceType.DRL);
-		if (kbuilder.hasErrors()) {
-			fail(kbuilder.getErrors().toString());
-		}
-		pkg = (KnowledgePackage) kbuilder.getKnowledgePackages().iterator()
-				.next();
-		writePackage(pkg, fileManager.newFile("pkg1.pkg"));
+        list.clear();
 
-		// KnowledgePackage pkg2 = ( KnowledgePackage )
-		// DroolsStreamUtils.streamIn( new FileInputStream( fileManager.newFile(
-		// "pkg1.pkg" ) ) );
+        // 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);
 
-		Thread.sleep(3000);
+        rule1 = this.createDefaultRule("rule3");
 
-		ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-		list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
+                ResourceType.DRL);
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
+                ResourceType.DRL);
+        if (kbuilder.hasErrors()) {
+            fail(kbuilder.getErrors().toString());
+        }
+        pkg = (KnowledgePackage) kbuilder.getKnowledgePackages().iterator().next();
+        writePackage(pkg, fileManager.newFile("pkg1.pkg"));
 
-		assertEquals(2, list.size());
+        this.waitUntilKBaseUpdate();
 
-		assertTrue(list.contains("rule3"));
-		assertTrue(list.contains("rule2"));
-		kagent.monitorResourceChangeEvents(false);
-	}
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-	public void testDeletePackageUrl() throws Exception {
-		String rule1 = "";
-		rule1 += "package org.drools.test1\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";
+        assertEquals(2, list.size());
 
-		String rule2 = "";
-		rule2 += "package org.drools.test2\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";
+        assertTrue(list.contains("rule3"));
+        assertTrue(list.contains("rule2"));
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
-				.newKnowledgeBuilder();
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
-				ResourceType.DRL);
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
-				ResourceType.DRL);
-		if (kbuilder.hasErrors()) {
-			fail(kbuilder.getErrors().toString());
-		}
+    public void testDeletePackageUrl() throws Exception {
+        String rule1 = this.createDefaultRule("rule1","org.drools.test1");
 
-		Map<String, KnowledgePackage> map = new HashMap<String, KnowledgePackage>();
-		for (KnowledgePackage pkg : kbuilder.getKnowledgePackages()) {
-			map.put(pkg.getName(), pkg);
-		}
-		writePackage((KnowledgePackage) map.get("org.drools.test1"),
-				fileManager.newFile("pkg1.pkg"));
-		writePackage((KnowledgePackage) map.get("org.drools.test2"),
-				fileManager.newFile("pkg2.pkg"));
+        String rule2 = this.createDefaultRule("rule2","org.drools.test2");
 
-		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()+"/pkg1.pkg' type='PKG' />";
-		xml += "        <resource source='http://localhost:"+this.getPort()+"/pkg2.pkg' type='PKG' />";
-		xml += "    </add> ";
-		xml += "</change-set>";
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
+                ResourceType.DRL);
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
+                ResourceType.DRL);
+        if (kbuilder.hasErrors()) {
+            fail(kbuilder.getErrors().toString());
+        }
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        Map<String, KnowledgePackage> map = new HashMap<String, KnowledgePackage>();
+        for (KnowledgePackage pkg : kbuilder.getKnowledgePackages()) {
+            map.put(pkg.getName(), pkg);
+        }
+        writePackage((KnowledgePackage) map.get("org.drools.test1"),
+                fileManager.newFile("pkg1.pkg"));
+        writePackage((KnowledgePackage) map.get("org.drools.test2"),
+                fileManager.newFile("pkg2.pkg"));
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        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() + "/pkg1.pkg' type='PKG' />";
+        xml += "        <resource source='http://localhost:" + this.getPort() + "/pkg2.pkg' type='PKG' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
 
-		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);
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		kagent.applyChangeSet(ResourceFactory.newByteArrayResource(xml
-				.getBytes()));
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        kagent.applyChangeSet(ResourceFactory.newByteArrayResource(xml.getBytes()));
+        kbaseUpdated = false;
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		list.clear();
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		// 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);
+        list.clear();
 
-		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 += "    <remove> ";
-		xml += "        <resource source='http://localhost:"+this.getPort()+"/pkg2.pkg' type='PKG' />";
-		xml += "    </remove> ";
-		xml += "</change-set>";
+        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 += "    <remove> ";
+        xml += "        <resource source='http://localhost:" + this.getPort() + "/pkg2.pkg' type='PKG' />";
+        xml += "    </remove> ";
+        xml += "</change-set>";
 
-		kagent.applyChangeSet(ResourceFactory.newByteArrayResource(xml
-				.getBytes()));
+        kagent.applyChangeSet(ResourceFactory.newByteArrayResource(xml.getBytes()));
+        kbaseUpdated = false;
 
-		Thread.sleep(3000);
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-		list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        assertEquals(1, list.size());
 
-		assertEquals(1, list.size());
+        assertTrue(list.contains("rule1"));
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-		assertTrue(list.contains("rule1"));
-		kagent.monitorResourceChangeEvents(false);
-	}
+    public void testOldSchoolPackageUrl() throws Exception {
+        String rule1 = this.createDefaultRule("rule1");
 
-	public void testOldSchoolPackageUrl() 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";
+        String rule2 = this.createDefaultRule("rule2");
 
-		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";
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
+                ResourceType.DRL);
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
+                ResourceType.DRL);
+        if (kbuilder.hasErrors()) {
+            fail(kbuilder.getErrors().toString());
+        }
 
-		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
-				.newKnowledgeBuilder();
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
-				ResourceType.DRL);
-		kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
-				ResourceType.DRL);
-		if (kbuilder.hasErrors()) {
-			fail(kbuilder.getErrors().toString());
-		}
+        KnowledgeBuilderImpl kbi = (KnowledgeBuilderImpl) kbuilder;
 
-		KnowledgeBuilderImpl kbi = (KnowledgeBuilderImpl) kbuilder;
+        // KnowledgePackage pkg = ( KnowledgePackage )
+        // kbuilder.getKnowledgePackages().iterator().next();
+        writePackage(kbi.getPackageBuilder().getPackage(), fileManager.newFile("pkgold.pkg"));
 
-		// KnowledgePackage pkg = ( KnowledgePackage )
-		// kbuilder.getKnowledgePackages().iterator().next();
-		writePackage(kbi.getPackageBuilder().getPackage(), fileManager
-				.newFile("pkgold.pkg"));
+        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() + "/pkgold.pkg' type='PKG' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File fxml = fileManager.newFile("changeset.xml");
+        Writer output = new BufferedWriter(new FileWriter(fxml));
+        output.write(xml);
+        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()+"/pkgold.pkg' type='PKG' />";
-		xml += "    </add> ";
-		xml += "</change-set>";
-		File fxml = fileManager.newFile("changeset.xml");
-		Writer output = new BufferedWriter(new FileWriter(fxml));
-		output.write(xml);
-		output.close();
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        kbaseUpdated = false;
 
-		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()));
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+    }
 
-	}
+    public void testModifyFile() throws IOException, InterruptedException {
+        String rule1 = this.createDefaultRule("rule1");
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-	public void testModifyFile() throws IOException, InterruptedException {
-		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 = this.createDefaultRule("rule2");
+        File f2 = fileManager.newFile("rule2.drl");
+        output = new BufferedWriter(new FileWriter(f2));
+        output.write(rule2);
+        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='" + f1.toURI().toURL()
+                + "' type='DRL' />";
+        xml += "        <resource source='" + f2.toURI().toURL()
+                + "' type='DRL' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File fxml = fileManager.newFile("changeset.xml");
+        output = new BufferedWriter(new FileWriter(fxml));
+        output.write(xml);
+        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='" + f1.toURI().toURL()
-				+ "' type='DRL' />";
-		xml += "        <resource source='" + f2.toURI().toURL()
-				+ "' 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();
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        kbaseUpdated = false;
 
-		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()));
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        list.clear();
 
-		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);
 
-		// 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 = this.createDefaultRule("rule3");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-		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);
+        this.waitUntilKBaseUpdate();
 
-		ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-		list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		assertEquals(2, list.size());
+        assertEquals(2, list.size());
 
-		assertTrue(list.contains("rule3"));
-		assertTrue(list.contains("rule2"));
-		kagent.monitorResourceChangeEvents(false);
-	}
+        assertTrue(list.contains("rule3"));
+        assertTrue(list.contains("rule2"));
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-	public void testModifyDirectory() throws IOException, InterruptedException {
-		// adds 2 files to a dir and executes then adds one and removes one and
-		// detects changes
-		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");
+    public void testModifyDirectory() throws IOException, InterruptedException {
+        // adds 2 files to a dir and executes then adds one and removes one and
+        // detects changes
+        String rule1 = this.createDefaultRule("rule1");
+        File f1 = fileManager.newFile("rule1.drl");
 
-		Writer output = new BufferedWriter(new FileWriter(f1));
-		output.write(rule1);
-		output.close();
+        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 rule2 = this.createDefaultRule("rule2");
+        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='"
-				+ f1.getParentFile().toURI().toURL() + "' type='DRL' />";
-		xml += "    </add> ";
-		xml += "</change-set>";
-		File newDir = fileManager.newFile("changeset");
-		newDir.mkdir();
-		File fxml = fileManager.newFile(newDir, "changeset.xml");
-		output = new BufferedWriter(new FileWriter(fxml));
-		output.write(xml);
-		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='"
+                + f1.getParentFile().toURI().toURL() + "' type='DRL' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File newDir = fileManager.newFile("changeset");
+        newDir.mkdir();
+        File fxml = fileManager.newFile(newDir, "changeset.xml");
+        output = new BufferedWriter(new FileWriter(fxml));
+        output.write(xml);
+        output.close();
 
-		// KnowledgeBuilder kbuilder =
-		// KnowledgeBuilderFactory.newKnowledgeBuilder();
-		// kbuilder.add( ResourceFactory.newUrlResource( fxml.toURI().toURL() ),
-		// ResourceType.ChangeSet );
-		// assertFalse( kbuilder.hasErrors() );
+        // KnowledgeBuilder kbuilder =
+        // KnowledgeBuilderFactory.newKnowledgeBuilder();
+        // kbuilder.add( ResourceFactory.newUrlResource( fxml.toURI().toURL() ),
+        // ResourceType.ChangeSet );
+        // assertFalse( kbuilder.hasErrors() );
 
-		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-		// kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        // kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory
-				.newKnowledgeAgentConfiguration();
-		aconf.setProperty("drools.agent.scanDirectories", "true");
-		aconf.setProperty("drools.agent.newInstance", "true");
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        kbaseUpdated = false;
 
-		KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-				"test agent", kbase, aconf);
-		kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI()
-				.toURL()));
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		Thread.sleep(3000); // give it 2 seconds to detect and build the changes
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        list.clear();
 
-		list.clear();
-		String rule3 = "";
-		rule3 += "package org.drools.test\n";
-		rule3 += "global java.util.List list\n";
-		rule3 += "rule rule3\n";
-		rule3 += "when\n";
-		rule3 += "then\n";
-		rule3 += "list.add( drools.getRule().getName() );\n";
-		rule3 += "end\n";
-		File f3 = fileManager.newFile("rule3.drl");
-		output = new BufferedWriter(new FileWriter(f3));
-		output.write(rule3);
-		output.close();
+        Thread.sleep(2000); // give it 2 seconds to detect and build the changes
+        String rule3 = this.createDefaultRule("rule3");
+        File f3 = fileManager.newFile("rule3.drl");
+        output = new BufferedWriter(new FileWriter(f3));
+        output.write(rule3);
+        output.close();
 
-		assertTrue(f1.delete());
+        assertTrue(f1.delete());
 
-		Thread.sleep(3000);
+        this.waitUntilKBaseUpdate();
 
-		ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-		list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule2"));
-		assertTrue(list.contains("rule3"));
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule2"));
+        assertTrue(list.contains("rule3"));
 
-		kagent.monitorResourceChangeEvents(false);
-	}
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-	public void testModifyFileInDirectory() throws Exception {
-		// Create the test directory
-		File testDirectory = fileManager.newFile("test");
-		testDirectory.mkdir();
+    public void testModifyFileInDirectory() throws Exception {
+        // Create the test directory
+        File testDirectory = fileManager.newFile("test");
+        testDirectory.mkdir();
 
-		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(testDirectory, "rule1.drl");
-		Writer output = new BufferedWriter(new FileWriter(f1));
-		output.write(rule1);
-		output.close();
+        String rule1 = this.createDefaultRule("rule1");
+        File f1 = fileManager.newFile(testDirectory, "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(testDirectory, "rule2.drl");
-		output = new BufferedWriter(new FileWriter(f2));
-		output.write(rule2);
-		output.close();
+        String rule2 = this.createDefaultRule("rule2");
+        File f2 = fileManager.newFile(testDirectory, "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='file:"
-				+ fileManager.getRootDirectory().getAbsolutePath()
-				+ "/test' type='DRL' />";
-		xml += "    </add> ";
-		xml += "</change-set>";
-		File fxml = fileManager.newFile("changeset.xml");
-		output = new BufferedWriter(new FileWriter(fxml));
-		output.write(xml);
-		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='file:"
+                + fileManager.getRootDirectory().getAbsolutePath()
+                + "/test' 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();
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		ResourceChangeScannerConfiguration sconf = ResourceFactory
-				.getResourceChangeScannerService()
-				.newResourceChangeScannerConfiguration();
-		sconf.setProperty("drools.resource.scanner.interval", "2");
-		ResourceFactory.getResourceChangeScannerService().configure(sconf);
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		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()));
+        kbaseUpdated = false;
 
-		assertEquals("test agent", kagent.getName());
 
-		kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI()
-				.toURL()));
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		StatefulKnowledgeSession ksession = kagent.getKnowledgeBase()
-				.newStatefulKnowledgeSession();
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
+        list.clear();
 
-		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);
 
-		// 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 = this.createDefaultRule("rule3");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(rule1);
+        output.close();
 
-		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);
+        this.waitUntilKBaseUpdate();
 
-		ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-		list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
-		ksession.fireAllRules();
-		ksession.dispose();
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
 
-		assertEquals(2, list.size());
+        assertEquals(2, list.size());
 
-		assertTrue(list.contains("rule3"));
-		assertTrue(list.contains("rule2"));
-		kagent.monitorResourceChangeEvents(false);
-	}
+        assertTrue(list.contains("rule3"));
+        assertTrue(list.contains("rule2"));
+        kagent.monitorResourceChangeEvents(false);
+    }
 
-	public void testStatelessWithPipeline() 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");
+    public void testStatelessWithPipeline() throws Exception {
+        String rule1 = this.createDefaultRule("rule1");
+        File f1 = fileManager.newFile("rule1.drl");
 
-		Writer output = new BufferedWriter(new FileWriter(f1));
-		output.write(rule1);
-		output.close();
+        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 rule2 = this.createDefaultRule("rule2");
+        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='"
-				+ f1.getParentFile().toURI().toURL() + "' type='DRL' />";
-		xml += "    </add> ";
-		xml += "</change-set>";
-		File newDir = fileManager.newFile("changeset");
-		newDir.mkdir();
-		File fxml = fileManager.newFile(newDir, "changeset.xml");
-		output = new BufferedWriter(new FileWriter(fxml));
-		output.write(xml);
-		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='"
+                + f1.getParentFile().toURI().toURL() + "' type='DRL' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File newDir = fileManager.newFile("changeset");
+        newDir.mkdir();
+        File fxml = fileManager.newFile(newDir, "changeset.xml");
+        output = new BufferedWriter(new FileWriter(fxml));
+        output.write(xml);
+        output.close();
 
-		KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory
-				.newKnowledgeAgentConfiguration();
-		aconf.setProperty("drools.agent.scanDirectories", "true");
-		aconf.setProperty("drools.agent.newInstance", "true");
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-		KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-				"test agent", aconf);
-		kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI()
-				.toURL()));
+        KnowledgeAgent kagent = this.createKAgent(kbase);
 
-		Thread.sleep(3000); // give it 2 seconds to detect and build the changes
-		StatelessKnowledgeSession ksession = kagent
-				.newStatelessKnowledgeSession();
+        kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+        kbaseUpdated = false;
 
-		List<String> list = new ArrayList<String>();
-		ksession.setGlobal("list", list);
 
-		Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+        StatelessKnowledgeSession ksession = kagent.newStatelessKnowledgeSession();
 
-		Action assignResult = PipelineFactory.newAssignObjectAsResult();
-		assignResult.setReceiver(executeResultHandler);
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
 
-		KnowledgeRuntimeCommand batchExecution = PipelineFactory
-				.newCommandExecutor();
-		batchExecution.setReceiver(assignResult);
+        Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
 
-		KnowledgeRuntimeCommand insertStage = PipelineFactory
-				.newInsertObjectCommand();
-		insertStage.setReceiver(batchExecution);
+        Action assignResult = PipelineFactory.newAssignObjectAsResult();
+        assignResult.setReceiver(executeResultHandler);
 
-		Pipeline pipeline = PipelineFactory
-				.newStatelessKnowledgeSessionPipeline(ksession);
-		pipeline.setReceiver(insertStage);
+        KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+        batchExecution.setReceiver(assignResult);
 
-		ResultHandlerImpl resultHandler = new ResultHandlerImpl();
-		pipeline.insert("hello", resultHandler);
+        KnowledgeRuntimeCommand insertStage = PipelineFactory.newInsertObjectCommand();
+        insertStage.setReceiver(batchExecution);
 
-		assertEquals(2, list.size());
-		assertTrue(list.contains("rule1"));
-		assertTrue(list.contains("rule2"));
-	}
+        Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline(ksession);
+        pipeline.setReceiver(insertStage);
 
-	private static void writePackage(Object pkg, File p1file)
-			throws IOException, FileNotFoundException {
-		FileOutputStream out = new FileOutputStream(p1file);
-		try {
-			DroolsStreamUtils.streamOut(out, pkg);
-		} finally {
-			out.close();
-		}
-	}
+        ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+        pipeline.insert("hello", resultHandler);
 
-	public static class ResultHandlerImpl implements ResultHandler {
-		Object object;
+        assertEquals(2, list.size());
+        assertTrue(list.contains("rule1"));
+        assertTrue(list.contains("rule2"));
+    }
 
-		public void handleResult(Object object) {
-			this.object = object;
-		}
+    private static void writePackage(Object pkg, File p1file)
+            throws IOException, FileNotFoundException {
+        FileOutputStream out = new FileOutputStream(p1file);
+        try {
+            DroolsStreamUtils.streamOut(out, pkg);
+        } finally {
+            out.close();
+        }
+    }
 
-		public Object getObject() {
-			return this.object;
-		}
-	}
-}
\ No newline at end of file
+    public static class ResultHandlerImpl implements ResultHandler {
+
+        Object object;
+
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+
+        public Object getObject() {
+            return this.object;
+        }
+    }
+
+    private KnowledgeAgent createKAgent(KnowledgeBase kbase) {
+        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");
+        // Testing incremental build here
+        aconf.setProperty("drools.agent.newInstance", "true");
+
+        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
+                "test agent", kbase, aconf);
+
+        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) {
+            }
+        });
+
+        assertEquals("test agent", kagent.getName());
+
+        return kagent;
+    }
+
+    private String createDefaultRule(String name){
+        return this.createDefaultRule(name, null);
+    }
+
+    private String createDefaultRule(String name, String packageName){
+        StringBuilder rule = new StringBuilder();
+        if (packageName == null){
+            rule.append("package org.drools.test\n");
+        }else{
+            rule.append("package ");
+            rule.append(packageName);
+            rule.append("\n");
+        }
+        rule.append("global java.util.List list\n");
+        rule.append("rule ");
+        rule.append(name);
+        rule.append("\n");
+        rule.append("when\n");
+        rule.append("then\n");
+        rule.append("list.add( drools.getRule().getName() );\n");
+        rule.append("end\n");
+
+        return rule.toString();
+    }
+
+    private void waitUntilKBaseUpdate() {
+        synchronized (lock) {
+            while (!kbaseUpdated) {
+                try {
+                    lock.wait();
+                } catch (InterruptedException e) {
+                }
+                System.out.println("Waking up!");
+            }
+            kbaseUpdated = false;
+        }
+    }
+}



More information about the jboss-svn-commits mailing list