--- /dev/null
+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);
+ }
+
+}
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);
}
*/
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))
}
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) }
}