[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