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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 8 03:53:24 EDT 2008


Author: Rikkola
Date: 2008-07-08 03:53:24 -0400 (Tue, 08 Jul 2008)
New Revision: 20955

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageChangeInfo.java
Modified:
   labs/jbossrules/trunk/drools-core/.classpath
   labs/jbossrules/trunk/drools-core/.project
   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/MockProvider.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-1660: Rule agent not detecting deleted files and removing packages

Modified: labs/jbossrules/trunk/drools-core/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-core/.classpath	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/.classpath	2008-07-08 07:53:24 UTC (rev 20955)
@@ -1,12 +1,8 @@
-<classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
-  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
-  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
-  <classpathentry kind="output" path="target/classes"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
-  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
-</classpath>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry including="**/*.java" kind="src" output="target/test-classes" path="src/test/java"/>
+	<classpathentry including="**/*.java" kind="src" path="src/main/java"/>
+	<classpathentry kind="con" path="org.devzuz.q.maven.jdt.core.mavenClasspathContainer"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

Modified: labs/jbossrules/trunk/drools-core/.project
===================================================================
--- labs/jbossrules/trunk/drools-core/.project	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/.project	2008-07-08 07:53:24 UTC (rev 20955)
@@ -1,16 +1,28 @@
-<projectDescription>
-  <name>drools-core</name>
-  <comment>A rule production system</comment>
-  <projects/>
-  <buildSpec>
-    <buildCommand>
-      <name>org.eclipse.jdt.core.javabuilder</name>
-    </buildCommand>
-    <buildCommand>
-      <name>org.drools.eclipse.droolsbuilder</name>
-    </buildCommand>
-  </buildSpec>
-  <natures>
-    <nature>org.eclipse.jdt.core.javanature</nature>
-  </natures>
-</projectDescription>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>drools-core</name>
+	<comment>A rule production system</comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.drools.eclipse.droolsbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.devzuz.q.maven.jdt.core.mavenIncrementalBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.devzuz.q.maven.jdt.core.mavenNature</nature>
+	</natures>
+</projectDescription>

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/DirectoryScanner.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -1,57 +1,92 @@
 package org.drools.agent;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 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.
- * It will update the list of files only if they number of files in a directory changes.
+ * This will scan a directory for files to watch for a change. It will update
+ * the list of files only if they number of files in a directory changes.
  * 
  * @author Michael Neale
  */
 public class DirectoryScanner extends PackageProvider {
 
-    private File[]      currentList;
-    private FileScanner scanner;
-    private File        dir;
+	private FileScanner scanner;
+	private File dir;
 
-    void configure(Properties config) {
-        String d = config.getProperty( RuleAgent.DIRECTORY );
+	void configure(Properties config) {
+		String d = config.getProperty(RuleAgent.DIRECTORY);
 
-        //now check to see whats in them dir...
-        dir = new File( d );
-        if ( !(dir.isDirectory() && dir.exists()) ) {
-            throw new IllegalArgumentException( "The directory " + d + "is not valid." );
-        }
+		// now check to see whats in them dir...
+		dir = new File(d);
+		if (!(dir.isDirectory() && dir.exists())) {
+			throw new IllegalArgumentException("The directory " + d
+					+ "is not valid.");
+		}
+		
+		scanner = new FileScanner();
+		scanner.setFiles( dir.listFiles() );
 
-        this.currentList = dir.listFiles();
-        scanner = new FileScanner();
-        scanner.setFiles( currentList );
+	}
 
-    }
+	PackageChangeInfo loadPackageChanges() {
+		
+		Map<String, String> pathToPackage = scanner.pathToPackage;
+		Collection<String> removedPackageNames = new ArrayList<String>();
+		
+		if( pathToPackage != null ) {
+			Map<String,String> tempPathToPackage = new HashMap<String, String>();
+			
+			File[] files = dir.listFiles();
+			for (int i = 0; i < files.length; i++) {
+				File f = files[i];
+				String path = f.getPath();
+				
+				if (pathToPackage.containsKey(path)) {
 
-    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 );
-        }
-        return scanner.loadPackageChanges();
-    }
-    
-    public String toString() {
-        String s = "DirectoryScanner";
-        if (dir != null) {
-            s = s + " scanning dir: " + dir.getPath();
-        }
-        if (currentList != null) {
-            s = s + " found " + currentList.length + " file(s).";            
-        }
-        return s;
-    }
+					tempPathToPackage.put(path, pathToPackage.get(path));
+					pathToPackage.remove(path);
+				} 
+			}
+			
+			if( pathToPackage.size() > 0 || files.length != tempPathToPackage.size() ) {
+				removedPackageNames.addAll( pathToPackage.values() );
+				
+				listener.info("File changes detected in the directory "
+						+ dir.getPath());
+				
+//				scanner = new FileScanner();
+				scanner.setFiles( files );			
+			}
+		
+			scanner.pathToPackage = tempPathToPackage;
+		}
+				
+		PackageChangeInfo info = scanner.loadPackageChanges();
+		
+		info.addRemovedPackages(removedPackageNames);
+		
+		return info;
+	}
+	
 
