// Copyright (C) 2007 Google Inc.
//
// 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.
import java.io.File;
import java.util.Hashtable;
import java.util.Timer;
import java.util.TimerTask;
/**
* Monitor files for changes. This singleton class maintains a map of files to
* monitor and objects to notify when something they change.
*/
public class FileMonitor {
private static final FileMonitor SINGLETON = new FileMonitor();
private Timer timer;
private Hashtable<String, TimerTask> timerTasks;
private FileMonitor() {
timer = new Timer(true);
timerTasks = new Hashtable<String, TimerTask>();
}
/**
* Returns the singleton instance of this class.
* @return the singleton instance
*/
public static FileMonitor getInstance() {
return SINGLETON;
}
/**
* Start monitoring a file.
*
* @param listener listener to notify when the file changed.
* @param fileName name of the file to monitor.
* @param period polling period in milliseconds.
*/
public void addFileChangeListener(FileChangeListener listener,
String fileName, long period) {
removeFileChangeListener(listener, fileName);
FileMonitorTask task = new FileMonitorTask(listener, fileName);
timerTasks.put(fileName + listener.hashCode(), task);
timer.schedule(task, period, period);
}
/**
* Remove the listener from the notification list.
*
* @param listener the listener to be removed.
*/
public void removeFileChangeListener(FileChangeListener listener,
String fileName) {
FileMonitorTask task = (FileMonitorTask) timerTasks.remove(fileName
+ listener.hashCode());
if (task != null) {
task.cancel();
}
}
protected void fireFileChangeEvent(FileChangeListener listener,
String fileName) {
listener.fileChanged(fileName);
}
class FileMonitorTask extends TimerTask {
FileChangeListener listener;
String fileName;
File monitoredFile;
long lastModified;
public FileMonitorTask(FileChangeListener listener, String fileName) {
this.listener = listener;
this.fileName = fileName;
this.lastModified = 0;
monitoredFile = new File(fileName);
this.lastModified = getLastModified();
}
private long getLastModified() {
if (monitoredFile.exists()) {
return monitoredFile.lastModified();
} else {
return -1;
}
}
@Override
public void run() {
long lastModified = getLastModified();
if (lastModified != this.lastModified) {
this.lastModified = lastModified;
fireFileChangeEvent(this.listener, this.fileName);
}
}
}
public interface FileChangeListener {
public void fileChanged(String fileName);
}
}