[jboss-svn-commits] JBL Code SVN: r12820 - in labs/jbossrules/trunk/drools-core/src: test/java/org/drools/agent and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jun 25 04:22:35 EDT 2007
Author: michael.neale at jboss.com
Date: 2007-06-25 04:22:35 -0400 (Mon, 25 Jun 2007)
New Revision: 12820
Added:
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockListener.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockRuleAgent.java
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/DirectoryScanner.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/FileScanner.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageProvider.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/URLScanner.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/DirectoryScannerTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/URLScannerTest.java
Log:
JBRULES-752 w00t ! all done bar for event logging
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/AgentEventListener.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -9,23 +9,28 @@
public interface AgentEventListener {
/**
+ * This sets the name for logging.
+ */
+ public void setAgentName(String name);
+
+ /**
* For general info messages.
*/
- public void info(String configName, String message);
+ public void info(String message);
/**
* For a warning (useful when tracking down problems).
*/
- public void warning(String configName, String message);
+ public void warning(String message);
/**
* An exception occurred.
*/
- public void exception(String configName, Exception e);
+ public void exception(Exception e);
/**
* These should not be logged, just shown if needed.
*/
- public void debug(String configName, String message);
+ public void debug(String message);
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/DirectoryScanner.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/DirectoryScanner.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/DirectoryScanner.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -4,6 +4,7 @@
import java.util.Properties;
import org.drools.RuleBase;
+import org.drools.rule.Package;
/**
* This will scan a directory for files to watch for a change.
@@ -32,15 +33,14 @@
}
- void updateRuleBase(RuleBase rb,
- boolean removeExistingPackages) {
+ Package[] loadPackageChanges() {
if ( currentList.length != dir.listFiles().length ) {
+ listener.info( "Extra files detected in the directory " + dir.getPath() );
currentList = dir.listFiles();
scanner = new FileScanner();
scanner.setFiles( currentList );
}
- scanner.updateRuleBase( rb,
- removeExistingPackages );
+ return scanner.loadPackageChanges();
}
public String toString() {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/FileScanner.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/FileScanner.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/FileScanner.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -11,11 +11,12 @@
import java.util.Map;
import java.util.Properties;
-import org.drools.RuleBase;
import org.drools.RuntimeDroolsException;
import org.drools.common.DroolsObjectInputStream;
import org.drools.rule.Package;
+import com.sun.corba.se.internal.iiop.ListenerThread;
+
/**
* This will monitor a file to a binary package.
* @author Michael Neale
@@ -51,14 +52,13 @@
}
/**
- * Perform the scan, adding in any packages changed to the rulebase.
+ * Perform the scan.
* If there was an error reading the packages, this will not fail, it will
* just do nothing (as there may be a temporary IO issue).
*/
- void updateRuleBase(RuleBase rb,
- boolean removeExistingPackages) {
+ Package[] loadPackageChanges() {
Package[] changes = getChangeSet();
- applyChanges( rb, removeExistingPackages, changes );
+ return changes;
}
@@ -91,7 +91,7 @@
* If an exception occurs, it is noted, but ignored.
* Especially IO, as generally they are temporary.
*/
- private static Package readPackage(File pkgFile) {
+ private Package readPackage(File pkgFile) {
Package p1_ = null;
ObjectInputStream in;
@@ -101,11 +101,13 @@
in.close();
} catch ( FileNotFoundException e ) {
- //throw new RuntimeDroolsException("Unable to open file: [" + pkgFile.getPath() + "]", e);
+ this.listener.exception( e );
+ this.listener.warning( "Was unable to find the file " + pkgFile.getPath() );
} catch ( IOException e ) {
- //throw new RuntimeDroolsException("Unable to open file: [" + pkgFile.getPath() + "] ", e);
+ this.listener.exception( e );
} catch ( ClassNotFoundException e ) {
- //throw new RuntimeDroolsException("Unable to load package from file: [" + pkgFile.getPath() + "]", e);
+ this.listener.exception( e );
+ this.listener.warning( "Was unable to load a class when loading a package. Perhaps it is missing from this application." );
}
return p1_;
}
@@ -120,7 +122,7 @@
return true;
} else {
Long last = (Long) updates.get( path );
- if ( last.intValue() < fileLastModified ) {
+ if ( last.longValue() < fileLastModified ) {
updates.put( path,
new Long( fileLastModified ) );
return true;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageProvider.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageProvider.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -1,5 +1,8 @@
package org.drools.agent;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
import java.util.Properties;
import org.drools.RuleBase;
@@ -13,13 +16,15 @@
*/
public abstract class PackageProvider {
+ protected AgentEventListener listener;
+
/**
- * Perform the scan, adding in any packages changed to the rulebase.
+ * Perform the scan, adding in any packages changed.
+ * if there are no changes, null should be returned.
* If there was an error reading the packages, this will not fail, it will
* just do nothing (as there may be a temporary IO issue).
*/
- abstract void updateRuleBase(RuleBase rb,
- boolean removeExistingPackages);
+ abstract Package[] loadPackageChanges();
/**
* This will be passed the entire config.
@@ -30,7 +35,7 @@
* Remove the package from the rulebase if it exists in it.
* If it does not, does nothing.
*/
- void removePackage(String name,
+ static void removePackage(String name,
RuleBase rb) {
Package[] ps = rb.getPackages();
if ( ps == null ) return;
@@ -44,15 +49,21 @@
}
- void applyChanges(RuleBase rb, boolean removeExistingPackages, Package[] changes) {
+ static void applyChanges(RuleBase rb, boolean removeExistingPackages, Package[] ps, AgentEventListener listener) {
+ applyChanges( rb, removeExistingPackages, Arrays.asList( ps ), listener );
+ }
+
+ static void applyChanges(RuleBase rb, boolean removeExistingPackages, Collection changes, AgentEventListener listener) {
if ( changes == null ) return;
- for ( int i = 0; i < changes.length; i++ ) {
- Package p = changes[i];
+ for ( Iterator iter = changes.iterator(); iter.hasNext(); ) {
+ Package p = (Package) iter.next();
+
if ( removeExistingPackages ) {
removePackage( p.getName(),
rb );
}
try {
+ listener.info( "Adding package called " + p.getName() );
rb.addPackage( p );
} catch ( Exception e ) {
throw new RuntimeDroolsException( e );
@@ -60,5 +71,9 @@
}
}
+ public void setAgentListener(AgentEventListener listener) {
+ this.listener = listener;
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -3,6 +3,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
@@ -17,6 +18,7 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.RuntimeDroolsException;
+import org.drools.rule.Package;
/**
* This manages a single rulebase, based on the properties given
@@ -39,6 +41,8 @@
*
* <code>dir</code>: a single file system directory to monitor for packages.
* As with files, each package must be in its own file.
+ *
+ * <code>url</code>: A space seperated URL to a binary rulebase in the BRMS.
*
* @author Michael Neale
*/
@@ -61,7 +65,7 @@
/**
* Here is where we have a map of providers to the key that appears on the configuration.
*/
- private static Map PACKAGE_PROVIDERS = new HashMap() {
+ public static Map PACKAGE_PROVIDERS = new HashMap() {
{
put( FILES,
FileScanner.class );
@@ -90,37 +94,52 @@
*/
List providers;
- AgentEventListener listener = getDefaultListener();
- private String configName;
-
/**
+ * This keeps the packages around that have been loaded.
+ */
+ Map packages = new HashMap();
+
+ /**
+ * For logging events (important for stuff that happens in the background).
+ */
+ AgentEventListener listener = getDefaultListener();
+
+
+
+ /**
* Properties configured to load up packages into a rulebase (and monitor them
* for changes).
*/
- public RuleAgent(Properties config) {
- init( config );
+ public static RuleAgent newRuleAgent(Properties config) {
+ RuleAgent agent = new RuleAgent();
+ agent.init( config );
+ return agent;
}
/**
* This allows an optional listener to be passed in.
* The default one prints some stuff out to System.err only when really needed.
*/
- public RuleAgent(Properties config, AgentEventListener listener) {
- this.listener = listener;
- init(config);
+ public static RuleAgent newRuleAgent(Properties config, AgentEventListener listener) {
+ RuleAgent agent = new RuleAgent();
+ agent.listener = listener;
+ agent.init(config);
+ return agent;
}
- private void init(Properties config) {
+ void init(Properties config) {
boolean newInstance = Boolean.valueOf( config.getProperty( NEW_INSTANCE,
"false" ) ).booleanValue();
int secondsToRefresh = Integer.parseInt( config.getProperty( POLL_INTERVAL,
"-1" ) );
- String name = config.getProperty( CONFIG_NAME, "default" );
+ final String name = config.getProperty( CONFIG_NAME, "default" );
- listener.info( this.configName, "Configuring with newInstance=" + newInstance + ", secondsToRefresh="
+ listener.setAgentName( name );
+
+ listener.info( "Configuring with newInstance=" + newInstance + ", secondsToRefresh="
+ secondsToRefresh);
List provs = new ArrayList();
@@ -130,30 +149,34 @@
PackageProvider prov = getProvider( key,
config );
if ( prov != null ) {
- listener.info( configName, "Configuring package provider : " + prov.toString() );
+ listener.info( "Configuring package provider : " + prov.toString() );
provs.add( prov );
}
}
configure( newInstance, provs,
- secondsToRefresh, name );
+ secondsToRefresh );
}
/**
* Pass in the name and full path to a config file that is on the classpath.
*/
- public RuleAgent(String propsFileName) {
- init( loadFromProperties( propsFileName ) );
+ public static RuleAgent newRuleAgent(String propsFileName) {
+ RuleAgent agent = new RuleAgent();
+ agent.init( agent.loadFromProperties( propsFileName ) );
+ return agent;
}
/**
* This takes in an optional listener.
* Listener must not be null in this case.
*/
- public RuleAgent(String propsFileName, AgentEventListener listener) {
- this.listener = listener;
- init( loadFromProperties( propsFileName ) );
+ public static RuleAgent newRuleAgent(String propsFileName, AgentEventListener listener) {
+ RuleAgent ag = new RuleAgent();
+ ag.listener = listener;
+ ag.init( ag.loadFromProperties( propsFileName ) );
+ return ag;
}
Properties loadFromProperties(String propsFileName) {
@@ -179,7 +202,8 @@
}
Class clz = (Class) PACKAGE_PROVIDERS.get( key );
try {
- PackageProvider prov = (PackageProvider) clz.newInstance();
+ PackageProvider prov = (PackageProvider) clz.newInstance( );
+ prov.setAgentListener( listener );
prov.configure( config );
return prov;
} catch ( InstantiationException e ) {
@@ -193,10 +217,10 @@
synchronized void configure(boolean newInstance,
List provs,
- int secondsToRefresh, String name) {
+ int secondsToRefresh) {
this.newInstance = newInstance;
this.providers = provs;
- this.configName = name;
+
//run it the first time for each.
refreshRuleBase();
@@ -208,11 +232,13 @@
timer.schedule( new TimerTask() {
public void run() {
try {
- listener.debug( configName, "Timer woke up." );
+
+ listener.debug( "Checking for updates." );
refreshRuleBase();
+
} catch (Exception e) {
- //don't want to stop execution here.
- listener.exception( configName, e );
+ //don't want to stop execution here.
+ listener.exception( e );
}
}
},
@@ -223,19 +249,45 @@
}
public void refreshRuleBase() {
+
+ List changedPackages = new ArrayList();
+
for ( Iterator iter = providers.iterator(); iter.hasNext(); ) {
PackageProvider prov = (PackageProvider) iter.next();
- updateRuleBase( prov );
+ Package[] changes = checkForChanges( prov );
+ if (changes != null && changes.length > 0) {
+ changedPackages.addAll( Arrays.asList( changes ) );
+ }
}
+
+ if (changedPackages.size() > 0) {
+ listener.info( "Applying changes to the rulebase." );
+ //we have a change
+ if (this.newInstance) {
+ listener.info( "Creating a new rulebase as per settings." );
+ //blow away old
+ this.ruleBase = RuleBaseFactory.newRuleBase();
+
+ //need to store ALL packages
+ for ( Iterator iter = changedPackages.iterator(); iter.hasNext(); ) {
+ Package element = (Package) iter.next();
+ this.packages.put( element.getName(), element ); //replace
+ }
+ //get packages from full name
+ PackageProvider.applyChanges( this.ruleBase, false, this.packages.values(), this.listener );
+ } else {
+ PackageProvider.applyChanges( this.ruleBase, true, changedPackages, this.listener );
+ }
+ }
+
+
}
- private synchronized void updateRuleBase(PackageProvider prov) {
- listener.debug( configName, "SCANNING FOR CHANGE " + prov.toString() );
- if ( this.newInstance || this.ruleBase == null ) {
- ruleBase = RuleBaseFactory.newRuleBase();
- }
- prov.updateRuleBase( this.ruleBase,
- !this.newInstance );
+ private synchronized Package[] checkForChanges(PackageProvider prov) {
+ listener.debug( "SCANNING FOR CHANGE " + prov.toString() );
+ if (this.ruleBase == null) ruleBase = RuleBaseFactory.newRuleBase();
+ Package[] changes = prov.loadPackageChanges();
+ return changes;
}
/**
@@ -291,27 +343,34 @@
return new AgentEventListener() {
+ private String name;
+
public String time() {
Date d = new Date();
return d.toString();
}
- public void exception(String name, Exception e) {
- System.err.println("RuleAgent(" + name + ") EXCEPTION (" + time() + "): " + e.getMessage() + ". Stack trace should follow");
+ public void exception(Exception e) {
+ System.err.println("RuleAgent(" + name + ") EXCEPTION (" + time() + "): " + e.getMessage() + ". Stack trace should follow.");
e.printStackTrace( System.err );
}
- public void info(String name, String message) {
+ public void info(String message) {
System.err.println("RuleAgent(" + name + ") INFO (" + time() + "): " + message);
}
- public void warning(String name, String message) {
+ public void warning(String message) {
System.err.println("RuleAgent(" + name + ") WARNING (" + time() + "): " + message);
}
- public void debug(String name, String message) {
+ public void debug(String message) {
//do nothing...
}
+
+ public void setAgentName(String name) {
+ this.name = name;
+
+ }
};
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/URLScanner.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/URLScanner.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/URLScanner.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -83,17 +83,19 @@
- void updateRuleBase(RuleBase rb, boolean removeExistingPackages) {
+ Package[] loadPackageChanges() { //void updateRuleBase(RuleBase rb, boolean removeExistingPackages) {
Package[] changes = null;
try {
changes = getChangeSet();
- applyChanges( rb, removeExistingPackages, changes );
+ return changes;
} catch ( IOException e ) {
if (this.localCacheFileScanner != null) {
- localCacheFileScanner.updateRuleBase( rb, removeExistingPackages );
+ listener.warning( "Falling back to local cache." );
+ return localCacheFileScanner.loadPackageChanges();
}
- //TODO: add in logging
+ listener.exception( e );
}
+ return null;
}
private Package[] getChangeSet() throws IOException {
@@ -123,7 +125,8 @@
out.flush();
out.close();
} catch (IOException e) {
- //TODO: log this event
+ listener.exception( e );
+ listener.warning( "Was an error with the local cache directory " + localCacheDir.getPath() );
}
}
@@ -135,8 +138,8 @@
private boolean hasChanged(URL u, Map updates) throws IOException {
LastUpdatedPing pong = httpClient.checkLastUpdated( u );
if (pong.isError()) {
+ listener.warning( "Was an error contacting " + u.toExternalForm() + ". Reponse header: " + pong.responseMessage );
throw new IOException("Was unable to reach server.");
- //TODO: log stuff here.
}
String url = u.toExternalForm();
@@ -146,7 +149,7 @@
return true;
} else {
Long last = (Long) updates.get( url );
- if ( last.intValue() < pong.lastUpdated ) {
+ if ( last.longValue() < pong.lastUpdated ) {
updates.put( url,
new Long( pong.lastUpdated ) );
return true;
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/DirectoryScannerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/DirectoryScannerTest.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/DirectoryScannerTest.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -25,13 +25,15 @@
RuleBaseAssemblerTest.writePackage( p2, p2f);
DirectoryScanner scan = new DirectoryScanner();
+ scan.listener = new MockListener();
Properties props = new Properties();
props.setProperty( RuleAgent.DIRECTORY, dir.getPath() );
scan.configure( props );
RuleBase rb = RuleBaseFactory.newRuleBase();
- scan.updateRuleBase( rb, true );
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+
assertEquals(2, rb.getPackages().length);
Package p3 = new Package("p3");
@@ -39,7 +41,8 @@
RuleBaseAssemblerTest.writePackage( p3, p3f );
- scan.updateRuleBase( rb, true );
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+
assertEquals(3, rb.getPackages().length);
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -1,6 +1,8 @@
package org.drools.agent;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
@@ -50,20 +52,23 @@
scan.configure( props );
RuleBase rb = RuleBaseFactory.newRuleBase();
- scan.updateRuleBase( rb, true );
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+
+
assertEquals(2, rb.getPackages().length);
assertEquals("p1", rb.getPackages()[0].getName());
assertEquals("p2", rb.getPackages()[1].getName());
-
- scan.updateRuleBase( rb, true );
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
assertEquals(2, rb.getPackages().length);
assertEquals("p1", rb.getPackages()[0].getName());
assertEquals("p2", rb.getPackages()[1].getName());
RuleBaseAssemblerTest.writePackage( p2, p2f );
- scan.updateRuleBase( rb, true );
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+
+
assertEquals(2, rb.getPackages().length);
assertEquals("p1", rb.getPackages()[0].getName());
assertEquals("p2", rb.getPackages()[1].getName());
@@ -73,9 +78,26 @@
public void testEmptyList() throws Exception {
FileScanner scan = new FileScanner();
RuleBase rb = RuleBaseFactory.newRuleBase();
- scan.updateRuleBase( rb, true );
+
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+
assertEquals(0, rb.getPackages().length);
}
+ public void testFileChanges() throws Exception {
+ File dir = RuleBaseAssemblerTest.getTempDirectory();
+ File t = new File(dir, "x.bar");
+
+ Package x = new Package("x");
+ RuleBaseAssemblerTest.writePackage( x, t );
+
+ FileScanner scan = new FileScanner();
+ Map updates = new HashMap();
+ assertTrue(scan.hasChanged( "x", updates, t.lastModified() ));
+ assertFalse(scan.hasChanged( "x", updates, t.lastModified() ));
+
+ }
+
+
}
Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockListener.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockListener.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -0,0 +1,32 @@
+package org.drools.agent;
+
+public class MockListener
+ implements
+ AgentEventListener {
+
+ public void debug(String message) {
+
+
+ }
+
+ public void exception(Exception e) {
+
+
+ }
+
+ public void info(String message) {
+
+
+ }
+
+ public void setAgentName(String name) {
+
+
+ }
+
+ public void warning(String message) {
+
+
+ }
+
+}
Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockListener.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockRuleAgent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockRuleAgent.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockRuleAgent.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -0,0 +1,19 @@
+package org.drools.agent;
+
+import java.util.Properties;
+
+public class MockRuleAgent extends RuleAgent {
+
+
+ public boolean refreshCalled = false;
+
+
+
+ public void refreshRuleBase() {
+ refreshCalled = true;
+
+ }
+
+
+
+}
Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockRuleAgent.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -3,6 +3,7 @@
import java.io.File;
import java.util.List;
import java.util.Properties;
+import java.util.Random;
import org.drools.RuleBase;
import org.drools.rule.Package;
@@ -40,7 +41,7 @@
Properties props = new Properties();
props.setProperty( "file", path );
- RuleAgent ag = new RuleAgent(props);
+ RuleAgent ag = RuleAgent.newRuleAgent(props);
RuleBase rb = ag.getRuleBase();
assertNotNull(rb);
assertEquals(2, rb.getPackages().length);
@@ -48,7 +49,7 @@
assertFalse(ag.isPolling());
props.setProperty( "poll", "1" );
- ag = new RuleAgent(props);
+ ag = RuleAgent.newRuleAgent(props);
assertTrue(ag.isPolling());
ag.stopPolling();
@@ -58,26 +59,30 @@
public void testPollingFilesRuleBaseUpdate() throws Exception {
//RuleBaseAssemblerTest.clearTempDirectory();
- File dir = RuleBaseAssemblerTest.getTempDirectory();
+ final File dir = RuleBaseAssemblerTest.getTempDirectory();
- Package p1 = new Package("p1");
- File p1f = new File(dir, "p42_.pkg");
+ Random rnd = new Random(System.currentTimeMillis());
+
+ final Package p1 = new Package("p1");
+ final File p1f = new File(dir, rnd.nextLong() + ".pkg");
RuleBaseAssemblerTest.writePackage( p1, p1f );
- String path = dir.getPath() + "/" + "p42_.pkg";
+ String path = p1f.getPath();
Properties props = new Properties();
props.setProperty( "file", path );
- props.setProperty( "poll", "1" );
- RuleAgent ag = new RuleAgent(props);
- assertTrue(ag.isPolling());
+ RuleAgent ag = RuleAgent.newRuleAgent(props);
+
+
RuleBase rb = ag.getRuleBase();
assertEquals(1, rb.getPackages().length);
assertEquals(0, rb.getPackages()[0].getGlobals().size());
p1.addGlobal( "goo", String.class );
+ Thread.sleep( 1000 );
+
RuleBaseAssemblerTest.writePackage( p1, p1f );
RuleBase rb_ = ag.getRuleBase();
@@ -85,8 +90,10 @@
assertEquals(1, rb.getPackages().length);
assertEquals(0, rb.getPackages()[0].getGlobals().size());
- Thread.sleep( 2000 );
+ Thread.sleep( 1000 );
+ ag.refreshRuleBase();
+
RuleBase rb2 = ag.getRuleBase();
assertSame(rb, rb2);
@@ -96,14 +103,18 @@
//now check subsequent changes
p1.addGlobal( "goo2", String.class );
System.err.println("-->WRITING CHANGE");
+ Thread.sleep( 1000 );
RuleBaseAssemblerTest.writePackage( p1, p1f );
System.err.println("-->WROTE CHANGE");
+ Thread.sleep( 1000 );
+ ag.refreshRuleBase();
+
RuleBase rb2_ = ag.getRuleBase();
assertSame(rb2_, rb2);
assertEquals(1, rb2_.getPackages().length);
- assertEquals(1, rb2_.getPackages()[0].getGlobals().size());
+ assertEquals(2, rb2_.getPackages()[0].getGlobals().size());
- Thread.sleep( 2000 );
+ ag.refreshRuleBase();
RuleBase rb3 = ag.getRuleBase();
assertSame(rb3, rb2);
@@ -111,42 +122,71 @@
assertEquals(1, rb3.getPackages().length);
assertEquals(2, rb3.getPackages()[0].getGlobals().size());
+ ag.refreshRuleBase();
+ ag.refreshRuleBase();
- ag.stopPolling();
+ assertEquals(1, rb3.getPackages().length);
+ assertEquals(2, rb3.getPackages()[0].getGlobals().size());
+
+
}
public void testPollingFilesRuleBaseReplace() throws Exception {
File dir = RuleBaseAssemblerTest.getTempDirectory();
-
+
Package p1 = new Package("p1");
File p1f = new File(dir, "p43_.pkg");
RuleBaseAssemblerTest.writePackage( p1, p1f );
+
+ Package p2 = new Package("p2");
+ File p2f = new File(dir, "p44_.pkg");
+ RuleBaseAssemblerTest.writePackage( p2, p2f );
- String path = dir.getPath() + "/" + "p43_.pkg";
+
+ String path = dir.getPath() + "/" + "p43_.pkg " + dir.getPath() + "/p44_.pkg";
+
Properties props = new Properties();
props.setProperty( "file", path );
- props.setProperty( "poll", "1" );
+
props.setProperty( "newInstance", "true" );
- RuleAgent ag = new RuleAgent(props);
+ RuleAgent ag = RuleAgent.newRuleAgent(props);
+
assertTrue(ag.isNewInstance());
- assertTrue(ag.isPolling());
+
RuleBase rb = ag.getRuleBase();
- assertEquals(1, rb.getPackages().length);
+ assertEquals(2, rb.getPackages().length);
RuleBase rb_ = ag.getRuleBase();
assertSame(rb, rb_);
+
+ ag.refreshRuleBase();
+
+ assertSame(rb, ag.getRuleBase());
+ Thread.sleep( 1000 );
+ //only change one
RuleBaseAssemblerTest.writePackage( p1, p1f );
+ Thread.sleep( 1000 );
+ ag.refreshRuleBase();
- Thread.sleep( 2100 );
rb_ = ag.getRuleBase();
assertNotSame( rb, rb_ );
- ag.stopPolling();
+ //check we will have 2
+ assertEquals(2, rb_.getPackages().length);
+
+ ag.refreshRuleBase();
+ ag.refreshRuleBase();
+
+ RuleBase rb__ = ag.getRuleBase();
+ assertSame(rb_, rb__);
+
+
+
}
@@ -160,8 +200,11 @@
Properties props = new Properties();
props.setProperty( RuleAgent.DIRECTORY, dir.getPath() );
- RuleAgent ag = new RuleAgent(props);
+ props.setProperty( RuleAgent.CONFIG_NAME, "goo" );
+
+ RuleAgent ag = RuleAgent.newRuleAgent(props);
+
ag.refreshRuleBase();
RuleBase rb = ag.getRuleBase();
@@ -194,14 +237,19 @@
RuleAgent ag = new RuleAgent();
assertNotNull(ag.listener);
+ final String[] name = new String[1];
+
AgentEventListener list = new AgentEventListener() {
- public void debug(String name, String message) {
+ public void debug(String message) {
}
- public void exception(String name, Exception e) {
+ public void exception(Exception e) {
}
- public void info(String name, String message) {
+ public void info(String message) {
}
- public void warning(String name, String message) {
+ public void warning(String message) {
+ }
+ public void setAgentName(String n) {
+ name[0] = n;
}
};
@@ -216,14 +264,43 @@
Properties props = new Properties();
props.setProperty( "file", path );
props.setProperty( "poll", "1" );
- ag = new RuleAgent(props, list);
+ props.setProperty( "name", "poo" );
+ ag = RuleAgent.newRuleAgent(props, list);
assertEquals(list, ag.listener);
+ assertEquals("poo", name[0]);
ag.stopPolling();
}
+ public void testPollSetup() throws Exception {
+ //this is the only method that will actually run the polling timer
+
+
+ Properties props = new Properties();
+ //props.setProperty( "file", "/foo/bar" );
+ props.setProperty( "poll", "1" );
+ MockRuleAgent ag = new MockRuleAgent();
+ ag.init(props);
+
+ assertTrue(ag.isPolling());
+ assertTrue(ag.refreshCalled);
+ ag.refreshCalled = false;
+ assertFalse(ag.refreshCalled);
+ Thread.sleep( 100 );
+ assertFalse(ag.refreshCalled);
+ Thread.sleep( 1500 );
+ assertTrue(ag.refreshCalled);
+ ag.refreshCalled = false;
+ Thread.sleep( 100 );
+ assertFalse(ag.refreshCalled);
+ Thread.sleep( 1500 );
+ assertTrue(ag.refreshCalled);
+ ag.stopPolling();
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/URLScannerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/URLScannerTest.java 2007-06-25 03:25:18 UTC (rev 12819)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/URLScannerTest.java 2007-06-25 08:22:35 UTC (rev 12820)
@@ -5,6 +5,8 @@
import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
import junit.framework.TestCase;
@@ -132,8 +134,10 @@
assertNull( scan.localCacheDir );
RuleBase rb = RuleBaseFactory.newRuleBase();
- scan.updateRuleBase( rb, false );
+ AgentEventListener list = getNilListener();
+ PackageProvider.applyChanges( rb, false, scan.loadPackageChanges(), list );
+
assertEquals( 2, rb.getPackages().length );
assertExists(new String[] {"goo2.ber", "wee2.waa"}, rb.getPackages());
@@ -143,6 +147,12 @@
assertEquals( numfiles, dir.list().length );
}
+
+
+ private AgentEventListener getNilListener() {
+ return new MockListener();
+ }
+
private void assertExists(String[] names, Package[] packages) {
for ( int i = 0; i < packages.length; i++ ) {
String name = packages[i].getName();
@@ -159,6 +169,7 @@
public void testUpdateWithLocalCache() {
URLScanner scan = new URLScanner();
+ scan.listener = new MockListener();
File dir = RuleBaseAssemblerTest.getTempDirectory();
Properties config = new Properties();
@@ -190,8 +201,9 @@
assertNotNull( scan.localCacheDir );
RuleBase rb = RuleBaseFactory.newRuleBase();
- scan.updateRuleBase( rb, false );
+ PackageProvider.applyChanges( rb, false, scan.loadPackageChanges(), getNilListener() );
+
assertEquals( 2, rb.getPackages().length );
assertEquals( "goo.ber", rb.getPackages()[0].getName() );
assertEquals( "wee.waa", rb.getPackages()[1].getName() );
@@ -223,9 +235,14 @@
rb = RuleBaseFactory.newRuleBase();
assertEquals(0, rb.getPackages().length);
- scan.updateRuleBase( rb, true );
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), getNilListener() );
+
assertEquals(2, rb.getPackages().length);
+ final boolean[] fetchCalled = new boolean[1];
+
+ fetchCalled[0] = false;
+
//now check with IOExceptions
scan.httpClient = new IHttpClient() {
@@ -237,23 +254,22 @@
}
public Package fetchPackage(URL url) throws IOException {
+ fetchCalled[0] = true;
throw new IOException("poo");
}
};
- scan.updateRuleBase( rb, true );
- assertEquals(2, rb.getPackages().length);
-
- rb = RuleBaseFactory.newRuleBase();
- scan.updateRuleBase( rb, true );
- assertEquals(2, rb.getPackages().length);
-
+ Package[] changes = scan.loadPackageChanges();
+ assertEquals(0, changes.length);
+ assertEquals(true, fetchCalled[0]);
+
}
public void testColdStartWithError() throws Exception {
//this will show starting up and reading packages from the dir when the remote one doesn't respond
URLScanner scan = new URLScanner();
+ scan.listener = new MockListener();
File dir = RuleBaseAssemblerTest.getTempDirectory();
Package p1 = new Package("goo.ber");
@@ -287,7 +303,7 @@
assertNotNull( scan.localCacheDir );
RuleBase rb = RuleBaseFactory.newRuleBase();
- scan.updateRuleBase( rb, true );
+ PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), getNilListener() );
assertEquals(2, rb.getPackages().length);
More information about the jboss-svn-commits
mailing list