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=2264b2e5e9d45201c62eb1fdd6320f4b0e72eea4;hb=0e8f7804ce344bdd69f5ecc7febe25a60a53561d;hpb=f90e0cae6af265344199c300d998460facf42db5 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 2264b2e..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,18 +17,29 @@ 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 java.util.Set; +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 */ @@ -41,7 +52,7 @@ public class GetNotificationsAjaxPage extends JsonPage { * The Sone web interface */ public GetNotificationsAjaxPage(WebInterface webInterface) { - super("ajax/getNotifications.ajax", webInterface); + super("getNotifications.ajax", webInterface); } // @@ -52,30 +63,34 @@ public class GetNotificationsAjaxPage extends JsonPage { * {@inheritDoc} */ @Override - protected JsonObject createJsonObject(Request request) { - List notifications = new ArrayList(webInterface.getNotifications().getChangedNotifications()); - Set removedNotifications = webInterface.getNotifications().getRemovedNotifications(); - Collections.sort(notifications, Notification.LAST_UPDATED_TIME_SORTER); - JsonObject result = createSuccessJsonObject(); - JsonArray jsonNotifications = new JsonArray(); - for (Notification notification : notifications) { - jsonNotifications.add(createJsonNotification(notification)); - } - JsonArray jsonRemovedNotifications = new JsonArray(); - for (Notification notification : removedNotifications) { - jsonRemovedNotifications.add(createJsonNotification(notification)); - } - return result.put("notifications", jsonNotifications).put("removedNotifications", jsonRemovedNotifications); + 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 // @@ -83,18 +98,60 @@ public class GetNotificationsAjaxPage extends JsonPage { /** * 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 static JsonObject createJsonNotification(Notification notification) { - JsonObject jsonNotification = new JsonObject(); + private JsonNode createJsonNotification(FreenetRequest request, Notification notification) { + ObjectNode jsonNotification = new ObjectNode(instance); jsonNotification.put("id", notification.getId()); - jsonNotification.put("text", notification.toString()); + 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; + } + }