X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.java;h=e311a5e957aa46af5766fd64d347e01164dd2832;hb=e80be3f00b1d486fd3995d8f29ce3bf04da7b61d;hp=d7cef49915bd94cec093a53eb9b5d7c429a5f7b8;hpb=7948a66da729b30be545d553e7a8234b5957b165;p=Sone.git 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 d7cef49..e311a5e 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -33,8 +33,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -42,8 +40,8 @@ import net.pterodactylus.sone.data.Album; import net.pterodactylus.sone.data.Image; import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.PostReply; -import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; +import net.pterodactylus.sone.data.impl.DefaultSoneBuilder; import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.DatabaseException; import net.pterodactylus.sone.database.PostDatabase; @@ -55,8 +53,10 @@ import net.pterodactylus.util.config.ConfigurationException; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.HashMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; import com.google.common.collect.SortedSetMultimap; import com.google.common.collect.TreeMultimap; import com.google.common.util.concurrent.AbstractService; @@ -82,10 +82,10 @@ public class MemoryDatabase extends AbstractService implements Database { private final Map allPosts = new HashMap(); /** All posts by their Sones. */ - private final Map> sonePosts = new HashMap>(); + private final Multimap sonePosts = HashMultimap.create(); /** All posts by their recipient. */ - private final Map> recipientPosts = new HashMap>(); + private final Multimap recipientPosts = HashMultimap.create(); /** Whether posts are known. */ private final Set knownPosts = new HashSet(); @@ -103,7 +103,13 @@ public class MemoryDatabase extends AbstractService implements Database { }, PostReply.TIME_COMPARATOR); /** Replies by post. */ - private final Map> postReplies = new HashMap>(); + private final SortedSetMultimap postReplies = TreeMultimap.create(new Comparator() { + + @Override + public int compare(String leftString, String rightString) { + return leftString.compareTo(rightString); + } + }, PostReply.TIME_COMPARATOR); /** Whether post replies are known. */ private final Set knownPostReplies = new HashSet(); @@ -208,7 +214,19 @@ public class MemoryDatabase extends AbstractService implements Database { @Override public SoneBuilder newSoneBuilder() { - return null; + return new DefaultSoneBuilder(this) { + @Override + public Sone build(Optional soneCreated) throws IllegalStateException { + Sone sone = super.build(soneCreated); + lock.writeLock().lock(); + try { + sones.put(sone.getId(), sone); + } finally { + lock.writeLock().unlock(); + } + return sone; + } + }; } // @@ -227,7 +245,12 @@ public class MemoryDatabase extends AbstractService implements Database { @Override public Collection getPosts(String soneId) { - return new HashSet(getPostsFrom(soneId)); + lock.readLock().lock(); + try { + return new HashSet(sonePosts.get(soneId)); + } finally { + lock.readLock().unlock(); + } } @Override @@ -251,9 +274,9 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allPosts.put(post.getId(), post); - getPostsFrom(post.getSone().getId()).add(post); + sonePosts.put(post.getSone().getId(), post); if (post.getRecipientId().isPresent()) { - getPostsTo(post.getRecipientId().get()).add(post); + recipientPosts.put(post.getRecipientId().get(), post); } } finally { lock.writeLock().unlock(); @@ -266,9 +289,9 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allPosts.remove(post.getId()); - getPostsFrom(post.getSone().getId()).remove(post); + sonePosts.remove(post.getSone().getId(), post); if (post.getRecipientId().isPresent()) { - getPostsTo(post.getRecipientId().get()).remove(post); + recipientPosts.remove(post.getRecipientId().get(), post); } post.getSone().removePost(post); } finally { @@ -289,20 +312,20 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { /* remove all posts by the Sone. */ - getPostsFrom(sone.getId()).clear(); + sonePosts.removeAll(sone.getId()); for (Post post : posts) { allPosts.remove(post.getId()); if (post.getRecipientId().isPresent()) { - getPostsTo(post.getRecipientId().get()).remove(post); + recipientPosts.remove(post.getRecipientId().get(), post); } } /* add new posts. */ - getPostsFrom(sone.getId()).addAll(posts); + sonePosts.putAll(sone.getId(), posts); for (Post post : posts) { allPosts.put(post.getId(), post); if (post.getRecipientId().isPresent()) { - getPostsTo(post.getRecipientId().get()).add(post); + recipientPosts.put(post.getRecipientId().get(), post); } } } finally { @@ -316,11 +339,11 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { /* remove all posts by the Sone. */ - getPostsFrom(sone.getId()).clear(); + sonePosts.removeAll(sone.getId()); for (Post post : sone.getPosts()) { allPosts.remove(post.getId()); if (post.getRecipientId().isPresent()) { - getPostsTo(post.getRecipientId().get()).remove(post); + recipientPosts.remove(post.getRecipientId().get(), post); } } } finally { @@ -391,13 +414,7 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allPostReplies.put(postReply.getId(), postReply); - if (postReplies.containsKey(postReply.getPostId())) { - postReplies.get(postReply.getPostId()).add(postReply); - } else { - TreeSet replies = new TreeSet(Reply.TIME_COMPARATOR); - replies.add(postReply); - postReplies.put(postReply.getPostId(), replies); - } + postReplies.put(postReply.getPostId(), postReply); } finally { lock.writeLock().unlock(); } @@ -422,13 +439,7 @@ public class MemoryDatabase extends AbstractService implements Database { for (PostReply postReply : postReplies) { allPostReplies.put(postReply.getId(), postReply); sonePostReplies.put(postReply.getSone().getId(), postReply); - if (this.postReplies.containsKey(postReply.getPostId())) { - this.postReplies.get(postReply.getPostId()).add(postReply); - } else { - TreeSet replies = new TreeSet(Reply.TIME_COMPARATOR); - replies.add(postReply); - this.postReplies.put(postReply.getPostId(), replies); - } + this.postReplies.put(postReply.getPostId(), postReply); } } finally { lock.writeLock().unlock(); @@ -440,12 +451,7 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allPostReplies.remove(postReply.getId()); - if (postReplies.containsKey(postReply.getPostId())) { - postReplies.get(postReply.getPostId()).remove(postReply); - if (postReplies.get(postReply.getPostId()).isEmpty()) { - postReplies.remove(postReply.getPostId()); - } - } + postReplies.remove(postReply.getPostId(), postReply); } finally { lock.writeLock().unlock(); } @@ -530,7 +536,9 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allAlbums.put(album.getId(), album); - albumChildren.put(album.getParent().getId(), album.getId()); + if (!album.isRoot()) { + albumChildren.put(album.getParent().getId(), album.getId()); + } } finally { lock.writeLock().unlock(); } @@ -674,68 +682,6 @@ public class MemoryDatabase extends AbstractService implements Database { // PRIVATE METHODS // - /** - * Gets all posts for the given Sone, creating a new collection if there is - * none yet. - * - * @param soneId - * The ID of the Sone to get the posts for - * @return All posts - */ - private Collection getPostsFrom(String soneId) { - Collection posts = null; - lock.readLock().lock(); - try { - posts = sonePosts.get(soneId); - } finally { - lock.readLock().unlock(); - } - if (posts != null) { - return posts; - } - - posts = new HashSet(); - lock.writeLock().lock(); - try { - sonePosts.put(soneId, posts); - } finally { - lock.writeLock().unlock(); - } - - return posts; - } - - /** - * Gets all posts that are directed the given Sone, creating a new collection - * if there is none yet. - * - * @param recipientId - * The ID of the Sone to get the posts for - * @return All posts - */ - private Collection getPostsTo(String recipientId) { - Collection posts = null; - lock.readLock().lock(); - try { - posts = recipientPosts.get(recipientId); - } finally { - lock.readLock().unlock(); - } - if (posts != null) { - return posts; - } - - posts = new HashSet(); - lock.writeLock().lock(); - try { - recipientPosts.put(recipientId, posts); - } finally { - lock.writeLock().unlock(); - } - - return posts; - } - /** Loads the known posts. */ private void loadKnownPosts() { lock.writeLock().lock();