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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jul 22 21:14:25 EDT 2010


Author: eaa
Date: 2010-07-22 21:14:25 -0400 (Thu, 22 Jul 2010)
New Revision: 34122

Added:
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/CompilerIndependenceTest.java
   labs/jbossrules/trunk/drools-core/src/test/resources/pkg/
   labs/jbossrules/trunk/drools-core/src/test/resources/pkg/mortgages.pkg
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
Log:
JBRULES-2567: Knowledge Agent needs drools-compiler dependency even if it is only working with compiled resources.
	- Fixed. New instances of kbuilder are only created only if the agent is dealing with non compiled resources.
	- Added a test

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-07-22 23:27:56 UTC (rev 34121)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java	2010-07-23 01:14:25 UTC (rev 34122)
@@ -46,6 +46,7 @@
 import org.drools.reteoo.ReteooRuleBase;
 import org.drools.rule.Function;
 import org.drools.rule.Package;
+import org.drools.rule.Query;
 import org.drools.rule.Rule;
 import org.drools.rule.TypeDeclaration;
 import org.drools.runtime.KnowledgeSessionConfiguration;
@@ -138,15 +139,15 @@
     public void setSystemEventListener(SystemEventListener listener) {
         this.listener = listener;
     }
-    
+
     public Set<Resource> getResourceDirectories() {
-    	return this.resourceDirectories;
+        return this.resourceDirectories;
     }
 
     public boolean isNewInstance() {
         return this.newInstance;
     }
-    
+
     public void applyChangeSet(Resource resource) {
         applyChangeSet(getChangeSet(resource));
     }
