[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