X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2Fajax%2FGetNotificationsAjaxPage.java;h=a25e6658c85c499085c554c539799f95d6d14f4f;hp=de2f8f89612f02d56a1e9b19a6a6c1190612f472;hb=0e8f7804ce344bdd69f5ecc7febe25a60a53561d;hpb=1c8d22496d1b1c26502d0adf2daab1605fa6e7fc diff --git a/src/main/java/net/pterodactylus/sone/web/ajax/GetNotificationsAjaxPage.java b/src/main/java/net/pterodactylus/sone/web/ajax/GetNotificationsAjaxPage.java index de2f8f8..a25e665 100644 --- a/src/main/java/net/pterodactylus/sone/web/ajax/GetNotificationsAjaxPage.java +++ b/src/main/java/net/pterodactylus/sone/web/ajax/GetNotificationsAjaxPage.java @@ -1,5 +1,5 @@ /* - * Sone - GetNotificationsAjaxPage.java - Copyright © 2010 David Roden + * Sone - GetNotificationsAjaxPage.java - Copyright © 2011–2013 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 @@ -17,29 +17,42 @@ package net.pterodactylus.sone.web.ajax; -import java.util.ArrayList; +import static com.fasterxml.jackson.databind.node.JsonNodeFactory.instance; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Collection; import java.util.Collections; import java.util.List; +import net.pterodactylus.sone.data.Sone; +import net.pterodactylus.sone.main.SonePlugin; +import net.pterodactylus.sone.notify.ListNotificationFilters; import net.pterodactylus.sone.web.WebInterface; -import net.pterodactylus.util.json.JsonArray; -import net.pterodactylus.util.json.JsonObject; +import net.pterodactylus.sone.web.page.FreenetRequest; import net.pterodactylus.util.notify.Notification; +import net.pterodactylus.util.notify.TemplateNotification; +import net.pterodactylus.util.template.TemplateContext; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; /** - * Returns all changed notifications. + * AJAX handler to return all current notifications. * * @author David ‘Bombe’ Roden */ public class GetNotificationsAjaxPage extends JsonPage { /** - * TODO + * Creates a new “get notifications” AJAX handler. * * @param webInterface + * The Sone web interface */ public GetNotificationsAjaxPage(WebInterface webInterface) { - super("ajax/getNotifications.ajax", webInterface); + super("getNotifications.ajax", webInterface); } // @@ -50,29 +63,95 @@ public class GetNotificationsAjaxPage extends JsonPage { * {@inheritDoc} */ @Override - protected JsonObject createJsonObject(Request request) { - List notifications = new ArrayList(webInterface.getNotifications().getChangedNotifications()); - Collections.sort(notifications, Notification.LAST_UPDATED_TIME_SORTER); - JsonObject result = createSuccessJsonObject(); - JsonArray jsonNotifications = new JsonArray(); - for (Notification notification : notifications) { - JsonObject jsonNotification = new JsonObject(); - jsonNotification.put("id", notification.getId()); - jsonNotification.put("text", notification.toString()); - jsonNotification.put("createdTime", notification.getCreatedTime()); - jsonNotification.put("lastUpdatedTime", notification.getLastUpdatedTime()); - jsonNotification.put("dismissable", notification.isDismissable()); - jsonNotifications.add(jsonNotification); - } - return result.put("notifications", jsonNotifications); + protected boolean needsFormPassword() { + return false; } /** * {@inheritDoc} */ @Override - protected boolean needsFormPassword() { + protected boolean requiresLogin() { return false; } + /** + * {@inheritDoc} + */ + @Override + protected JsonReturnObject createJsonObject(FreenetRequest request) { + Sone currentSone = getCurrentSone(request.getToadletContext(), false); + Collection notifications = webInterface.getNotifications().getNotifications(); + List filteredNotifications = ListNotificationFilters.filterNotifications(notifications, currentSone); + Collections.sort(filteredNotifications, Notification.CREATED_TIME_SORTER); + ArrayNode jsonNotifications = new ArrayNode(instance); + for (Notification notification : filteredNotifications) { + jsonNotifications.add(createJsonNotification(request, notification)); + } + return createSuccessJsonObject().put("notificationHash", filteredNotifications.hashCode()).put("notifications", jsonNotifications).put("options", createJsonOptions(currentSone)); + } + + // + // PRIVATE METHODS + // + + /** + * Creates a JSON object from the given notification. + * + * @param request + * The request to load the session from + * @param notification + * The notification to create a JSON object + * @return The JSON object + */ + private JsonNode createJsonNotification(FreenetRequest request, Notification notification) { + ObjectNode jsonNotification = new ObjectNode(instance); + jsonNotification.put("id", notification.getId()); + StringWriter notificationWriter = new StringWriter(); + try { + if (notification instanceof TemplateNotification) { + TemplateContext templateContext = webInterface.getTemplateContextFactory().createTemplateContext().mergeContext(((TemplateNotification) notification).getTemplateContext()); + templateContext.set("core", webInterface.getCore()); + templateContext.set("currentSone", webInterface.getCurrentSone(request.getToadletContext(), false)); + templateContext.set("localSones", webInterface.getCore().getLocalSones()); + templateContext.set("request", request); + templateContext.set("currentVersion", SonePlugin.VERSION); + templateContext.set("hasLatestVersion", webInterface.getCore().getUpdateChecker().hasLatestVersion()); + templateContext.set("latestEdition", webInterface.getCore().getUpdateChecker().getLatestEdition()); + templateContext.set("latestVersion", webInterface.getCore().getUpdateChecker().getLatestVersion()); + templateContext.set("latestVersionTime", webInterface.getCore().getUpdateChecker().getLatestVersionDate()); + templateContext.set("notification", notification); + ((TemplateNotification) notification).render(templateContext, notificationWriter); + } else { + notification.render(notificationWriter); + } + } catch (IOException ioe1) { + /* StringWriter never throws, ignore. */ + } + jsonNotification.put("text", notificationWriter.toString()); + jsonNotification.put("createdTime", notification.getCreatedTime()); + jsonNotification.put("lastUpdatedTime", notification.getLastUpdatedTime()); + jsonNotification.put("dismissable", notification.isDismissable()); + return jsonNotification; + } + + /** + * Creates a JSON object that contains all options that are currently in + * effect for the given Sone (or overall, if the given Sone is {@code null} + * ). + * + * @param currentSone + * The current Sone (may be {@code null}) + * @return The current options + */ + private static JsonNode createJsonOptions(Sone currentSone) { + ObjectNode options = new ObjectNode(instance); + if (currentSone != null) { + options.put("ShowNotification/NewSones", currentSone.getOptions().isShowNewSoneNotifications()); + options.put("ShowNotification/NewPosts", currentSone.getOptions().isShowNewPostNotifications()); + options.put("ShowNotification/NewReplies", currentSone.getOptions().isShowNewReplyNotifications()); + } + return options; + } + }