1 | sclass RecursiWatcherService extends AutoCloseable {
|
2 | File rootFolder; |
3 | WatchService watcher; |
4 | ExecutorService executor; |
5 | |
6 | public void init() throws IOException {
|
7 | watcher = FileSystems.getDefault().newWatchService(); |
8 | executor = Executors.newSingleThreadExecutor(); |
9 | startRecursiveWatcher(); |
10 | } |
11 | |
12 | void cleanMeUp() { close(); }
|
13 | public void close() {
|
14 | pcall { watcher.close(); }
|
15 | executor.shutdown(); |
16 | } |
17 | |
18 | private void startRecursiveWatcher() throws IOException {
|
19 | LOG.info("Starting Recursive Watcher");
|
20 | |
21 | final Map<WatchKey, Path> keys = new HashMap<>(); |
22 | |
23 | Consumer<Path> register = p -> {
|
24 | if (!p.toFile().exists() || !p.toFile().isDirectory()) {
|
25 | throw new RuntimeException("folder " + p + " does not exist or is not a directory");
|
26 | } |
27 | try {
|
28 | Files.walkFileTree(p, new SimpleFileVisitor<Path>() {
|
29 | @Override |
30 | public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
|
31 | LOG.info("registering " + dir + " in watcher service");
|
32 | WatchKey watchKey = dir.register(watcher, new WatchEvent.Kind[]{ENTRY_CREATE}, SensitivityWatchEventModifier.HIGH);
|
33 | keys.put(watchKey, dir); |
34 | return FileVisitResult.CONTINUE; |
35 | } |
36 | }); |
37 | } catch (IOException e) {
|
38 | throw new RuntimeException("Error registering path " + p);
|
39 | } |
40 | }; |
41 | |
42 | register.accept(rootFolder.toPath()); |
43 | |
44 | executor.submit(() -> {
|
45 | while (true) {
|
46 | final WatchKey key; |
47 | try {
|
48 | key = watcher.take(); // wait for a key to be available |
49 | } catch (InterruptedException ex) {
|
50 | return; |
51 | } |
52 | |
53 | final Path dir = keys.get(key); |
54 | if (dir == null) {
|
55 | System.err.println("WatchKey " + key + " not recognized!");
|
56 | continue; |
57 | } |
58 | |
59 | key.pollEvents().stream() |
60 | .filter(e -> (e.kind() != OVERFLOW)) |
61 | .map(e -> ((WatchEvent<Path>) e).context()) |
62 | .forEach(p -> {
|
63 | final Path absPath = dir.resolve(p); |
64 | if (absPath.toFile().isDirectory()) {
|
65 | register.accept(absPath); |
66 | } else {
|
67 | final File f = absPath.toFile(); |
68 | LOG.info("Detected new file " + f.getAbsolutePath());
|
69 | } |
70 | }); |
71 | |
72 | boolean valid = key.reset(); // IMPORTANT: The key must be reset after processed |
73 | if (!valid) {
|
74 | break; |
75 | } |
76 | } |
77 | }); |
78 | } |
79 | } |
download show line numbers debug dex old transpilations
Travelled to 12 computer(s): bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1019340 |
| Snippet name: | Recursive Watcher Service Spike [dev.] |
| Eternal ID of this version: | #1019340/1 |
| Text MD5: | 79658dc5046db62d09809c6bd6e1a2e8 |
| Author: | stefan |
| Category: | javax / gui / a.i. |
| Type: | JavaX source code (desktop) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-11-03 12:27:56 |
| Source code size: | 3048 bytes / 79 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 580 / 869 |
| Referenced in: | [show references] |