Replace mark as known page with Kotlin version
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 24 May 2017 04:59:26 +0000 (06:59 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 24 May 2017 04:59:26 +0000 (06:59 +0200)
src/main/java/net/pterodactylus/sone/web/pages/MarkAsKnownPage.java [deleted file]
src/main/kotlin/net/pterodactylus/sone/utils/Iterables.kt [new file with mode: 0644]
src/main/kotlin/net/pterodactylus/sone/web/pages/MarkAsKnownPage.kt [new file with mode: 0644]
src/test/kotlin/net/pterodactylus/sone/web/pages/MarkAsKnownPageTest.kt

diff --git a/src/main/java/net/pterodactylus/sone/web/pages/MarkAsKnownPage.java b/src/main/java/net/pterodactylus/sone/web/pages/MarkAsKnownPage.java
deleted file mode 100644 (file)
index 4eb7a95..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Sone - MarkAsKnownPage.java - Copyright © 2011–2016 David Roden
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package net.pterodactylus.sone.web.pages;
-
-import java.util.StringTokenizer;
-
-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.web.WebInterface;
-import net.pterodactylus.sone.web.page.FreenetRequest;
-import net.pterodactylus.util.template.Template;
-import net.pterodactylus.util.template.TemplateContext;
-
-import com.google.common.base.Optional;
-
-/**
- * Page that lets the user mark a number of {@link Sone}s, {@link Post}s, or
- * {@link Reply Replie}s as known.
- *
- * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
- */
-public class MarkAsKnownPage extends SoneTemplatePage {
-
-       /**
-        * Creates a new “mark as known” page.
-        *
-        * @param template
-        *            The template to render
-        * @param webInterface
-        *            The Sone web interface
-        */
-       public MarkAsKnownPage(Template template, WebInterface webInterface) {
-               super("markAsKnown.html", template, "Page.MarkAsKnown.Title", webInterface);
-       }
-
-       //
-       // SONETEMPLATEPAGE METHODS
-       //
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       protected void handleRequest(FreenetRequest request, TemplateContext templateContext) throws RedirectException {
-               String type = request.getHttpRequest().getPartAsStringFailsafe("type", 5);
-               if (!type.equals("sone") && !type.equals("post") && !type.equals("reply")) {
-                       throw new RedirectException("invalid.html");
-               }
-               String ids = request.getHttpRequest().getPartAsStringFailsafe("id", 65536);
-               for (StringTokenizer idTokenizer = new StringTokenizer(ids); idTokenizer.hasMoreTokens();) {
-                       String id = idTokenizer.nextToken();
-                       if (type.equals("post")) {
-                               Optional<Post> post = webInterface.getCore().getPost(id);
-                               if (!post.isPresent()) {
-                                       continue;
-                               }
-                               webInterface.getCore().markPostKnown(post.get());
-                       } else if (type.equals("reply")) {
-                               Optional<PostReply> reply = webInterface.getCore().getPostReply(id);
-                               if (!reply.isPresent()) {
-                                       continue;
-                               }
-                               webInterface.getCore().markReplyKnown(reply.get());
-                       } else {
-                               Optional<Sone> sone = webInterface.getCore().getSone(id);
-                               if (!sone.isPresent()) {
-                                       continue;
-                               }
-                               webInterface.getCore().markSoneKnown(sone.get());
-                       }
-               }
-               String returnPage = request.getHttpRequest().getPartAsStringFailsafe("returnPage", 256);
-               throw new RedirectException(returnPage);
-       }
-
-}
diff --git a/src/main/kotlin/net/pterodactylus/sone/utils/Iterables.kt b/src/main/kotlin/net/pterodactylus/sone/utils/Iterables.kt
new file mode 100644 (file)
index 0000000..5651c72
--- /dev/null
@@ -0,0 +1,6 @@
+package net.pterodactylus.sone.utils
+
+import com.google.common.base.Optional
+
+fun <T, R> Iterable<T>.mapPresent(transform: (T) -> Optional<R>): List<R> =
+               map(transform).filter { it.isPresent }.map { it.get() }
diff --git a/src/main/kotlin/net/pterodactylus/sone/web/pages/MarkAsKnownPage.kt b/src/main/kotlin/net/pterodactylus/sone/web/pages/MarkAsKnownPage.kt
new file mode 100644 (file)
index 0000000..f88fab3
--- /dev/null
@@ -0,0 +1,29 @@
+package net.pterodactylus.sone.web.pages
+
+import net.pterodactylus.sone.data.Post
+import net.pterodactylus.sone.utils.mapPresent
+import net.pterodactylus.sone.utils.parameters
+import net.pterodactylus.sone.web.WebInterface
+import net.pterodactylus.sone.web.page.FreenetRequest
+import net.pterodactylus.util.template.Template
+import net.pterodactylus.util.template.TemplateContext
+
+/**
+ * Page that lets the user mark a number of [net.pterodactylus.sone.data.Sone]s, [Post]s, or
+ * [Replie][net.pterodactylus.sone.data.Reply]s as known.
+ */
+class MarkAsKnownPage(template: Template, webInterface: WebInterface):
+               SoneTemplatePage("markAsKnown.html", template, "Page.MarkAsKnown.Title", webInterface, false) {
+
+       override fun handleRequest(request: FreenetRequest, templateContext: TemplateContext) {
+               val ids = request.parameters["id", 65536]!!.split(" ")
+               when (request.parameters["type", 5]) {
+                       "sone" -> ids.mapPresent(webInterface.core::getSone).forEach(webInterface.core::markSoneKnown)
+                       "post" -> ids.mapPresent(webInterface.core::getPost).forEach(webInterface.core::markPostKnown)
+                       "reply" -> ids.mapPresent(webInterface.core::getPostReply).forEach(webInterface.core::markReplyKnown)
+                       else -> throw RedirectException("invalid.html")
+               }
+               throw RedirectException(request.parameters["returnPage", 256]!!)
+       }
+
+}
index a132a70..1e62a81 100644 (file)
@@ -4,6 +4,7 @@ import net.pterodactylus.sone.data.Post
 import net.pterodactylus.sone.data.PostReply
 import net.pterodactylus.sone.data.Sone
 import net.pterodactylus.sone.test.mock
+import net.pterodactylus.util.web.Method.POST
 import org.hamcrest.MatcherAssert.assertThat
 import org.hamcrest.Matchers.equalTo
 import org.junit.Test
@@ -36,6 +37,7 @@ class MarkAsKnownPageTest: WebPageTest() {
 
        @Test
        fun `posts can be marked as known`() {
+               setMethod(POST)
                addHttpRequestPart("returnPage", "return.html")
                addHttpRequestPart("type", "post")
                addHttpRequestPart("id", "post1 post2 post3")
@@ -50,6 +52,7 @@ class MarkAsKnownPageTest: WebPageTest() {
 
        @Test
        fun `replies can be marked as known`() {
+               setMethod(POST)
                addHttpRequestPart("returnPage", "return.html")
                addHttpRequestPart("type", "reply")
                addHttpRequestPart("id", "reply1 reply2 reply3")
@@ -64,6 +67,7 @@ class MarkAsKnownPageTest: WebPageTest() {
 
        @Test
        fun `sones can be marked as known`() {
+               setMethod(POST)
                addHttpRequestPart("returnPage", "return.html")
                addHttpRequestPart("type", "sone")
                addHttpRequestPart("id", "sone1 sone2 sone3")
@@ -78,6 +82,7 @@ class MarkAsKnownPageTest: WebPageTest() {
 
        @Test
        fun `different type redirects to invalid page`() {
+               setMethod(POST)
                addHttpRequestPart("type", "foo")
                verifyRedirect("invalid.html")
        }