X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.java;h=6481a1b0ee56931ade9fcce215e688f66b918fed;hp=c9dd543765ab092df5068d1f8efa7fcb044698a7;hb=36b8e20651c14970ca30a1b8ed43af219b367bc9;hpb=01540cbd527e955dac1e41c2e6855a89ab12605c diff --git a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java index c9dd543..6481a1b 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -51,6 +51,7 @@ import net.pterodactylus.sone.database.ImageBuilder; import net.pterodactylus.sone.database.PostBuilder; import net.pterodactylus.sone.database.PostDatabase; import net.pterodactylus.sone.database.PostReplyBuilder; +import net.pterodactylus.sone.database.SoneBuilder; import net.pterodactylus.sone.database.SoneProvider; import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; @@ -81,6 +82,7 @@ public class MemoryDatabase extends AbstractService implements Database { /** The configuration. */ private final Configuration configuration; + private final ConfigurationLoader configurationLoader; private final Map allSones = new HashMap(); @@ -114,6 +116,8 @@ public class MemoryDatabase extends AbstractService implements Database { private final Map allImages = new HashMap(); private final Multimap soneImages = HashMultimap.create(); + private final MemoryBookmarkDatabase memoryBookmarkDatabase; + /** * Creates a new memory database. * @@ -126,6 +130,9 @@ public class MemoryDatabase extends AbstractService implements Database { public MemoryDatabase(SoneProvider soneProvider, Configuration configuration) { this.soneProvider = soneProvider; this.configuration = configuration; + this.configurationLoader = new ConfigurationLoader(configuration); + memoryBookmarkDatabase = + new MemoryBookmarkDatabase(this, configurationLoader); } // @@ -151,6 +158,7 @@ public class MemoryDatabase extends AbstractService implements Database { /** {@inheritDocs} */ @Override protected void doStart() { + memoryBookmarkDatabase.start(); loadKnownPosts(); loadKnownPostReplies(); notifyStarted(); @@ -168,9 +176,43 @@ public class MemoryDatabase extends AbstractService implements Database { } @Override + public SoneBuilder newSoneBuilder() { + return new MemorySoneBuilder(); + } + + @Override public void storeSone(Sone sone) { lock.writeLock().lock(); try { + removeSone(sone); + + allSones.put(sone.getId(), sone); + sonePosts.putAll(sone.getId(), sone.getPosts()); + for (Post post : sone.getPosts()) { + allPosts.put(post.getId(), post); + } + sonePostReplies.putAll(sone.getId(), sone.getReplies()); + for (PostReply postReply : sone.getReplies()) { + allPostReplies.put(postReply.getId(), postReply); + } + soneAlbums.putAll(sone.getId(), toAllAlbums.apply(sone)); + for (Album album : toAllAlbums.apply(sone)) { + allAlbums.put(album.getId(), album); + } + soneImages.putAll(sone.getId(), toAllImages.apply(sone)); + for (Image image : toAllImages.apply(sone)) { + allImages.put(image.getId(), image); + } + } finally { + lock.writeLock().unlock(); + } + } + + @Override + public void removeSone(Sone sone) { + lock.writeLock().lock(); + try { + allSones.remove(sone.getId()); Collection removedPosts = sonePosts.removeAll(sone.getId()); for (Post removedPost : removedPosts) { allPosts.remove(removedPost.getId()); @@ -190,24 +232,6 @@ public class MemoryDatabase extends AbstractService implements Database { for (Image removedImage : removedImages) { allImages.remove(removedImage.getId()); } - - allSones.put(sone.getId(), sone); - sonePosts.putAll(sone.getId(), sone.getPosts()); - for (Post post : sone.getPosts()) { - allPosts.put(post.getId(), post); - } - sonePostReplies.putAll(sone.getId(), sone.getReplies()); - for (PostReply postReply : sone.getReplies()) { - allPostReplies.put(postReply.getId(), postReply); - } - soneAlbums.putAll(sone.getId(), toAllAlbums.apply(sone)); - for (Album album : toAllAlbums.apply(sone)) { - allAlbums.put(album.getId(), album); - } - soneImages.putAll(sone.getId(), toAllImages.apply(sone)); - for (Image image : toAllImages.apply(sone)) { - allImages.put(image.getId(), image); - } } finally { lock.writeLock().unlock(); } @@ -227,7 +251,7 @@ public class MemoryDatabase extends AbstractService implements Database { public Collection getSones() { lock.readLock().lock(); try { - return unmodifiableCollection(allSones.values()); + return new HashSet(allSones.values()); } finally { lock.readLock().unlock(); } @@ -584,6 +608,31 @@ public class MemoryDatabase extends AbstractService implements Database { } } + @Override + public void bookmarkPost(String postId) { + memoryBookmarkDatabase.bookmarkPost(postId); + } + + @Override + public void bookmarkPost(Post post) { + memoryBookmarkDatabase.bookmarkPost(post); + } + + @Override + public void unbookmarkPost(Post post) { + memoryBookmarkDatabase.unbookmarkPost(post); + } + + @Override + public boolean isPostBookmarked(Post post) { + return memoryBookmarkDatabase.isPostBookmarked(post); + } + + @Override + public Set getBookmarkedPosts() { + return memoryBookmarkDatabase.getBookmarkedPosts(); + } + // // PACKAGE-PRIVATE METHODS // @@ -686,16 +735,11 @@ public class MemoryDatabase extends AbstractService implements Database { /** Loads the known posts. */ private void loadKnownPosts() { + Set knownPosts = configurationLoader.loadKnownPosts(); lock.writeLock().lock(); try { - int postCounter = 0; - while (true) { - String knownPostId = configuration.getStringValue("KnownPosts/" + postCounter++ + "/ID").getValue(null); - if (knownPostId == null) { - break; - } - knownPosts.add(knownPostId); - } + this.knownPosts.clear(); + this.knownPosts.addAll(knownPosts); } finally { lock.writeLock().unlock(); } @@ -732,7 +776,7 @@ public class MemoryDatabase extends AbstractService implements Database { private Collection getRepliesFrom(String id) { lock.readLock().lock(); try { - return Collections.unmodifiableCollection(sonePostReplies.get(id)); + return unmodifiableCollection(sonePostReplies.get(id)); } finally { lock.readLock().unlock(); } @@ -740,16 +784,11 @@ public class MemoryDatabase extends AbstractService implements Database { /** Loads the known post replies. */ private void loadKnownPostReplies() { + Set knownPostReplies = configurationLoader.loadKnownPostReplies(); lock.writeLock().lock(); try { - int replyCounter = 0; - while (true) { - String knownReplyId = configuration.getStringValue("KnownReplies/" + replyCounter++ + "/ID").getValue(null); - if (knownReplyId == null) { - break; - } - knownPostReplies.add(knownReplyId); - } + this.knownPostReplies.clear(); + this.knownPostReplies.addAll(knownPostReplies); } finally { lock.writeLock().unlock(); }