[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