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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Feb 19 01:44:19 EST 2009


Author: mark.proctor at jboss.com
Date: 2009-02-19 01:44:19 -0500 (Thu, 19 Feb 2009)
New Revision: 25333

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.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/io/impl/ResourceChangeNotifierImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerConfigurationImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/xml/ChangeSetSemanticModule.java
Log:
JBRULES-1974 KnowledgeAgent is not detecting packge changes

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	2009-02-19 04:47:05 UTC (rev 25332)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java	2009-02-19 06:44:19 UTC (rev 25333)
@@ -2,20 +2,31 @@
 
 import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.Writer;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import junit.framework.TestCase;
 
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
 import org.drools.io.ResourceChangeScannerConfiguration;
 import org.drools.io.ResourceFactory;
 import org.drools.io.impl.ResourceChangeScannerImpl;
+import org.drools.definition.KnowledgePackage;
 import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.util.DroolsStreamUtils;
 import org.drools.util.FileManager;
 import org.mortbay.jetty.Handler;
 import org.mortbay.jetty.Server;
@@ -53,9 +64,11 @@
         ResourceFactory.getResourceChangeNotifierService().stop();
         ResourceFactory.getResourceChangeScannerService().stop();
         ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
+        
+        server.stop();
     }
     
-    public void testModifyUrl() throws Exception {
+    public void testModifyFileUrl() throws Exception {
         String rule1 = "";
         rule1 += "package org.drools.test\n";
         rule1 += "global java.util.List list\n";
@@ -161,9 +174,235 @@
 
         assertTrue( list.contains( "rule3" ) );
         assertTrue( list.contains( "rule2" ) );
+        kagent.monitorResourceChangeEvents( false );        
+    }
+
+    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";
+    
+        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() );
+        }
+        KnowledgePackage pkg = ( KnowledgePackage ) kbuilder.getKnowledgePackages().iterator().next();
+        writePackage( pkg, fileManager.newFile( "pkg1.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:9000/pkg1.pkg' type='PKG' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+        File fxml = fileManager.newFile( "changeset.xml" );
+        fxml.deleteOnExit();
+        Writer output = new BufferedWriter( new FileWriter( fxml ) );
+        output.write( xml );
+        output.close();
+    
+        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" );
+        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 list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+        ksession.fireAllRules();
+        ksession.dispose();
+    
+        assertEquals( 2,
+                      list.size() );
+        assertTrue( list.contains( "rule1" ) );
+        assertTrue( list.contains( "rule2" ) );
+    
+        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 );
+    
+        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";
+    
+        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" ) );  
+        
+        //KnowledgePackage pkg2 = ( KnowledgePackage ) DroolsStreamUtils.streamIn( new FileInputStream( fileManager.newFile( "pkg1.pkg" ) ) );
+        
+        
+        Thread.sleep( 3000 );
+        
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+        ksession.fireAllRules();
+        ksession.dispose();
+    
+        assertEquals( 2,
+                      list.size() );
+    
+        assertTrue( list.contains( "rule3" ) );
+        assertTrue( list.contains( "rule2" ) );
         kagent.monitorResourceChangeEvents( false );
     }
+    
+    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";
+    
+        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";
+        
+        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() );
+        }
+        
+        Map map = new HashMap();
+        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 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/pkg1.pkg' type='PKG' />";
+        xml += "        <resource source='http://localhost:9000/pkg2.pkg' type='PKG' />";
+        xml += "    </add> ";
+        xml += "</change-set>";
+    
+        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" );
+        aconf.setProperty( "drools.agent.newInstance",
+                           "true" );
+        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "test agent",
+                                                                         kbase,
+                                                                         aconf );
+    
+        kagent.applyChangeSet( ResourceFactory.newByteArrayResource( xml.getBytes() ) );
+    
+        StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        List list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+        ksession.fireAllRules();
+        ksession.dispose();
+    
+        assertEquals( 2,
+                      list.size() );
+        assertTrue( list.contains( "rule1" ) );
+        assertTrue( list.contains( "rule2" ) );
+    
+        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 );
+        
+        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:9000/pkg2.pkg' type='PKG' />";
+        xml += "    </remove> ";
+        xml += "</change-set>";        
+    
+        kagent.applyChangeSet( ResourceFactory.newByteArrayResource( xml.getBytes() ) );
 
+        Thread.sleep( 3000 );
+        
+        ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+        list = new ArrayList();
+        ksession.setGlobal( "list",
+                            list );
+        ksession.fireAllRules();
+        ksession.dispose();
+    
+        assertEquals( 1,
+                      list.size() );
+    
+        assertTrue( list.contains( "rule1" ) );
+        kagent.monitorResourceChangeEvents( false );
+    }    
+
     public void testModifyFile() throws IOException,
                                 InterruptedException {
         String rule1 = "";
@@ -273,9 +512,10 @@
         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";
@@ -389,4 +629,16 @@
         kagent.monitorResourceChangeEvents( false );
     }
 
