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=d7e9f58189a9456911d3c770e75f78c7409be388;hp=13c0530175f5f7f0ce490793dc6aea097474b1cb;hb=e641b6984bf4d67fb842d7a858e8521f2b34155f;hpb=d8959f34c36864af99e027a6ee41805e86acda16 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 13c0530..d7e9f58 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -17,6 +17,7 @@ package net.pterodactylus.sone.database.memory; +import static com.google.common.base.Optional.fromNullable; import static com.google.common.base.Preconditions.checkNotNull; import java.util.ArrayList; @@ -33,12 +34,18 @@ import java.util.TreeSet; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +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.AlbumBuilderImpl; +import net.pterodactylus.sone.data.impl.ImageBuilderImpl; +import net.pterodactylus.sone.database.AlbumBuilder; import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.DatabaseException; +import net.pterodactylus.sone.database.ImageBuilder; import net.pterodactylus.sone.database.PostBuilder; import net.pterodactylus.sone.database.PostDatabase; import net.pterodactylus.sone.database.PostReplyBuilder; @@ -47,6 +54,8 @@ import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; import com.google.common.base.Optional; +import com.google.common.collect.HashMultimap; +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; @@ -72,10 +81,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(); @@ -98,13 +107,17 @@ public class MemoryDatabase extends AbstractService implements Database { /** Whether post replies are known. */ private final Set knownPostReplies = new HashSet(); + private final Map allAlbums = new HashMap(); + + private final Map allImages = new HashMap(); + /** * Creates a new memory database. * * @param soneProvider - * The Sone provider + * The Sone provider * @param configuration - * The configuration for loading and saving elements + * The configuration for loading and saving elements */ @Inject public MemoryDatabase(SoneProvider soneProvider, Configuration configuration) { @@ -120,7 +133,7 @@ public class MemoryDatabase extends AbstractService implements Database { * Saves the database. * * @throws DatabaseException - * if an error occurs while saving + * if an error occurs while saving */ @Override public void save() throws DatabaseException { @@ -132,9 +145,7 @@ public class MemoryDatabase extends AbstractService implements Database { // SERVICE METHODS // - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override protected void doStart() { loadKnownPosts(); @@ -142,9 +153,7 @@ public class MemoryDatabase extends AbstractService implements Database { notifyStarted(); } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override protected void doStop() { try { @@ -159,36 +168,30 @@ public class MemoryDatabase extends AbstractService implements Database { // POSTPROVIDER METHODS // - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public Optional getPost(String postId) { lock.readLock().lock(); try { - return Optional.fromNullable(allPosts.get(postId)); + return fromNullable(allPosts.get(postId)); } finally { lock.readLock().unlock(); } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public Collection getPosts(String soneId) { return new HashSet(getPostsFrom(soneId)); } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public Collection getDirectedPosts(String recipientId) { lock.readLock().lock(); try { Collection posts = recipientPosts.get(recipientId); - return (posts == null) ? Collections. emptySet() : new HashSet(posts); + return (posts == null) ? Collections.emptySet() : new HashSet(posts); } finally { lock.readLock().unlock(); } @@ -198,9 +201,7 @@ public class MemoryDatabase extends AbstractService implements Database { // POSTBUILDERFACTORY METHODS // - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public PostBuilder newPostBuilder() { return new MemoryPostBuilder(this, soneProvider); @@ -210,9 +211,7 @@ public class MemoryDatabase extends AbstractService implements Database { // POSTSTORE METHODS // - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void storePost(Post post) { checkNotNull(post, "post must not be null"); @@ -228,9 +227,7 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void removePost(Post post) { checkNotNull(post, "post must not be null"); @@ -247,9 +244,7 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void storePosts(Sone sone, Collection posts) throws IllegalArgumentException { checkNotNull(sone, "sone must not be null"); @@ -263,8 +258,8 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { /* remove all posts by the Sone. */ - getPostsFrom(sone.getId()).clear(); - for (Post post : posts) { + Collection oldPosts = getPostsFrom(sone.getId()); + for (Post post : oldPosts) { allPosts.remove(post.getId()); if (post.getRecipientId().isPresent()) { getPostsTo(post.getRecipientId().get()).remove(post); @@ -284,9 +279,7 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void removePosts(Sone sone) { checkNotNull(sone, "sone must not be null"); @@ -309,22 +302,18 @@ public class MemoryDatabase extends AbstractService implements Database { // POSTREPLYPROVIDER METHODS // - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public Optional getPostReply(String id) { lock.readLock().lock(); try { - return Optional.fromNullable(allPostReplies.get(id)); + return fromNullable(allPostReplies.get(id)); } finally { lock.readLock().unlock(); } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public List getReplies(String postId) { lock.readLock().lock(); @@ -342,9 +331,7 @@ public class MemoryDatabase extends AbstractService implements Database { // POSTREPLYBUILDERFACTORY METHODS // - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public PostReplyBuilder newPostReplyBuilder() { return new MemoryPostReplyBuilder(this, soneProvider); @@ -354,9 +341,7 @@ public class MemoryDatabase extends AbstractService implements Database { // POSTREPLYSTORE METHODS // - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void storePostReply(PostReply postReply) { lock.writeLock().lock(); @@ -374,9 +359,7 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void storePostReplies(Sone sone, Collection postReplies) { checkNotNull(sone, "sone must not be null"); @@ -409,9 +392,7 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void removePostReply(PostReply postReply) { lock.writeLock().lock(); @@ -428,9 +409,7 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@inheritDocs} - */ + /** {@inheritDocs} */ @Override public void removePostReplies(Sone sone) { checkNotNull(sone, "sone must not be null"); @@ -446,6 +425,100 @@ public class MemoryDatabase extends AbstractService implements Database { } // + // ALBUMPROVDER METHODS + // + + @Override + public Optional getAlbum(String albumId) { + lock.readLock().lock(); + try { + return fromNullable(allAlbums.get(albumId)); + } finally { + lock.readLock().unlock(); + } + } + + // + // ALBUMBUILDERFACTORY METHODS + // + + @Override + public AlbumBuilder newAlbumBuilder() { + return new AlbumBuilderImpl(); + } + + // + // ALBUMSTORE METHODS + // + + @Override + public void storeAlbum(Album album) { + lock.writeLock().lock(); + try { + allAlbums.put(album.getId(), album); + } finally { + lock.writeLock().unlock(); + } + } + + @Override + public void removeAlbum(Album album) { + lock.writeLock().lock(); + try { + allAlbums.remove(album.getId()); + } finally { + lock.writeLock().unlock(); + } + } + + // + // IMAGEPROVIDER METHODS + // + + @Override + public Optional getImage(String imageId) { + lock.readLock().lock(); + try { + return fromNullable(allImages.get(imageId)); + } finally { + lock.readLock().unlock(); + } + } + + // + // IMAGEBUILDERFACTORY METHODS + // + + @Override + public ImageBuilder newImageBuilder() { + return new ImageBuilderImpl(); + } + + // + // IMAGESTORE METHODS + // + + @Override + public void storeImage(Image image) { + lock.writeLock().lock(); + try { + allImages.put(image.getId(), image); + } finally { + lock.writeLock().unlock(); + } + } + + @Override + public void removeImage(Image image) { + lock.writeLock().lock(); + try { + allImages.remove(image.getId()); + } finally { + lock.writeLock().unlock(); + } + } + + // // PACKAGE-PRIVATE METHODS // @@ -453,7 +526,7 @@ public class MemoryDatabase extends AbstractService implements Database { * Returns whether the given post is known. * * @param post - * The post + * The post * @return {@code true} if the post is known, {@code false} otherwise */ boolean isPostKnown(Post post) { @@ -469,9 +542,9 @@ public class MemoryDatabase extends AbstractService implements Database { * Sets whether the given post is known. * * @param post - * The post + * The post * @param known - * {@code true} if the post is known, {@code false} otherwise + * {@code true} if the post is known, {@code false} otherwise */ void setPostKnown(Post post, boolean known) { lock.writeLock().lock(); @@ -490,7 +563,7 @@ public class MemoryDatabase extends AbstractService implements Database { * Returns whether the given post reply is known. * * @param postReply - * The post reply + * The post reply * @return {@code true} if the given post reply is known, {@code false} * otherwise */ @@ -507,10 +580,9 @@ public class MemoryDatabase extends AbstractService implements Database { * Sets whether the given post reply is known. * * @param postReply - * The post reply + * The post reply * @param known - * {@code true} if the post reply is known, {@code false} - * otherwise + * {@code true} if the post reply is known, {@code false} otherwise */ void setPostReplyKnown(PostReply postReply, boolean known) { lock.writeLock().lock(); @@ -534,66 +606,36 @@ public class MemoryDatabase extends AbstractService implements Database { * none yet. * * @param soneId - * The ID of the Sone to get the posts for + * 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); + return 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. + * 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 + * 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); + return 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. - */ + /** Loads the known posts. */ private void loadKnownPosts() { lock.writeLock().lock(); try { @@ -614,7 +656,7 @@ public class MemoryDatabase extends AbstractService implements Database { * Saves the known posts to the configuration. * * @throws DatabaseException - * if a configuration error occurs + * if a configuration error occurs */ private void saveKnownPosts() throws DatabaseException { lock.readLock().lock(); @@ -671,7 +713,7 @@ public class MemoryDatabase extends AbstractService implements Database { * Saves the known post replies to the configuration. * * @throws DatabaseException - * if a configuration error occurs + * if a configuration error occurs */ private void saveKnownPostReplies() throws DatabaseException { lock.readLock().lock();