From 57c75978b69d28154010497ba5420f190856b66c Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Sun, 8 Mar 2020 20:19:37 +0000 Subject: [PATCH] wip on feed manager deserialization --- .../core/filefeeds/FeedItemLoadedEvent.groovy | 7 ++ .../core/filefeeds/FeedLoadedEvent.groovy | 7 ++ .../muwire/core/filefeeds/FeedManager.groovy | 93 +++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 core/src/main/groovy/com/muwire/core/filefeeds/FeedItemLoadedEvent.groovy create mode 100644 core/src/main/groovy/com/muwire/core/filefeeds/FeedLoadedEvent.groovy create mode 100644 core/src/main/groovy/com/muwire/core/filefeeds/FeedManager.groovy diff --git a/core/src/main/groovy/com/muwire/core/filefeeds/FeedItemLoadedEvent.groovy b/core/src/main/groovy/com/muwire/core/filefeeds/FeedItemLoadedEvent.groovy new file mode 100644 index 00000000..146f3708 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/filefeeds/FeedItemLoadedEvent.groovy @@ -0,0 +1,7 @@ +package com.muwire.core.filefeeds + +import com.muwire.core.Event + +class FeedItemLoadedEvent extends Event { + FeedItem item +} diff --git a/core/src/main/groovy/com/muwire/core/filefeeds/FeedLoadedEvent.groovy b/core/src/main/groovy/com/muwire/core/filefeeds/FeedLoadedEvent.groovy new file mode 100644 index 00000000..7e92554e --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/filefeeds/FeedLoadedEvent.groovy @@ -0,0 +1,7 @@ +package com.muwire.core.filefeeds + +import com.muwire.core.Event + +class FeedLoadedEvent extends Event { + Feed feed +} diff --git a/core/src/main/groovy/com/muwire/core/filefeeds/FeedManager.groovy b/core/src/main/groovy/com/muwire/core/filefeeds/FeedManager.groovy new file mode 100644 index 00000000..3214b163 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/filefeeds/FeedManager.groovy @@ -0,0 +1,93 @@ +package com.muwire.core.filefeeds + +import java.nio.file.Files +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.ThreadFactory + +import com.muwire.core.EventBus +import com.muwire.core.Persona + +import groovy.json.JsonSlurper +import groovy.util.logging.Log + +import net.i2p.data.Base64 + +@Log +class FeedManager { + + private final EventBus eventBus + private final File metadataFolder, itemsFolder + private final Map feeds = new ConcurrentHashMap<>() + private final Map> feedItems = new ConcurrentHashMap<>() + + private final ExecutorService persister = Executors.newSingleThreadExecutor({r -> + new Thread(r, "feed persister") + } as ThreadFactory) + + + FeedManager(EventBus eventBus, File home) { + this.eventBus = eventBus + File feedsFolder = new File(home, "filefeeds") + if (!feedsFolder.exists()) + feedsFolder.mkdir() + this.metadataFolder = new File(feedsFolder, "metadata") + if (!metadataFolder.exists()) + metadataFolder.mkdir() + this.itemsFolder = new File(feedsFolder, "items") + if (!itemsFolder.exists()) + itemsFolder.mkdir() + } + + void start() { + log.info("starting feed manager") + persister.submit({loadFeeds()} as Runnable) + persister.submit({loadItems()} as Runnable) + } + + void stop() { + persister.shutdown() + } + + private void loadFeeds() { + def slurper = new JsonSlurper() + Files.walk(metadataFolder.toPath()). + filter( { it.getFileName().toString().endsWith(".json")}). + forEach( { + def parsed = slurper.parse(it.toFile()) + Persona publisher = new Persona(new ByteArrayInputStream(Base64.decode(parsed.publisher))) + Feed feed = new Feed(publisher) + feed.setUpdateInterval(parsed.updateInterval) + feed.setLastUpdated(parsed.lastUpdated) + feed.setItemsToKeep(parsed.itemsToKeep) + feed.setAutoDownload(parsed.autoDownload) + + feeds.put(feed.getPublisher(), feed) + + eventBus.publish(new FeedLoadedEvent(feed : feed)) + }) + } + + private void loadItems() { + def slurper = new JsonSlurper() + feeds.keySet().each { + File itemsFile = new File(itemsFolder, it.destination.toBase32() + ".json") + if (!itemsFile.exists()) + return // no items yet? + itemsFile.eachLine { line -> + def parsed = slurper.parse(line) + FeedItem item = FeedItems.objToFeedItem(parsed, it) + + Set items = feedItems.get(it) + if (items == null) { + items = new HashSet<>() + feedItems.put(it, items) + } + items.add(item) + + eventBus.publish(new FeedItemLoadedEvent(item : item)) + } + } + } +}