(no commit message)
authorerik <erik@77661180-640e-0410-b3a8-9f9b13e6d0e0>
Thu, 8 Feb 2007 12:48:51 +0000 (12:48 +0000)
committererik <erik@77661180-640e-0410-b3a8-9f9b13e6d0e0>
Thu, 8 Feb 2007 12:48:51 +0000 (12:48 +0000)
trunk/support/src/main/java/org/wamblee/io/DirectoryMonitor.java [new file with mode: 0644]

diff --git a/trunk/support/src/main/java/org/wamblee/io/DirectoryMonitor.java b/trunk/support/src/main/java/org/wamblee/io/DirectoryMonitor.java
new file mode 100644 (file)
index 0000000..5fe2e57
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2006 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.
+ * 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.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.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Monitors a directory for changes. 
+ */
+public class DirectoryMonitor {
+    
+    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;
+        _filter = aFilefilter; 
+        _listener = aListener;
+        _contents = new HashMap<File,Date>();
+    }
+    
+    public void poll() {
+        LOG.info("Polling " + _directory);
+        Map<File,Date> newContents = new HashMap<File,Date>();
+        File[] files = _directory.listFiles(_filter);
+        for (File file: files) { 
+            if ( _contents.containsKey(file)) { 
+                Date oldDate = _contents.get(file);
+                if (file.lastModified() != oldDate.getTime()) { 
+                    _listener.fileChanged(file);
+                } else { 
+                    // No change. 
+                }
+                _contents.remove(file);
+                newContents.put(file, new Date(file.lastModified()));
+            } else { 
+                _listener.fileCreated(file);
+                newContents.put(file, new Date(file.lastModified()));
+            }
+        }
+        for (File file: _contents.keySet()) { 
+            _listener.fileDeleted(file);
+        }
+        _contents = newContents;
+    }
+
+}