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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jan 6 16:16:05 EST 2010


Author: eaa
Date: 2010-01-06 16:16:04 -0500 (Wed, 06 Jan 2010)
New Revision: 30961

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentBinaryDiffTests.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/DefaultResourceDiffProducerImpl.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/ResourceDiffProducer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/BinaryResourceDiffProducerImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/ResourceDiffResult.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/definitions/impl/KnowledgePackageImp.java
Log:
JBRULES-2082: support for delete/modify in changesets
	- Added binary diff support to KnowledgeAgent when newInstance=false (incremental build). 

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentBinaryDiffTests.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentBinaryDiffTests.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentBinaryDiffTests.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -0,0 +1,568 @@
+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.GregorianCalendar;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+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.rule.Rule;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.util.FileManager;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.handler.ResourceHandler;
+
+public class KnowledgeAgentBinaryDiffTests extends TestCase {
+
+    FileManager fileManager;
+    private Server server;
+
+    @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(9000);
+        ResourceHandler resourceHandler = new ResourceHandler();
+        resourceHandler.setResourceBase(fileManager.getRootDirectory().getPath());
+        System.out.println("root : " + fileManager.getRootDirectory().getPath());
+
+        server.setHandler(resourceHandler);
+
+        server.start();
+    }
+
+    @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 testDifferentDateExpires() throws Exception {
+
+        final String attribute1 = "date-expires \"4-jan-2010\"";
+        final String attribute2 = "date-expires \"5-jan-2010\"";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals(2010, rule.getDateExpires().get(GregorianCalendar.YEAR));
+                    assertEquals(GregorianCalendar.JANUARY, rule.getDateExpires().get(GregorianCalendar.MONTH));
+                    assertEquals(4, rule.getDateExpires().get(GregorianCalendar.DAY_OF_MONTH));
+                }else if (attribute.equals(attribute2)){
+                    assertEquals(2010, rule.getDateExpires().get(GregorianCalendar.YEAR));
+                    assertEquals(GregorianCalendar.JANUARY, rule.getDateExpires().get(GregorianCalendar.MONTH));
+                    assertEquals(5, rule.getDateExpires().get(GregorianCalendar.DAY_OF_MONTH));
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentDateEffective() throws Exception {
+
+        final String attribute1 = "date-effective \"4-jan-2010\"";
+        final String attribute2 = "date-effective \"5-jan-2010\"";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals(2010, rule.getDateEffective().get(GregorianCalendar.YEAR));
+                    assertEquals(GregorianCalendar.JANUARY, rule.getDateEffective().get(GregorianCalendar.MONTH));
+                    assertEquals(4, rule.getDateEffective().get(GregorianCalendar.DAY_OF_MONTH));
+                }else if (attribute.equals(attribute2)){
+                    assertEquals(2010, rule.getDateEffective().get(GregorianCalendar.YEAR));
+                    assertEquals(GregorianCalendar.JANUARY, rule.getDateEffective().get(GregorianCalendar.MONTH));
+                    assertEquals(5, rule.getDateEffective().get(GregorianCalendar.DAY_OF_MONTH));
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+
+    public void testDifferentDialect() throws Exception {
+
+        final String attribute1 = "dialect \"java\"";
+        final String attribute2 = "dialect \"mvel\"";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals("java", rule.getDialect());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals("mvel", rule.getDialect());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentRuleFlowGroup() throws Exception {
+
+        final String attribute1 = "ruleflow-group \"g1\"";
+        final String attribute2 = "ruleflow-group \"g2\"";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals("g1", rule.getRuleFlowGroup());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals("g2", rule.getRuleFlowGroup());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentAutoFocus() throws Exception {
+
+        final String attribute1 = "auto-focus false";
+        final String attribute2 = "auto-focus true";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals(false, rule.getAutoFocus());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals(true, rule.getAutoFocus());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentAgendaGroup() throws Exception {
+
+        final String attribute1 = "agenda-group \"g1\"";
+        final String attribute2 = "agenda-group \"g2\"";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals("g1", rule.getAgendaGroup());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals("g2", rule.getAgendaGroup());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentLockOnActive() throws Exception {
+
+        final String attribute1 = "lock-on-active false";
+        final String attribute2 = "lock-on-active true";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals(false, rule.isLockOnActive());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals(true, rule.isLockOnActive());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentNoLoop() throws Exception {
+
+        final String attribute1 = "no-loop false";
+        final String attribute2 = "no-loop true";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals(false, rule.isNoLoop());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals(true, rule.isNoLoop());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentActivationGroup() throws Exception {
+
+        final String attribute1 = "activation-group \"1\"";
+        final String attribute2 = "activation-group \"2\"";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals("1", rule.getActivationGroup());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals("2", rule.getActivationGroup());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+    
+
+    public void testDifferentSalience() throws Exception {
+
+        final String attribute1 = "salience 1";
+        final String attribute2 = "salience 2";
+
+        RuleAttributeAsserter asserter = new RuleAttributeAsserter() {
+
+            public void assertRuleAttribute(String attribute, Rule rule) {
+                if (attribute.equals(attribute1)){
+                    assertEquals("1", rule.getSalience().toString());
+                }else if (attribute.equals(attribute2)){
+                    assertEquals("2", rule.getSalience().toString());
+                }else{
+                    throw new IllegalArgumentException("Unexpected attribute "+attribute);
+                }
+            }
+        };
+
+        this.differentRuleAttributeTest(attribute1, attribute2, asserter);
+
+    }
+
+    public void testDifferentLHS() throws Exception {
+
+        String header1 = "";
+        header1 += "package org.drools.test\n";
+        header1 += "global java.util.List list\n\n";
+
+        String rule1 = this.createCommonRule("rule1");
+
+
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header1);
+        output.write(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:9000/rule1.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 = kbase.newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("rule1"));
+
+        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);
+
+        //String rule1v3 = this.createCommonRule("rule1","3");
+        String rule1v2 = "";
+        rule1v2 += "rule rule1\n";
+        rule1v2 += "when\n";
+        rule1v2 += "\tString()\n";
+        rule1v2 += "then\n";
+        rule1v2 += "list.add( drools.getRule().getName()+\"-V2\");\n";
+        rule1v2 += "end\n";
+
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header1);
+        output.write(rule1v2);
+        output.close();
+        Thread.sleep(3000);
+
+        // Use the same session for incremental build test
+        ksession = kbase.newStatefulKnowledgeSession();
+        ksession.setGlobal("list", list);
+        ksession.insert("Some String");
+        ksession.fireAllRules();
+        ksession.dispose();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("rule1-V2"));
+
+        kagent.monitorResourceChangeEvents(false);
+    }
+    
+    
+    public void testDifferentConsequences() throws Exception {
+
+        String header1 = "";
+        header1 += "package org.drools.test\n";
+        header1 += "global java.util.List list\n\n";
+
+        String rule1 = this.createCommonRule("rule1");
+
+
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header1);
+        output.write(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:9000/rule1.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 = kbase.newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("rule1"));
+
+        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);
+
+        String rule1v2 = this.createCommonRule("rule1", "2");
+
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header1);
+        output.write(rule1v2);
+        output.close();
+        Thread.sleep(3000);
+
+        // Use the same session for incremental build test
+        ksession = kbase.newStatefulKnowledgeSession();
+        ksession.setGlobal("list", list);
+        ksession.insert("Some String");
+        ksession.fireAllRules();
+        ksession.dispose();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("rule1-V2"));
+
+        kagent.monitorResourceChangeEvents(false);
+    }
+
+
+
+
+
+
+//
+
+    private void differentRuleAttributeTest(String attribute1, String attribute2,RuleAttributeAsserter asserter) throws Exception {
+
+        String header1 = "";
+        header1 += "package org.drools.test\n";
+        header1 += "global java.util.List list\n\n";
+
+        String rule1 = "";
+        rule1 += "rule rule1\n";
+        rule1 += attribute1+"\n";
+        rule1 += "when\n";
+        rule1 += "\tString()\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(header1);
+        output.write(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:9000/rule1.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()));
+
+        org.drools.rule.Rule rule = (org.drools.rule.Rule) kagent.getKnowledgeBase().getRule("org.drools.test", "rule1");
+
+        assertNotNull(rule);
+        asserter.assertRuleAttribute(attribute1, rule);
+
+
+        // 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);
+
+        String rule1v2 = "";
+        rule1v2 += "rule rule1\n";
+        rule1v2 += attribute2+"\n";
+        rule1v2 += "when\n";
+        rule1v2 += "\tString()\n";
+        rule1v2 += "then\n";
+        rule1v2 += "list.add( drools.getRule().getName());\n";
+        rule1v2 += "end\n";
+
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header1);
+        output.write(rule1v2);
+        output.close();
+        Thread.sleep(3000);
+
+        rule = (org.drools.rule.Rule) kagent.getKnowledgeBase().getRule("org.drools.test", "rule1");
+        assertNotNull(rule);
+        asserter.assertRuleAttribute(attribute2, rule);
+
+        kagent.monitorResourceChangeEvents(false);
+    }
+
+    private KnowledgeAgent createKAgent(KnowledgeBase kbase) {
+        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", "false");
+
+
+
+        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
+                "test agent", kbase, aconf);
+
+        assertEquals("test agent", kagent.getName());
+
+        return kagent;
+    }
+
+    private String createCommonRule(String ruleName) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("rule ");
+        sb.append(ruleName);
+        sb.append("\n");
+        sb.append("when\n");
+        sb.append("then\n");
+        sb.append("list.add( drools.getRule().getName() );\n");
+        sb.append("end\n");
+
+        return sb.toString();
+    }    
+
+    private String createCommonRule(String ruleName, String version) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("rule ");
+        sb.append(ruleName);
+        sb.append("\n");
+        sb.append("when\n");
+        sb.append("then\n");
+        sb.append("list.add( drools.getRule().getName()+\"-V" + version + "\");\n");
+        sb.append("end\n");
+
+        return sb.toString();
+    }
+
+    
+}
+
+interface RuleAttributeAsserter{
+    void assertRuleAttribute(String attribute, org.drools.rule.Rule rule);
+}
\ No newline at end of file

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-01-06 18:21:27 UTC (rev 30960)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -8,6 +8,8 @@
 import java.io.IOException;
 import java.io.Writer;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -18,12 +20,16 @@
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
 import org.drools.definition.KnowledgePackage;
