X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.java;h=13c0530175f5f7f0ce490793dc6aea097474b1cb;hb=d8959f34c36864af99e027a6ee41805e86acda16;hp=35d3c379276af50e349069b88859b2668120c84f;hpb=a43efdbac39a7462d5b9392ac064ea0e1042abb4;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 35d3c37..13c0530 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -29,7 +30,6 @@ import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import java.util.UUID; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -37,8 +37,6 @@ 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.AbstractPostBuilder; -import net.pterodactylus.sone.data.impl.AbstractPostReplyBuilder; import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.DatabaseException; import net.pterodactylus.sone.database.PostBuilder; @@ -49,6 +47,8 @@ import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; import com.google.common.base.Optional; +import com.google.common.collect.SortedSetMultimap; +import com.google.common.collect.TreeMultimap; import com.google.common.util.concurrent.AbstractService; import com.google.inject.Inject; @@ -83,6 +83,15 @@ public class MemoryDatabase extends AbstractService implements Database { /** All post replies by their ID. */ private final Map allPostReplies = new HashMap(); + /** Replies sorted by Sone. */ + private final SortedSetMultimap sonePostReplies = TreeMultimap.create(new Comparator() { + + @Override + public int compare(String leftString, String rightString) { + return leftString.compareTo(rightString); + } + }, PostReply.TIME_COMPARATOR); + /** Replies by post. */ private final Map> postReplies = new HashMap>(); @@ -194,7 +203,7 @@ public class MemoryDatabase extends AbstractService implements Database { */ @Override public PostBuilder newPostBuilder() { - return new MemoryPostBuilder(soneProvider); + return new MemoryPostBuilder(this, soneProvider); } // @@ -338,7 +347,7 @@ public class MemoryDatabase extends AbstractService implements Database { */ @Override public PostReplyBuilder newPostReplyBuilder() { - return new MemoryPostReplyBuilder(); + return new MemoryPostReplyBuilder(this, soneProvider); } // @@ -380,8 +389,13 @@ public class MemoryDatabase extends AbstractService implements Database { 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); if (this.postReplies.containsKey(postReply.getPostId())) { this.postReplies.get(postReply.getPostId()).add(postReply); } else { @@ -618,8 +632,25 @@ public class MemoryDatabase extends AbstractService implements Database { } /** - * Loads the known post replies. + * 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 { + if (sonePostReplies.containsKey(id)) { + return Collections.unmodifiableCollection(sonePostReplies.get(id)); + } + return Collections.emptySet(); + } finally { + lock.readLock().unlock(); + } + } + + /** Loads the known post replies. */ private void loadKnownPostReplies() { lock.writeLock().lock(); try { @@ -657,56 +688,4 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@link PostBuilder} implementation that creates a {@link MemoryPost}. - * - * @author David ‘Bombe’ Roden - */ - private class MemoryPostBuilder extends AbstractPostBuilder { - - /** - * Creates a new memory post builder. - * - * @param soneProvider - * The Sone provider - */ - public MemoryPostBuilder(SoneProvider soneProvider) { - super(soneProvider); - } - - /** - * {@inheritDocs} - */ - @Override - public Post build() throws IllegalStateException { - validate(); - Post post = new MemoryPost(MemoryDatabase.this, soneProvider, randomId ? UUID.randomUUID().toString() : id, senderId, recipientId, currentTime ? System.currentTimeMillis() : time, text); - post.setKnown(isPostKnown(post)); - return post; - } - - } - - /** - * {@link PostReplyBuilder} implementation that creates - * {@link MemoryPostReply} objects. - * - * @author David ‘Bombe’ Roden - */ - private class MemoryPostReplyBuilder extends AbstractPostReplyBuilder { - - /** - * {@inheritDocs} - */ - @Override - public PostReply build() throws IllegalStateException { - validate(); - - PostReply postReply = new MemoryPostReply(MemoryDatabase.this, soneProvider, randomId ? UUID.randomUUID().toString() : id, senderId, currentTime ? System.currentTimeMillis() : time, text, postId); - postReply.setKnown(isPostReplyKnown(postReply)); - return postReply; - } - - } - }