🎨 Replace in-memory post with Kotlin version
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / database / memory / MemoryDatabase.kt
index e943b38..589d977 100644 (file)
@@ -21,7 +21,8 @@ import com.google.common.base.Preconditions.checkNotNull
 import com.google.common.collect.HashMultimap
 import com.google.common.collect.Multimap
 import com.google.common.collect.TreeMultimap
-import com.google.common.util.concurrent.*
+import com.google.common.util.concurrent.AbstractService
+import com.google.common.util.concurrent.RateLimiter
 import com.google.inject.Inject
 import com.google.inject.Singleton
 import net.pterodactylus.sone.data.Album
@@ -41,10 +42,13 @@ import net.pterodactylus.sone.database.ImageBuilder
 import net.pterodactylus.sone.database.PostBuilder
 import net.pterodactylus.sone.database.PostDatabase
 import net.pterodactylus.sone.database.PostReplyBuilder
-import net.pterodactylus.sone.utils.*
+import net.pterodactylus.sone.utils.ifTrue
+import net.pterodactylus.sone.utils.unit
 import net.pterodactylus.util.config.Configuration
 import net.pterodactylus.util.config.ConfigurationException
 import java.util.concurrent.locks.ReentrantReadWriteLock
+import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock
+import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock
 import kotlin.concurrent.withLock
 
 /**
@@ -54,14 +58,14 @@ import kotlin.concurrent.withLock
 class MemoryDatabase @Inject constructor(private val configuration: Configuration) : AbstractService(), Database {
 
        private val lock = ReentrantReadWriteLock()
-       private val readLock by lazy { lock.readLock()!! }
-       private val writeLock by lazy { lock.writeLock()!! }
+       private val readLock: ReadLock by lazy { lock.readLock() }
+       private val writeLock: WriteLock by lazy { lock.writeLock() }
        private val configurationLoader = ConfigurationLoader(configuration)
        private val allSones = mutableMapOf<String, Sone>()
        private val allPosts = mutableMapOf<String, Post>()
        private val sonePosts: Multimap<String, Post> = HashMultimap.create<String, Post>()
        private val knownPosts = mutableSetOf<String>()
-       private val allPostReplies = mutableMapOf<String, PostReply>()
+       private val allPostReplies = mutableMapOf<String, MemoryPostReply.Shell>()
        private val sonePostReplies: Multimap<String, PostReply> = TreeMultimap.create<String, PostReply>(Comparator { leftString, rightString -> leftString.compareTo(rightString) }, newestReplyFirst)
        private val knownPostReplies = mutableSetOf<String>()
        private val allAlbums = mutableMapOf<String, Album>()
@@ -121,7 +125,7 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
                        }
                        sonePostReplies.putAll(sone.id, sone.replies)
                        for (postReply in sone.replies) {
-                               allPostReplies[postReply.id] = postReply
+                               allPostReplies[postReply.id] = postReply.toShell()
                        }
                        sone.allAlbums.let { albums ->
                                soneAlbums.putAll(sone.id, albums)
@@ -221,12 +225,15 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
                }
        }
 
-       override fun getPostReply(id: String) = readLock.withLock { allPostReplies[id] }
+       override fun getPostReply(id: String) = readLock.withLock {
+               allPostReplies[id]?.build(newPostReplyBuilder())
+       }
 
        override fun getReplies(postId: String) =
                        readLock.withLock {
                                allPostReplies.values
                                                .filter { it.postId == postId }
+                                               .map { it.build(newPostReplyBuilder()) }
                                                .sortedWith(newestReplyFirst.reversed())
                        }
 
@@ -235,7 +242,7 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
 
        override fun storePostReply(postReply: PostReply) =
                        writeLock.withLock {
-                               allPostReplies[postReply.id] = postReply
+                               allPostReplies[postReply.id] = postReply.toShell()
                        }
 
        override fun removePostReply(postReply: PostReply) =
@@ -284,7 +291,7 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
        override fun isPostBookmarked(post: Post) =
                        memoryBookmarkDatabase.isPostBookmarked(post)
 
-       protected fun isPostKnown(post: Post) = readLock.withLock { post.id in knownPosts }
+       internal fun isPostKnown(post: Post) = readLock.withLock { post.id in knownPosts }
 
        fun setPostKnown(post: Post, known: Boolean): Unit =
                        writeLock.withLock {
@@ -295,14 +302,11 @@ class MemoryDatabase @Inject constructor(private val configuration: Configuratio
                                saveKnownPosts()
                        }
 
-       protected fun isPostReplyKnown(postReply: PostReply) = readLock.withLock { postReply.id in knownPostReplies }
+       internal fun isPostReplyKnown(postReply: PostReply) = readLock.withLock { postReply.id in knownPostReplies }
 
-       fun setPostReplyKnown(postReply: PostReply, known: Boolean): Unit =
+       override fun setPostReplyKnown(postReply: PostReply): Unit =
                        writeLock.withLock {
-                               if (known)
-                                       knownPostReplies.add(postReply.id)
-                               else
-                                       knownPostReplies.remove(postReply.id)
+                               knownPostReplies.add(postReply.id)
                                saveKnownPostReplies()
                        }