1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.dirwatch;
35
36 import info.magnolia.init.MagnoliaConfigurationProperties;
37 import info.magnolia.objectfactory.Components;
38
39 import java.io.IOException;
40 import java.nio.file.Path;
41 import java.util.concurrent.ExecutorService;
42 import java.util.concurrent.Executors;
43 import java.util.concurrent.Future;
44 import java.util.concurrent.TimeUnit;
45
46 import javax.inject.Singleton;
47
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51 import com.google.common.base.Predicate;
52
53
54
55
56
57
58
59 @Singleton
60 public class DirectoryWatcherService {
61
62 private static final Logger log = LoggerFactory.getLogger(DirectoryWatcherService.class);
63
64 private static final boolean RECURSIVE = true;
65 private static final boolean FOLLOW_LINKS = true;
66
67 private final ExecutorService executorService;
68 private final DirectoryWatcher watcher;
69
70 private Future<?> watcherFuture;
71
72 public DirectoryWatcherService(MagnoliaConfigurationProperties properties) throws IOException {
73
74 this.executorService = Executors.newSingleThreadExecutor();
75 this.watcher = new DirectoryWatcher(RECURSIVE, FOLLOW_LINKS, properties);
76 }
77
78
79
80
81 @Deprecated
82 public DirectoryWatcherService() throws IOException {
83 this(Components.getComponent(MagnoliaConfigurationProperties.class));
84 }
85
86 public void start() {
87 }
88
89
90
91
92 public synchronized void register(Path path, Predicate<Path> filterPredicate, WatcherCallback callback) throws IOException {
93 if (watcherFuture == null) {
94 log.info("Starting DirectoryWatcher");
95 watcherFuture = executorService.submit(watcher);
96 }
97 watcher.register(path, filterPredicate, callback);
98 }
99
100 public void stop() {
101 executorService.shutdownNow();
102
103 boolean terminated = false;
104 try {
105 terminated = executorService.awaitTermination(1, TimeUnit.SECONDS);
106 } catch (InterruptedException e) {
107 log.error("Exception during service termination", e);
108 }
109 if (terminated) {
110 log.info("{} terminated.", getClass().getSimpleName());
111 } else {
112 log.warn("{} not terminated, some tasks are still running.", getClass().getSimpleName());
113 }
114 }
115
116 }