+    private static void writePackage(KnowledgePackage pkg,
+                                     File p1file) throws IOException,
+                                                 FileNotFoundException {
+         FileOutputStream out = new FileOutputStream( p1file );
+         try {
+             DroolsStreamUtils.streamOut( out,
+                                          pkg );
+         } finally {
+             out.close();
+         }
+     }
+    
 }

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	2009-02-19 04:47:05 UTC (rev 25332)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java	2009-02-19 06:44:19 UTC (rev 25333)
@@ -1,5 +1,6 @@
 package org.drools.agent.impl;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -22,7 +23,9 @@
 import org.drools.builder.ResourceType;
 import org.drools.common.AbstractRuleBase;
 import org.drools.definition.KnowledgeDefinition;
+import org.drools.definition.KnowledgePackage;
 import org.drools.definition.process.Process;
+import org.drools.definitions.impl.KnowledgePackageImp;
 import org.drools.event.io.ResourceChangeListener;
 import org.drools.impl.KnowledgeBaseImpl;
 import org.drools.io.InternalResource;
@@ -88,7 +91,7 @@
 
         monitorResourceChangeEvents( monitor );
 
-        buildResourceMapping( kbase );
+        //buildResourceMapping( kbase );
 
         this.listener.info( "KnowledgAgent created, with configuration:\nmonitorChangeSetEvents=" + monitor + " scanResources=" + scanResources + " scanDirectories=" + this.scanDirectories );
     }
@@ -109,7 +112,7 @@
                           changeSetState );
 
         rebuildResources( changeSetState );
-        buildResourceMapping( this.kbase );
+        //buildResourceMapping( this.kbase );
     }
 
     public void processChangeSet(Resource resource,
@@ -222,6 +225,10 @@
         boolean        needsKnowledgeBuilder;
     }
 