+import org.drools.definition.rule.Rule;
+import org.drools.definitions.impl.KnowledgePackageImp;
 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.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.rule.QueryResults;
+import org.drools.runtime.rule.QueryResultsRow;
 import org.drools.util.DroolsStreamUtils;
 import org.drools.util.FileManager;
 import org.mortbay.jetty.Server;
@@ -63,31 +69,25 @@
         server.stop();
     }
 
-    
     public void testModifyFileUrlIncremental() 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 header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+        
+        String rule1 =  this.createCommonRule("rule1");
+
         File f1 = fileManager.newFile("rule1.drl");
         Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
         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";
+        String rule2 = this.createCommonRule("rule2");
+        
         File f2 = fileManager.newFile("rule2.drl");
         output = new BufferedWriter(new FileWriter(f2));
+        output.write(header);
         output.write(rule2);
         output.close();
 
@@ -106,21 +106,8 @@
         output.close();
 
         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);
-
-        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", "false");
-        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-                "test agent", kbase, aconf);
-
-        assertEquals("test agent", kagent.getName());
-
         kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -139,16 +126,11 @@
         // http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=019789
         Thread.sleep(2000);
 
-        rule1 = "";
-        rule1 += "package org.drools.test\n";
-        rule1 += "global java.util.List list\n";
-        rule1 += "rule rule3\n";
-        rule1 += "when\n";
-        rule1 += "then\n";
-        rule1 += "list.add( drools.getRule().getName() );\n";
-        rule1 += "end\n";
+        String rule3 = this.createCommonRule("rule3");
+
         output = new BufferedWriter(new FileWriter(f1));
