♻️ Extract interface for reply visibility filter
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 27 Jun 2020 21:12:45 +0000 (23:12 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 28 Jun 2020 19:11:04 +0000 (21:11 +0200)
src/main/java/net/pterodactylus/sone/notify/DefaultReplyVisibilityFilter.java [new file with mode: 0644]
src/main/java/net/pterodactylus/sone/notify/ReplyVisibilityFilter.java
src/test/kotlin/net/pterodactylus/sone/notify/ReplyVisibilityFilterTest.kt
src/test/kotlin/net/pterodactylus/sone/notify/Testing.kt

diff --git a/src/main/java/net/pterodactylus/sone/notify/DefaultReplyVisibilityFilter.java b/src/main/java/net/pterodactylus/sone/notify/DefaultReplyVisibilityFilter.java
new file mode 100644 (file)
index 0000000..0b891af
--- /dev/null
@@ -0,0 +1,68 @@
+package net.pterodactylus.sone.notify;
+
+import java.util.function.Predicate;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import net.pterodactylus.sone.data.Post;
+import net.pterodactylus.sone.data.PostReply;
+import net.pterodactylus.sone.data.Sone;
+
+import com.google.common.base.Optional;
+
+/**
+ * Filter that checks a {@link PostReply} for visibility.
+ */
+@Singleton
+public class DefaultReplyVisibilityFilter implements ReplyVisibilityFilter {
+
+       private final PostVisibilityFilter postVisibilityFilter;
+
+       @Inject
+       public DefaultReplyVisibilityFilter(@Nonnull PostVisibilityFilter postVisibilityFilter) {
+               this.postVisibilityFilter = postVisibilityFilter;
+       }
+
+       /**
+        * Checks whether a reply is visible to the given Sone. A reply is not
+        * considered visible if one of the following statements is true:
+        * <ul>
+        * <li>The reply does not have a post.</li>
+        * <li>The reply’s post {@link PostVisibilityFilter#isPostVisible(Sone, Post) is not visible}.</li>
+        * <li>The reply’s {@link PostReply#getTime() time} is in the future.</li>
+        * </ul>
+        * If none of these statements is true the reply is considered visible.
+        *
+        * @param sone
+        *              The Sone that checks for a post’s visibility (may be
+        *              {@code null} to skip Sone-specific checks, such as trust)
+        * @param reply
+        *              The reply to check for visibility
+        * @return {@code true} if the reply is considered visible, {@code false}
+        * otherwise
+        */
+       @Override
+       public boolean isReplyVisible(@Nullable Sone sone, @Nonnull PostReply reply) {
+               checkNotNull(reply, "reply must not be null");
+               Optional<Post> post = reply.getPost();
+               if (!post.isPresent()) {
+                       return false;
+               }
+               if (!postVisibilityFilter.isPostVisible(sone, post.get())) {
+                       return false;
+               }
+               return reply.getTime() <= System.currentTimeMillis();
+       }
+
+       @Nonnull
+       @Override
+       public Predicate<PostReply> isVisible(@Nullable final Sone currentSone) {
+               return postReply -> (postReply != null) && isReplyVisible(currentSone, postReply);
+       }
+
+}
index 67a8d7d..cd282b7 100644 (file)
@@ -1,66 +1,19 @@
 package net.pterodactylus.sone.notify;
 
 import java.util.function.Predicate;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import javax.inject.Inject;
-import javax.inject.Singleton;
 
-import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.PostReply;
 import net.pterodactylus.sone.data.Sone;
 
-import com.google.common.base.Optional;
-
-/**
- * Filter that checks a {@link PostReply} for visibility.
- */
-@Singleton
-public class ReplyVisibilityFilter {
-
-       private final PostVisibilityFilter postVisibilityFilter;
+import com.google.inject.ImplementedBy;
 
-       @Inject
-       public ReplyVisibilityFilter(@Nonnull PostVisibilityFilter postVisibilityFilter) {
-               this.postVisibilityFilter = postVisibilityFilter;
-       }
+@ImplementedBy(DefaultReplyVisibilityFilter.class)
+public interface ReplyVisibilityFilter {
 
-       /**
-        * Checks whether a reply is visible to the given Sone. A reply is not
-        * considered visible if one of the following statements is true:
-        * <ul>
-        * <li>The reply does not have a post.</li>
-        * <li>The reply’s post {@link PostVisibilityFilter#isPostVisible(Sone, Post) is not visible}.</li>
-        * <li>The reply’s {@link PostReply#getTime() time} is in the future.</li>
-        * </ul>
-        * If none of these statements is true the reply is considered visible.
-        *
-        * @param sone
-        *              The Sone that checks for a post’s visibility (may be
-        *              {@code null} to skip Sone-specific checks, such as trust)
-        * @param reply
-        *              The reply to check for visibility
-        * @return {@code true} if the reply is considered visible, {@code false}
-        * otherwise
-        */
-       boolean isReplyVisible(@Nullable Sone sone, @Nonnull PostReply reply) {
-               checkNotNull(reply, "reply must not be null");
-               Optional<Post> post = reply.getPost();
-               if (!post.isPresent()) {
-                       return false;
-               }
-               if (!postVisibilityFilter.isPostVisible(sone, post.get())) {
-                       return false;
-               }
-               return reply.getTime() <= System.currentTimeMillis();
-       }
+       boolean isReplyVisible(@Nullable Sone sone, @Nonnull PostReply reply);
 
-       @Nonnull
-       public Predicate<PostReply> isVisible(@Nullable final Sone currentSone) {
-               return postReply -> (postReply != null) && isReplyVisible(currentSone, postReply);
-       }
+       Predicate<PostReply> isVisible(@Nullable final Sone currentSone);
 
 }
index 980dcd0..e91bd42 100644 (file)
@@ -14,20 +14,20 @@ import org.junit.Test
  */
 class ReplyVisibilityFilterTest {
 
-       private val replyVisibilityFilter = ReplyVisibilityFilter(showAllPosts)
+       private val replyVisibilityFilter = DefaultReplyVisibilityFilter(showAllPosts)
        private val localSone = createLocalSone()
        private val post = createPost()
 
        @Test
        fun `reply visibility filter is only created once`() {
                val injector = Guice.createInjector()
-               injector.verifySingletonInstance<ReplyVisibilityFilter>()
+               injector.verifySingletonInstance<DefaultReplyVisibilityFilter>()
        }
 
        @Test
        fun `reply is not visible if post is not visible`() {
                val postReply = createPostReply(post = post)
-               val replyVisibilityFilter = ReplyVisibilityFilter(showNoPosts)
+               val replyVisibilityFilter = DefaultReplyVisibilityFilter(showNoPosts)
                assertThat(replyVisibilityFilter.isReplyVisible(null, postReply), equalTo(false))
        }
 
index bec8a51..381ded4 100644 (file)
@@ -17,7 +17,7 @@ fun matchThisReply(reply: PostReply) = createReplyVisibilityFilter(showAllPosts)
 val showAllReplies = createReplyVisibilityFilter(showAllPosts) { _, _ -> true }
 val showNoReplies = createReplyVisibilityFilter(showAllPosts) { _, _ -> false }
 
-private fun createReplyVisibilityFilter(postVisibilityFilter: PostVisibilityFilter, visible: (Sone?, PostReply) -> Boolean) = object : ReplyVisibilityFilter(postVisibilityFilter) {
+private fun createReplyVisibilityFilter(postVisibilityFilter: PostVisibilityFilter, visible: (Sone?, PostReply) -> Boolean) = object : DefaultReplyVisibilityFilter(postVisibilityFilter) {
        override fun isReplyVisible(sone: Sone?, reply: PostReply) = visible(sone, reply)
        override fun isVisible(currentSone: Sone?) = Predicate<PostReply> { r -> r != null && isReplyVisible(currentSone, r) }
 }