wip on directory watching

This commit is contained in:
Zlatin Balevsky
2020-03-26 04:09:18 +00:00
parent 23b6995bf2
commit 11e320ef53
7 changed files with 109 additions and 4 deletions

View File

@ -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")

View File

@ -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()

View File

@ -0,0 +1,9 @@
package com.muwire.core.files.directories
class WatchedDirectory {
File directory
boolean autoWatch
int syncInterval
long lastSync
}

View File

@ -0,0 +1,7 @@
package com.muwire.core.files.directories
import com.muwire.core.Event
class WatchedDirectoryConfigurationEvent extends Event {
WatchedDirectory directory
}

View File

@ -7,5 +7,4 @@ import com.muwire.core.Event
* new format.
*/
class WatchedDirectoryConvertedEvent extends Event {
String directoryPath
}

View File

@ -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())
}
}

View File

@ -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
}
}