+	public String toString() {
+		String s = "DirectoryScanner";
+		if (dir != null) {
+			s = s + " scanning dir: " + dir.getPath();
+		}
+		if (scanner != null && scanner.files != null) {
+			s = s + " found " + scanner.files.length + " file(s).";
+		}
+		return s;
+	}
+
 }

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/FileScanner.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -4,7 +4,6 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -19,11 +18,12 @@
  *
  */
 public class FileScanner extends PackageProvider {
+	
+    File[] 				files;
+    Map    				lastUpdated = new HashMap();
+    Map<String,String> 	pathToPackage = null;
 
-    File[] files;
-    Map    lastUpdated = new HashMap();
 
-
     /**
      * This sets the list of files to be monitored.
      * This takes a list of paths and files (not directories).
@@ -52,8 +52,8 @@
      * 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).
      */
-    Package[] loadPackageChanges() {
-        Package[] changes = getChangeSet();
+    PackageChangeInfo loadPackageChanges() {
+    	PackageChangeInfo changes = getChangeSet();
         return changes;
     }
 
@@ -64,19 +64,31 @@
      * Calculate a change set, based on last updated times.
      * (keep a map of files).
      */
-    private Package[] getChangeSet() {
-        if ( this.files == null ) return new Package[0];
-        List list = new ArrayList();
+    private PackageChangeInfo getChangeSet() {
+    	PackageChangeInfo info = new PackageChangeInfo();
+        if ( this.files == null ) return info;
+        
+        if( pathToPackage == null ) pathToPackage = new HashMap<String,String>();
+        
         for ( int i = 0; i < files.length; i++ ) {
             File f = files[i];
-            if ( hasChanged( f.getPath(),
+            
+            if( !f.exists() ){
+            	String name = pathToPackage.get(f.getPath());
+            	if( name != null ){
+            		info.addRemovedPackage( name );
+            	}
+            } else if ( hasChanged( f.getPath(),
                              this.lastUpdated,
                              f.lastModified() ) ) {
                 Package p = readPackage( f );
-                if ( p != null ) list.add( p );
+                if ( p != null ) {
+                	info.addPackage( p );
+                	pathToPackage.put(f.getPath(), p.getName());
+                }
             }
         }
-        return (Package[]) list.toArray( new Package[list.size()] );
+        return info;
     }
 
     /**

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageChangeInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageChangeInfo.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageChangeInfo.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -0,0 +1,61 @@
+package org.drools.agent;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.drools.rule.Package;
+
+/**
+ * Contains the changes to packages.
+ * 
+ * @author Toni Rikkola
+ * 
+ */
+class PackageChangeInfo {
+
+	private Collection<Package> changedPackages;
+	private Collection<String> removedPackages;
+
+	void addPackage(Package p) {
+
+		if (changedPackages == null) {
+			changedPackages = new ArrayList<Package>();
+		}
+
+		changedPackages.add(p);
+	}
+
+	void addRemovedPackages(Collection<String> removedPackages) {
+
+		for (String name : removedPackages) {
+			addRemovedPackage(name);
+		}
+
+	}
+
+	Collection<Package> getChangedPackages() {
+		if (changedPackages != null) {
+			return changedPackages;
+		} else {
+			return Collections.emptyList();
+		}
+	}
+
+	Collection<String> getRemovedPackages() {
+		if (removedPackages != null) {
+			return removedPackages;
+		} else {
+			return Collections.emptyList();
+		}
+	}
+
+	void addRemovedPackage(String name) {
+
+		if (removedPackages == null) {
+			removedPackages = new ArrayList<String>();
+		}
+
+		removedPackages.add(name);
+	}
+}

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/PackageProvider.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -3,6 +3,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Properties;
 
 import org.drools.RuleBase;
@@ -24,7 +25,7 @@
      * 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 Package[] loadPackageChanges();
+    abstract PackageChangeInfo loadPackageChanges();
 
     /**
      * This will be passed the entire config.
@@ -47,29 +48,49 @@
             }
         }
     }    
+
+    static void removePackages(	Collection<String> removedPackages,
+    							RuleBase rb, 
+    							AgentEventListener listener ) {
+    	
+    	for (String name : removedPackages) {
+	        listener.info( "Removing package called " + name );
+	    	removePackage(name, rb);
+		}
+    }    
     
-    
-    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) {
+    	applyChanges(rb, removeExistingPackages, changes, null, listener);
     }
     
-    static void applyChanges(RuleBase rb, boolean removeExistingPackages, Collection changes, AgentEventListener listener) {
-        rb.lock();
-        if ( changes == null ) return;
-        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 );
-            }
-        }
+    static void applyChanges(RuleBase rb, boolean removeExistingPackages, Collection changes, 
+    							Collection<String> removed, AgentEventListener listener) {
+    	if ( changes == null && removed == null ) return;
+    	
+    	rb.lock();
+        
+    	if(removed != null ) {
+    		removePackages(removed, rb, listener);
+    	}
+    	
+    	if( changes != null ) {
+	        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 );
+	            }
+	        }
+    	}
+        
         rb.unlock();
     }
     

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/RuleAgent.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -4,6 +4,7 @@
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -290,18 +291,25 @@
     }
 
     public void refreshRuleBase() {
+    	
+        List<Package> changedPackages = new ArrayList<Package>();
+        List<String> removedPackages = new ArrayList<String>();
 
-        List changedPackages = new ArrayList();
-
         for ( Iterator iter = providers.iterator(); iter.hasNext(); ) {
             PackageProvider prov = (PackageProvider) iter.next();
-            Package[] changes = checkForChanges( prov );
-            if (changes != null && changes.length > 0) {
-                changedPackages.addAll( Arrays.asList( changes ) );
+            PackageChangeInfo info = checkForChanges( prov );
+            Collection<Package> changes = info.getChangedPackages(); 
+            Collection<String> removed = info.getRemovedPackages(); 
+            if (changes != null && changes.size() > 0) {
+                changedPackages.addAll( changes );
+            } 
+            if (removed != null && removed.size() > 0) {
+                removedPackages.addAll( removed );
             }
         }
 
-        if (changedPackages.size() > 0) {
+        // Update changes.
+        if (changedPackages.size() > 0 || removedPackages.size() > 0) {
             listener.info( "Applying changes to the rulebase." );
             //we have a change
             if (this.newInstance) {
@@ -309,30 +317,33 @@
                 //blow away old
                 this.ruleBase = RuleBaseFactory.newRuleBase( this.ruleBaseConf );
 
+                // Remove removed packages.
+                for (String name : removedPackages) {
+            		this.packages.remove( name );
+				}
                 //need to store ALL packages
-                for ( Iterator iter = changedPackages.iterator(); iter.hasNext(); ) {
-                    Package element = (Package) iter.next();
+                for ( Package element : changedPackages ) {
                     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 );
+                PackageProvider.applyChanges( this.ruleBase, true, changedPackages, removedPackages, this.listener );
             }
         }
 
 
     }
 
-    private synchronized Package[] checkForChanges(PackageProvider prov) {
+    private synchronized PackageChangeInfo checkForChanges(PackageProvider prov) {
         listener.debug( "SCANNING FOR CHANGE " + prov.toString() );
         if (this.ruleBase == null) ruleBase = RuleBaseFactory.newRuleBase( this.ruleBaseConf );
-        Package[] changes = prov.loadPackageChanges();
-        return changes;
+        PackageChangeInfo info = prov.loadPackageChanges();
+        return info ;
     }
 
     /**
-     * Convert a space seperated list into a List of stuff.
+     * Convert a space separated list into a List of stuff.
      * If a filename or whatnot has a space in it, you can put double quotes around it
      * and it will read it in as one token.
      */

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/URLScanner.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -84,8 +84,8 @@
 
 
 
-    Package[] loadPackageChanges() { //void updateRuleBase(RuleBase rb, boolean removeExistingPackages) {
-        Package[] changes = null;
+    PackageChangeInfo loadPackageChanges() { //void updateRuleBase(RuleBase rb, boolean removeExistingPackages) {
+    	PackageChangeInfo changes = null;
         try {
             changes = getChangeSet();
             return changes;
@@ -102,21 +102,24 @@
         return null;
     }
 
-    private Package[] getChangeSet() throws IOException, ClassNotFoundException {
-        if ( this.urls == null ) return new Package[0];
-        List list = new ArrayList();
+    private PackageChangeInfo getChangeSet() throws IOException, ClassNotFoundException {
+    	
+    	PackageChangeInfo info = new PackageChangeInfo();
+    	
+        if ( this.urls == null ) return info;
+        
         for ( int i = 0; i < urls.length; i++ ) {
             URL u = urls[i];
             if ( hasChanged( u, this.lastUpdated) ) {
                 Package p = readPackage( u );
                 if ( p == null ) return null;
-                list.add( p );
+                info.addPackage( p );
                 if (localCacheDir != null) {
                     writeLocalCacheCopy(p, u, localCacheDir);
                 }
             }
         }
-        return (Package[]) list.toArray( new Package[list.size()] );
+        return info;
     }
 
     private void writeLocalCacheCopy(Package p, URL u, File localCacheDir) {

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/DirectoryScannerTest.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -9,43 +9,89 @@
 
 import junit.framework.TestCase;
 
+public class DirectoryScannerTest extends TestCase {
 
+	public void testScan() throws Exception {
+		File dir = RuleBaseAssemblerTest.getTempDirectory();
 
-public class DirectoryScannerTest extends TestCase {
+		Package p1 = new Package("p1");
+		Package p2 = new Package("p2");
+		File p1f = new File(dir, "p1.pkg");
+		File p2f = new File(dir, "p2.pkg");
 
-    public void testScan() throws Exception {
-        File dir = RuleBaseAssemblerTest.getTempDirectory();       
-        
-        Package p1 = new Package("p1");
-        Package p2 = new Package("p2");
-        File p1f = new File(dir, "p1.pkg");
-        File p2f = new File(dir, "p2.pkg");        
-        
-        RuleBaseAssemblerTest.writePackage( p1, p1f );
-        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();
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
-        
-        assertEquals(2, rb.getPackages().length);
-                
-        Package p3 = new Package("p3");
-        File p3f = new File(dir, "p3.pkg");
-        
-        RuleBaseAssemblerTest.writePackage( p3, p3f );
-        
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+		RuleBaseAssemblerTest.writePackage(p1, p1f);
+		RuleBaseAssemblerTest.writePackage(p2, p2f);
 
-        assertEquals(3, rb.getPackages().length);        
-    }
-    
-    
-    
+		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();
+		PackageProvider.applyChanges(rb, true, scan.loadPackageChanges().getChangedPackages(),
+				new MockListener());
+
+		assertEquals(2, rb.getPackages().length);
+
+		Package p3 = new Package("p3");
+		File p3f = new File(dir, "p3.pkg");
+
+		RuleBaseAssemblerTest.writePackage(p3, p3f);
+
+		PackageProvider.applyChanges(rb, true, scan.loadPackageChanges().getChangedPackages(),
+				new MockListener());
+
+		assertEquals(3, rb.getPackages().length);
+	}
+
+	public void testScanDRLFileReplace() throws Exception {
+		File dir = RuleBaseAssemblerTest.getTempDirectory();
+
+		Package p1 = new Package("p1");
+		Package p2 = new Package("p2");
+		File p1f = new File(dir, "p1.pkg");
+		File p2f = new File(dir, "p2.pkg");
+
+		RuleBaseAssemblerTest.writePackage(p1, p1f);
+		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();
+
+		PackageChangeInfo info1 = scan.loadPackageChanges();
+
+		assertEquals(2, info1.getChangedPackages().size());
+		assertEquals(0, info1.getRemovedPackages().size());
+
+		PackageProvider.applyChanges(rb, true, info1.getChangedPackages(), info1.getRemovedPackages(), new MockListener());
+
+		assertEquals(2, rb.getPackages().length);
+
+		// Delete file p2.pkg and create file p3.pkg.
+		boolean fileDeleted = p2f.delete();
+		assertTrue(fileDeleted);
+
+		Package p3 = new Package("p3");
+		File p3f = new File(dir, "p3.pkg");
+
+		RuleBaseAssemblerTest.writePackage(p3, p3f);
+
+		PackageChangeInfo info2 = scan.loadPackageChanges();
+
+		assertEquals(1, info2.getChangedPackages().size());
+		assertEquals(1, info2.getRemovedPackages().size());
+
+		PackageProvider.applyChanges(rb, true, info2.getChangedPackages(), info2.getRemovedPackages(),  new MockListener());
+
+		assertEquals(2, 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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -52,7 +52,7 @@
         scan.configure( props );
         
         RuleBase rb = RuleBaseFactory.newRuleBase();
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges().getChangedPackages(), new MockListener() );
         
         
         
@@ -60,13 +60,13 @@
         assertTrue("p1".equals(rb.getPackages()[0].getName()) || "p1".equals(rb.getPackages()[1].getName()));
         assertTrue("p2".equals(rb.getPackages()[0].getName()) || "p2".equals(rb.getPackages()[1].getName()));
 
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges().getChangedPackages(), new MockListener() );
         assertEquals(2, rb.getPackages().length);
         assertTrue("p1".equals(rb.getPackages()[0].getName()) || "p1".equals(rb.getPackages()[1].getName()));
         assertTrue("p2".equals(rb.getPackages()[0].getName()) || "p2".equals(rb.getPackages()[1].getName()));
 
         RuleBaseAssemblerTest.writePackage( p2, p2f );
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges().getChangedPackages(), new MockListener() );
 
 
         assertEquals(2, rb.getPackages().length);
@@ -79,7 +79,7 @@
         FileScanner scan = new FileScanner();
         RuleBase rb = RuleBaseFactory.newRuleBase();
         
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), new MockListener() );
+        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges().getChangedPackages(), new MockListener() );
 
         assertEquals(0, rb.getPackages().length);
     }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockProvider.java	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/MockProvider.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -11,7 +11,7 @@
         public void configure(Properties config) {
         }
 
-        Package[] loadPackageChanges() {
+        PackageChangeInfo loadPackageChanges() {
             return null;
         }
 

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -223,8 +223,122 @@
 
 
     }
+    
+    public void testPollingFilesRuleBaseRemoveNewInstanceFalse() 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 " + dir.getPath() + "/p44_.pkg";
+    	
+    	Properties props = new Properties();
+    	props.setProperty( "file", path );
+    	
+    	props.setProperty( "newInstance", "false" );
+    	RuleAgent ag = RuleAgent.newRuleAgent(props);
+    	
+    	assertFalse(ag.isNewInstance());
+    	
+    	RuleBase rb = ag.getRuleBase();
+    	assertEquals(2, rb.getPackages().length);
+    	
+    	
+    	boolean success = p2f.delete();
+    	assertTrue(success);
+    	
+    	ag.refreshRuleBase();
 
+    	assertEquals(1, rb.getPackages().length);
+    	Thread.sleep( 1000 );
+    	//only change one
+    	RuleBaseAssemblerTest.writePackage( p1, p1f );
+    	Thread.sleep( 1000 );
+    	ag.refreshRuleBase();
+    	    	
+    	
+    	//check we will have 2
+    	assertEquals(1, rb.getPackages().length);
+    	
+    	ag.refreshRuleBase();
+    	ag.refreshRuleBase();
+    	
+    	assertEquals(1, rb.getPackages().length);
+    	
+    	
+    	
+    	
+    }
+    
+    public void testPollingFilesRuleBaseRemoveNewInstanceTrue() 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 " + dir.getPath() + "/p44_.pkg";
+    	
+    	Properties props = new Properties();
+    	props.setProperty( "file", path );
+    	
+    	props.setProperty( "newInstance", "true" );
+    	RuleAgent ag = RuleAgent.newRuleAgent(props);
+    	
+    	assertTrue(ag.isNewInstance());
+    	
+    	RuleBase rb = ag.getRuleBase();
+    	assertEquals(2, rb.getPackages().length);
+    	
+    	
+    	boolean success = p2f.delete();
+    	assertTrue(success);
+    	
+    	ag.refreshRuleBase();
 
+    	RuleBase rb_ = ag.getRuleBase();
+    	
+    	assertNotSame(rb, rb_);
+    	
+    	assertEquals(1, rb_.getPackages().length);
+    	Thread.sleep( 1000 );
+    	//only change one
+    	RuleBaseAssemblerTest.writePackage( p1, p1f );
+    	Thread.sleep( 1000 );
+    	ag.refreshRuleBase();
+
+    	RuleBase rb__ = ag.getRuleBase();
+    	
+    	assertNotSame(rb, rb__);
+    	
+    	//check we will have 2
+    	assertEquals(1, rb__.getPackages().length);
+    	
+    	ag.refreshRuleBase();
+    	ag.refreshRuleBase();
+
+    	RuleBase rb___ = ag.getRuleBase();
+    	assertEquals(1, rb___.getPackages().length);
+    	
+    	
+    	
+    	
+    }
+
+
     public void testDirectory() throws Exception {
         File dir = RuleBaseAssemblerTest.getTempDirectory();
 

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	2008-07-08 04:44:31 UTC (rev 20954)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/URLScannerTest.java	2008-07-08 07:53:24 UTC (rev 20955)
@@ -136,7 +136,7 @@
 
         RuleBase rb = RuleBaseFactory.newRuleBase();
         AgentEventListener list = getNilListener();
-        PackageProvider.applyChanges( rb, false, scan.loadPackageChanges(), list );
+        PackageProvider.applyChanges( rb, false, scan.loadPackageChanges().getChangedPackages(), list );
 
 
         assertEquals( 2, rb.getPackages().length );
@@ -202,7 +202,7 @@
         assertNotNull( scan.localCacheDir );
 
         RuleBase rb = RuleBaseFactory.newRuleBase();
-        PackageProvider.applyChanges( rb, false, scan.loadPackageChanges(), getNilListener() );
+        PackageProvider.applyChanges( rb, false, scan.loadPackageChanges().getChangedPackages(), getNilListener() );
 
 
         assertEquals( 2, rb.getPackages().length );
@@ -236,7 +236,7 @@
 
         rb = RuleBaseFactory.newRuleBase();
         assertEquals(0, rb.getPackages().length);
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), getNilListener() );
+        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges().getChangedPackages(), getNilListener() );
 
         assertEquals(2, rb.getPackages().length);
 
@@ -261,8 +261,8 @@
 
         };
 
-        Package[] changes = scan.loadPackageChanges();
-        assertEquals(0, changes.length);
+        PackageChangeInfo changes = scan.loadPackageChanges();
+        assertEquals(0, changes.getChangedPackages().size());
         assertEquals(true, fetchCalled[0]);
         assertEquals(2, ((MockListener)scan.listener).exceptions.size());
 
@@ -305,7 +305,7 @@
         assertNotNull( scan.localCacheDir );
 
         RuleBase rb = RuleBaseFactory.newRuleBase();
-        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges(), getNilListener() );
+        PackageProvider.applyChanges( rb, true, scan.loadPackageChanges().getChangedPackages(), getNilListener() );
         assertEquals(2, rb.getPackages().length);
 
 




More information about the jboss-svn-commits mailing list