// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.util; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import org.eclipse.jetty.util.PathWatcher.PathWatchEvent; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; public class PathWatcherDemo implements PathWatcher.Listener { private static final Logger LOG = Log.getLogger(PathWatcherDemo.class); public static void main(String[] args) { List<Path> paths = new ArrayList<>(); for (String arg : args) { paths.add(new File(arg).toPath()); } if (paths.isEmpty()) { LOG.warn("No paths specified on command line"); System.exit(-1); } PathWatcherDemo demo = new PathWatcherDemo(); try { demo.run(paths); } catch (Throwable t) { LOG.warn(t); } } public void run(List<Path> paths) throws Exception { PathWatcher watcher = new PathWatcher(); //watcher.addListener(new PathWatcherDemo()); watcher.addListener (new PathWatcher.EventListListener(){ @Override public void onPathWatchEvents(List<PathWatchEvent> events) { if (events == null) LOG.warn("Null events received"); if (events.isEmpty()) LOG.warn("Empty events received"); LOG.info("Bulk notification received"); for (PathWatchEvent e:events) onPathWatchEvent(e); } }); watcher.setNotifyExistingOnStart(false); List<String> excludes = new ArrayList<>(); excludes.add("glob:*.bak"); // ignore backup files excludes.add("regex:^.*/\\~[^/]*$"); // ignore scratch files for (Path path : paths) { if (Files.isDirectory(path)) { PathWatcher.Config config = new PathWatcher.Config(path); config.addExcludeHidden(); config.addExcludes(excludes); config.setRecurseDepth(4); watcher.watch(config); } else { watcher.watch(path); } } watcher.start(); Thread.currentThread().join(); } @Override public void onPathWatchEvent(PathWatchEvent event) { StringBuilder msg = new StringBuilder(); msg.append("onPathWatchEvent: ["); msg.append(event.getType()); msg.append("] "); msg.append(event.getPath()); msg.append(" (count=").append(event.getCount()).append(")"); if (Files.isRegularFile(event.getPath())) { try { String fsize = String.format(" (filesize=%,d)",Files.size(event.getPath())); msg.append(fsize); } catch (IOException e) { LOG.warn("Unable to get filesize",e); } } LOG.info("{}",msg.toString()); } }