X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.fileimport%2Fsrc%2Forg%2Fsimantics%2Ffileimport%2Fdropins%2FFileImportDropins.java;h=21a9f9ab0152fd5fab5d5a6d84d50e553d2a047f;hp=a32dd98775639f0f15b5224d011b72b54e7f17b2;hb=b809a171b6dfb81ed9ef9e84870dcbcbc5912f0e;hpb=0e8cf1e1708870e179330c2f9af2d03589d553ab;ds=sidebyside diff --git a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/dropins/FileImportDropins.java b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/dropins/FileImportDropins.java index a32dd9877..21a9f9ab0 100644 --- a/bundles/org.simantics.fileimport/src/org/simantics/fileimport/dropins/FileImportDropins.java +++ b/bundles/org.simantics.fileimport/src/org/simantics/fileimport/dropins/FileImportDropins.java @@ -1,34 +1,47 @@ package org.simantics.fileimport.dropins; -import static java.nio.file.StandardWatchEventKinds.OVERFLOW; import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; +import static java.nio.file.StandardWatchEventKinds.OVERFLOW; import java.io.IOException; +import java.io.RandomAccessFile; import java.nio.file.FileSystem; +import java.nio.file.FileSystemException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.WatchEvent; import java.nio.file.WatchEvent.Kind; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; import java.nio.file.attribute.BasicFileAttributes; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; import org.simantics.fileimport.Activator; import org.simantics.fileimport.FileImportService; +/** + * Directory watcher based on {@link java.nio.file.WatchService} which will listen to file changes inside the dropins directory + * ~/workspace/.metadata/plugins/org.simantics.fileimport/dropins + * + * @author Jani Simomaa + * + */ public class FileImportDropins { private static Thread watcherThread = null; private static DropinsFolderWatcher watcher = null; + /** + * Start watching the dropins folder which are located in + * ~/workspace/.metadata/plugins/org.simantics.fileimport/dropins + */ public static void watchDropinsFolder() { if (watcher == null && watcherThread == null) { try { @@ -42,6 +55,9 @@ public class FileImportDropins { } } + /** + * Stop watching the dropins folder + */ public static void unwatchDropinsFolder() { watcher.stop(); try { @@ -70,6 +86,29 @@ public class FileImportDropins { registerAll(this.dropinsFolder); } + private static void syncPath(Path f) throws IOException { + // Does not seem to need 's' according to unit test in Windows + boolean synced = false; + int count = 0; + while (!synced) { + try (RandomAccessFile raf = new RandomAccessFile(f.toFile(), "rw")) { + raf.getFD().sync(); + synced = true; + } catch (IOException e) { + if (count == 3) { + throw e; + } else { + try { + Thread.sleep(50); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + count++; + } + } + } + } + @Override public void run() { stopped.set(false); @@ -91,8 +130,28 @@ public class FileImportDropins { continue; if (ENTRY_CREATE == kind) { System.out.println("New path created: " + newPath); - FileImportService.performFileImport(newPath, Optional.empty()); + int current = 0; + + while (!Files.isWritable(newPath) && current <= 10) { + System.out.println("Sleeping for file import (current=" + current +")"); + Thread.sleep(200); + current++; + } + + FileImportService.performFileImport(newPath, Optional.of(t -> { + if (t instanceof FileSystemException) { + try { + syncPath(newPath); + } catch (IOException e) { + e.printStackTrace(); + } + FileImportService.performFileImport(newPath, Optional.empty()); + } else { + t.printStackTrace(); + } + })); register(newPath); + } else if (ENTRY_MODIFY == kind) { System.out.println("New path modified: " + newPath); } else if (ENTRY_DELETE == kind) { @@ -104,8 +163,6 @@ public class FileImportDropins { keys.remove(key); // break; // loop } - } catch (IOException e) { - e.printStackTrace(); } catch (InterruptedException e) { if (!stopped.get()) e.printStackTrace();