+    /**
+     * This indexes the rules and flows against their respective urls, to allow more fine grained removal and not just removing of an entire package
+     * @param kbase
+     */
     public void buildResourceMapping(KnowledgeBase kbase) {
         RuleBase rbase = ((KnowledgeBaseImpl) kbase).ruleBase;
         this.listener.debug( "KnowledgeAgent building resource map" );
@@ -334,32 +341,22 @@
     private void rebuildResources(ChangeSetState changeSetState) {
         this.listener.debug( "KnowledgeAgent rebuilding KnowledgeBase using ChangeSet" );
         synchronized ( this.resources ) {
-            for ( Resource child : changeSetState.pkgs ) {
+            // modified we already know is in the map, so no need to process those
 
-                try {
-                    InputStream is = child.getInputStream();
-                    Package pkg = (Package) DroolsStreamUtils.streamIn( is );
-                    this.listener.debug( "KnowledgeAgent adding KnowledgeDefinitionsPackage " + pkg.getName() );
-                    ((KnowledgeBaseImpl) this.kbase).ruleBase.addPackage( pkg );
-                    is.close();
-                } catch ( Exception e ) {
-                    this.listener.exception( new RuntimeException( "KnowledgeAgent exception while trying to serialize and KnowledgeDefinitionsPackage  " ) );
-                }
-            }
+            //            // now make a copy of the resource keys, as we are about to reset it, but need the keys to rebuild the kbase
+            //            Resource[] resourcesClone = this.resources.keySet().toArray( new Resource[this.resources.size()] );
+            //
+            //            // reset the resources map, so it can now be rebuilt
+            //            this.resources.clear();
 
+            this.kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
             if ( changeSetState.needsKnowledgeBuilder ) {
-                // modified we already know is in the map, so no need to process those
 
-                // now make a copy of the resource keys, as we are about to reset it, but need the keys to rebuild the kbase
-                Resource[] resourcesClone = this.resources.keySet().toArray( new Resource[this.resources.size()] );
-
-                // reset the resources map, so it can now be rebuilt
-                this.resources.clear();
-
                 // rebuild the kbase
                 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
 
-                for ( Resource resource : resourcesClone ) {
+                for ( Resource resource : this.resources.keySet() ) {
                     this.listener.debug( "KnowledgeAgent building resource=" + resource );
                     if ( ((InternalResource) resource).getResourceType() != ResourceType.PKG ) {
                         // .pks are handled as a special case.
@@ -373,10 +370,59 @@
                                            kbuilder.getErrors() );
                 }
 
-                this.kbase = KnowledgeBaseFactory.newKnowledgeBase();
                 this.kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-                this.listener.info( "KnowledgeAgent new KnowledgeBase now built and in use" );
             }
+
+            for ( Resource resource : this.resources.keySet() ) {
+
+                if ( ((InternalResource) resource).getResourceType() == ResourceType.PKG ) {
+                    this.listener.debug( "KnowledgeAgent building resource=" + resource );
+
+                    InputStream is = null;
+                    try {
+                        // .pks are handled as a special case.
+                        is = resource.getInputStream();
+                        Object object = DroolsStreamUtils.streamIn( is );
+                        Package pkg = null;
+                        if ( object instanceof KnowledgePackage ) {
+                            pkg = ((KnowledgePackageImp) object).pkg;
+                        } else {
+                            pkg = (Package) pkg;
+                        }
+                        this.listener.debug( "KnowledgeAgent adding KnowledgeDefinitionsPackage " + pkg.getName() );
+                        ((KnowledgeBaseImpl) this.kbase).ruleBase.addPackage( pkg );
+                    } catch ( Exception e ) {
+                        this.listener.exception( new RuntimeException( "KnowledgeAgent exception while trying to serialize KnowledgeDefinitionsPackage  " ) );
+                    } finally {
+                        try {
+                            is.close();
+                        } catch ( IOException e ) {
+                            this.listener.exception( new RuntimeException( "KnowledgeAgent exception while trying to close KnowledgeDefinitionsPackage  " ) );
+                        }
+                    }
+                }
+            }
+
+            //            for ( Resource child : changeSetState.pkgs ) {
+            //                try {
+            //                    this.listener.debug( "child : " + ((InternalResource) child).getLastRead() + " : " + ((InternalResource) child).getLastModified() );
+            //                    InputStream is = child.getInputStream();
+            //                    Object object = DroolsStreamUtils.streamIn( is );
+            //                    Package pkg = null;
+            //                    if ( object instanceof KnowledgePackage ) {
+            //                        pkg = ((KnowledgePackageImp)object).pkg;
+            //                    } else {
+            //                        pkg = ( Package ) pkg;
+            //                    }
+            //                    this.listener.debug( "KnowledgeAgent adding KnowledgeDefinitionsPackage " + pkg.getName() );
+            //                    ((KnowledgeBaseImpl) this.kbase).ruleBase.addPackage( pkg );
+            //                    is.close();
+            //                } catch ( Exception e ) {
+            //                    this.listener.exception( new RuntimeException( "KnowledgeAgent exception while trying to serialize and KnowledgeDefinitionsPackage  " ) );
+            //                }
+            //            }        
+
+            this.listener.info( "KnowledgeAgent new KnowledgeBase now built and in use" );
         }
 
         // code commented out to try and do incremental kbase changes
@@ -459,13 +505,17 @@
                 this.listener.info( "KnowledegAgent has started listening for ChangeSet notifications" );
             }
             while ( this.monitor ) {
+                Exception exception = null;
                 try {
                     kagent.applyChangeSet( this.queue.take() );
                 } catch ( InterruptedException e ) {
-                    this.listener.exception( new RuntimeException( "KnowledgeAgent ChangeSet notification thread has been interrupted",
-                                                                   e ) );
+                    exception = e;
                 }
                 Thread.yield();
+                if ( this.monitor && exception != null) {
+                    this.listener.exception( new RuntimeException( "KnowledgeAgent ChangeSet notification thread has been interrupted, but shutdown was not scheduled",
+                                                                   exception ) );
+                }
             }
 
             this.listener.info( "KnowledegAgent has stopped listening for ChangeSet notifications" );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeNotifierImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeNotifierImpl.java	2009-02-19 04:47:05 UTC (rev 25332)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeNotifierImpl.java	2009-02-19 06:44:19 UTC (rev 25333)
@@ -248,14 +248,18 @@
                 this.listener.info( "ResourceChangeNotification has started listening for ChangeSet publications" );
             }
             while ( this.notify ) {
+                Exception exception = null;
                 try {
-                    this.listener.debug( "ResourceChangeNotification notifier thread is waiting for queue update" );
+                    this.listener.debug( "ResourceChangeNotification thread is waiting for queue update" );
                     this.notifier.processChangeSet( this.queue.take() );
                 } catch ( InterruptedException e ) {
-                    this.listener.exception( new RuntimeException( "ResourceChangeNotification ChangeSet publication thread was interrupted",
-                                                                   e ) );
+                    exception = e;
                 }
                 Thread.yield();
+                if ( this.notify && exception != null) {
+                    this.listener.exception( new RuntimeException( "ResourceChangeNotification ChangeSet publication thread was interrupted, but shutdown was not scheduled",
+                                                                   exception ) );
+                }
             }
             this.listener.info( "ResourceChangeNotification has stopped listening for ChangeSet publications" );
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerConfigurationImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerConfigurationImpl.java	2009-02-19 04:47:05 UTC (rev 25332)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerConfigurationImpl.java	2009-02-19 06:44:19 UTC (rev 25333)
@@ -49,7 +49,7 @@
     }
 
     public void setInterval(int interval) {
-        this.interval = interval * 1000;
+        this.interval = interval;
     }
    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerImpl.java	2009-02-19 04:47:05 UTC (rev 25332)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/io/impl/ResourceChangeScannerImpl.java	2009-02-19 06:44:19 UTC (rev 25333)
