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=571f9a38d543d28cae7e7136dd177b970a5d7f96;hp=0f795eb9564df9a86900d0ec40e9ce89f17bf9b2;hb=cbd6de75a2a96966a2381100c5b643feea702458;hpb=723de3522aa5c04634932f05bf4075304979c7a9 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 0f795eb..571f9a3 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -1,5 +1,5 @@ /* - * Sone - MemoryDatabase.java - Copyright © 2013 David Roden + * Sone - MemoryDatabase.java - Copyright © 2013–2016 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,13 +21,13 @@ import static com.google.common.base.Optional.fromNullable; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Predicates.not; import static com.google.common.collect.FluentIterable.from; -import static java.util.Collections.unmodifiableCollection; import static net.pterodactylus.sone.data.Reply.TIME_COMPARATOR; import static net.pterodactylus.sone.data.Sone.LOCAL_SONE_FILTER; import static net.pterodactylus.sone.data.Sone.toAllAlbums; import static net.pterodactylus.sone.data.Sone.toAllImages; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -37,6 +37,9 @@ import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import net.pterodactylus.sone.data.Album; import net.pterodactylus.sone.data.Image; import net.pterodactylus.sone.data.Post; @@ -52,11 +55,9 @@ 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; -import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -65,6 +66,7 @@ import com.google.common.collect.TreeMultimap; import com.google.common.util.concurrent.AbstractService; import com.google.inject.Inject; import com.google.inject.Singleton; +import kotlin.jvm.functions.Function1; /** * Memory-based {@link PostDatabase} implementation. @@ -77,9 +79,6 @@ public class MemoryDatabase extends AbstractService implements Database { /** The lock. */ private final ReadWriteLock lock = new ReentrantReadWriteLock(); - /** The Sone provider. */ - private final SoneProvider soneProvider; - /** The configuration. */ private final Configuration configuration; private final ConfigurationLoader configurationLoader; @@ -117,22 +116,21 @@ public class MemoryDatabase extends AbstractService implements Database { private final Multimap soneImages = HashMultimap.create(); private final MemoryBookmarkDatabase memoryBookmarkDatabase; + private final MemoryFriendDatabase memoryFriendDatabase; /** * Creates a new memory database. * - * @param soneProvider - * The Sone provider * @param configuration * The configuration for loading and saving elements */ @Inject - public MemoryDatabase(SoneProvider soneProvider, Configuration configuration) { - this.soneProvider = soneProvider; + public MemoryDatabase(Configuration configuration) { this.configuration = configuration; this.configurationLoader = new ConfigurationLoader(configuration); memoryBookmarkDatabase = new MemoryBookmarkDatabase(this, configurationLoader); + memoryFriendDatabase = new MemoryFriendDatabase(configurationLoader); } // @@ -178,7 +176,7 @@ public class MemoryDatabase extends AbstractService implements Database { @Override public SoneBuilder newSoneBuilder() { - return new MemorySoneBuilder(); + return new MemorySoneBuilder(this); } @Override @@ -238,11 +236,22 @@ public class MemoryDatabase extends AbstractService implements Database { } } + @Nonnull + @Override + public Function1 getSoneLoader() { + return new Function1() { + @Override + public Sone invoke(String soneId) { + return getSone(soneId); + } + }; + } + @Override - public Optional getSone(String soneId) { + public Sone getSone(String soneId) { lock.readLock().lock(); try { - return fromNullable(allSones.get(soneId)); + return allSones.get(soneId); } finally { lock.readLock().unlock(); } @@ -279,16 +288,54 @@ public class MemoryDatabase extends AbstractService implements Database { } } + @Override + public Collection getFriends(Sone localSone) { + if (!localSone.isLocal()) { + return Collections.emptySet(); + } + return memoryFriendDatabase.getFriends(localSone.getId()); + } + + @Override + public boolean isFriend(Sone localSone, String friendSoneId) { + if (!localSone.isLocal()) { + return false; + } + return memoryFriendDatabase.isFriend(localSone.getId(), friendSoneId); + } + + @Override + public void addFriend(Sone localSone, String friendSoneId) { + if (!localSone.isLocal()) { + return; + } + memoryFriendDatabase.addFriend(localSone.getId(), friendSoneId); + } + + @Override + public void removeFriend(Sone localSone, String friendSoneId) { + if (!localSone.isLocal()) { + return; + } + memoryFriendDatabase.removeFriend(localSone.getId(), friendSoneId); + } + + @Nullable + @Override + public Long getFollowingTime(@Nonnull String friendSoneId) { + return memoryFriendDatabase.getFollowingTime(friendSoneId); + } + // // POSTPROVIDER METHODS // - /** {@inheritDocs} */ + @Nullable @Override - public Optional getPost(String postId) { + public Post getPost(@Nonnull String postId) { lock.readLock().lock(); try { - return fromNullable(allPosts.get(postId)); + return allPosts.get(postId); } finally { lock.readLock().unlock(); } @@ -323,7 +370,7 @@ public class MemoryDatabase extends AbstractService implements Database { /** {@inheritDocs} */ @Override public PostBuilder newPostBuilder() { - return new MemoryPostBuilder(this, soneProvider); + return new MemoryPostBuilder(this, this); } // @@ -357,61 +404,16 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** {@inheritDocs} */ - @Override - public void storePosts(Sone sone, Collection posts) throws IllegalArgumentException { - checkNotNull(sone, "sone must not be null"); - /* verify that all posts are from the same Sone. */ - for (Post post : posts) { - if (!sone.equals(post.getSone())) { - throw new IllegalArgumentException(String.format("Post from different Sone found: %s", post)); - } - } - - lock.writeLock().lock(); - try { - /* remove all posts by the Sone. */ - Collection oldPosts = getPostsFrom(sone.getId()); - for (Post post : oldPosts) { - allPosts.remove(post.getId()); - } - - /* add new posts. */ - getPostsFrom(sone.getId()).addAll(posts); - for (Post post : posts) { - allPosts.put(post.getId(), post); - } - } finally { - lock.writeLock().unlock(); - } - } - - /** {@inheritDocs} */ - @Override - public void removePosts(Sone sone) { - checkNotNull(sone, "sone must not be null"); - lock.writeLock().lock(); - try { - /* remove all posts by the Sone. */ - getPostsFrom(sone.getId()).clear(); - for (Post post : sone.getPosts()) { - allPosts.remove(post.getId()); - } - } finally { - lock.writeLock().unlock(); - } - } - // // POSTREPLYPROVIDER METHODS // - /** {@inheritDocs} */ + @Nullable @Override - public Optional getPostReply(String id) { + public PostReply getPostReply(String id) { lock.readLock().lock(); try { - return fromNullable(allPostReplies.get(id)); + return allPostReplies.get(id); } finally { lock.readLock().unlock(); } @@ -441,7 +443,7 @@ public class MemoryDatabase extends AbstractService implements Database { /** {@inheritDocs} */ @Override public PostReplyBuilder newPostReplyBuilder() { - return new MemoryPostReplyBuilder(this, soneProvider); + return new MemoryPostReplyBuilder(this, this); } // @@ -461,32 +463,6 @@ public class MemoryDatabase extends AbstractService implements Database { /** {@inheritDocs} */ @Override - public void storePostReplies(Sone sone, Collection postReplies) { - checkNotNull(sone, "sone must not be null"); - /* verify that all posts are from the same Sone. */ - for (PostReply postReply : postReplies) { - if (!sone.equals(postReply.getSone())) { - throw new IllegalArgumentException(String.format("PostReply from different Sone found: %s", postReply)); - } - } - - lock.writeLock().lock(); - try { - /* remove all post replies of the Sone. */ - for (PostReply postReply : getRepliesFrom(sone.getId())) { - removePostReply(postReply); - } - for (PostReply postReply : postReplies) { - allPostReplies.put(postReply.getId(), postReply); - sonePostReplies.put(postReply.getSone().getId(), postReply); - } - } finally { - lock.writeLock().unlock(); - } - } - - /** {@inheritDocs} */ - @Override public void removePostReply(PostReply postReply) { lock.writeLock().lock(); try { @@ -496,30 +472,16 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** {@inheritDocs} */ - @Override - public void removePostReplies(Sone sone) { - checkNotNull(sone, "sone must not be null"); - - lock.writeLock().lock(); - try { - for (PostReply postReply : sone.getReplies()) { - removePostReply(postReply); - } - } finally { - lock.writeLock().unlock(); - } - } - // // ALBUMPROVDER METHODS // + @Nullable @Override - public Optional getAlbum(String albumId) { + public Album getAlbum(@Nonnull String albumId) { lock.readLock().lock(); try { - return fromNullable(allAlbums.get(albumId)); + return allAlbums.get(albumId); } finally { lock.readLock().unlock(); } @@ -564,11 +526,12 @@ public class MemoryDatabase extends AbstractService implements Database { // IMAGEPROVIDER METHODS // + @Nullable @Override - public Optional getImage(String imageId) { + public Image getImage(@Nonnull String imageId) { lock.readLock().lock(); try { - return fromNullable(allImages.get(imageId)); + return allImages.get(imageId); } finally { lock.readLock().unlock(); } @@ -762,22 +725,6 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * Returns all replies by the given Sone. - * - * @param id - * The ID of the Sone - * @return The post replies of the Sone, sorted by time (newest first) - */ - private Collection getRepliesFrom(String id) { - lock.readLock().lock(); - try { - return unmodifiableCollection(sonePostReplies.get(id)); - } finally { - lock.readLock().unlock(); - } - } - /** Loads the known post replies. */ private void loadKnownPostReplies() { Set knownPostReplies = configurationLoader.loadKnownPostReplies();