You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tc...@apache.org on 2005/09/24 13:54:09 UTC

svn commit: r291284 - in /jakarta/commons/sandbox/jci/trunk: ./ src/java/org/apache/commons/jci/ src/java/org/apache/commons/jci/compilers/groovy/ src/java/org/apache/commons/jci/listeners/ src/java/org/apache/commons/jci/monitor/ src/java/org/apache/c...

Author: tcurdt
Date: Sat Sep 24 04:53:44 2005
New Revision: 291284

URL: http://svn.apache.org/viewcvs?rev=291284&view=rev
Log:
further refactoring and consolidation

Added:
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/FileChangeListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotificationListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotifyingListener.java
      - copied, changed from r290987, jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/AbstractListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ResourceStoringListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/ResourceStoreClassLoader.java
Removed:
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/AbstractListener.java
Modified:
    jakarta/commons/sandbox/jci/trunk/TODO
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoaderListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/groovy/GroovyJavaCompiler.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/CompilingListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ReloadingListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationListener.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/FileResourceStore.java
    jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/MemoryResourceStore.java
    jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/AbstractTestCase.java
    jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/CompilingClassLoaderTestCase.java
    jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/ReloadingClassLoaderTestCase.java
    jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/compilers/GroovySources.java
    jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/monitor/FilesystemAlterationMonitorTestCase.java

Modified: jakarta/commons/sandbox/jci/trunk/TODO
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/TODO?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/TODO (original)
+++ jakarta/commons/sandbox/jci/trunk/TODO Sat Sep 24 04:53:44 2005
@@ -8,3 +8,4 @@
 o turn the JavaCompilerFactory into an interface and maybe provide a simple default impl
 o documentation
 o dependency analysis for proper re-try after errors
+o store resources as org/apache/my.class instead of org.apache.my

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoader.java Sat Sep 24 04:53:44 2005
@@ -18,7 +18,8 @@
 import java.io.File;
 import java.io.InputStream;
 import java.net.URL;
-import org.apache.commons.jci.listeners.AbstractListener;
+import org.apache.commons.jci.listeners.NotificationListener;
+import org.apache.commons.jci.listeners.ReloadingListener;
 import org.apache.commons.jci.stores.ResourceStore;
 import org.apache.commons.jci.stores.ResourceStoreClassLoader;
 import org.apache.commons.logging.Log;
@@ -28,7 +29,7 @@
  * @author tcurdt
  *
  */
