1 package org.simantics.fileimport.dropins;
\r
3 import static java.nio.file.StandardWatchEventKinds.OVERFLOW;
\r
4 import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
\r
5 import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
\r
6 import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
\r
8 import java.io.IOException;
\r
9 import java.nio.file.FileSystem;
\r
10 import java.nio.file.FileVisitResult;
\r
11 import java.nio.file.Files;
\r
12 import java.nio.file.Path;
\r
13 import java.nio.file.SimpleFileVisitor;
\r
14 import java.nio.file.WatchEvent;
\r
15 import java.nio.file.WatchEvent.Kind;
\r
16 import java.nio.file.attribute.BasicFileAttributes;
\r
17 import java.util.HashMap;
\r
18 import java.util.Map;
\r
19 import java.util.Optional;
\r
20 import java.util.concurrent.atomic.AtomicBoolean;
\r
21 import java.nio.file.WatchKey;
\r
22 import java.nio.file.WatchService;
\r
24 import org.simantics.fileimport.Activator;
\r
25 import org.simantics.fileimport.FileImportService;
\r
27 public class FileImportDropins {
\r
29 private static Thread watcherThread = null;
\r
30 private static DropinsFolderWatcher watcher = null;
\r
32 public static void watchDropinsFolder() {
\r
33 if (watcher == null && watcherThread == null) {
\r
35 watcher = new DropinsFolderWatcher(Activator.getDropinsFolder());
\r
36 watcherThread = new Thread(watcher, "Simantics Dropins Folder watcher thread");
\r
37 watcherThread.setDaemon(true);
\r
38 watcherThread.start();
\r
39 } catch (IOException e) {
\r
40 e.printStackTrace();
\r
45 public static void unwatchDropinsFolder() {
\r
48 watcherThread.join(500);
\r
49 if (watcherThread.isAlive())
\r
50 watcherThread.interrupt();
\r
51 } catch (InterruptedException e) {
\r
52 e.printStackTrace();
\r
54 watcherThread = null;
\r
58 private static class DropinsFolderWatcher implements Runnable {
\r
60 private final Path dropinsFolder;
\r
61 private final WatchService ws;
\r
62 private final AtomicBoolean stopped = new AtomicBoolean(true);
\r
64 private final Map<WatchKey, Path> keys = new HashMap<>();
\r
66 public DropinsFolderWatcher(Path dropinsFolder) throws IOException {
\r
67 this.dropinsFolder = dropinsFolder;
\r
68 FileSystem fs = dropinsFolder.getFileSystem();
\r
69 this.ws = fs.newWatchService();
\r
70 registerAll(this.dropinsFolder);
\r
77 while (!stopped.get()) {
\r
79 WatchKey key = ws.take();
\r
80 for (WatchEvent<?> watchEvent : key.pollEvents()) {
\r
81 if (OVERFLOW == watchEvent.kind())
\r
84 @SuppressWarnings("unchecked")
\r
85 WatchEvent<Path> pathEvent = (WatchEvent<Path>) watchEvent;
\r
86 Kind<Path> kind = pathEvent.kind();
\r
88 Path parent = keys.get(key);
\r
89 Path newPath = parent.resolve(pathEvent.context());
\r
90 if (FileImportService.DB_FILE.equals(newPath.getFileName().toString()))
\r
92 if (ENTRY_CREATE == kind) {
\r
93 System.out.println("New path created: " + newPath);
\r
94 FileImportService.performFileImport(newPath, Optional.empty());
\r
96 } else if (ENTRY_MODIFY == kind) {
\r
97 System.out.println("New path modified: " + newPath);
\r
98 } else if (ENTRY_DELETE == kind) {
\r
99 System.out.println("New path deleted: " + newPath);
\r
100 FileImportService.removeResourceForFile(newPath.toAbsolutePath(), Optional.empty());
\r
103 if (!key.reset()) {
\r
107 } catch (IOException e) {
\r
108 e.printStackTrace();
\r
109 } catch (InterruptedException e) {
\r
110 if (!stopped.get())
\r
111 e.printStackTrace();
\r
112 } catch (Throwable t) {
\r
113 t.printStackTrace();
\r
118 public void stop() {
\r
122 private void registerAll(Path path) throws IOException {
\r
123 Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
\r
126 public FileVisitResult preVisitDirectory(Path file, BasicFileAttributes attrs) throws IOException {
\r
128 return FileVisitResult.CONTINUE;
\r
133 private void register(Path path) throws IOException {
\r
134 if (Files.isDirectory(path)) {
\r
135 WatchKey key = path.toAbsolutePath().register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
\r
136 keys.put(key, path);
\r