/** * Schedule delay used when tracking {@link #asResource(File)} files. * * <p>Access provided for test cases. */ public static void schedule(long delay, TimeUnit unit) { watcher.schedule(delay, unit); }
@Override public ResourceNotificationDispatcher getResourceNotificationDispatcher() { if (watcher == null) { watcher = new FileSystemWatcher( new FileSystemWatcher.FileExtractor() { @Override public File getFile(String path) { return Paths.toFile(baseDirectory, path); } }); } return watcher; } }
@Override public void addListener(ResourceListener listener) { watcher.addListener(path(), listener); }
public synchronized void addListener(String path, ResourceListener listener) { File file = fileExtractor.getFile(path); if (file == null) { throw new NullPointerException("File to watch is required"); } if (path == null) { throw new NullPointerException("Path for notification is required"); } Watch watch = watch(file, path); if (watch == null) { watch = new Watch(file, path); watchers.add(watch); if (monitor == null) { monitor = pool.scheduleWithFixedDelay(sync, delay, delay, unit); } } watch.addListener(listener); }
@Override public void removeListener(ResourceListener listener) { watcher.removeListener(path(), listener); }
public synchronized boolean removeListener(String path, ResourceListener listener) { File file = fileExtractor.getFile(path); if (file == null) { throw new NullPointerException("File to watch is required"); } if (path == null) { throw new NullPointerException("Path for notification is required"); } Watch watch = watch(file, path); boolean removed = false; if (watch != null) { watch.removeListener(listener); if (watch.getListeners().isEmpty()) { removed = watchers.remove(watch); } } if (removed && watchers.isEmpty()) { if (monitor != null) { monitor.cancel(false); // stop watching nobody is looking monitor = null; } } return removed; }
@Test public void fileEvents() throws Exception { File fileD = Paths.toFile(store.baseDirectory, "DirC/FileD"); AwaitResourceListener listener = new AwaitResourceListener(); store.get("DirC/FileD").addListener(listener); store.watcher.schedule(30, TimeUnit.MILLISECONDS); long before = fileD.lastModified(); long after = touch(fileD); assertTrue("touched", after > before); ResourceNotification n = listener.await(5, TimeUnit.SECONDS); assertNotNull("detected event", n); assertEquals("file modified", Kind.ENTRY_MODIFY, n.getKind()); assertTrue("Resource only", n.events().isEmpty()); listener.reset(); fileD.delete(); n = listener.await(5, TimeUnit.SECONDS); assertEquals("file removed", Kind.ENTRY_DELETE, n.getKind()); listener.reset(); fileD.createNewFile(); n = listener.await(5, TimeUnit.SECONDS); assertEquals("file created", Kind.ENTRY_CREATE, n.getKind()); store.get("DirC/FileD").removeListener(listener); } /**
store.watcher.schedule(30, TimeUnit.MILLISECONDS);
@Test public void fileEvents() throws Exception { File fileD = Paths.toFile(store.baseDirectory, "DirC/FileD"); AwaitResourceListener listener = new AwaitResourceListener(); store.get("DirC/FileD").addListener(listener); store.watcher.schedule(30, TimeUnit.MILLISECONDS); long before = fileD.lastModified(); long after = touch(fileD); assertTrue("touched", after > before); ResourceNotification n = listener.await(5, TimeUnit.SECONDS); assertNotNull("detected event", n); assertEquals("file modified", Kind.ENTRY_MODIFY, n.getKind()); assertTrue("Resource only", n.events().isEmpty()); listener.reset(); fileD.delete(); n = listener.await(5, TimeUnit.SECONDS); assertEquals("file removed", Kind.ENTRY_DELETE, n.getKind()); listener.reset(); fileD.createNewFile(); n = listener.await(5, TimeUnit.SECONDS); assertEquals("file created", Kind.ENTRY_CREATE, n.getKind()); store.get("DirC/FileD").removeListener(listener); } /**
store.watcher.schedule(30, TimeUnit.MILLISECONDS);