-        output.write(rule1);
+        output.write(header);
+        output.write(rule3);
         output.close();
         Thread.sleep(3000);
 
@@ -167,29 +149,24 @@
     }
 
     public void testRemoveFileUrlIncremental() 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 header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+        
+        String rule1 = this.createCommonRule("rule1");
+
         File f1 = fileManager.newFile("rule1.drl");
         Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
         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";
+        String rule2 = this.createCommonRule("rule2");
+
         File f2 = fileManager.newFile("rule2.drl");
         output = new BufferedWriter(new FileWriter(f2));
+        output.write(header);
         output.write(rule2);
         output.close();
 
@@ -209,20 +186,8 @@
 
         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");
-        // Testing incremental build here
-        aconf.setProperty("drools.agent.newInstance", "false");
-        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-                "test agent", kbase, aconf);
-
-        assertEquals("test agent", kagent.getName());
-
         kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -275,38 +240,27 @@
      * @throws Exception
      */
     public void testModifyFileUrlOverwriteIncremental() 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 = "";
-        rule2 += "rule rule2\n";
-        rule2 += "when\n";
-        rule2 += "then\n";
-        rule2 += "list.add( drools.getRule().getName() );\n";
-        rule2 += "end\n";
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
 
+        String rule1 = this.createCommonRule("rule1");
+
+        String rule2 = this.createCommonRule("rule2");
+
         File f1 = fileManager.newFile("rule1.drl");
         Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
         output.write(rule1);
         output.write(rule2);
         output.close();
 
-        String rule1v2 = "";
-        rule1v2 += "package org.drools.test\n";
-        rule1v2 += "global java.util.List list\n";
-        rule1v2 += "rule rule1\n";
-        rule1v2 += "when\n";
-        rule1v2 += "then\n";
-        rule1v2 += "list.add( drools.getRule().getName() + \"_v2\");\n";
-        rule1v2 += "end\n";
+        String rule1v2 = this.createCommonRule("rule1","2");
+        
         File f2 = fileManager.newFile("rule2.drl");
         output = new BufferedWriter(new FileWriter(f2));
+        output.write(header);
         output.write(rule1v2);
         output.close();
 
@@ -326,20 +280,8 @@
 
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
 
-        ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
-        sconf.setProperty("drools.resource.scanner.interval", "2");
-        ResourceFactory.getResourceChangeScannerService().configure(sconf);
-
-        KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
-        aconf.setProperty("drools.agent.scanDirectories", "true");
-        aconf.setProperty("drools.agent.scanResources", "true");
-        // Testing incremental build here
-        aconf.setProperty("drools.agent.newInstance", "false");
-        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-                "test agent", kbase, aconf);
-
-        assertEquals("test agent", kagent.getName());
-
+        KnowledgeAgent kagent = this.createKAgent(kbase);
+        
         kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -349,7 +291,7 @@
         ksession.dispose();
 
         assertEquals(2, list.size());
-        assertTrue(list.contains("rule1_v2"));
+        assertTrue(list.contains("rule1-V2"));
         assertTrue(list.contains("rule2"));
 
         list.clear();
@@ -358,15 +300,10 @@
         // http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=019789
         Thread.sleep(2000);
 
-        String rule1v3 = "";
-        rule1v3 += "package org.drools.test\n";
-        rule1v3 += "global java.util.List list\n";
-        rule1v3 += "rule rule1\n";
-        rule1v3 += "when\n";
-        rule1v3 += "then\n";
-        rule1v3 += "list.add( drools.getRule().getName() + \"_v3\" );\n";
-        rule1v3 += "end\n";
+        String rule1v3 = this.createCommonRule("rule1","3");
+
         output = new BufferedWriter(new FileWriter(f2));
+        output.write(header);
         output.write(rule1v3);
         output.close();
         Thread.sleep(3000);
@@ -378,7 +315,7 @@
         ksession.dispose();
 
         assertEquals(2, list.size());
-        assertTrue(list.contains("rule1_v3"));
+        assertTrue(list.contains("rule1-V3"));
         assertTrue(list.contains("rule2"));
 
         //Delete f2 now, rule1 should still fire if the indexing worked properly
@@ -405,25 +342,18 @@
      * @throws Exception
      */
     public void testMultipleRulesOnFileUrlIncremental() 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\n";
+        
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+        
+        String rule1 = this.createCommonRule("rule1");
 
+        String rule2 = this.createCommonRule("rule2");
 
-        String rule2 = "";
-        rule2 += "rule rule2\n";
-        rule2 += "when\n";
-        rule2 += "then\n";
-        rule2 += "list.add( drools.getRule().getName());\n";
-        rule2 += "end\n";
-
         File f1 = fileManager.newFile("rules.drl");
         Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
         output.write(rule1);
         output.write(rule2);
         output.close();
