package com.sandwich.util.io; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import com.sandwich.koan.ApplicationSettings; public class FileMonitorFactory { private static Map<String, FileMonitor> monitors = new LinkedHashMap<String, FileMonitor>(); public static final int SLEEP_TIME_IN_MS = 500; static { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){ public void run() { for(FileMonitor monitor : monitors.values()){ monitor.close(); } monitors.clear(); } })); Thread pollingThread = new Thread(new Runnable(){ public void run() { do{ if(ApplicationSettings.isInteractive()){ try { Thread.sleep(SLEEP_TIME_IN_MS); } catch (InterruptedException e) { throw new RuntimeException(e); } } for(Entry<String, FileMonitor> filePathAndMonitor : monitors.entrySet()){ FileMonitor monitor = filePathAndMonitor.getValue(); if(monitor != null){ monitor.notifyListeners(); } } }while(ApplicationSettings.isInteractive()); } }); pollingThread.setName("FileMonitorPolling"); if (ApplicationSettings.isInteractive()) { pollingThread.start(); } } public static FileMonitor getInstance(File monitoredFile, File dataFile) { String key = monitoredFile.getAbsolutePath() + dataFile.getAbsolutePath(); FileMonitor monitor = monitors.get(key); if(monitor == null){ monitor = new FileMonitor(monitoredFile, dataFile); monitors.put(key, monitor); } return monitor; } public static void removeInstance(FileMonitor monitor){ monitor.close(); monitors.remove(monitor.getFilesystemPath()); } public static void removeInstance(String absolutePath) { monitors.remove(absolutePath); } public static void closeAll() { for(FileMonitor monitor : monitors.values()){ monitor.close(); } monitors.clear(); } }