diff options
author | Matt Kohls <mattkohls13@gmail.com> | 2018-11-19 23:03:20 -0500 |
---|---|---|
committer | Matt Kohls <mattkohls13@gmail.com> | 2018-11-19 23:03:20 -0500 |
commit | 47ebae8b5085b7deed8fc10b69bc0f4be4d4e00d (patch) | |
tree | 7f148edc3b72a5f832b44fa78a41972b268f19eb | |
parent | cdb25dd2ac7065b5211364730e5bb03b435a3358 (diff) | |
download | SoundChan-feature/sound-rescan.tar.gz SoundChan-feature/sound-rescan.tar.bz2 SoundChan-feature/sound-rescan.zip |
Handling events from sub-dirs correctlyfeature/sound-rescan
-rw-r--r-- | src/main/java/soundchan/BotListener/MediaWatcher.java | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/main/java/soundchan/BotListener/MediaWatcher.java b/src/main/java/soundchan/BotListener/MediaWatcher.java index 80a0c83..2784eec 100644 --- a/src/main/java/soundchan/BotListener/MediaWatcher.java +++ b/src/main/java/soundchan/BotListener/MediaWatcher.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import static java.lang.Thread.sleep; import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; @@ -17,6 +18,7 @@ public class MediaWatcher implements Runnable { private Path mediaDir; private WatchService watchService; private WatchKey watchKey; + private ArrayList<WatchKey> subDirKeys; private boolean isDirectory; private int sleepTime = 5000; @@ -68,6 +70,7 @@ public class MediaWatcher implements Runnable { } else if(mediaFile.isDirectory()) { this.mediaDir = mediaFile.toPath(); isDirectory = true; + subDirKeys = new ArrayList<>(); } try { this.watchService = FileSystems.getDefault().newWatchService(); @@ -77,7 +80,8 @@ public class MediaWatcher implements Runnable { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { try { - dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); + WatchKey temp = dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); + subDirKeys.add(temp); return FileVisitResult.CONTINUE; } catch (IOException e) { System.out.println("Error setting up watch service with sub dirs in " + filepath); @@ -97,10 +101,26 @@ public class MediaWatcher implements Runnable { public void run() { try { while(true) { - WatchKey key = watchService.take(); - if(this.watchKey != key) { + WatchKey key = watchService.take(); // Wait for an event to happen + + // Check this event happened in a place we are monitoring, otherwise ignore it + if(!isDirectory && this.watchKey != key) { System.out.println("Error with WatchKey"); continue; + } else if(isDirectory) { + if(this.watchKey != key) { // Our event doesn't happen in the root of the sounds directory + boolean noKeyMatch = true; + for(WatchKey subKey : subDirKeys) { // Check if it happened in on of the sub directories + if(subKey == key) { + noKeyMatch = false; + break; + } + } + if(noKeyMatch) { + System.out.println("Error with WatchKey"); + continue; + } + } } for(WatchEvent<?> event : key.pollEvents()) { |