From c8bdd972b5ac8aa160a85afdcf0db2cbb120d33e Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Wed, 24 Nov 2010 15:37:00 +0100 Subject: [PATCH] Return new posts and replies with status. --- .../net/pterodactylus/sone/web/WebInterface.java | 3 +- .../sone/web/ajax/GetStatusAjaxPage.java | 86 +++++++++++++++++++++- 2 files changed, 86 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/pterodactylus/sone/web/WebInterface.java b/src/main/java/net/pterodactylus/sone/web/WebInterface.java index 1c91b64..5010bad 100644 --- a/src/main/java/net/pterodactylus/sone/web/WebInterface.java +++ b/src/main/java/net/pterodactylus/sone/web/WebInterface.java @@ -321,6 +321,7 @@ public class WebInterface implements CoreListener { Template logoutTemplate = templateFactory.createTemplate(createReader("/templates/logout.html")); Template optionsTemplate = templateFactory.createTemplate(createReader("/templates/options.html")); Template aboutTemplate = templateFactory.createTemplate(createReader("/templates/about.html")); + Template postTemplate = templateFactory.createTemplate(createReader("/templates/include/viewPost.html")); Template replyTemplate = templateFactory.createTemplate(createReader("/templates/include/viewReply.html")); PageToadletFactory pageToadletFactory = new PageToadletFactory(sonePlugin.pluginRespirator().getHLSimpleClient(), "/Sone/"); @@ -351,7 +352,7 @@ public class WebInterface implements CoreListener { pageToadlets.add(pageToadletFactory.createPageToadlet(new StaticPage("javascript/", "/static/javascript/", "text/javascript"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new StaticPage("images/", "/static/images/", "image/png"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetTranslationPage(this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new GetStatusAjaxPage(this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new GetStatusAjaxPage(this, postTemplate, replyTemplate))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DismissNotificationAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new CreateReplyAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetReplyAjaxPage(this, replyTemplate))); diff --git a/src/main/java/net/pterodactylus/sone/web/ajax/GetStatusAjaxPage.java b/src/main/java/net/pterodactylus/sone/web/ajax/GetStatusAjaxPage.java index 831bb6f..8b7f513 100644 --- a/src/main/java/net/pterodactylus/sone/web/ajax/GetStatusAjaxPage.java +++ b/src/main/java/net/pterodactylus/sone/web/ajax/GetStatusAjaxPage.java @@ -17,6 +17,7 @@ package net.pterodactylus.sone.web.ajax; +import java.io.StringWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -25,12 +26,17 @@ import java.util.Date; import java.util.List; import java.util.Set; +import net.pterodactylus.sone.data.Post; +import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.template.SoneAccessor; import net.pterodactylus.sone.web.WebInterface; +import net.pterodactylus.util.io.Closer; import net.pterodactylus.util.json.JsonArray; import net.pterodactylus.util.json.JsonObject; import net.pterodactylus.util.notify.Notification; +import net.pterodactylus.util.template.Template; +import net.pterodactylus.util.template.TemplateException; /** * The “get status” AJAX handler returns all information that is necessary to @@ -43,14 +49,26 @@ public class GetStatusAjaxPage extends JsonPage { /** Date formatter. */ private static final DateFormat dateFormat = new SimpleDateFormat("MMM d, yyyy, HH:mm:ss"); + /** The template to render posts. */ + private final Template postTemplate; + + /** The template to render replies. */ + private final Template replyTemplate; + /** * Creates a new “get status” AJAX handler. * * @param webInterface * The Sone web interface + * @param postTemplate + * The template to render for posts + * @param replyTemplate + * The template to render for replies */ - public GetStatusAjaxPage(WebInterface webInterface) { + public GetStatusAjaxPage(WebInterface webInterface, Template postTemplate, Template replyTemplate) { super("ajax/getStatus.ajax", webInterface); + this.postTemplate = postTemplate; + this.replyTemplate = replyTemplate; } /** @@ -78,7 +96,21 @@ public class GetStatusAjaxPage extends JsonPage { for (Notification notification : removedNotifications) { jsonRemovedNotifications.add(createJsonNotification(notification)); } - return createSuccessJsonObject().put("sones", jsonSones).put("notifications", jsonNotifications).put("removedNotifications", jsonRemovedNotifications); + /* load new posts. */ + postTemplate.set("currentSone", getCurrentSone(request.getToadletContext())); + Set newPosts = webInterface.getNewPosts(); + JsonArray jsonPosts = new JsonArray(); + for (Post post : newPosts) { + jsonPosts.add(createJsonPost(post)); + } + /* load new replies. */ + replyTemplate.set("currentSone", getCurrentSone(request.getToadletContext())); + Set newReplies = webInterface.getNewReplies(); + JsonArray jsonReplies = new JsonArray(); + for (Reply reply : newReplies) { + jsonReplies.add(createJsonReply(reply)); + } + return createSuccessJsonObject().put("sones", jsonSones).put("notifications", jsonNotifications).put("removedNotifications", jsonRemovedNotifications).put("newPosts", jsonPosts).put("newReplies", jsonReplies); } /** @@ -116,6 +148,56 @@ public class GetStatusAjaxPage extends JsonPage { } /** + * Creates a JSON object from the given post. The JSON object will only + * contain the ID of the post, its time, and its rendered HTML code. + * + * @param post + * The post to create a JSON object from + * @return The JSON representation of the post + */ + private JsonObject createJsonPost(Post post) { + JsonObject jsonPost = new JsonObject(); + jsonPost.put("id", post.getId()); + jsonPost.put("time", post.getTime()); + StringWriter stringWriter = new StringWriter(); + postTemplate.set("post", post); + try { + postTemplate.render(stringWriter); + } catch (TemplateException te1) { + /* TODO - shouldn’t happen. */ + } finally { + Closer.close(stringWriter); + } + return jsonPost.put("html", stringWriter.toString()); + } + + /** + * Creates a JSON object from the given reply. The JSON object will only + * contain the ID of the reply, the ID of its post, its time, and its + * rendered HTML code. + * + * @param reply + * The reply to create a JSON object from + * @return The JSON representation of the reply + */ + private JsonObject createJsonReply(Reply reply) { + JsonObject jsonPost = new JsonObject(); + jsonPost.put("postId", reply.getPost().getId()); + jsonPost.put("id", reply.getId()); + jsonPost.put("time", reply.getTime()); + StringWriter stringWriter = new StringWriter(); + replyTemplate.set("reply", reply); + try { + replyTemplate.render(stringWriter); + } catch (TemplateException te1) { + /* TODO - shouldn’t happen. */ + } finally { + Closer.close(stringWriter); + } + return jsonPost.put("html", stringWriter.toString()); + } + + /** * Creates a JSON object from the given notification. * * @param notification -- 2.7.4