@@ -43,9 +43,12 @@
 
     public void configure(ResourceChangeScannerConfiguration configuration) {
         setInterval( ((ResourceChangeScannerConfigurationImpl) configuration).getInterval() );
-        this.listener.info( "ResourceChangeScanner reconfigured with interval=" + ( getInterval() / 1000 ) );
-        synchronized ( this.resources ) {
-            this.resources.notify(); // notify wait, so that it will wait again
+        this.listener.info( "ResourceChangeScanner reconfigured with interval=" + ( getInterval() ) );
+        
+        // restart it if it's already running.
+        if ( this.scannerScheduler.isRunning() ) {
+            stop();
+            start();           
         }
     }
 
@@ -157,7 +160,7 @@
                             changeSet.getResourcesRemoved().add( resource );
                         }
                     } else if ( ((InternalResource) resource).getLastRead() < lastModified ) {
-                        this.listener.debug( "ResourceChangeScanner modified resource=" + resource );
+                        this.listener.debug( "ResourceChangeScanner modified resource=" + resource + " : " + ((InternalResource) resource).getLastRead() + " : " + lastModified );
                         // it's modified
                         // iterate notifiers for this resource and add to each modified
                         for ( ResourceChangeNotifier notifier : notifiers ) {
@@ -192,10 +195,6 @@
 
     public void setInterval(int interval) {
         this.scannerScheduler.setInterval( interval );
-        if ( this.scannerScheduler.isRunning() ) {
-            // need to interrupt so it will iterate the run() and the new interval will take effect
-            this.thread.interrupt();            
-        }
     }
 
     public int getInterval() {
@@ -245,7 +244,7 @@
         }
 
         public int getInterval() {
-            return (int) this.interval / 1000;
+            return (int) this.interval;
         }
 
         public void setScan(boolean scan) {
@@ -262,20 +261,25 @@
                     this.listener.info( "ResourceChangeNotification scanner has started" );
                 }
                 while ( this.scan ) {
-                    System.out.println( "BEFORE : sync this.resources" );
+                    Exception exception = null;
+                    //System.out.println( "BEFORE : sync this.resources" );
                     synchronized ( this.resources ) {      
-                        System.out.println( "DURING : sync this.resources" );
+                        //System.out.println( "DURING : sync this.resources" );
                         // lock the resources, as we don't want this modified while processing
                         this.scanner.scan();
                     }
-                    System.out.println( "AFTER : SCAN" );
+                    //System.out.println( "AFTER : SCAN" );
                     try {
-                        this.listener.debug( "ResourceChangeNotification scanner thread is waiting for " + ( this.interval / 1000 ) );
-                        wait( this.interval );
+                        this.listener.debug( "ResourceChangeScanner thread is waiting for " + this.interval );
+                        wait( this.interval * 1000 );
                     } catch ( InterruptedException e ) {
-                        this.listener.exception( new RuntimeException( "ResourceChangeNotification ChangeSet scanning thread was interrupted",
-                                                                       e ) );
+                        exception = e;
                     }
+                    
+                    if ( this.scan && exception != null) {
+                        this.listener.exception( new RuntimeException( "ResourceChangeNotification ChangeSet scanning thread was interrupted, but shutdown was not scheduled",
+                                                                       exception ) );                        
+                    }
                 }
                 this.listener.info( "ResourceChangeNotification scanner has stopped" );
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/xml/ChangeSetSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/xml/ChangeSetSemanticModule.java	2009-02-19 04:47:05 UTC (rev 25332)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/xml/ChangeSetSemanticModule.java	2009-02-19 06:44:19 UTC (rev 25333)
@@ -21,10 +21,10 @@
         addHandler( "add",
                     new AddHandler() ); 
         
-        addHandler( "removed",
+        addHandler( "remove",
                     new RemoveHandler() );
         
-        addHandler( "modified",
+        addHandler( "modify",
                     new ModifyHandler() );        
         
         addHandler( "resource",




More information about the jboss-svn-commits mailing list