From 92a433a77ffa470a74f99cf8c92c84189f769095 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sat, 29 Mar 2014 02:24:37 +0000 Subject: [PATCH] * fix NPE --- .../filebot/cli/FolderWatchService.java | 115 +++++++----------- 1 file changed, 46 insertions(+), 69 deletions(-) diff --git a/source/net/sourceforge/filebot/cli/FolderWatchService.java b/source/net/sourceforge/filebot/cli/FolderWatchService.java index c8dd02f6..e1c568c7 100644 --- a/source/net/sourceforge/filebot/cli/FolderWatchService.java +++ b/source/net/sourceforge/filebot/cli/FolderWatchService.java @@ -1,7 +1,5 @@ - package net.sourceforge.filebot.cli; - import static java.nio.file.StandardWatchEventKinds.*; import static java.util.Collections.*; import static net.sourceforge.tuned.FileUtilities.*; @@ -29,18 +27,17 @@ import java.util.logging.Logger; import net.sourceforge.tuned.DefaultThreadFactory; import net.sourceforge.tuned.Timer; - public abstract class FolderWatchService implements Closeable { - + private final Collection commitSet = new HashSet(); - + private final ExecutorService processor = Executors.newSingleThreadExecutor(); private final ExecutorService watchers = Executors.newCachedThreadPool(new DefaultThreadFactory("FolderWatchService")); - + private long commitDelay = 500; // 0.5 s private boolean commitPerFolder = true; private final Timer commitTimer = new Timer() { - + @Override public void run() { synchronized (processor) { @@ -48,37 +45,32 @@ public abstract class FolderWatchService implements Closeable { } } }; - + private final boolean watchTree; - - + public FolderWatchService(boolean watchTree) { this.watchTree = watchTree; } - - + public synchronized void setCommitPerFolder(boolean enabled) { this.commitPerFolder = enabled; } - - + public synchronized void setCommitDelay(long commitDelay) { if (commitDelay < 0) throw new IllegalArgumentException("Delay must not be negativ"); - + this.commitDelay = commitDelay; resetCommitTimer(); } - - + public synchronized void resetCommitTimer() { commitTimer.set(commitDelay, TimeUnit.MILLISECONDS, false); } - - + public synchronized void commit() { final SortedSet files = new TreeSet(); - + synchronized (commitSet) { for (File it : commitSet) { if (it.isFile()) { @@ -87,16 +79,16 @@ public abstract class FolderWatchService implements Closeable { } commitSet.clear(); } - + if (files.isEmpty()) { return; } - + // divide into commit batches per folder if required final Map> commitBatches = commitPerFolder ? mapByFolder(files) : singletonMap((File) null, files); - + processor.submit(new Runnable() { - + @Override public void run() { synchronized (processor) { @@ -107,37 +99,36 @@ public abstract class FolderWatchService implements Closeable { } }); } - - + public abstract void processCommitSet(File[] files, File dir); - - + public synchronized void watchFolder(File folder) throws IOException { if (!watchTree) { startWatch(folder); return; } - + watchFolderTree(folder); } - - + private void watchFolderTree(File root) throws IOException { - for (File it : root.listFiles(FOLDERS)) { - watchFolderTree(it); + File[] folders = root.listFiles(FOLDERS); + if (folders != null) { + for (File it : folders) { + watchFolderTree(it); + } } - + startWatch(root); } - - + private synchronized void startWatch(File node) throws IOException { if (!node.isDirectory()) { throw new IllegalArgumentException("Must be a folder: " + node); } - + watchers.submit(new FolderWatcher(node) { - + @Override protected void processEvents(List> events) { synchronized (commitSet) { @@ -145,8 +136,7 @@ public abstract class FolderWatchService implements Closeable { super.processEvents(events); } } - - + @Override protected void created(File file) { synchronized (commitSet) { @@ -154,7 +144,7 @@ public abstract class FolderWatchService implements Closeable { commitSet.add(file); return; } - + // start watching newly created folder if (watchTree) { try { @@ -166,8 +156,7 @@ public abstract class FolderWatchService implements Closeable { } } } - - + @Override protected void modified(File file) { synchronized (commitSet) { @@ -176,8 +165,7 @@ public abstract class FolderWatchService implements Closeable { } } } - - + @Override protected void deleted(File file) { synchronized (commitSet) { @@ -186,29 +174,25 @@ public abstract class FolderWatchService implements Closeable { } }); } - - + @Override public synchronized void close() throws IOException { commitTimer.cancel(); processor.shutdownNow(); watchers.shutdownNow(); } - - + private abstract static class FolderWatcher implements Runnable, Closeable { - + private final Path node; private final WatchService watchService; - - + public FolderWatcher(File node) throws IOException { this.node = node.toPath(); this.watchService = this.node.getFileSystem().newWatchService(); this.node.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE); } - - + @Override public void run() { try { @@ -219,8 +203,7 @@ public abstract class FolderWatchService implements Closeable { Logger.getLogger(getClass().getName()).log(Level.WARNING, e.getMessage(), e); } } - - + public void watch() throws IOException, InterruptedException { try { boolean valid = true; @@ -233,13 +216,11 @@ public abstract class FolderWatchService implements Closeable { this.close(); } } - - + public File getAbsoluteFile(WatchEvent event) { return node.resolve(event.context().toString()).toFile(); } - - + protected void processEvents(List> list) { for (WatchEvent event : list) { if (event.kind() == ENTRY_CREATE) { @@ -251,21 +232,17 @@ public abstract class FolderWatchService implements Closeable { } } } - - + protected abstract void created(File file); - - + protected abstract void modified(File file); - - + protected abstract void deleted(File file); - - + @Override public void close() throws IOException { watchService.close(); } } - + }