+/*
+ * 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;
+ }
+
+}