package org.hive2hive.client.util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
/**
* Default implementation of a file observer. Internally uses the Apache Commons IO
* {@link FileAlterationObserver} and {@link FileAlterationMonitor}.
*
* @author Christian
*
*/
public class FileObserver {
private final FileAlterationObserver observer;
private final FileAlterationMonitor monitor;
private boolean isRunning;
/**
* A file observer that uses the specified interval to check for file changes.
*
* @param rootDirectory
* @param ms
*/
public FileObserver(File rootDirectory, long ms) {
this.observer = new FileAlterationObserver(rootDirectory);
this.monitor = new FileAlterationMonitor(ms, observer);
}
/**
* A file observer that uses the default interval to check for file changes.
*
* @param rootDirectory
*/
public FileObserver(File rootDirectory) {
this(rootDirectory, 1000);
}
public void start() throws Exception {
if (!isRunning) {
monitor.start();
isRunning = true;
}
}
public void stop() throws Exception {
stop(0);
}
public void stop(long ms) throws Exception {
if (isRunning) {
monitor.stop(ms);
isRunning = false;
}
}
public void addFileObserverListener(FileObserverListener listener) {
observer.addListener(listener);
}
public void removeFileObserverListener(FileObserverListener listener) {
observer.removeListener(listener);
}
public List<FileObserverListener> getFileObserverListeners() {
List<FileObserverListener> listeners = new ArrayList<FileObserverListener>();
// TODO check if this interface casting is allowed
for (FileAlterationListener listener : observer.getListeners()) {
listeners.add((FileObserverListener) listener);
}
return listeners;
}
public long getInterval() {
return monitor.getInterval();
}
public boolean isRunning() {
return isRunning;
}
}