@@ -443,20 +373,8 @@
 
         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");
-        // Testing incremental build here
-        aconf.setProperty("drools.agent.newInstance", "false");
-        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-                "test agent", kbase, aconf);
-
-        assertEquals("test agent", kagent.getName());
-
         kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -475,13 +393,10 @@
         // http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=019789
         Thread.sleep(2000);
 
-        String rule3 = "";
-        rule3 += "rule rule3\n";
-        rule3 += "when\n";
-        rule3 += "then\n";
-        rule3 += "list.add( drools.getRule().getName());\n";
-        rule3 += "end\n";
+        String rule3 = this.createCommonRule("rule3");
+
         output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
         output.write(rule1);
         output.write(rule3);
         output.close();
@@ -655,25 +570,16 @@
 
 
     public void testModifyPackageUrlIncremental() 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 = "";
-        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";
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+        
+        String rule1 = header + this.createCommonRule("rule1");
 
-        // Do only Rule1 in the first package
+        String rule2 = header + this.createCommonRule("rule2");
+
+        // Put just Rule1 in the first package
         File pkg1 = fileManager.newFile("pkg1.pkg");
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
@@ -699,17 +605,8 @@
 
         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", "false");
-        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-                "test agent", kbase, aconf);
-
         kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -727,17 +624,10 @@
         // http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=019789
         Thread.sleep(2000);
 
-        rule1 = "";
-        rule1 += "package org.drools.test\n";
-        rule1 += "global java.util.List list\n";
-        rule1 += "rule rule3\n";
-        rule1 += "when\n";
-        rule1 += "then\n";
-        rule1 += "list.add( drools.getRule().getName() );\n";
-        rule1 += "end\n";
+        String rule3 = header+this.createCommonRule("rule3");
 
         kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()),
+        kbuilder.add(ResourceFactory.newByteArrayResource(rule3.getBytes()),
                 ResourceType.DRL);
         kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
                 ResourceType.DRL);
@@ -763,23 +653,13 @@
     }
 
     public void testUpdatePackageUrlIncremental() 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 header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+        
+        String rule1 = header + this.createCommonRule("rule1");
 
-        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";
+        String rule2 = header + this.createCommonRule("rule2");
 
         // Add Rule1 and Rule2 in the first package
         File pkg1 = fileManager.newFile("pkg1.pkg");
@@ -809,17 +689,8 @@
 
         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", "false");
-        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-                "test agent", kbase, aconf);
-
         kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -838,14 +709,7 @@
         // http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=1&t=019789
         Thread.sleep(2000);
 
-        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";
+        String rule3 = header + this.createCommonRule("rule3");
 
         kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()),
@@ -875,42 +739,19 @@
 
 
     public void testUpdatePackageUrlOverwriteIncremental() 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 rule1v2 = "";
-        rule1v2 += "package org.drools.test\n";
-        rule1v2 += "global java.util.List list\n";
-        rule1v2 += "rule rule1\n";
-        rule1v2 += "when\n";
-        rule1v2 += "then\n";
-        rule1v2 += "list.add( drools.getRule().getName()+\"_V2\");\n";
-        rule1v2 += "end\n";
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+        
+        String rule1 = header + this.createCommonRule("rule1");
 
-        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";
+        String rule1v2 = header + this.createCommonRule("rule1","2");
 
-        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";
+        String rule2 = header + this.createCommonRule("rule2");
 
+        String rule3 = header + this.createCommonRule("rule3");
+
         // Add Rule1 and Rule2 in the first package
         File pkgF1 = fileManager.newFile("pkg1.pkg");
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
@@ -951,17 +792,8 @@
 
         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", "false");
-        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
-                "test agent", kbase, aconf);
-
         kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
 
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
@@ -1000,13 +832,13 @@
 
         assertEquals(2, list.size());
 
-        assertTrue(list.contains("rule1_V2"));
+        assertTrue(list.contains("rule1-V2"));
         assertTrue(list.contains("rule2"));
         kagent.monitorResourceChangeEvents(false);
     }
 
 
