X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.java;h=a19290e5360b874eb7b8a638c25b274858cda937;hb=918190a7948e8c45398059dec7c446c8662450ae;hp=8cff1befcd623b29a67c6546fe801ae8db9a6737;hpb=888268b3742d0fca33bc50fc42f6956f3142e503;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 8cff1be..a19290e 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -48,13 +48,17 @@ import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.DatabaseException; import net.pterodactylus.sone.database.PostDatabase; import net.pterodactylus.sone.database.SoneBuilder; +import net.pterodactylus.sone.freenet.wot.Identity; import net.pterodactylus.util.config.Configuration; 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; @@ -73,13 +77,14 @@ public class MemoryDatabase extends AbstractService implements Database { /** The configuration. */ private final Configuration configuration; + private final Map identities = Maps.newHashMap(); private final Map sones = new HashMap(); /** All posts by their ID. */ 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>(); @@ -154,6 +159,16 @@ public class MemoryDatabase extends AbstractService implements Database { } @Override + public Optional getIdentity(String identityId) { + lock.readLock().lock(); + try { + return fromNullable(identities.get(identityId)); + } finally { + lock.readLock().unlock(); + } + } + + @Override public Optional getSone(String soneId) { lock.readLock().lock(); try { @@ -214,7 +229,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 @@ -238,7 +258,7 @@ 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); } @@ -253,7 +273,7 @@ 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); } @@ -276,7 +296,7 @@ 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()) { @@ -285,7 +305,7 @@ public class MemoryDatabase extends AbstractService implements Database { } /* 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()) { @@ -303,7 +323,7 @@ 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()) { @@ -662,37 +682,6 @@ public class MemoryDatabase extends AbstractService implements Database { // /** - * 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. *