@@ -607,11 +608,12 @@
      */
     private KnowledgePackageImp createPackageFromResource(Resource resource, KnowledgeBuilder kbuilder) {
 
-        if (kbuilder == null) {
-            kbuilder = this.createKBuilder();
-        }
+        if (((InternalResource) resource).getResourceType() != ResourceType.PKG) {
 
-        if (((InternalResource) resource).getResourceType() != ResourceType.PKG) {
+            if (kbuilder == null) {
+                kbuilder = this.createKBuilder();
+            }
+
             kbuilder.add(resource, ((InternalResource) resource).getResourceType());
             if (kbuilder.hasErrors()) {
                 this.eventSupport.fireResourceCompilationFailed(kbuilder, resource, ((InternalResource) resource).getResourceType());
@@ -940,11 +942,11 @@
 
         //subscribe/unsubscribe from resources
         for (Resource resource : allResources) {
-            if (monitor){
+            if (monitor) {
                 this.listener.debug("KnowledgeAgent subscribing from resource="
                         + resource);
                 this.notifier.subscribeResourceChangeListener(this, resource);
-            }else{
+            } else {
                 this.listener.debug("KnowledgeAgent unsubscribing from resource="
                         + resource);
                 this.notifier.unsubscribeResourceChangeListener(this, resource);
@@ -1150,9 +1152,34 @@
         public Set<Resource> getAllResources() {
             return this.map.keySet();
         }
+
+        public boolean onlyHasPKGResources() {
+            for (Resource resource : map.keySet()) {
+                if (((InternalResource) resource).getResourceType() != ResourceType.PKG) {
+                    return false;
+                }
+            }
+            return true;
+        }
     }
 
+    /**
+     * Creates a kbuilder if necessary. The built kbuilder will contain all the
+     * DSL resources the agent is managing. It will also apply any
+     * KnowledgeBuilderConfiguration present in {@link #builderConfiguration} or
+     * will copy any KnowledgeBuilderConfiguration from the current kbase if
+     * {@link #useKBaseClassLoaderForCompiling} is true.
+     * This method will return null if the agent is only managing binary resources.
+     * This avoids drools-compiler dependency.
+     *
+     * @return a new kbuilder or null if all the managed resources are binaries.
+     */
     private KnowledgeBuilder createKBuilder() {
+
+        if (this.registeredResources.onlyHasPKGResources()){
+            return null;
+        }
+
         KnowledgeBuilder kbuilder = null;
         if (this.builderConfiguration != null) {
             kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(this.builderConfiguration);
@@ -1192,8 +1219,8 @@
             //all kbase's ksessions must be disposed
             if (this.kbase != null) {
                 Collection<StatefulKnowledgeSession> statefulSessions = this.kbase.getStatefulKnowledgeSessions();
-                if (statefulSessions != null && statefulSessions.size() > 0){
-                    String message = "The kbase still contains "+statefulSessions.size()+" stateful sessions. You must dispose them first.";
+                if (statefulSessions != null && statefulSessions.size() > 0) {
+                    String message = "The kbase still contains " + statefulSessions.size() + " stateful sessions. You must dispose them first.";
                     this.listener.warning(message);
                     throw new IllegalStateException(message);
                 }

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/CompilerIndependenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/CompilerIndependenceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/CompilerIndependenceTest.java	2010-07-23 01:14:25 UTC (rev 34122)
@@ -0,0 +1,177 @@
+package org.drools.agent;
+
+
+import java.io.File;
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+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.ClassPathResource;
+import org.drools.io.impl.ResourceChangeNotifierImpl;
+import org.drools.io.impl.ResourceChangeScannerImpl;
+
+public class CompilerIndependenceTest extends TestCase {
+
+
+    private final Object lock = new Object();
+    private volatile boolean kbaseUpdated;
+
+    @Override
+    protected void setUp() throws Exception {
+        ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
+        ResourceFactory.getResourceChangeNotifierService().start();
+        ResourceFactory.getResourceChangeScannerService().start();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        ResourceFactory.getResourceChangeNotifierService().stop();
+        ResourceFactory.getResourceChangeScannerService().stop();
+        ((ResourceChangeNotifierImpl) ResourceFactory.getResourceChangeNotifierService()).reset();
+        ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
+    }
+
+    public void testDRL() throws Exception {
+
+        
+        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='classpath:rules.drl' type='DRL' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        KnowledgeAgent kagent = this.createKAgent(kbase,true);
+
+        try{
+            kagent.applyChangeSet(ResourceFactory.newByteArrayResource(xml.getBytes()));
+
+            fail("The agent shouldn't be able to compile the resource!");
+        } catch(IllegalArgumentException ex){
+
+        }
+
+        kagent.dispose();
+
+    }
+
+    public void testPKG() throws Exception {
+
+
+        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='classpath:pkg/mortgages.pkg' type='PKG' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        KnowledgeAgent kagent = this.createKAgent(kbase,true);
+
+        kagent.applyChangeSet(ResourceFactory.newByteArrayResource(xml.getBytes()));
+        this.kbaseUpdated = false;
+
+        assertEquals(1, kagent.getKnowledgeBase().getKnowledgePackages().size());
+
+        Thread.sleep(2000);
+
+        ClassPathResource cpResource = (ClassPathResource)ResourceFactory.newClassPathResource("pkg/mortgages.pkg");
+
+        File f = new File(cpResource.getURL().getFile());
+
+        assertTrue(f.exists());
+        
+        f.setLastModified(System.currentTimeMillis());
+
+        this.waitUntilKBaseUpdate();
+
+        assertEquals(1, kagent.getKnowledgeBase().getKnowledgePackages().size());
+
+        kagent.dispose();
+
+    }
+
+    private KnowledgeAgent createKAgent(KnowledgeBase kbase, boolean newInstance) {
+        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", ""+newInstance);
+
+
+        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 void waitUntilKBaseUpdate() {
+        synchronized (lock) {
+            while (!kbaseUpdated) {
+                try {
+                    lock.wait();
+                } catch (InterruptedException e) {
+                }
+                System.out.println("Waking up!");
+            }
+            kbaseUpdated = false;
+        }
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/test/resources/pkg/mortgages.pkg
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-core/src/test/resources/pkg/mortgages.pkg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream



More information about the jboss-svn-commits mailing list