X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.java;h=db64c79688965eaa30742c71061788798862d362;hb=4479b8a9e2e8b3a51b998c757e6c26ee2853bbd5;hp=264571ef0cd51cac648a9bafa255d6edc81bf331;hpb=3ff261bd1cdb77acd9e4015ec0c5b98a1c487f9a;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 264571e..db64c79 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -17,11 +17,12 @@ package net.pterodactylus.sone.database.memory; -import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.*; 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,7 +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.AbstractPostReplyBuilder; import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.DatabaseException; import net.pterodactylus.sone.database.PostBuilder; @@ -48,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; @@ -82,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>(); @@ -337,7 +347,7 @@ public class MemoryDatabase extends AbstractService implements Database { */ @Override public PostReplyBuilder newPostReplyBuilder() { - return new MemoryPostReplyBuilder(); + return new MemoryPostReplyBuilder(this, soneProvider); } // @@ -379,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 { @@ -617,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 { @@ -656,26 +688,4 @@ public class MemoryDatabase extends AbstractService implements Database { } } - /** - * {@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; - } - - } - }