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 2007/01/21 22:55:32 UTC

svn commit: r498463 - in /jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor: FilesystemAlterationMonitor.java FilesystemAlterationObserver.java FilesystemAlterationObserverImpl.java

Author: tcurdt
Date: Sun Jan 21 13:55:31 2007
New Revision: 498463

URL: http://svn.apache.org/viewvc?view=rev&rev=498463
Log:
https://issues.apache.org/jira/browse/SANDBOX-179


Added:
    jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java   (with props)
    jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java   (with props)
Modified:
    jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java

Modified: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java?view=diff&rev=498463&r1=498462&r2=498463
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java (original)
+++ jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationMonitor.java Sun Jan 21 13:55:31 2007
@@ -17,14 +17,8 @@
 package org.apache.commons.jci.monitor;
 
 import java.io.File;
-import java.io.FileFilter;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import org.apache.commons.collections.MultiHashMap;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -35,139 +29,14 @@
 
     private final Log log = LogFactory.getLog(FilesystemAlterationMonitor.class);
 
-    public class Entry {
-
-        private final File root;
-        private final File file;
-        private long lastModified;
-        private Set paths = new HashSet();
-        private Set childs = new HashSet();
-        private final boolean isDirectory;
-
-
-        public Entry(final File pRoot, final File pFile) {
-            root = pRoot;
-            file = pFile;
-            lastModified = -1;
-            isDirectory = file.isDirectory();
-        }
-
-
-        public boolean hasChanged() {
-            final long modified = file.lastModified();
-            return modified != lastModified;
-        }
-
-
-        public boolean isDelected() {
-            return !file.exists();
-        }
-
-
-        public boolean isDirectory() {
-            return isDirectory;
-        }
-
-
-        public Entry[] getChilds() {
-            final Entry[] r = new Entry[childs.size()];
-            childs.toArray(r);
-            return r;
-        }
-
-
-        private FileFilter getFileFilter() {
-            return new FileFilter() {
-
-                public boolean accept( final File pathname ) {
-                    final String p = pathname.getAbsolutePath();
-                    return !paths.contains(p);
-                }
-            };
-        }
-
-
-        public Entry[] getNonChilds() {
-            final File[] newFiles = file.listFiles(getFileFilter());
-            final Entry[] r = new Entry[newFiles.length];
-            for (int i = 0; i < newFiles.length; i++) {
-                r[i] = new Entry(root, newFiles[i]);
-            }
-            return r;
-        }
-
+    private final FilesystemAlterationObserver observer;
 
-        public void add( final Entry entry ) {
-            childs.add(entry);
-            paths.add(entry.toString());
-            onCreate(root, entry);
-        }
-
-
-        private void deleteChilds() {
-            final Entry[] childs = this.getChilds();
-            for (int i = 0; i < childs.length; i++) {
-                final Entry child = childs[i];
-                delete(child);
-            }
-        }
-
-
-        public void delete( final Entry entry ) {
-            childs.remove(entry);
-            paths.remove(entry.toString());
-            entry.deleteChilds();
-            onDelete(root, entry);
-        }
-
-
-        public File getFile() {
-            return file;
-        }
-
-
-        public void markNotChanged() {
-            lastModified = file.lastModified();
-        }
-
-
-        public String toString() {
-            return file.getAbsolutePath();
-        }
-    }
-
-    public static class UniqueMultiHashMap extends MultiHashMap {
-
-		private static final long serialVersionUID = 1L;
-
-		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();
     private long delay = 3000;
-    private boolean running = true;
+    private volatile boolean running = true;
     private Thread thread;
 
-
     public FilesystemAlterationMonitor() {
+    	observer = new FilesystemAlterationObserverImpl();
     }
 
 
@@ -178,9 +47,8 @@
 
 
     public void stop() {
-        synchronized (mutexRunning) {
-            running = false;
-        }
+        running = false;
+
         try {
             thread.join(delay);
         } catch (InterruptedException e) {
@@ -194,240 +62,31 @@
 
 
     public void addListener( final FilesystemAlterationListener pListener ) {
-        final File directory = pListener.getRepository();
-        synchronized (mutexListeners) {
-            // listerner -> dir1, dir2, dir3
-            final UniqueMultiHashMap newListeners = new UniqueMultiHashMap(listeners);
-            newListeners.put(pListener, directory);
-            listeners = newListeners;
-            // directory -> listener1, listener2, listener3
-            final UniqueMultiHashMap newDirectories = new UniqueMultiHashMap(directories);
-            newDirectories.put(directory, pListener);
-            directories = newDirectories;
-        }
+    	observer.addListener( pListener );
     }
 
     public Collection getListeners() {
-        synchronized (mutexListeners) {
-            return listeners.keySet();
-        }
+        return observer.getListeners();
     }
 
     public Collection getListenersFor( final File pRepository ) {
-        synchronized (mutexListeners) {
-            return (Collection) directories.get(pRepository);
-        }
+        return observer.getListenersFor( pRepository );
     }
 
     public void removeListener( final FilesystemAlterationListener listener ) {
-        synchronized (mutexListeners) {
-            // listerner -> dir1, dir2, dir3
-            final UniqueMultiHashMap newListeners = new UniqueMultiHashMap(listeners);
-            Collection d = (Collection) newListeners.remove(listener);
-            listeners = newListeners;
-            if (d != null) {
-                // directory -> listener1, listener2, listener3
-                final UniqueMultiHashMap newDirectories = new UniqueMultiHashMap(directories);
-                for (Iterator it = d.iterator(); it.hasNext();) {
-                    newDirectories.remove(it.next());
-                    entries.remove(d);
-                }
-                directories = newDirectories;
-            }
-        }
-    }
-
-
-    private void onStart( final File root ) {
-        log.debug("start checking " + root);
-        Map directories;
-        synchronized (mutexListeners) {
-            directories = this.directories;
-        }
-        final Collection l = (Collection) directories.get(root);
-        if (l != null) {
-            for (Iterator it = l.iterator(); it.hasNext();) {
-                final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                        .next();
-                listener.onStart();
-            }
-        }
-    }
-
-
-    private void onStop( final File root ) {
-        log.debug("stop checking " + root);
-        Map directories;
-        synchronized (mutexListeners) {
-            directories = this.directories;
-        }
-        final Collection l = (Collection) directories.get(root);
-        if (l != null) {
-            for (Iterator it = l.iterator(); it.hasNext();) {
-                final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                        .next();
-                listener.onStop();
-            }
-        }
-    }
-
-
-    private void onCreate( final File root, final Entry entry ) {
-        log.debug("created " + ((entry.isDirectory()) ? "dir " : "file ") + entry);
-        Map directories;
-        synchronized (mutexListeners) {
-            directories = this.directories;
-        }
-        final Collection l = (Collection) directories.get(root);
-        if (l != null) {
-            if (entry.isDirectory()) {
-                for (Iterator it = l.iterator(); it.hasNext();) {
-                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                            .next();
-                    listener.onCreateDirectory(entry.getFile());
-                }
-            } else {
-                for (Iterator it = l.iterator(); it.hasNext();) {
-                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                            .next();
-                    listener.onCreateFile(entry.getFile());
-                }
-            }
-        }
-        entry.markNotChanged();
-    }
-
-
-    private void onChange( final File root, final Entry entry ) {
-        log.debug("changed " + ((entry.isDirectory()) ? "dir " : "file ") + entry);
-        Map directories;
-        synchronized (mutexListeners) {
-            directories = this.directories;
-        }
-        final Collection l = (Collection) directories.get(root);
-        if (l != null) {
-            if (entry.isDirectory()) {
-                for (Iterator it = l.iterator(); it.hasNext();) {
-                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                            .next();
-                    listener.onChangeDirectory(entry.getFile());
-                }
-            } else {
-                for (Iterator it = l.iterator(); it.hasNext();) {
-                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                            .next();
-                    listener.onChangeFile(entry.getFile());
-                }
-            }
-        }
-        entry.markNotChanged();
-    }
-
-
-    private void onDelete( final File root, final Entry entry ) {
-        log.debug("deleted " + ((entry.isDirectory()) ? "dir " : "file ") + entry);
-        Map directories;
-        synchronized (mutexListeners) {
-            directories = this.directories;
-        }
-        final Collection l = (Collection) directories.get(root);
-        if (l != null) {
-            if (entry.isDirectory()) {
-                for (Iterator it = l.iterator(); it.hasNext();) {
-                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                            .next();
-                    listener.onDeleteDirectory(entry.getFile());
-                }
-            } else {
-                for (Iterator it = l.iterator(); it.hasNext();) {
-                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
-                            .next();
-                    listener.onDeleteFile(entry.getFile());
-                }
-            }
-        }
-        entry.markNotChanged();
-    }
-
-
-    private void check( final File root, final Entry entry, final boolean create ) {
-        // log.debug("checking " + entry);
-        if (entry.isDirectory()) {
-            final Entry[] currentChilds = entry.getChilds();
-            if (entry.hasChanged() || create) {
-                // log.debug(entry + " has changed");
-                if (!create) {
-                    onChange(root, entry);
-                    for (int i = 0; i < currentChilds.length; i++) {
-                        final Entry child = currentChilds[i];
-                        if (child.isDelected()) {
-                            entry.delete(child);
-                            currentChilds[i] = null;
-                        }
-                    }
-                }
-                final Entry[] newChilds = entry.getNonChilds();
-                for (int i = 0; i < newChilds.length; i++) {
-                    final Entry child = newChilds[i];
-                    entry.add(child);
-                }
-                if (!create) {
-                    for (int i = 0; i < currentChilds.length; i++) {
-                        final Entry child = currentChilds[i];
-                        if (child != null) {
-                            check(root, child, false);
-                        }
-                    }
-                }
-                for (int i = 0; i < newChilds.length; i++) {
-                    final Entry child = newChilds[i];
-                    check(root, child, true);
-                }
-            } else {
-                // log.debug(entry + " has not changed");
-                for (int i = 0; i < currentChilds.length; i++) {
-                    final Entry child = currentChilds[i];
-                    check(root, child, false);
-                }
-            }
-        } else {
-            if (entry.isDelected()) {
-                onDelete(root, entry);
-            } else if (entry.hasChanged()) {
-                onChange(root, entry);
-            }
-        }
+    	observer.removeListener( listener );
     }
 
 
     public void run() {
         log.debug("fam running");
         while (true) {
-            synchronized (mutexRunning) {
-                if (!running) {
-                    break;
-                }
-            }
-            Map directories;
-            synchronized (mutexListeners) {
-                directories = this.directories;
-            }
-            for (Iterator it = directories.keySet().iterator(); it.hasNext();) {
-                final File directory = (File) it.next();
-                if (directory.exists()) {
-                    onStart(directory);
-                    Entry root;
-                    synchronized (mutexListeners) {
-                        root = (Entry) entries.get(directory);
-                        if (root == null) {
-                            root = new Entry(directory, directory);
-                            entries.put(directory, root);
-                        }
-                    }
-                    check(directory, root, false);
-                    onStop(directory);
-                }
+            if (!running) {
+                break;
             }
+
+            observer.check();
+
             try {
                 Thread.sleep(delay);
             } catch (final InterruptedException e) {
@@ -439,8 +98,6 @@
 
 
     public String toString() {
-        return listeners.toString() + directories.toString();
-    }
-
-    
+        return observer.toString();
+    }   
 }

Added: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java?view=auto&rev=498463
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java (added)
+++ jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java Sun Jan 21 13:55:31 2007
@@ -0,0 +1,20 @@
+package org.apache.commons.jci.monitor;
+
+import java.io.File;
+import java.util.Collection;
+
+public interface FilesystemAlterationObserver {
+
+	public abstract void addListener(
+			final FilesystemAlterationListener pListener);
+
+	public abstract Collection getListeners();
+
+	public abstract Collection getListenersFor(final File pRepository);
+
+	public abstract void removeListener(
+			final FilesystemAlterationListener listener);
+
+	public abstract void check();
+
+}
\ No newline at end of file

Propchange: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java?view=auto&rev=498463
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java (added)
+++ jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java Sun Jan 21 13:55:31 2007
@@ -0,0 +1,401 @@
+/*
+ * 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.monitor;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.collections.MultiHashMap;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author tcurdt
+ */
+public class FilesystemAlterationObserverImpl implements FilesystemAlterationObserver {
+
+    private final Log log = LogFactory.getLog(FilesystemAlterationObserverImpl.class);
+
+    public class Entry {
+
+        private final File root;
+        private final File file;
+        private long lastModified;
+        private Set paths = new HashSet();
+        private Set childs = new HashSet();
+        private final boolean isDirectory;
+
+
+        public Entry(final File pRoot, final File pFile) {
+            root = pRoot;
+            file = pFile;
+            lastModified = -1;
+            isDirectory = file.isDirectory();
+        }
+
+
+        public boolean hasChanged() {
+            final long modified = file.lastModified();
+            return modified != lastModified;
+        }
+
+
+        public boolean isDelected() {
+            return !file.exists();
+        }
+
+
+        public boolean isDirectory() {
+            return isDirectory;
+        }
+
+
+        public Entry[] getChilds() {
+            final Entry[] r = new Entry[childs.size()];
+            childs.toArray(r);
+            return r;
+        }
+
+
+        private FileFilter getFileFilter() {
+            return new FileFilter() {
+
+                public boolean accept( final File pathname ) {
+                    final String p = pathname.getAbsolutePath();
+                    return !paths.contains(p);
+                }
+            };
+        }
+
+
+        public Entry[] getNonChilds() {
+            final File[] newFiles = file.listFiles(getFileFilter());
+            final Entry[] r = new Entry[newFiles.length];
+            for (int i = 0; i < newFiles.length; i++) {
+                r[i] = new Entry(root, newFiles[i]);
+            }
+            return r;
+        }
+
+
+        public void add( final Entry entry ) {
+            childs.add(entry);
+            paths.add(entry.toString());
+            onCreate(root, entry);
+        }
+
+
+        private void deleteChilds() {
+            final Entry[] childs = this.getChilds();
+            for (int i = 0; i < childs.length; i++) {
+                final Entry child = childs[i];
+                delete(child);
+            }
+        }
+
+
+        public void delete( final Entry entry ) {
+            childs.remove(entry);
+            paths.remove(entry.toString());
+            entry.deleteChilds();
+            onDelete(root, entry);
+        }
+
+
+        public File getFile() {
+            return file;
+        }
+
+
+        public void markNotChanged() {
+            lastModified = file.lastModified();
+        }
+
+
+        public String toString() {
+            return file.getAbsolutePath();
+        }
+    }
+
+    public static class UniqueMultiValueMap extends MultiHashMap {
+
+		private static final long serialVersionUID = 1L;
+
+		public UniqueMultiValueMap() {
+            super( );
+        }
+
+        public UniqueMultiValueMap(Map copy) {
+            super( copy );
+        }
+
+        protected Collection createCollection( Collection copy ) {
+            if (copy != null) {
+                return new HashSet(copy);
+            }
+            return new HashSet();
+        }
+        
+    }
+    
+    private Map listeners = new UniqueMultiValueMap();
+    private Map directories = new UniqueMultiValueMap();
+    private Map entries = new HashMap();
+    private final Object mutexListeners = new Object();
+    
+
+    public FilesystemAlterationObserverImpl() {
+    }
+
+
+    public void addListener( final FilesystemAlterationListener pListener ) {
+        final File directory = pListener.getRepository();
+        synchronized (mutexListeners) {
+            // listerner -> dir1, dir2, dir3
+            final UniqueMultiValueMap newListeners = new UniqueMultiValueMap(listeners);
+            newListeners.put(pListener, directory);
+            listeners = newListeners;
+            // directory -> listener1, listener2, listener3
+            final UniqueMultiValueMap newDirectories = new UniqueMultiValueMap(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 UniqueMultiValueMap newListeners = new UniqueMultiValueMap(listeners);
+            Collection d = (Collection) newListeners.remove(listener);
+            listeners = newListeners;
+            if (d != null) {
+                // directory -> listener1, listener2, listener3
+                final UniqueMultiValueMap newDirectories = new UniqueMultiValueMap(directories);
+                for (Iterator it = d.iterator(); it.hasNext();) {
+                    newDirectories.remove(it.next());
+                    entries.remove(d);
+                }
+                directories = newDirectories;
+            }
+        }
+    }
+
+
+    private void onStart( final File root ) {
+        log.debug("start checking " + root);
+        Map directories;
+        synchronized (mutexListeners) {
+            directories = this.directories;
+        }
+        final Collection l = (Collection) directories.get(root);
+        if (l != null) {
+            for (Iterator it = l.iterator(); it.hasNext();) {
+                final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                        .next();
+                listener.onStart();
+            }
+        }
+    }
+
+
+    private void onStop( final File root ) {
+        log.debug("stop checking " + root);
+        Map directories;
+        synchronized (mutexListeners) {
+            directories = this.directories;
+        }
+        final Collection l = (Collection) directories.get(root);
+        if (l != null) {
+            for (Iterator it = l.iterator(); it.hasNext();) {
+                final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                        .next();
+                listener.onStop();
+            }
+        }
+    }
+
+
+    private void onCreate( final File root, final Entry entry ) {
+        log.debug("created " + ((entry.isDirectory()) ? "dir " : "file ") + entry);
+        Map directories;
+        synchronized (mutexListeners) {
+            directories = this.directories;
+        }
+        final Collection l = (Collection) directories.get(root);
+        if (l != null) {
+            if (entry.isDirectory()) {
+                for (Iterator it = l.iterator(); it.hasNext();) {
+                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                            .next();
+                    listener.onCreateDirectory(entry.getFile());
+                }
+            } else {
+                for (Iterator it = l.iterator(); it.hasNext();) {
+                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                            .next();
+                    listener.onCreateFile(entry.getFile());
+                }
+            }
+        }
+        entry.markNotChanged();
+    }
+
+
+    private void onChange( final File root, final Entry entry ) {
+        log.debug("changed " + ((entry.isDirectory()) ? "dir " : "file ") + entry);
+        Map directories;
+        synchronized (mutexListeners) {
+            directories = this.directories;
+        }
+        final Collection l = (Collection) directories.get(root);
+        if (l != null) {
+            if (entry.isDirectory()) {
+                for (Iterator it = l.iterator(); it.hasNext();) {
+                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                            .next();
+                    listener.onChangeDirectory(entry.getFile());
+                }
+            } else {
+                for (Iterator it = l.iterator(); it.hasNext();) {
+                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                            .next();
+                    listener.onChangeFile(entry.getFile());
+                }
+            }
+        }
+        entry.markNotChanged();
+    }
+
+
+    private void onDelete( final File root, final Entry entry ) {
+        log.debug("deleted " + ((entry.isDirectory()) ? "dir " : "file ") + entry);
+        Map directories;
+        synchronized (mutexListeners) {
+            directories = this.directories;
+        }
+        final Collection l = (Collection) directories.get(root);
+        if (l != null) {
+            if (entry.isDirectory()) {
+                for (Iterator it = l.iterator(); it.hasNext();) {
+                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                            .next();
+                    listener.onDeleteDirectory(entry.getFile());
+                }
+            } else {
+                for (Iterator it = l.iterator(); it.hasNext();) {
+                    final FilesystemAlterationListener listener = (FilesystemAlterationListener) it
+                            .next();
+                    listener.onDeleteFile(entry.getFile());
+                }
+            }
+        }
+        entry.markNotChanged();
+    }
+
+
+    private void check( final File root, final Entry entry, final boolean create ) {
+        // log.debug("checking " + entry);
+        if (entry.isDirectory()) {
+            final Entry[] currentChilds = entry.getChilds();
+            if (entry.hasChanged() || create) {
+                // log.debug(entry + " has changed");
+                if (!create) {
+                    onChange(root, entry);
+                    for (int i = 0; i < currentChilds.length; i++) {
+                        final Entry child = currentChilds[i];
+                        if (child.isDelected()) {
+                            entry.delete(child);
+                            currentChilds[i] = null;
+                        }
+                    }
+                }
+                final Entry[] newChilds = entry.getNonChilds();
+                for (int i = 0; i < newChilds.length; i++) {
+                    final Entry child = newChilds[i];
+                    entry.add(child);
+                }
+                if (!create) {
+                    for (int i = 0; i < currentChilds.length; i++) {
+                        final Entry child = currentChilds[i];
+                        if (child != null) {
+                            check(root, child, false);
+                        }
+                    }
+                }
+                for (int i = 0; i < newChilds.length; i++) {
+                    final Entry child = newChilds[i];
+                    check(root, child, true);
+                }
+            } else {
+                // log.debug(entry + " has not changed");
+                for (int i = 0; i < currentChilds.length; i++) {
+                    final Entry child = currentChilds[i];
+                    check(root, child, false);
+                }
+            }
+        } else {
+            if (entry.isDelected()) {
+                onDelete(root, entry);
+            } else if (entry.hasChanged()) {
+                onChange(root, entry);
+            }
+        }
+    }
+
+
+
+    public void check() {
+        log.debug("observation running");
+        Map directories;
+        synchronized (mutexListeners) {
+            directories = this.directories;
+        }
+        for (Iterator it = directories.keySet().iterator(); it.hasNext();) {
+            final File directory = (File) it.next();
+            if (directory.exists()) {
+                onStart(directory);
+                Entry root;
+                synchronized (mutexListeners) {
+                    root = (Entry) entries.get(directory);
+                    if (root == null) {
+                        root = new Entry(directory, directory);
+                        entries.put(directory, root);
+                    }
+                }
+                check(directory, root, false);
+                onStop(directory);
+            }
+        }
+        log.debug("observation exiting");
+    }
+
+    public String toString() {
+        return listeners.toString() + directories.toString();
+    }
+
+    
+}

Propchange: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: jakarta/commons/sandbox/jci/trunk/fam/src/main/java/org/apache/commons/jci/monitor/FilesystemAlterationObserverImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



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