(no commit message)
[utils] / support / general / src / main / java / org / wamblee / io / DirectoryMonitor.java
index 0f84183c1b4478cdb32aad51dcc49b4145eeebc8..685a0cb5ca5f5673902ac6c7b89f284d5ea4f844 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2006 the original author or authors.
+ * Copyright 2005-2010 the original author or authors.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.wamblee.io;
 
 import java.io.File;
 import java.io.FileFilter;
-import java.util.ArrayList;
+
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import java.util.logging.Logger;
 
 /**
- * Monitors a directory for changes.
+ * Monitors a directory for changes. The currernt implementation only checks
+ * files not directories and does not check for modifications in subdirectories.
  * 
  * @author Erik Brakkee
  */
 public class DirectoryMonitor {
+    private static final Logger LOG = Logger.getLogger(DirectoryMonitor.class
+        .getName());
+
+    private File directory;
+
+    private FileFilter filter;
+
+    private Listener listener;
+
+    private Map<File, Date> contents;
+
+    /**
+     * Creates a new DirectoryMonitor object.
+     * 
+     */
+    public DirectoryMonitor(File aDirectory, FileFilter aFilefilter,
+        Listener aListener) {
+        directory = aDirectory;
+
+        if (!directory.isDirectory()) {
+            throw new IllegalArgumentException("Directory '" + directory +
+                "' does not exist");
+        }
+
+        filter = aFilefilter;
+        listener = aListener;
+        contents = new HashMap<File, Date>();
+    }
+
+    /**
+     * Polls the directory for changes and notifies the listener of any changes.
+     * In case of any exceptions thrown by the listener while handling the
+     * changes, the next call to this method will invoked the listeners again
+     * for the same changes.
+     */
+    public void poll() {
+        LOG.fine("Polling " + directory);
+
+        Map<File, Date> newContents = new HashMap<File, Date>();
+        File[] files = directory.listFiles(filter);
+
+        // Check deleted files.
+        Set<File> deletedFiles = new HashSet<File>(contents.keySet());
+
+        for (File file : files) {
+            if (file.isFile()) {
+                if (contents.containsKey(file)) {
+                    deletedFiles.remove(file);
+                }
+            }
+        }
+
+        for (File file : deletedFiles) {
+            listener.fileDeleted(file);
+        }
+
+        for (File file : files) {
+            if (file.isFile()) {
+                if (contents.containsKey(file)) {
+                    Date oldDate = contents.get(file);
+
+                    if (file.lastModified() != oldDate.getTime()) {
+                        listener.fileChanged(file);
+                    } else {
+                        // No change.
+                    }
+
+                    newContents.put(file, new Date(file.lastModified()));
+                } else {
+                    listener.fileCreated(file);
+                    newContents.put(file, new Date(file.lastModified()));
+                }
+            }
+        }
+
+        contents = newContents;
+    }
+
+    /**
+     * Listener interface to be provided by users of the directory monitor to
+     * get notified of changes.
+     * 
+     * @author Erik Brakkee
+     */
+    public static interface Listener {
+        /**
+         * @param aFile
+         *            File that has changed.
+         */
+        void fileChanged(File aFile);
 
-       private static final Log LOG = LogFactory.getLog(DirectoryMonitor.class);
-
-       public static interface Listener {
-               
-               void fileChanged(File aFile);
-
-               void fileCreated(File aFile);
-
-               void fileDeleted(File aFile);
-       };
-
-       private File _directory;
-       private FileFilter _filter;
-       private Listener _listener;
-       private Map<File, Date> _contents;
-
-       public DirectoryMonitor(File aDirectory, FileFilter aFilefilter,
-                       Listener aListener) {
-               _directory = aDirectory;
-               if (!_directory.isDirectory()) {
-                       throw new IllegalArgumentException("Directory '" + _directory
-                                       + "' does not exist");
-               }
-               _filter = aFilefilter;
-               _listener = aListener;
-               _contents = new HashMap<File, Date>();
-       }
-
-       /**
-        * Polls the directory for changes and notifies the listener of any changes. 
-        * In case of any exceptions thrown by the listener while handling the changes, 
-        * the next call to this method will invoked the listeners again for the same changes. 
-        */
-       public void poll() {
-               LOG.debug("Polling " + _directory);
-               Map<File, Date> newContents = new HashMap<File, Date>();
-               File[] files = _directory.listFiles(_filter);
-
-               // Check deleted files. 
-               Set<File> deletedFiles = new HashSet<File>(_contents.keySet());
-               for (File file : files) {
-                       if (file.isFile()) {
-                               if (_contents.containsKey(file)) {
-                                       deletedFiles.remove(file);
-                               }
-                       }
-               }
-               for (File file : deletedFiles) {
-                       _listener.fileDeleted(file);
-               }
-               
-               for (File file : files) {
-                       if (file.isFile()) {
-                               if (_contents.containsKey(file)) {
-                                       Date oldDate = _contents.get(file);
-                                       if (file.lastModified() != oldDate.getTime()) {
-                                               _listener.fileChanged(file);
-                                       } else {
-                                               // No change.
-                                       }
-                                       newContents.put(file, new Date(file.lastModified()));
-                               } else {
-                                       _listener.fileCreated(file);
-                                       newContents.put(file, new Date(file.lastModified()));
-                               }
-                       }
-               }
-               
-               _contents = newContents;
-       }
+        /**
+         * @param aFile
+         *            File that was created.
+         */
+        void fileCreated(File aFile);
 
+        /**
+         * @param aFile
+         *            File that was deleted.
+         */
+        void fileDeleted(File aFile);
+    }
 }