From 11e320ef530e18ac41a0523fca3f662b2fdcbabf Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 26 Mar 2020 04:09:18 +0000 Subject: [PATCH] wip on directory watching --- .../main/groovy/com/muwire/core/Core.groovy | 22 +++++++++- .../muwire/core/files/DirectoryWatcher.groovy | 3 +- .../files/directories/WatchedDirectory.groovy | 9 ++++ .../WatchedDirectoryConfigurationEvent.groovy | 7 +++ .../WatchedDirectoryConvertedEvent.groovy | 1 - .../WatchedDirectoryConverter.groovy | 28 ++++++++++++ .../WatchedDirectoryManager.groovy | 43 +++++++++++++++++++ 7 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectory.groovy create mode 100644 core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConfigurationEvent.groovy create mode 100644 core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConverter.groovy create mode 100644 core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index e43f69bb..7e65e3b7 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -55,7 +55,10 @@ import com.muwire.core.files.HasherService import com.muwire.core.files.PersisterService import com.muwire.core.files.SideCarFileEvent import com.muwire.core.files.UICommentEvent - +import com.muwire.core.files.directories.WatchedDirectoryConfigurationEvent +import com.muwire.core.files.directories.WatchedDirectoryConvertedEvent +import com.muwire.core.files.directories.WatchedDirectoryConverter +import com.muwire.core.files.directories.WatchedDirectoryManager import com.muwire.core.files.AllFilesLoadedEvent import com.muwire.core.files.DirectoryUnsharedEvent import com.muwire.core.files.DirectoryWatchedEvent @@ -130,6 +133,8 @@ public class Core { final ChatManager chatManager final FeedManager feedManager private final FeedClient feedClient + private final WatchedDirectoryConverter watchedDirectoryConverter + final WatchedDirectoryManager watchedDirectoryManager private final Router router @@ -388,7 +393,7 @@ public class Core { log.info("initializing directory watcher") directoryWatcher = new DirectoryWatcher(eventBus, fileManager, home, props) eventBus.register(DirectoryWatchedEvent.class, directoryWatcher) - eventBus.register(AllFilesLoadedEvent.class, directoryWatcher) + eventBus.register(WatchedDirectoryConvertedEvent.class, directoryWatcher) eventBus.register(DirectoryUnsharedEvent.class, directoryWatcher) log.info("initializing hasher service") @@ -411,6 +416,17 @@ public class Core { BrowseManager browseManager = new BrowseManager(i2pConnector, eventBus, me) eventBus.register(UIBrowseEvent.class, browseManager) + log.info("initializing watched directory converter") + watchedDirectoryConverter = new WatchedDirectoryConverter(this) + eventBus.register(AllFilesLoadedEvent.class, watchedDirectoryConverter) + + log.info("initializing watched directory manager") + watchedDirectoryManager = new WatchedDirectoryManager(home, eventBus, fileManager) + eventBus.with { + register(WatchedDirectoryConfigurationEvent.class, watchedDirectoryManager) + register(WatchedDirectoryConvertedEvent.class, watchedDirectoryManager) + } + } public void startServices() { @@ -454,6 +470,8 @@ public class Core { connectionEstablisher.stop() log.info("shutting down directory watcher") directoryWatcher.stop() + log.info("shutting down watch directory manager") + watchedDirectoryManager.shutdown() log.info("shutting down cache client") cacheClient.stop() log.info("shutting down chat server") diff --git a/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy b/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy index 54d2a592..17e1b339 100644 --- a/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy +++ b/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy @@ -15,6 +15,7 @@ import java.util.concurrent.ConcurrentHashMap import com.muwire.core.EventBus import com.muwire.core.MuWireSettings import com.muwire.core.SharedFile +import com.muwire.core.files.directories.WatchedDirectoryConvertedEvent import groovy.util.logging.Log import net.i2p.util.SystemVersion @@ -53,7 +54,7 @@ class DirectoryWatcher { publisherThread.setDaemon(true) } - void onAllFilesLoadedEvent(AllFilesLoadedEvent e) { + void onWatchedDirectoryConvertedEvent(WatchedDirectoryConvertedEvent e) { watchService = FileSystems.getDefault().newWatchService() watcherThread.start() publisherThread.start() diff --git a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectory.groovy b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectory.groovy new file mode 100644 index 00000000..e9a3b867 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectory.groovy @@ -0,0 +1,9 @@ +package com.muwire.core.files.directories + + +class WatchedDirectory { + File directory + boolean autoWatch + int syncInterval + long lastSync +} diff --git a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConfigurationEvent.groovy b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConfigurationEvent.groovy new file mode 100644 index 00000000..34d0a4f0 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConfigurationEvent.groovy @@ -0,0 +1,7 @@ +package com.muwire.core.files.directories + +import com.muwire.core.Event + +class WatchedDirectoryConfigurationEvent extends Event { + WatchedDirectory directory +} diff --git a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConvertedEvent.groovy b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConvertedEvent.groovy index 9603932d..a2a72f10 100644 --- a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConvertedEvent.groovy +++ b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConvertedEvent.groovy @@ -7,5 +7,4 @@ import com.muwire.core.Event * new format. */ class WatchedDirectoryConvertedEvent extends Event { - String directoryPath } diff --git a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConverter.groovy b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConverter.groovy new file mode 100644 index 00000000..ffd69268 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryConverter.groovy @@ -0,0 +1,28 @@ +package com.muwire.core.files.directories + +import com.muwire.core.Core +import com.muwire.core.files.AllFilesLoadedEvent + +/** + * converts the setting-based format to new folder-based format. + */ +class WatchedDirectoryConverter { + + private final Core core + + WatchedDirectoryConverter(Core core) { + this.core = core + } + + void onAllFilesLoadedEvent(AllFilesLoadedEvent e) { + core.getMuOptions().getWatchedDirectories().each { + File directory = new File(it) + directory = directory.getCanonicalFile() + WatchedDirectory watched = new WatchedDirectory(directory : directory, autoWatch : true) + core.eventBus.publish(new WatchedDirectoryConfigurationEvent(directory : watched)) + } + core.getMuOptions().getWatchedDirectories().clear() + core.saveMuSettings() + core.eventBus.publish(new WatchedDirectoryConvertedEvent()) + } +} diff --git a/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy new file mode 100644 index 00000000..135be384 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/directories/WatchedDirectoryManager.groovy @@ -0,0 +1,43 @@ +package com.muwire.core.files.directories + +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.ThreadFactory + +import com.muwire.core.EventBus +import com.muwire.core.files.FileManager + +class WatchedDirectoryManager { + + private final File home + private final EventBus eventBus + private final FileManager fileManager + + + private final ExecutorService diskIO = Executors.newSingleThreadExecutor({r -> + Thread t = new Thread(r, "disk-io") + t.setDaemon(true) + t + } as ThreadFactory) + + private final Timer timer = new Timer("directory-timer", true) + + WatchedDirectoryManager(File home, EventBus eventBus, FileManager fileManager) { + this.home = home + this.eventBus = eventBus + this.fileManager = fileManager + } + + public void shutdown() { + diskIO.shutdown() + timer.cancel() + } + + void onWatchedDirectoryConfigurationEvent(WatchedDirectoryConfigurationEvent e) { + // persist + } + + void onWatchedDirectoryConvertedEvent(WatchedDirectoryConvertedEvent e) { + // load + } +}