+ /**
+ * DOCUMENT ME!
+ */
+ private static final Log LOG = LogFactory.getLog(DirectoryMonitor.class);
+
+ /**
+ * DOCUMENT ME!
+ */
+ private File directory;
+
+ /**
+ * DOCUMENT ME!
+ */
+ private FileFilter filter;
+
+ /**
+ * DOCUMENT ME!
+ */
+ private Listener listener;
+
+ /**
+ * DOCUMENT ME!
+ */
+ private Map<File, Date> contents;
+
+/**
+ * Creates a new DirectoryMonitor object.
+ *
+ * @param aDirectory DOCUMENT ME!
+ * @param aFilefilter DOCUMENT ME!
+ * @param aListener DOCUMENT ME!
+ */
+ 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;
+ }
+
+ public static interface Listener {
+ void fileChanged(File aFile);