-public class ReloadingClassLoader extends ClassLoader {
+public class ReloadingClassLoader extends ClassLoader implements NotificationListener {
     
     private final static Log log = LogFactory.getLog(ReloadingClassLoader.class);
     
@@ -44,14 +45,14 @@
         delegate = new ResourceStoreClassLoader(parent, stores);
     }
 
-    public void addListener(final AbstractListener pListener) {
-        pListener.setReloadingClassLoader(this);
+    public void addListener(final ReloadingListener pListener) {
+        pListener.setNotificationListener(this);
         addResourceStore(pListener.getStore());
     }
     
-    public void removeListener(final AbstractListener pListener) {
+    public void removeListener(final ReloadingListener pListener) {
         removeResourceStore(pListener.getStore());
-        pListener.setReloadingClassLoader(null);
+        pListener.setNotificationListener(null);
     }
     
     private void addResourceStore(final ResourceStore pStore) {
@@ -100,22 +101,17 @@
         }        
     }
     */
-    public void reload(final boolean pReload) {
-        if (pReload) {
-            log.debug("reloading");
-            delegate = new ResourceStoreClassLoader(parent, stores);
-            //notifyReloadingListeners(true);
-        } else {
-            log.debug("not reloading");
-            //notifyReloadingListeners(false);            
-        }
+    public void handleNotification() {
+        log.debug("reloading");
+        delegate = new ResourceStoreClassLoader(parent, stores);
+        //notifyReloadingListeners();
     }
     /*
-    private void notifyReloadingListeners(final boolean pReload) { 
+    private void notifyReloadingListeners() { 
         synchronized (reloadingListeners) {
             for (final Iterator it = reloadingListeners.iterator(); it.hasNext();) {
                 final ReloadingClassLoaderListener listener = (ReloadingClassLoaderListener) it.next();
-                listener.hasReloaded(pReload);
+                listener.hasReloaded();
             }            
         }
     }

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoaderListener.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoaderListener.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoaderListener.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/ReloadingClassLoaderListener.java Sat Sep 24 04:53:44 2005
@@ -20,5 +20,5 @@
  * @author tcurdt
  */
 public interface ReloadingClassLoaderListener {
-    void hasReloaded(final boolean pReload);
+    void hasReloaded();
 }

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/groovy/GroovyJavaCompiler.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/groovy/GroovyJavaCompiler.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/groovy/GroovyJavaCompiler.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/groovy/GroovyJavaCompiler.java Sat Sep 24 04:53:44 2005
@@ -62,6 +62,7 @@
                 store.write(name, bytes);
             }
         } catch (final CompilationFailedException e) {
+            e.printStackTrace();
             final ErrorCollector col = e.getUnit().getErrorCollector();
 
             final Collection warnings = col.getWarnings();

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/CompilingListener.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/CompilingListener.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/CompilingListener.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/CompilingListener.java Sat Sep 24 04:53:44 2005
@@ -33,14 +33,10 @@
 import org.apache.commons.logging.LogFactory;
 
 
-public class CompilingListener extends AbstractListener {
+public class CompilingListener extends ReloadingListener {
 
     private final static Log log = LogFactory.getLog(CompilingListener.class);
     
-    private final Collection created = new ArrayList();
-    private final Collection changed = new ArrayList();
-    private final Collection deleted = new ArrayList();
-    
     private final JavaCompiler compiler;
     private final ResourceReader reader;
     private final TransactionalResourceStore transactionalStore;
@@ -75,18 +71,18 @@
     }
     
     public void onStart() {
-        created.clear();
-        changed.clear();
-        deleted.clear();
+        super.onStart();
         transactionalStore.onStart();
     }
-    public void onStop() {
-        log.debug(
-                created.size() + " created, " + 
-                changed.size() + " changed, " + 
-                deleted.size() + " deleted");
 
+    public void onStop() {
         boolean reload = false;
+
+        log.debug("created:" + created.size()
+                + " changed:" + changed.size()
+                + " deleted:" + deleted.size()
+                + " resources");
+
         
         if (deleted.size() > 0) {
             for (Iterator it = deleted.iterator(); it.hasNext();) {
@@ -97,15 +93,29 @@
         }
                         
         final Collection compileables = new ArrayList();
-        // FIXME: only compile ".java" resources to support resource reloading
-        compileables.addAll(created);
-        compileables.addAll(changed);
-
-        final String[] clazzes = new String[compileables.size()];
         
+        for (final Iterator it = created.iterator(); it.hasNext();) {
+            final File createdFile = (File) it.next();
+            if (createdFile.getName().endsWith(".java")) {
+                compileables.add(createdFile);
+            }
+        }
+        
+        for (final Iterator it = changed.iterator(); it.hasNext();) {
+            final File changedFile = (File) it.next();
+            if (changedFile.getName().endsWith(".java")) {
+                compileables.add(changedFile);
+            }
+        }
+
         if (compileables.size() > 0) {
-            
+
+            log.debug(compileables.size()
+                    + " classes to compile"
+                    );
+
             int i = 0;
+            final String[] clazzes = new String[compileables.size()];            
             for (Iterator it = compileables.iterator(); it.hasNext();) {
                 final File file = (File) it.next();
                 clazzes[i] = ReloadingClassLoader.clazzName(repository, file);
@@ -133,6 +143,7 @@
         
             if (errors.length > 0) {
                 // FIXME: they need to be marked for re-compilation
+                // and then added as compileables again
                 for (int j = 0; j < clazzes.length; j++) {
                     transactionalStore.remove(clazzes[j]);
                 }
@@ -143,32 +154,6 @@
 
         transactionalStore.onStop();
 
-        needsReload(reload);
-    }
-
-    public void onCreateFile( final File file ) {
-        // FIXME: to support resource reloading do the suffix filtering in onStop
-        if (file.getName().endsWith(".java")) {
-            created.add(file);
-        }
-    }
-    public void onChangeFile( final File file ) {                
-        // FIXME: to support resource reloading do the suffix filtering in onStop
-        if (file.getName().endsWith(".java")) {
-            changed.add(file);
-        }
-    }
-    public void onDeleteFile( final File file ) {
-        // FIXME: to support resource reloading do the suffix filtering in onStop
-        if (file.getName().endsWith(".java")) {
-            deleted.add(file);
-        }
-    }
-
-    public void onCreateDirectory( final File file ) {                
-    }
-    public void onChangeDirectory( final File file ) {                
-    }
-    public void onDeleteDirectory( final File file ) {
+        checked(reload);
     }
 }

Added: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/FileChangeListener.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/FileChangeListener.java?rev=291284&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/FileChangeListener.java (added)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/FileChangeListener.java Sat Sep 24 04:53:44 2005
@@ -0,0 +1,47 @@
+package org.apache.commons.jci.listeners;
+
+import java.io.File;
+
+
+public class FileChangeListener extends NotifyingListener {
+
+    private boolean changed;
+        
+    public FileChangeListener(final File pRepository) {
+        super(pRepository);
+    }
+    
+    public void onStart() {
+        changed = false;
+    }
+
+    public void onStop() {
+        checked(changed);
+    }
+
+    
+    public void onChangeFile( File pFile ) {
+        changed = true;
+    }
+
+
+    public void onCreateFile( File pFile ) {
+        changed = true;
+    }
+
+
+    public void onDeleteFile( File pFile ) {
+        changed = true;
+    }
+
+
+    public void onChangeDirectory( File pDir ) {
+    }
+
+    public void onCreateDirectory( File pDir ) {
+    }
+
+    public void onDeleteDirectory( File pDir ) {
+    }
+    
+}

Added: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotificationListener.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotificationListener.java?rev=291284&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotificationListener.java (added)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotificationListener.java Sat Sep 24 04:53:44 2005
@@ -0,0 +1,6 @@
+package org.apache.commons.jci.listeners;
+
+
+public interface NotificationListener {
+    void handleNotification();
+}

Copied: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotifyingListener.java (from r290987, jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/AbstractListener.java)
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotifyingListener.java?p2=jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotifyingListener.java&p1=jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/AbstractListener.java&r1=290987&r2=291284&rev=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/AbstractListener.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/NotifyingListener.java Sat Sep 24 04:53:44 2005
@@ -1,31 +1,112 @@
 package org.apache.commons.jci.listeners;
 
 import java.io.File;
-import org.apache.commons.jci.ReloadingClassLoader;
 import org.apache.commons.jci.monitor.FilesystemAlterationListener;
-import org.apache.commons.jci.stores.ResourceStore;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 
-public abstract class AbstractListener implements FilesystemAlterationListener {
+public abstract class NotifyingListener implements FilesystemAlterationListener {
+
+    private final static Log log = LogFactory.getLog(NotifyingListener.class);
+
+    public final static class Signal {
+        public boolean triggered;
+    }
 
     protected final File repository;
-    protected ReloadingClassLoader reloader;
+    protected NotificationListener notificationListener;
+    private final Signal notificationSignal = new Signal();
+    private final Signal checkSignal = new Signal();
 
-    public AbstractListener(final File pRepository) {
+    public NotifyingListener(final File pRepository) {
         repository = pRepository;        
     }
+    
+    public File getRepository() {
+        return repository;
+    }
 
-    public void setReloadingClassLoader(final ReloadingClassLoader pReloader) {
-        reloader = pReloader;
+    public void setNotificationListener(final NotificationListener pNotificationListener) {
+        notificationListener = pNotificationListener;
+    }
+
+    protected void checked( final boolean pNotify ) {
+        if (pNotify) {
+            if (notificationListener != null) {
+                notificationListener.handleNotification();
+            }
+            synchronized(notificationSignal) {
+                notificationSignal.triggered = true;
+                notificationSignal.notifyAll();
+            }
+        }
+        synchronized(checkSignal) {
+            checkSignal.triggered = true;
+            checkSignal.notifyAll();
+        }
     }
     
-    public abstract ResourceStore getStore();
     
-    public File getRepository() {
-        return repository;
+    public void waitForNotification() throws Exception {
+        synchronized(notificationSignal) {
+            notificationSignal.triggered = false;
+        }
+        log.debug("waiting for reload signal");
+        if (!waitForSignal(notificationSignal, 10)) {
+            throw new Exception("timeout");
+        }
+    }
+    
+    /*
+     * we don't reset the signal
+     * so if there was a check it is
+     * already true and exit immediatly
+     * otherwise it will behave just
+     * like waitForCheck()
+     */
+    public void waitForFirstCheck() throws Exception {
+        log.debug("waiting for first signal");
+        if (!waitForSignal(checkSignal, 10)) {
+            throw new Exception("timeout");
+        }        
     }
 
-    protected void needsReload( final boolean pReload ) {
-        reloader.reload(pReload);
+    public void waitForCheck() throws Exception {
+        synchronized(checkSignal) {
+            checkSignal.triggered = false;
+        }
+        log.debug("waiting for check signal");
+        if (!waitForSignal(checkSignal, 10)) {
+            throw new Exception("timeout");
+        }
+    }
+    
+    private boolean waitForSignal(final Signal pSignal, final int pSecondsTimeout) {
+        int i = 0;
+        while(true) {
+            synchronized(pSignal) {
+                //log.debug("loop");
+                if (!pSignal.triggered) {
+                    try {
+                        //log.debug("waiting");
+                        pSignal.wait(1000);
+                    } catch (InterruptedException e) {
+                        ;
+                    }
+                    if (++i > pSecondsTimeout) {
+                        log.error("timeout after " + pSecondsTimeout + "s");
+                        return false;
+                    }
+                } else {
+                    pSignal.triggered = false;
+                    break;
+                }
+            }
+        }
+        
+        log.debug("caught signal");
+        return true;
     }
+  
 }

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ReloadingListener.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ReloadingListener.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ReloadingListener.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ReloadingListener.java Sat Sep 24 04:53:44 2005
@@ -28,15 +28,17 @@
 import org.apache.commons.logging.LogFactory;
 
 
-public class ReloadingListener extends AbstractListener{
+public class ReloadingListener extends ResourceStoringListener {
 
     private final static Log log = LogFactory.getLog(ReloadingListener.class);
 
-    private final Collection created = new ArrayList();
-    private final Collection changed = new ArrayList();
-    private final Collection deleted = new ArrayList();
+    protected final Collection created = new ArrayList();
+    protected final Collection changed = new ArrayList();
+    protected final Collection deleted = new ArrayList();
 
     private final ResourceStore store;
+
+    protected ReloadingClassLoader reloader;
     
     public ReloadingListener(final File pRepository) {
         this(pRepository, new MemoryResourceStore());
@@ -46,27 +48,32 @@
         super(pRepository);
         store = pStore;
     }
-
+    
     public ResourceStore getStore() {
         return store;
     }
-    
+        
     public void onStart() {
         created.clear();
         changed.clear();
         deleted.clear();
     }
+
     public void onStop() {
         boolean reload = false;
         
         log.debug("created:" + created.size()
-               + " changed:" + changed.size()
-               + " deleted:" + deleted.size());
+                + " changed:" + changed.size()
+                + " deleted:" + deleted.size()
+                + " resources");
         
         if (deleted.size() > 0) {
             for (Iterator it = deleted.iterator(); it.hasNext();) {
                 final File file = (File) it.next();
-                store.remove(ReloadingClassLoader.clazzName(repository, file));
+                final String resourceName = ReloadingClassLoader.clazzName(repository, file);
+                //if (resourceName.endsWith(".class")) {
+                    store.remove(resourceName);
+                //}
             }
             reload = true;
         }
@@ -76,7 +83,10 @@
                 final File file = (File) it.next();
                 try {
                     final byte[] bytes = IOUtils.toByteArray(new FileReader(file));
-                    store.write(ReloadingClassLoader.clazzName(repository, file), bytes);
+                    final String resourceName = ReloadingClassLoader.clazzName(repository, file); 
+                    //if (resourceName.endsWith(".class")) {
+                        store.write(resourceName, bytes);
+                    //}
                 } catch(final Exception e) {
                     log.error("could not load " + file, e);
                 }
@@ -90,7 +100,10 @@
                 final File file = (File) it.next();
                 try {
                     final byte[] bytes = IOUtils.toByteArray(new FileReader(file));
-                    store.write(ReloadingClassLoader.clazzName(repository, file), bytes);
+                    final String resourceName = ReloadingClassLoader.clazzName(repository, file); 
+                    //if (resourceName.endsWith(".class")) {
+                        store.write(resourceName, bytes);
+                    //}
                 } catch(final Exception e) {
                     log.error("could not load " + file, e);
                 }
@@ -98,26 +111,17 @@
             reload = true;
         }
 
-        needsReload(reload);
+        checked(reload);
     }
 
     public void onCreateFile( final File file ) {
-        // FIXME: for resource reloading remove the filtering
-        if (file.getName().endsWith(".class")) {
-            created.add(file);
-        }
+        created.add(file);
     }
     public void onChangeFile( final File file ) {                
-        // FIXME: for resource reloading remove the filtering
-        if (file.getName().endsWith(".class")) {
-            changed.add(file);
-        }
+        changed.add(file);
     }
     public void onDeleteFile( final File file ) {
-        // FIXME: for resource reloading remove the filtering
-        if (file.getName().endsWith(".class")) {
-            deleted.add(file);
-        }
+        deleted.add(file);
     }
 
     public void onCreateDirectory( final File file ) {                
@@ -126,5 +130,4 @@
     }
     public void onDeleteDirectory( final File file ) {
     }
-
 }

Added: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ResourceStoringListener.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ResourceStoringListener.java?rev=291284&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ResourceStoringListener.java (added)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/listeners/ResourceStoringListener.java Sat Sep 24 04:53:44 2005
@@ -0,0 +1,14 @@
+package org.apache.commons.jci.listeners;
+
+import java.io.File;
+import org.apache.commons.jci.stores.ResourceStore;
+
+
+public abstract class ResourceStoringListener extends NotifyingListener {
+    
+    public ResourceStoringListener(final File pRepository) {
+        super(pRepository);        
+    }
+    
+    public abstract ResourceStore getStore();
+}

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationListener.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationListener.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationListener.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationListener.java Sat Sep 24 04:53:44 2005
@@ -22,7 +22,7 @@
  *
  */
 public interface FilesystemAlterationListener {
-    File getRepository();
+    File getRepository(); // FIXME: ugly!!!!
     void onStart();
     void onCreateFile( final File file );
     void onChangeFile( final File file );

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java Sat Sep 24 04:53:44 2005
@@ -129,8 +129,27 @@
         }
     }
 
-    private Map listeners = new MultiHashMap();
-    private Map directories = new MultiHashMap();
+    public static class UniqueMultiHashMap extends MultiHashMap {
+
+        public UniqueMultiHashMap() {
+            super();
+        }
+
+        public UniqueMultiHashMap(Map copy) {
+            super(copy);
+        }
+
+        protected Collection createCollection( Collection copy ) {
+            if (copy != null) {
+                return new HashSet(copy);
+            }
+            return new HashSet();
+        }
+        
+    }
+    
+    private Map listeners = new UniqueMultiHashMap();
+    private Map directories = new UniqueMultiHashMap();
     private Map entries = new HashMap();
     private final Object mutexListeners = new Object();
     private final Object mutexRunning = new Object();
@@ -169,26 +188,37 @@
         final File directory = pListener.getRepository();
         synchronized (mutexListeners) {
             // listerner -> dir1, dir2, dir3
-            final MultiHashMap newListeners = new MultiHashMap(listeners);
+            final UniqueMultiHashMap newListeners = new UniqueMultiHashMap(listeners);
             newListeners.put(pListener, directory);
             listeners = newListeners;
             // directory -> listener1, listener2, listener3
-            final MultiHashMap newDirectories = new MultiHashMap(directories);
+            final UniqueMultiHashMap newDirectories = new UniqueMultiHashMap(directories);
             newDirectories.put(directory, pListener);
             directories = newDirectories;
         }
     }
 
+    public Collection getListeners() {
+        synchronized (mutexListeners) {
+            return listeners.keySet();
+        }
+    }
+
+    public Collection getListenersFor( final File pRepository ) {
+        synchronized (mutexListeners) {
+            return (Collection) directories.get(pRepository);
+        }
+    }
 
     public void removeListener( final FilesystemAlterationListener listener ) {
         synchronized (mutexListeners) {
             // listerner -> dir1, dir2, dir3
-            final MultiHashMap newListeners = new MultiHashMap(listeners);
+            final UniqueMultiHashMap newListeners = new UniqueMultiHashMap(listeners);
             Collection d = (Collection) newListeners.remove(listener);
             listeners = newListeners;
             if (d != null) {
                 // directory -> listener1, listener2, listener3
-                final MultiHashMap newDirectories = new MultiHashMap(directories);
+                final UniqueMultiHashMap newDirectories = new UniqueMultiHashMap(directories);
                 for (Iterator it = d.iterator(); it.hasNext();) {
                     newDirectories.remove(it.next());
                     entries.remove(d);
@@ -393,4 +423,12 @@
         }
         log.info("fam exiting");
     }
+
+
+
+    public String toString() {
+        return listeners.toString() + directories.toString();
+    }
+
+    
 }

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/FileResourceStore.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/FileResourceStore.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/FileResourceStore.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/FileResourceStore.java Sat Sep 24 04:53:44 2005
@@ -87,5 +87,10 @@
         final String fileName = pResourceName.replace('.', File.separatorChar) + ".class";
         return new File(root, fileName);
     }
+    
+    public String toString() {
+        return this.getClass().getName() + root.toString();
+    }
 
+    
 }

Modified: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/MemoryResourceStore.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/MemoryResourceStore.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/MemoryResourceStore.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/MemoryResourceStore.java Sat Sep 24 04:53:44 2005
@@ -47,6 +47,6 @@
     }
 
     public String toString() {
-        return store.keySet().toString();
+        return this.getClass().getName() + store.toString();
     }
 }

Added: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/ResourceStoreClassLoader.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/ResourceStoreClassLoader.java?rev=291284&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/ResourceStoreClassLoader.java (added)
+++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/stores/ResourceStoreClassLoader.java Sat Sep 24 04:53:44 2005
@@ -0,0 +1,93 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.jci.stores;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * @author tcurdt
+ *
+ */
+public final class ResourceStoreClassLoader extends ClassLoader {
+
+    private final static Log log = LogFactory.getLog(ResourceStoreClassLoader.class);
+
+    private final ResourceStore[] stores;
+    private final ClassLoader parent;
+
+    public ResourceStoreClassLoader( final ClassLoader pParent, final ResourceStore[] pStores ) {
+        super(pParent);
+        parent = pParent;
+        stores = pStores;
+    }
+
+    private Class fastFindClass(final String name) {
+        
+        if (stores != null) {
+            for (int i = 0; i < stores.length; i++) {
+                final ResourceStore store = stores[i];
+                final byte[] clazzBytes = store.read(name);
+                if (clazzBytes != null) {
+                    log.debug("found class " + name  + " (" + clazzBytes.length + " bytes)");
+                    return defineClass(name, clazzBytes, 0, clazzBytes.length);
+                }            
+            }
+        }
+        
+        log.debug("did not find class " + name);
+        
+        return null;            
+    }
+    
+    protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        log.debug("looking for " + name);
+        Class clazz = findLoadedClass(name);
+
+        if (clazz == null) {
+            clazz = fastFindClass(name);
+            
+            if (clazz == null) {
+
+                final ClassLoader parent = getParent();
+                if (parent != null) {
+                    clazz = parent.loadClass(name);
+                    log.debug("loaded from parent: " + name);
+                } else {
+                    throw new ClassNotFoundException(name);
+                }
+                
+            } else {
+                log.debug("loaded from store: " + name);
+            }
+        }
+
+        if (resolve) {
+            resolveClass(clazz);
+        }
+
+        return clazz;
+    }
+
+    protected Class findClass( final String name ) throws ClassNotFoundException {
+        final Class clazz = fastFindClass(name);
+        if (clazz == null) {
+            throw new ClassNotFoundException(name);
+        }
+        return clazz;
+    }
+}

Modified: jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/AbstractTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/AbstractTestCase.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/AbstractTestCase.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/AbstractTestCase.java Sat Sep 24 04:53:44 2005
@@ -32,10 +32,6 @@
 
     protected File directory;
 
-    public final class Signal {
-        public boolean triggered;
-    }
-
     /*
     public void runBare() throws Throwable {
         try {
@@ -47,33 +43,6 @@
     }
     */
     
-    protected void waitForSignal(final Signal pSignal) {
-        log.debug("waiting for signal");
-        int i = 0;
-        while(true) {
-            synchronized(pSignal) {
-                if (!pSignal.triggered) {
-                    try {
-                        pSignal.wait(1000);
-                    } catch (InterruptedException e) {
-                        ;
-                    }
-                    if (++i > 7) {
-                        log.error("timeout");
-                        fail("timeout");
-                    }
-                } else {
-                    pSignal.triggered = false;
-                    break;
-                }
-            }
-        }
-        
-        log.debug("caught signal");
-    }
-    
-
-    
     protected void setUp() throws Exception {
         directory = createTempDirectory();
         assertTrue(directory.exists());
@@ -118,6 +87,7 @@
                 throw new IOException("could not create" + parent);
             }
         }
+        log.debug("writing " + file);
         final FileWriter writer = new FileWriter(file);
         writer.write(pText);
         writer.close();

Modified: jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/CompilingClassLoaderTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/CompilingClassLoaderTestCase.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/CompilingClassLoaderTestCase.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/CompilingClassLoaderTestCase.java Sat Sep 24 04:53:44 2005
@@ -14,8 +14,6 @@
 
     private final static Log log = LogFactory.getLog(CompilingClassLoaderTestCase.class);
     
-    private final Signal reloadSignal = new Signal();
-
     private ReloadingClassLoader classloader;
     private CompilingListener listener;
     private FilesystemAlterationMonitor fam;
@@ -24,17 +22,7 @@
         super.setUp();
         
         classloader = new ReloadingClassLoader(this.getClass().getClassLoader());
-        listener = new CompilingListener(directory) {
-            protected void needsReload(final boolean pReload) {
-                super.needsReload(pReload);
-                if (pReload) {
-                    synchronized(reloadSignal) {
-                        reloadSignal.triggered = true;
-                        reloadSignal.notify();
-                    }
-                }
-            }  
-        };        
+        listener = new CompilingListener(directory);   
         classloader.addListener(listener);
         
         fam = new FilesystemAlterationMonitor();
@@ -46,14 +34,14 @@
         delay();        
         writeFile("jci/Simple.java", JavaSources.simple);        
         writeFile("jci/Extended.java", JavaSources.extended);        
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
     }
     
     
     public void testCompileProblems() throws Exception {
         delay();        
         writeFile("jci/Simple.java", JavaSources.error);
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
         
         // FIXME
     }
@@ -79,7 +67,7 @@
 
         delay();
         writeFile("jci/Simple.java", JavaSources.SIMPLE);
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
     
         final Object SIMPLE = classloader.loadClass("jci.Simple").newInstance();        
         assertTrue("SIMPLE".equals(SIMPLE.toString()));
@@ -99,7 +87,7 @@
         
         delay();
         assertTrue(new File(directory, "jci/Extended.java").delete());
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
 
         final Object oldSimple = classloader.loadClass("jci.Simple").newInstance();        
         assertTrue("Simple".equals(oldSimple.toString()));
@@ -113,7 +101,7 @@
         
         delay();
         FileUtils.deleteDirectory(new File(directory, "jci"));
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
 
         try {
             classloader.loadClass("jci.Simple").newInstance();
@@ -135,7 +123,7 @@
         
         delay();
         assertTrue(new File(directory, "jci/Simple.java").delete());
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
 
         try {
             classloader.loadClass("jci.Extended").newInstance();

Modified: jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/ReloadingClassLoaderTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/ReloadingClassLoaderTestCase.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/ReloadingClassLoaderTestCase.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/ReloadingClassLoaderTestCase.java Sat Sep 24 04:53:44 2005
@@ -27,9 +27,6 @@
 
     private final static Log log = LogFactory.getLog(ReloadingClassLoaderTestCase.class);
     
-    private final Signal reloadSignal = new Signal();
-    private final Signal checkedSignal = new Signal();
-
     private ReloadingClassLoader classloader;
     private ReloadingListener listener;
     private FilesystemAlterationMonitor fam;
@@ -54,22 +51,9 @@
         super.setUp();
         
         classloader = new ReloadingClassLoader(this.getClass().getClassLoader());
-        listener = new ReloadingListener(directory) {
-            protected void needsReload(final boolean pReload) {
-                super.needsReload(pReload);
-                if (pReload) {
-                    synchronized(reloadSignal) {
-                        reloadSignal.triggered = true;
-                        reloadSignal.notify();
-                    }
-                } else {
-                    synchronized(checkedSignal) {
-                        checkedSignal.triggered = true;
-                        checkedSignal.notify();
-                    }
-                }
-            }  
-        };
+        listener = new ReloadingListener(directory);
+        
+        // listener.addListener(classloader);
         classloader.addListener(listener);
         
         fam = new FilesystemAlterationMonitor();
@@ -78,26 +62,26 @@
     }
 
     public void testCreate() throws Exception {
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
 
         log.debug("creating class");
         
         delay();
         writeFile("jci/Simple.class", clazzSimple);
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
         
         final Object simple = classloader.loadClass("jci.Simple").newInstance();        
         assertTrue("Simple".equals(simple.toString()));        
     }
 
     public void testChange() throws Exception {        
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
 
         log.debug("creating class");
 
         delay();        
         writeFile("jci/Simple.class", clazzSimple);
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
 
         final Object simple = classloader.loadClass("jci.Simple").newInstance();        
         assertTrue("Simple".equals(simple.toString()));
@@ -106,20 +90,20 @@
         
         delay();        
         writeFile("jci/Simple.class", clazzSIMPLE);
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
     
         final Object SIMPLE = classloader.loadClass("jci.Simple").newInstance();        
         assertTrue("SIMPLE".equals(SIMPLE.toString()));        
     }
 
     public void testDelete() throws Exception {
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
 
         log.debug("creating class");
 
         delay();        
         writeFile("jci/Simple.class", clazzSimple);
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
 
         final Object simple = classloader.loadClass("jci.Simple").newInstance();        
         assertTrue("Simple".equals(simple.toString()));
@@ -128,7 +112,7 @@
         
         assertTrue(new File(directory, "jci/Simple.class").delete());
         
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
 
         try {
             classloader.loadClass("jci.Simple").newInstance();        
@@ -139,14 +123,14 @@
     }
 
     public void testDeleteDependency() throws Exception {        
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
 
         log.debug("creating classes");
 
         delay();        
         writeFile("jci/Simple.class", clazzSimple);
         writeFile("jci/Extended.class", clazzExtended);
-        waitForSignal(checkedSignal);
+        listener.waitForCheck();
 
         final Object simple = classloader.loadClass("jci.Simple").newInstance();        
         assertTrue("Simple".equals(simple.toString()));
@@ -158,7 +142,7 @@
         
         assertTrue(new File(directory, "jci/Simple.class").delete());
         
-        waitForSignal(reloadSignal);
+        listener.waitForNotification();
 
         try {
             classloader.loadClass("jci.Extended").newInstance();

Modified: jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/compilers/GroovySources.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/compilers/GroovySources.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/compilers/GroovySources.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/compilers/GroovySources.java Sat Sep 24 04:53:44 2005
@@ -40,7 +40,7 @@
 
     String error =
         "package jci;\n"
-        + "public class Simple { \n"
+        + "public clss Simple { \n"
         + "  public String toString() { \n"
         + "    return 1; \n"
         + "  } \n"

Modified: jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/monitor/FilesystemAlterationMonitorTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/monitor/FilesystemAlterationMonitorTestCase.java?rev=291284&r1=291283&r2=291284&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/monitor/FilesystemAlterationMonitorTestCase.java (original)
+++ jakarta/commons/sandbox/jci/trunk/src/test/org/apache/commons/jci/monitor/FilesystemAlterationMonitorTestCase.java Sat Sep 24 04:53:44 2005
@@ -18,7 +18,7 @@
 import java.io.File;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.jci.AbstractTestCase;
-import org.apache.commons.jci.listeners.AbstractListener;
+import org.apache.commons.jci.listeners.NotifyingListener;
 import org.apache.commons.jci.stores.ResourceStore;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -29,12 +29,10 @@
 
     private final static Log log = LogFactory.getLog(FilesystemAlterationMonitorTestCase.class);
 
-    private final Signal signal = new Signal();
-
     private FilesystemAlterationMonitor fam;
     private MyFilesystemAlterationListener listener;
 
-    private class MyFilesystemAlterationListener extends AbstractListener {
+    private class MyFilesystemAlterationListener extends NotifyingListener {
         private int started;
         private int stopped;
         private int createdFiles;
@@ -43,6 +41,7 @@
         private int createdDirs;
         private int changedDirs;
         private int deletedDirs;
+        private boolean changed;
  
         public MyFilesystemAlterationListener(final File pRepository) {
             super(pRepository);
@@ -52,10 +51,6 @@
             return null;
         }
 
-        protected void needsReload( boolean pReload ) {
-            // prevent NPE
-        }
-
         public int getChangedDirs() {
             return changedDirs;
         }
@@ -82,47 +77,93 @@
         }
                  
         public void onStart() {
+            changed = false;
             ++started;
+            log.debug("onStart");
         }
         public void onStop() {
             ++stopped;
-            synchronized(signal) {
-                signal.triggered = true;
-                signal.notify();
-            }
+            log.debug("onStop");
+            
+            checked(changed);
         }
         public void onCreateFile( final File file ) {
             ++createdFiles;
+            changed = true;
+            log.debug("onCreateFile " + file);
         }
         public void onChangeFile( final File file ) {                
             ++changedFiles;
+            changed = true;
+            log.debug("onChangeFile " + file);
         }
         public void onDeleteFile( final File file ) {
             ++deletedFiles;
+            changed = true;
+            log.debug("onDeleteFile " + file);
         }
         public void onCreateDirectory( final File file ) {                
             ++createdDirs;
+            changed = true;
+            log.debug("onCreateDirectory " + file);
         }
         public void onChangeDirectory( final File file ) {                
             ++changedDirs;
+            changed = true;
+            log.debug("onChangeDirectory " + file);
         }
         public void onDeleteDirectory( final File file ) {
             ++deletedDirs;
-        }       
+            changed = true;
+            log.debug("onDeleteDirectory " + file);
+        }
     }
 
-    private void start() {
+    private void start() throws Exception {
         fam = new FilesystemAlterationMonitor();
         listener = new MyFilesystemAlterationListener(directory);
         fam.addListener(listener);
         fam.start();
-        waitForSignal(signal);
+        listener.waitForFirstCheck();
     }
     
     private void stop() {
         fam.stop();
     }
     
+    public void testListenerDoublication() throws Exception {
+        fam = new FilesystemAlterationMonitor();
+        listener = new MyFilesystemAlterationListener(directory);
+        
+        fam.addListener(listener);
+        log.debug(fam);
+        assertTrue(fam.getListeners().size() == 1);
+        
+        fam.addListener(listener); 
+        log.debug(fam);        
+        assertTrue(fam.getListeners().size() == 1);
+    }
+
+    public void testDirectoryDoublication() throws Exception {
+        fam = new FilesystemAlterationMonitor();
+
+        fam.addListener(new MyFilesystemAlterationListener(directory)); 
+        log.debug(fam);
+        assertTrue(fam.getListenersFor(directory).size() == 1);
+        
+        fam.addListener(new MyFilesystemAlterationListener(directory)); 
+        log.debug(fam);        
+        assertTrue(fam.getListenersFor(directory).size() == 2);
+    }
+
+    public void testListener() throws Exception {
+        start();
+        log.debug(fam);
+        fam.removeListener(listener);
+        log.debug(fam);
+        stop();
+    }
+
     public void testCreateFileDetection() throws Exception {
         start();
         
@@ -130,7 +171,7 @@
         
         writeFile("file", "file");
         
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.createdFiles == 1);
         
@@ -144,7 +185,7 @@
 
         createDirectory("dir");
         
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.createdDirs == 1);
         
@@ -158,14 +199,14 @@
         
         final File file = writeFile("file", "file");
         
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.createdFiles == 1);
         
         file.delete();
         assertTrue(!file.exists());
 
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.deletedFiles == 1);
         
@@ -180,18 +221,16 @@
         final File dir = createDirectory("dir");
         createDirectory("dir/sub");
         
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.createdDirs == 2);
 
-        waitForSignal(signal);
-
         delay();
         
         FileUtils.deleteDirectory(dir);
         assertTrue(!dir.exists());
 
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.deletedDirs == 2);
 
@@ -205,15 +244,15 @@
         
         writeFile("file", "file");
         
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.createdFiles == 1);
 
-        waitForSignal(signal);
+        delay();
 
         writeFile("file", "changed file");
 
-        waitForSignal(signal);
+        listener.waitForNotification();
         
         assertTrue(listener.changedFiles == 1);
         
@@ -266,14 +305,7 @@
     
     public void testInterval() throws Exception {
         start();
-        fam.setInterval(1000);
+        fam.setInterval(100);
         stop();
-    }
-    
-    public void testListener() throws Exception {
-        start();
-        fam.removeListener(listener);
-        stop();
-    }
-    
+    }    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org