/** * Stops the watch thread by interrupting it and subsequently * calls the {@link #afterStop()} template method (to be implemented * by subclasses. */ public synchronized void stop() { if (watchThread != null) { try { running.set(false); watchThread.interrupt(); // Call after-stop hook afterStop(); } catch (IOException e) { logger.log(Level.FINE, "Could not close watcher", e); } } }
@Override public void run() { running.set(true); beforePollEventLoop(); // Call before-loop hook while (running.get()) { try { boolean relevantEvents = pollEvents(); if (relevantEvents) { restartWaitSettlementTimer(); } } catch (InterruptedException e) { logger.log(Level.FINE, "Could not poll the events. EXITING watcher.", e); running.set(false); } catch (ClosedWatchServiceException e) { logger.log(Level.FINE, "Watch closed or polling failed. EXITING watcher.", e); running.set(false); } } } }, "Watcher/" + root.toFile().getName());
private void stopRecursiveWatcher() { try { logger.log(Level.INFO, "Stopping recursive watcher for " + config.getLocalDir() + " ..."); recursiveWatcher.stop(); } catch (Exception e) { logger.log(Level.WARNING, "Cannot stop file watcher.", e); } }
private void startRecursiveWatcher() { logger.log(Level.INFO, "Starting recursive watcher for " + config.getLocalDir() + " ..."); Path localDir = Paths.get(config.getLocalDir().getAbsolutePath()); List<Path> ignorePaths = new ArrayList<Path>(); ignorePaths.add(Paths.get(config.getAppDir().getAbsolutePath())); ignorePaths.add(Paths.get(config.getCacheDir().getAbsolutePath())); ignorePaths.add(Paths.get(config.getDatabaseDir().getAbsolutePath())); ignorePaths.add(Paths.get(config.getLogDir().getAbsolutePath())); recursiveWatcher = RecursiveWatcher.createRecursiveWatcher(localDir, ignorePaths, options.getSettleDelay(), this); try { recursiveWatcher.start(); } catch (Exception e) { logger.log(Level.WARNING, "Cannot initiate file watcher. Relying on regular tree walks.", e); } }
@Override public void run() { logger.log(Level.INFO, "File system actions (on watched folders) settled. Updating watches ..."); watchEventsOccurred(); fireListenerEvents(); } }, settleDelay);
@Test public void testGetFolder() throws Exception { final AtomicInteger eventCount = new AtomicInteger(0); final Path tempDir = TestFileUtil.createTempDirectoryInSystemTemp("RecursiveWatcherTest").toPath(); RecursiveWatcher watcher = RecursiveWatcher.createRecursiveWatcher(tempDir, new ArrayList<Path>(), 300, new WatchListener() { @Override public void watchEventsOccurred() { eventCount.incrementAndGet(); } }); watcher.start(); Thread.sleep(100); TestFileUtil.createRandomFileInDirectory(tempDir.toFile(), 111); Thread.sleep(350); TestFileUtil.createRandomFileInDirectory(tempDir.toFile(), 222); Thread.sleep(350); TestFileUtil.createRandomFileInDirectory(tempDir.toFile(), 333); Thread.sleep(350); assertEquals(3, eventCount.get()); TestFileUtil.deleteDirectory(tempDir.toFile()); }