-    public void completeTest() throws Exception {
+    public void testCompleteRuleScenario() throws Exception {
         String header = "";
         header += "package org.drools.test\n";
         header += "global java.util.List list\n\n";
@@ -1204,19 +1036,224 @@
         ksession.fireAllRules();
         ksession.dispose();
 
-        assertEquals(4, list.size());
+        assertEquals(3, list.size());
         assertTrue(list.contains("rule1-V3"));
         assertTrue(list.contains("rule2"));
-        //rule3 reapears because rules2.drl was reporcessed
-        assertTrue(list.contains("rule3"));
+        //rule3 doesn't reapear because it was not modified in the resource
+        //assertTrue(list.contains("rule3"));
         assertTrue(list.contains("rule4"));
 
         kagent.monitorResourceChangeEvents(false);
 
     }
 
-     
 
+
+    public void testAddModifyFunctionIncremental() throws Exception {
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("rule rule1 \n");
+        sb.append("when\n");
+        sb.append("then\n");
+        sb.append("function1 (list,\"rule1\");\n");
+        sb.append("end\n");
+
+        String rule1 = sb.toString();
+
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(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:9000/rule1.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()));
+
+
+        KnowledgePackage knowledgePackage = kbase.getKnowledgePackage("org.drools.test");
+
+        //the resource didn't compile because function1 doesn't exist
+        assertNull(knowledgePackage);
+
+        // 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);
+
+        //we are going to add function1 now
+        String function1 = this.createCommonFunction("function1", "function1");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(function1);
+        output.write(rule1);
+        output.close();
+        Thread.sleep(3000);
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("function1 from rule1"));
+
+        //we are going to modify the definition of function1()
+        // 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);
+
+        //we are going to modify function1 now
+        String function1V2 = this.createCommonFunction("function1", "function1-V2");
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(function1V2);
+        output.write(rule1);
+        output.close();
+        Thread.sleep(3000);
+
+        ksession = kbase.newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.fireAllRules();
+        ksession.dispose();
+
+        assertEquals(1, list.size());
+        assertTrue(list.contains("function1-V2 from rule1"));
+
+        kagent.monitorResourceChangeEvents(false);
+    }
+
+
+    public void testAddModifyQueryIncremental() throws Exception {
+        String header = "";
+        header += "package org.drools.test\n";
+        header += "global java.util.List list\n\n";
+
+
+        String query1 = "";
+        query1 += "query \"all the Strings\"\n";
+        query1 += "     $strings : String()\n";
+        query1 += "end\n";
+
+        String rule1 = this.createCommonRule("rule1");
+
+        File f1 = fileManager.newFile("rule1.drl");
+        Writer output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(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:9000/rule1.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()));
+
+
+        KnowledgePackage knowledgePackage = kbase.getKnowledgePackage("org.drools.test");
+
+        assertNotNull(knowledgePackage);
+
+        Rule allTheStringsQuery = ((KnowledgePackageImp) knowledgePackage).getRule("all the Strings");
+
+        assertNull(allTheStringsQuery);
+
+        // 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);
+
+        //we are going to add the query now
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(query1);
+        output.write(rule1);
+        output.close();
+        Thread.sleep(3000);
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+        List<String> list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.insert("Some String");
+        ksession.insert("Some Other String");
+
+        QueryResults queryResults = ksession.getQueryResults("all the Strings");
+
+        ksession.dispose();
+
+
+        assertEquals(2, queryResults.size());
+
+        Iterator<QueryResultsRow> iterator = queryResults.iterator();
+        while (iterator.hasNext()){
+            System.out.println("Row= "+iterator.next().get("$strings"));
+        }
+
+        //we are going to modify the query definition
+        // 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);
+
+        //we are going to add function1 now
+        String query1V2 = "";
+        query1V2 += "query \"all the Strings\"\n";
+        query1V2 += "     $strings : String(this == \"Some String\")\n";
+        query1V2 += "end\n";
+
+        output = new BufferedWriter(new FileWriter(f1));
+        output.write(header);
+        output.write(query1V2);
+        output.write(rule1);
+        output.close();
+        Thread.sleep(3000);
+
+        ksession = kbase.newStatefulKnowledgeSession();
+        list = new ArrayList<String>();
+        ksession.setGlobal("list", list);
+        ksession.insert("Some String");
+        ksession.insert("Some Other String");
+
+        queryResults = ksession.getQueryResults("all the Strings");
+
+        ksession.dispose();
+
+
+        assertEquals(1, queryResults.size());
+        assertEquals("Some String",queryResults.iterator().next().get("$strings"));
+
+        kagent.monitorResourceChangeEvents(false);
+    }
+
     private static void writePackage(Object pkg, File p1file)
             throws IOException, FileNotFoundException {
         FileOutputStream out = new FileOutputStream(p1file);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/ResourceDiffProducer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/ResourceDiffProducer.java	2010-01-06 18:21:27 UTC (rev 30960)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/ResourceDiffProducer.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -27,5 +27,5 @@
  * @author esteban
  */
 public interface ResourceDiffProducer {
-    ResourceDiffResult diff(Set<KnowledgeDefinition> originalDefinitions, KnowledgePackageImp pkg);
+    ResourceDiffResult diff(Set<KnowledgeDefinition> originalDefinitions, KnowledgePackageImp newPkg, KnowledgePackageImp currentPkg );
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/BinaryResourceDiffProducerImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/BinaryResourceDiffProducerImpl.java	2010-01-06 18:21:27 UTC (rev 30960)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/BinaryResourceDiffProducerImpl.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -16,12 +16,21 @@
 
 package org.drools.agent.impl;
 
+import java.util.Calendar;
+import java.util.GregorianCalendar;
 import java.util.HashSet;
 import java.util.Set;
+import org.drools.SystemEventListener;
+import org.drools.SystemEventListenerFactory;
+import org.drools.WorkingMemory;
 import org.drools.definition.KnowledgeDefinition;
 import org.drools.definitions.impl.KnowledgePackageImp;
 import org.drools.agent.ResourceDiffProducer;
+import org.drools.rule.Function;
+import org.drools.rule.Query;
 import org.drools.rule.Rule;
+import org.drools.spi.Consequence;
+import org.drools.spi.KnowledgeHelper;
 import org.drools.util.ReflectiveVisitor;
 
 /**
@@ -30,31 +39,245 @@
  */
 public class BinaryResourceDiffProducerImpl extends ReflectiveVisitor implements ResourceDiffProducer {
 
+
+
     private KnowledgePackageImp newPkg;
+    private KnowledgePackageImp currentPkg;
+    private Set<KnowledgeDefinition> unmodifiedDefinitions = new HashSet<KnowledgeDefinition>();
+    private Set<KnowledgeDefinition> removedDefinitions = new HashSet<KnowledgeDefinition>();
 
-    public ResourceDiffResult diff(Set<KnowledgeDefinition> originalDefinitions, KnowledgePackageImp pkg) {
+    private SystemEventListener listener;
 
-        this.newPkg = pkg;
-        
-        Set<KnowledgeDefinition> removed = new HashSet<KnowledgeDefinition>();
+    //attributes used during rules comparison
+    private Calendar now = new GregorianCalendar();
+    private Consequence dummyConsequence = new DummyConsequence();
 
+    public ResourceDiffResult diff(Set<KnowledgeDefinition> originalDefinitions, KnowledgePackageImp newPkg, KnowledgePackageImp currentPkg ) {
 
+        this.listener = SystemEventListenerFactory.getSystemEventListener();
+
+        this.newPkg = newPkg;
+        this.currentPkg = currentPkg;
+
         for (KnowledgeDefinition knowledgeDefinition : originalDefinitions) {
             this.visit(knowledgeDefinition);
         }
 
 
+
         //return the whole new package as new
-        return new ResourceDiffResult(pkg, originalDefinitions);
+        return new ResourceDiffResult(this.newPkg, this.unmodifiedDefinitions, this.removedDefinitions);
     }
 
     
-    public void visitRule(final Rule rule){
-        //ok, so I got an old rule: is it modified in the new pkg? is it even present on it?
-        //newPkg.
+    public void visitRule(final Rule oldRule){
 
+       
+
+        //ok, so I get an old rule: is it modified in the new pkg? is it even present on it?
+        org.drools.definition.rule.Rule newRule = newPkg.getRule(oldRule.getName());
+
+        if (newRule == null){
+            //the old rule is not present on the new package. Add it to
+            //removed rules list.
+            listener.debug("BinaryResourceDiffProducerImpl: "+oldRule+" is not present anymore. Adding to removed list.");
+            this.removedDefinitions.add(oldRule);
+            return;
+        }
+
+        //it is possible that the old rule doesn't exist anymore in the current
+        //pkg. This is because maybe some other resouce updated its definition
+        //and after that the same resource removed it. If that is the case,
+        //this resource (the one we are processing) still contain a reference
+        //to the rule, but it is no present on kbase anymore. If this is the
+        //case, we wan't to skip this rule. Because remember that someone
+        //modified it and removed it before this resource. We don't even
+        //add it to removedDefinitions, because it is no present on kbase. What
+        //we have to do is remove it from the new pkg so it won't reapears.
+        if (currentPkg.getRule(oldRule.getName()) == null){
+            listener.debug("BinaryResourceDiffProducerImpl: "+oldRule+" is not present on current PKG. Removing from new package.");
+            newPkg.removeRule(oldRule);
+            return;
+        }
+
+        //I hate to do this. But if it is not instance of
+        //org.drools.rule.Rule I can't get his LHS.
+        if (!(newRule instanceof org.drools.rule.Rule)){
+            listener.warning("BinaryResourceDiffProducerImpl: Rules must be subclasses of org.drools.rule.Rule.");
+            return;
+        }
+
+        //Queries are not supported yet.
+        if (newRule instanceof Query){
+            listener.debug("BinaryResourceDiffProducerImpl: Query diff is not supported yet.");
+            return;
+        }
+
+        //is newRule equal to oldRule?
+        if (this.compareRules((Rule)newRule,oldRule)){
+            //if so, we don't need the rule in the new Package.
+            listener.debug("BinaryResourceDiffProducerImpl: "+oldRule+" didn't change. Removing from diff package and adding it to unmodified list.");
+            newPkg.removeRule((org.drools.rule.Rule)newRule);
+            this.unmodifiedDefinitions.add(oldRule);
+        }
+
     }
 
+    public void visitFunction(final Function oldFunction){
+        //ok, so I get an old function: is it modified in the new pkg? is it even present on it?
+        Function newFunction = newPkg.getFunction(oldFunction.getName());
 
+        if (newFunction == null){
+            //the old function is not present on the new package. Add it to
+            //removed rules list.
+            listener.debug("BinaryResourceDiffProducerImpl: "+oldFunction+" is not present anymore. Adding to removed list.");
+            this.removedDefinitions.add(oldFunction);
+            return;
+        }
 
+        //it is possible that the old function doesn't exist anymore in the current
+        //pkg. This is because maybe some other resouce updated its definition
+        //and after that the same resource removed it. If that is the case,
+        //this resource (the one we are processing) still contain a reference
+        //to the function, but it is no present on kbase anymore. If this is the
+        //case, we wan't to skip this function. Remember that someone
+        //modified it and removed it before this resource. We don't even
+        //add it to removedDefinitions, because it is no present on kbase. What
+        //we have to do is remove it from the new pkg so it won't reapears.
+        if (currentPkg.getFunction(oldFunction.getName()) == null){
+            listener.debug("BinaryResourceDiffProducerImpl: "+oldFunction+" is not present on current PKG. Removing from new package.");
+            newPkg.removeFunction(oldFunction.getName());
+            return;
+        }
+
+        //is newFunction equal to oldFunction?
+        if (newFunction.equals(oldFunction)){
+            //if so, we don't need the function in the new Package.
+            listener.debug("BinaryResourceDiffProducerImpl: "+oldFunction+" didn't change. Removing from diff package and adding it to unmodified list.");
+            newPkg.removeFunction(newFunction.getName());
+            this.unmodifiedDefinitions.add(oldFunction);
+        }else{
+            //it seams that the kbase doesn't overrides function's definitions.
+            //that's why we need to mark this function as removed, but don't
+            //remove it from the new pkg.
+            listener.debug("BinaryResourceDiffProducerImpl: "+oldFunction+" did change. Marking as removed so it new version could be added later.");
+            this.removedDefinitions.add(oldFunction);
+        }
+
+
+    }
+
+
+    public void visitKnowledgeDefinitionn(final KnowledgeDefinition oldDefinition){
+        listener.debug("BinaryResourceDiffProducerImpl: Couldn't handle "+oldDefinition+". We must leave it in the new Package.");
+    }
+
+
+
+    private boolean compareRules(Rule r1, Rule r2){
+        listener.debug("BinaryResourceDiffProducerImpl: Comparing "+r1+" against "+r2);
+        
+        
+
+        //compares the salinces
+        String v1 = r1.getSalience()== null?"":r1.getSalience().toString();
+        String v2 = r2.getSalience()== null?"":r2.getSalience().toString();
+        
+        if (!v1.equals(v2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different saliences: r1= "+v1+", r2= "+v2);
+            return false;
+        }
+
+        //compares the activation groups
+        v1 = r1.getActivationGroup()== null?"":r1.getActivationGroup();
+        v2 = r2.getActivationGroup()== null?"":r2.getActivationGroup();
+        if (!v1.equals(v2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different activation groups: r1= "+v1+", r2= "+v2);
+            return false;
+        }
+
+        //compares no-loop attribute
+        if (r1.isNoLoop() != r2.isNoLoop()){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different values for no-loop attribure: r1= "+r1.isNoLoop()+", r2= "+r2.isNoLoop());
+            return false;
+        }
+
+        //compares lock-on-active attribute
+        if (r1.isLockOnActive() != r2.isLockOnActive()){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different values for lock-on-active attribure: r1= "+r1.isLockOnActive()+", r2= "+r2.isLockOnActive());
+            return false;
+        }
+
+        //compares agenda-group attribute
+        v1 = r1.getAgendaGroup()== null?"":r1.getAgendaGroup();
+        v2 = r2.getAgendaGroup()== null?"":r2.getAgendaGroup();
+        if (!v1.equals(v2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different agenda groups: r1= "+v1+", r2= "+v2);
+            return false;
+        }
+
+        //compares auto-focus attribute
+        if (r1.getAutoFocus() != r2.getAutoFocus()){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different values for auto-focus attribure: r1= "+r1.getAutoFocus()+", r2= "+r2.getAutoFocus());
+            return false;
+        }
+
+        //compares ruleflow-group attribute
+        v1 = r1.getRuleFlowGroup()== null?"":r1.getRuleFlowGroup();
+        v2 = r2.getRuleFlowGroup()== null?"":r2.getRuleFlowGroup();
+        if (!v1.equals(v2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different ruleflow-group attribute: r1= "+v1+", r2= "+v2);
+            return false;
+        }
+
+        //compares dialect attribute
+        v1 = r1.getDialect()== null?"":r1.getDialect();
+        v2 = r2.getDialect()== null?"":r2.getDialect();
+        if (!v1.equals(v2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different dialect attribute: r1= "+v1+", r2= "+v2);
+            return false;
+        }
+
+        //compares date-effective attribute
+        Calendar c1 = r1.getDateEffective()== null?now:r1.getDateEffective();
+        Calendar c2 = r2.getDateEffective()== null?now:r2.getDateEffective();
+        if (!c1.equals(c2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different date-effective attribute: r1= "+c1+", r2= "+c2);
+            return false;
+        }
+
+        //compares date-expires attribute
+        c1 = r1.getDateExpires()== null?now:r1.getDateExpires();
+        c2 = r2.getDateExpires()== null?now:r2.getDateExpires();
+        if (!c1.equals(c2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different date-expires attribute: r1= "+c1+", r2= "+c2);
+            return false;
+        }
+
+        //compares the rules' LHS
+        if (!r1.getLhs().equals(r2.getLhs())){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different LHS");
+            return false;
+        }
+
+        //compares the rules consequences
+        Consequence consequence1 = r1.getConsequence()== null?dummyConsequence:r1.getConsequence();
+        Consequence consequence2 = r2.getConsequence()== null?dummyConsequence:r2.getConsequence();
+        if (!consequence1.equals(consequence2)){
+            listener.debug("BinaryResourceDiffProducerImpl: The rules have different Consequences: r1= "+consequence1+", r2= "+consequence2);
+            return false;
+        }
+
+        return true;
+    }
+
+    //Dummy implementation of Consequnce used for rules comparison.
+    private class DummyConsequence implements Consequence{
+
+        public void evaluate(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory) throws Exception {
+            throw new UnsupportedOperationException("You should never call this method!!");
+        }
+
+    }
+
 }

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/DefaultResourceDiffProducerImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/DefaultResourceDiffProducerImpl.java	2010-01-06 18:21:27 UTC (rev 30960)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/DefaultResourceDiffProducerImpl.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -1,51 +0,0 @@
-/*
- *  Copyright 2009 esteban.
- * 
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- * 
- *       http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *  under the License.
- */
-
-package org.drools.agent.impl;
-
-import java.util.HashSet;
-import java.util.Set;
-import org.drools.RuntimeDroolsException;
-import org.drools.builder.KnowledgeBuilder;
-import org.drools.builder.KnowledgeBuilderFactory;
-import org.drools.definition.KnowledgeDefinition;
-import org.drools.definitions.impl.KnowledgePackageImp;
-import org.drools.agent.ResourceDiffProducer;
-
-/**
- *
- * @author esteban.aliverti at gmail.com
- */
-public class DefaultResourceDiffProducerImpl implements ResourceDiffProducer {
-
-    public ResourceDiffResult diff(Set<KnowledgeDefinition> originalDefinitions, KnowledgePackageImp pkg) {
-
-        Set<KnowledgeDefinition> removed = new HashSet<KnowledgeDefinition>();
-
-        //put all the original definitions as removed
-        for (KnowledgeDefinition knowledgeDefinition : originalDefinitions) {
-            removed.add(knowledgeDefinition);
-        }
-
-        //return the whole new package as new
-        return new ResourceDiffResult(pkg, removed);
-
-
-    }
-
-
-}

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-01-06 18:21:27 UTC (rev 30960)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -697,15 +697,28 @@
                 }
 
 
-                ResourceDiffProducer rdp = new DefaultResourceDiffProducerImpl();
-                //ResourceDiffProducer rdp = new BinaryResourceDiffProducerImpl();
+                this.listener.debug("KnowledgeAgent: Diffing: "+entry.getKey());
 
-                ResourceDiffResult diff = rdp.diff(entry.getValue(), kpkg);
 
+                ResourceDiffProducer rdp = new BinaryResourceDiffProducerImpl();
+
+                //we suppose that the package definition didn't change in the resource.
+                //That's why we are serching the current package as
+                //this.kbase.getKnowledgePackage(kpkg.getName())
+                ResourceDiffResult diff = rdp.diff(entry.getValue(), kpkg, (KnowledgePackageImp) this.kbase.getKnowledgePackage(kpkg.getName()));
+
                 for (KnowledgeDefinition kd : diff.getRemovedDefinitions()) {
+                    this.listener.debug("KnowledgeAgent: Removing: "+kd);
                     removeKnowledgeDefinitionFromBase(kd);
                 }
 
+                //because all the mappings for "resource" were removed, we
+                //need to map again the definitions that didn't change.
+                //Those modified or added will be mapped in addResourcesToKnowledgeBase()
+                for (KnowledgeDefinition knowledgeDefinition : diff.getUnmodifiedDefinitions()) {
+                    this.addDefinitionMapping(entry.getKey(), knowledgeDefinition, false);
+                }
+
                 changeSetState.createdPackages.put(entry.getKey(), diff.getPkg());
 
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/ResourceDiffResult.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/ResourceDiffResult.java	2010-01-06 18:21:27 UTC (rev 30960)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/ResourceDiffResult.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -26,11 +26,23 @@
  * @author esteban.aliverti at gmail.com
  */
 public class ResourceDiffResult {
-    private KnowledgePackage pkg;
-    private Set<KnowledgeDefinition> removedDefinitions;
+    private final KnowledgePackage pkg;
 
-    public ResourceDiffResult(KnowledgePackage pkg, Set<KnowledgeDefinition> removedDefinitions) {
+    /**
+     * The definitions present in package's old version but not in the
+     * new one.
+     */
+    private final Set<KnowledgeDefinition> removedDefinitions;
+
+    /**
+     * The definitions that were not modified in the new version of the
+     * package.
+     */
+    private final Set<KnowledgeDefinition> unmodifiedDefinitions;
+
+    public ResourceDiffResult(KnowledgePackage pkg, Set<KnowledgeDefinition> unmodifiedDefinitions, Set<KnowledgeDefinition> removedDefinitions) {
         this.pkg = pkg;
+        this.unmodifiedDefinitions = unmodifiedDefinitions;
         this.removedDefinitions = removedDefinitions;
     }
 
@@ -38,6 +50,10 @@
         return pkg;
     }
 
+    public Set<KnowledgeDefinition> getUnmodifiedDefinitions() {
+        return unmodifiedDefinitions;
+    }
+
     public Set<KnowledgeDefinition> getRemovedDefinitions() {
         return removedDefinitions;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/definitions/impl/KnowledgePackageImp.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/definitions/impl/KnowledgePackageImp.java	2010-01-06 18:21:27 UTC (rev 30960)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/definitions/impl/KnowledgePackageImp.java	2010-01-06 21:16:04 UTC (rev 30961)
@@ -12,6 +12,7 @@
 import org.drools.definition.process.Process;
 import org.drools.definition.rule.Rule;
 import org.drools.definitions.rule.impl.RuleImpl;
+import org.drools.rule.Function;
 import org.drools.rule.Package;
 
 public class KnowledgePackageImp
@@ -41,6 +42,48 @@
         return list;
     }
 
+    /**
+     * Delegate method to retrieve a Rule by its name.
+     * @param name the rule's name
+     * @return
+     * @see org.drools.rule.Package#getRule(java.lang.String)
+     */
+    public Rule getRule(String name) {
+        return this.pkg.getRule(name);
+    }
+
+    /**
+     * Delegate method to remove a Rule by its name.
+     * @param rule the rule to be removed
+     * @return
+     * @see org.drools.rule.Package#removeRule(org.drools.rule.Rule) 
+     */
+    public void removeRule(org.drools.rule.Rule rule) {
+        pkg.removeRule(rule);
+    }
+
+    /**
+     * Delegate method to retrieve a Function by its name.
+     * @param name the function's name
+     * @return
+     * @see org.drools.rule.Package#getFunctions()
+     */
+    public Function getFunction(String name) {
+        return this.pkg.getFunctions().containsKey(name)?this.pkg.getFunctions().get(name):null;
+    }
+
+    /**
+     * Delegate method to retrieve a Rule by its name.
+     * @param functionName the function's name
+     * @return
+     * @see org.drools.rule.Package#removeFunction(java.lang.String) 
+     */
+    public void removeFunction(String functionName) {
+        pkg.removeFunction(functionName);
+    }
+
+    
+
     public Collection<Process> getProcesses() {
         Collection<org.drools.definition.process.Process> processes = (Collection<org.drools.definition.process.Process>) pkg.getRuleFlows().values();
         List<Process> list = new ArrayList<Process>( processes.size() );



More information about the jboss-svn-commits mailing list