package com.spun.util.io;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
public class FileMonitor
{
private Timer timer;
private Map<File, Long> files;
private Set<FileListener> listeners;
public FileMonitor(long pollingInterval)
{
files = new HashMap<File, Long>();
listeners = new HashSet<FileListener>();
timer = new Timer(true);
timer.schedule(new FileMonitorNotifier(), 0, pollingInterval);
}
public void stop()
{
timer.cancel();
}
public void addFile(File file)
{
if (!files.containsKey(file))
{
files.put(file, (file.exists() ? file.lastModified() : -1L));
}
}
public void removeFile(File file)
{
files.remove(file);
}
public void addListener(FileListener fileListener)
{
listeners.add(fileListener);
}
public void removeListener(FileListener fileListener)
{
listeners.remove(fileListener);
}
private class FileMonitorNotifier extends TimerTask
{
public void run()
{
for (File file : files.keySet())
{
long lastModifiedTime = ((Long) files.get(file)).longValue();
long newModifiedTime = file.exists() ? file.lastModified() : -1;
if (newModifiedTime != lastModifiedTime)
{
files.put(file, newModifiedTime);
for (FileListener listener : listeners)
{
listener.fileChanged(file);
}
}
}
}
}
public interface FileListener
{
void fileChanged(File file);
}
}