package com.github.dreamhead.moco.runner.watcher;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.TimeUnit;
public class FileMocoRunnerWatcher implements MocoRunnerWatcher {
public static final long INTERVAL = TimeUnit.SECONDS.toMillis(1);
private static Logger logger = LoggerFactory.getLogger(FileMocoRunnerWatcher.class);
private final FileAlterationMonitor monitor;
private boolean running = false;
public FileMocoRunnerWatcher(final File file, final FileAlterationListener listener) {
this.monitor = monitorFile(file, listener);
}
public synchronized void startMonitor() {
try {
monitor.start();
running = true;
} catch (Exception e) {
logger.error("Error found.", e);
}
}
public synchronized void stopMonitor() {
try {
if (monitor != null && running) {
monitor.stop();
running = false;
}
} catch (Exception e) {
logger.error("Error found.", e);
}
}
private FileAlterationMonitor monitorFile(final File file, final FileAlterationListener listener) {
File parentFile = file.getParentFile();
File directory = toDirectory(parentFile);
FileAlterationObserver observer = new FileAlterationObserver(directory, sameFile(file));
observer.addListener(listener);
return new FileAlterationMonitor(INTERVAL, observer);
}
private File toDirectory(final File parentFile) {
if (parentFile == null) {
return new File(".");
}
return parentFile;
}
private FileFilter sameFile(final File file) {
return new FileFilter() {
@Override
public boolean accept(final File detectedFile) {
return file.getName().equals(detectedFile.getName());
}
};
}
}