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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Jun 16 23:47:09 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-06-16 23:47:09 -0400 (Sat, 16 Jun 2007)
New Revision: 12636

Added:
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/FileScanner.java
Log:
scanner tests

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-16 22:58:00 UTC (rev 12635)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/FileScanner.java	2007-06-17 03:47:09 UTC (rev 12636)
@@ -1,9 +1,19 @@
 package org.drools.agent;
 
 import java.io.File;
-import java.util.Timer;
-import java.util.TimerTask;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
+import org.drools.RuleBase;
+import org.drools.RuntimeDroolsException;
+import org.drools.rule.Package;
+
 /**
  * This will monitor a file to a binary package.
  * @author Michael Neale
@@ -11,19 +21,102 @@
  */
 public class FileScanner {
 
-    public FileScanner(String path, int poll) {
-        File f = new File(path);
-        Timer timer = new Timer();
-        timer.schedule( task(f), poll * 60 );
+    private File[] files;
+    private Map    lastUpdated = new HashMap();
+
+    public FileScanner() {
+
     }
 
-    private TimerTask task(final File file) {
-        return new TimerTask() {
-            public void run() {
-                    file.lastModified();
+    /**
+     * This sets the list of files to be monitored.
+     * This takes a list of paths and files (not directories).
+     */
+    public void setFiles(String[] paths) {
+        files = new File[paths.length];
+        for ( int i = 0; i < paths.length; i++ ) {
+            File file = new File( paths[i] );
+            if ( !file.exists() ) {
+                throw new IllegalArgumentException( "The file " + file.getName() + " does not exist." );
             }
-        };
+            files[i] = file;
+        }
     }
-    
-    
+
+    /**
+     * Perform the scan, adding in any packages changed to the rulebase.
+     * It will call remove package 
+     * @throws ClassNotFoundException 
+     * @throws IOException 
+     * @throws FileNotFoundException 
+     */
+    void updateRuleBase(RuleBase rb) throws FileNotFoundException, IOException, ClassNotFoundException {
+        Package[] changes = getChangeSet();
+        for ( int i = 0; i < changes.length; i++ ) {
+            Package p = changes[i];
+            removePackage(p.getName(), rb);
+            try {
+                rb.addPackage( p );
+            } catch ( Exception e ) {
+                throw new RuntimeDroolsException( e );
+            }
+        }
+    }
+
+    private void removePackage(String name, RuleBase rb) {
+        Package[] ps = rb.getPackages();
+        if (ps == null) return;
+        for ( int i = 0; i < ps.length; i++ ) {
+            Package p = ps[i];
+            if (p.getName().equals( name )) {
+                rb.removePackage( name );
+                return;
+            }
+        }
+    }
+
+    /**
+     * Calculate a change set, based on last updated times.
+     * (keep a map of files).
+     * @throws ClassNotFoundException 
+     * @throws IOException 
+     * @throws FileNotFoundException 
+     */
+    private Package[] getChangeSet() throws FileNotFoundException, IOException, ClassNotFoundException {
+        List list = new ArrayList();
+        for ( int i = 0; i < files.length; i++ ) {
+            File f = files[i];
+            if ( hasChanged( f.getPath(), this.lastUpdated, f.lastModified() ) ) {
+                list.add( readPackage(f) );
+            }
+        }
+        return (Package[]) list.toArray( new Package[list.size()] );
+    }
+
+    public static Package readPackage(File pkgFile) throws IOException,
+                                                  FileNotFoundException,
+                                                  ClassNotFoundException {
+        ObjectInputStream in = new ObjectInputStream( new FileInputStream( pkgFile ) );
+        Package p1_ = (Package) in.readObject();
+        in.close();
+        return p1_;
+    }
+
+    boolean hasChanged(String path, Map updates, long fileLastModified) {
+
+        if ( !updates.containsKey( path ) ) {
+            updates.put( path, new Long( fileLastModified ) );
+            return true;
+        } else {
+            Long last = (Long) updates.get( path );
+            if ( last.intValue() < fileLastModified ) {
+                updates.put( path, new Long( fileLastModified ) );
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+    }
+
 }

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java	2007-06-17 03:47:09 UTC (rev 12636)
@@ -0,0 +1,79 @@
+package org.drools.agent;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.rule.Package;
+
+import junit.framework.TestCase;
+
+public class FileScannerTest extends TestCase {
+
+    public void testHasChanged() {
+        Map lastMod = new HashMap();
+        
+        FileScanner scan = new FileScanner();
+        assertTrue(scan.hasChanged( "/goo/ber", lastMod, 42 ));
+
+        assertFalse(scan.hasChanged( "/goo/ber", lastMod, 42 ));
+        assertTrue(scan.hasChanged( "/goo/baaaa", lastMod, 42 ));
+
+        assertFalse(scan.hasChanged( "/goo/baaaa", lastMod, 42 ));
+        assertFalse(scan.hasChanged( "/goo/ber", lastMod, 42 ));
+
+        
+        assertTrue(scan.hasChanged( "/goo/ber", lastMod, 400 ));
+        assertFalse(scan.hasChanged( "/goo/baaaa", lastMod, 42 ));
+        assertTrue(scan.hasChanged( "/goo/baaaa", lastMod, 69 ));
+    }
+    
+    public void testScanAndLoad() throws Exception {
+        
+        Package p1 = new Package("p1");
+        Package p2 = new Package("p2");
+        
+        File dir = RuleBaseAssemblerTest.getTempDirectory();
+        File p1f = new File(dir, "p1.pkg");
+        File p2f = new File(dir, "p2.pkg");
+        
+        RuleBaseAssemblerTest.writePackage( p1, p1f );
+        RuleBaseAssemblerTest.writePackage( p2, p2f);
+        
+        
+        
+        
+        
+        FileScanner scan = new FileScanner();
+        scan.setFiles( new String[] {p1f.getPath(), p2f.getPath()} );
+        
+        
+        
+        RuleBase rb = RuleBaseFactory.newRuleBase();
+        scan.updateRuleBase( rb );
+        
+        assertEquals(2, rb.getPackages().length);
+        assertEquals("p1", rb.getPackages()[0].getName());
+        assertEquals("p2", rb.getPackages()[1].getName());
+        
+        
+        scan.updateRuleBase( rb );
+        assertEquals(2, rb.getPackages().length);
+        assertEquals("p1", rb.getPackages()[0].getName());
+        assertEquals("p2", rb.getPackages()[1].getName());
+
+        RuleBaseAssemblerTest.writePackage( p2, p2f );
+        scan.updateRuleBase( rb );
+        assertEquals(2, rb.getPackages().length);
+        assertEquals("p1", rb.getPackages()[0].getName());
+        assertEquals("p2", rb.getPackages()[1].getName());
+        
+        
+        
+        
+    }
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/FileScannerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java	2007-06-17 03:47:09 UTC (rev 12636)
@@ -0,0 +1,86 @@
+package org.drools.agent;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.rule.Package;
+
+import junit.framework.TestCase;
+
+public class RuleBaseAssemblerTest extends TestCase {
+
+    
+    public void testAssemblePackages() throws Exception {
+        RuleBase rb = RuleBaseFactory.newRuleBase();
+        rb.addPackage( new Package("goober") );
+        
+        Package p1 = new Package("p1");
+        
+        File f = getTempDirectory();
+        
+        File p1file = new File(f, "p1.pkg");
+        
+        writePackage( p1, p1file );
+        
+        Package p1_ = readPackage( p1file );
+        
+        rb = RuleBaseFactory.newRuleBase();
+        rb.addPackage( p1_ );
+        
+        
+    }
+
+    public static Package readPackage(File p1file) throws IOException,
+                                            FileNotFoundException,
+                                            ClassNotFoundException {
+        ObjectInputStream in = new ObjectInputStream(new FileInputStream(p1file));
+        Package p1_ = (Package) in.readObject();
+        in.close();
+        return p1_;
+    }
+
+    public static void writePackage(Package pkg, File p1file) throws IOException,
+                                                      FileNotFoundException {
+        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(p1file));
+        out.writeObject( pkg );
+        out.flush(); out.close();
+    }
+
+    public static File getTempDirectory() {
+        File f = new File("__temp_test_drools_packages");
+        if (f.exists()) {
+            if (f.isFile()) {
+                throw new IllegalStateException("The temp directory exists as a file. Nuke it now !");
+            }
+            deleteDir( f );
+            f.mkdir();
+        } else {
+            f.mkdir();
+        }
+        return f;
+    }
+    
+    public static boolean deleteDir(File dir) {
+        
+        if (dir.isDirectory()) {
+            String[] children = dir.list();
+            for (int i=0; i<children.length; i++) {
+                boolean success = deleteDir(new File(dir, children[i]));
+                if (!success) {
+                    return false;
+                }
+            }
+        }
+    
+        // The directory is now empty so delete it
+        return dir.delete();
+    }      
+    
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list