X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FWebInterface.java;h=723a1663991204062f470b03b3fb2edcddfc46fa;hb=05d126a69fbd464bea6aa974cff52dc4e5d5b2a6;hp=1e6e6fba6d50dff3627fc2444baa34daa9ff6929;hpb=5aaa1e1dc761fa0c8b6745b7b022c0a19d248c68;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/web/WebInterface.java b/src/main/java/net/pterodactylus/sone/web/WebInterface.java index 1e6e6fb..723a166 100644 --- a/src/main/java/net/pterodactylus/sone/web/WebInterface.java +++ b/src/main/java/net/pterodactylus/sone/web/WebInterface.java @@ -1,5 +1,5 @@ /* - * Sone - WebInterface.java - Copyright © 2010–2019 David Roden + * Sone - WebInterface.java - Copyright © 2010–2020 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,19 +17,13 @@ package net.pterodactylus.sone.web; -import static com.google.common.collect.FluentIterable.from; import static java.util.logging.Logger.getLogger; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; import java.util.TimeZone; -import java.util.UUID; import java.util.logging.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import javax.inject.Named; import net.pterodactylus.sone.core.Core; import net.pterodactylus.sone.core.ElementLoader; @@ -44,10 +38,8 @@ import net.pterodactylus.sone.main.PluginHomepage; import net.pterodactylus.sone.main.PluginVersion; import net.pterodactylus.sone.main.PluginYear; import net.pterodactylus.sone.main.SonePlugin; -import net.pterodactylus.sone.notify.ListNotification; import net.pterodactylus.sone.notify.ListNotificationFilter; import net.pterodactylus.sone.notify.PostVisibilityFilter; -import net.pterodactylus.sone.notify.ReplyVisibilityFilter; import net.pterodactylus.sone.template.LinkedElementRenderFilter; import net.pterodactylus.sone.template.ParserFilter; import net.pterodactylus.sone.template.RenderFilter; @@ -85,21 +77,16 @@ import net.pterodactylus.sone.web.page.TemplateRenderer; import net.pterodactylus.sone.web.pages.*; import net.pterodactylus.util.notify.Notification; import net.pterodactylus.util.notify.NotificationManager; -import net.pterodactylus.util.notify.TemplateNotification; import net.pterodactylus.util.template.Template; import net.pterodactylus.util.template.TemplateContextFactory; import net.pterodactylus.util.web.RedirectPage; import net.pterodactylus.util.web.TemplatePage; -import freenet.clients.http.SessionManager; -import freenet.clients.http.SessionManager.Session; -import freenet.clients.http.ToadletContext; - import com.codahale.metrics.*; import com.google.common.base.Optional; -import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.Subscribe; import com.google.inject.Inject; +import freenet.clients.http.ToadletContext; /** * Bundles functionality that a web interface of a Freenet plugin needs, e.g. @@ -107,9 +94,6 @@ import com.google.inject.Inject; */ public class WebInterface implements SessionProvider { - /** The logger. */ - private static final Logger logger = getLogger(WebInterface.class.getName()); - /** The loaders for templates, pages, and classpath providers. */ private final Loaders loaders; @@ -133,7 +117,6 @@ public class WebInterface implements SessionProvider { private final ListNotificationFilter listNotificationFilter; private final PostVisibilityFilter postVisibilityFilter; - private final ReplyVisibilityFilter replyVisibilityFilter; private final ElementLoader elementLoader; private final LinkedElementRenderFilter linkedElementRenderFilter; @@ -143,40 +126,25 @@ public class WebInterface implements SessionProvider { private final PageToadletRegistry pageToadletRegistry; private final MetricRegistry metricRegistry; private final Translation translation; + private final SessionProvider sessionProvider; - /** The “new post” notification. */ - private final ListNotification newPostNotification; - - /** The “new reply” notification. */ - private final ListNotification newReplyNotification; - - /** The invisible “local post” notification. */ - private final ListNotification localPostNotification; - - /** The invisible “local reply” notification. */ - private final ListNotification localReplyNotification; - - /** Notifications for sone inserts. */ - private final Map soneInsertNotifications = new HashMap<>(); + private final NewElements newElements; @Inject public WebInterface(SonePlugin sonePlugin, Loaders loaders, ListNotificationFilter listNotificationFilter, - PostVisibilityFilter postVisibilityFilter, ReplyVisibilityFilter replyVisibilityFilter, - ElementLoader elementLoader, TemplateContextFactory templateContextFactory, - TemplateRenderer templateRenderer, - ParserFilter parserFilter, ShortenFilter shortenFilter, - RenderFilter renderFilter, - LinkedElementRenderFilter linkedElementRenderFilter, - PageToadletRegistry pageToadletRegistry, MetricRegistry metricRegistry, Translation translation, L10nFilter l10nFilter, - NotificationManager notificationManager, @Named("newRemotePost") ListNotification newPostNotification, - @Named("newRemotePostReply") ListNotification newReplyNotification, - @Named("localPost") ListNotification localPostNotification, - @Named("localReply") ListNotification localReplyNotification) { + PostVisibilityFilter postVisibilityFilter, + ElementLoader elementLoader, TemplateContextFactory templateContextFactory, + TemplateRenderer templateRenderer, + ParserFilter parserFilter, ShortenFilter shortenFilter, + RenderFilter renderFilter, + LinkedElementRenderFilter linkedElementRenderFilter, + PageToadletRegistry pageToadletRegistry, MetricRegistry metricRegistry, Translation translation, L10nFilter l10nFilter, + NotificationManager notificationManager, SessionProvider sessionProvider, + NewElements newElements) { this.sonePlugin = sonePlugin; this.loaders = loaders; this.listNotificationFilter = listNotificationFilter; this.postVisibilityFilter = postVisibilityFilter; - this.replyVisibilityFilter = replyVisibilityFilter; this.elementLoader = elementLoader; this.templateRenderer = templateRenderer; this.parserFilter = parserFilter; @@ -188,10 +156,8 @@ public class WebInterface implements SessionProvider { this.l10nFilter = l10nFilter; this.translation = translation; this.notificationManager = notificationManager; - this.newPostNotification = newPostNotification; - this.newReplyNotification = newReplyNotification; - this.localPostNotification = localPostNotification; - this.localReplyNotification = localReplyNotification; + this.sessionProvider = sessionProvider; + this.newElements = newElements; formPassword = sonePlugin.pluginRespirator().getToadletContainer().getFormPassword(); this.templateContextFactory = templateContextFactory; @@ -222,75 +188,15 @@ public class WebInterface implements SessionProvider { return templateContextFactory; } - private Session getCurrentSessionWithoutCreation(ToadletContext toadletContenxt) { - return getSessionManager().useSession(toadletContenxt); - } - - private Session getOrCreateCurrentSession(ToadletContext toadletContenxt) { - Session session = getCurrentSessionWithoutCreation(toadletContenxt); - if (session == null) { - session = getSessionManager().createSession(UUID.randomUUID().toString(), toadletContenxt); - } - return session; - } - - public Sone getCurrentSoneCreatingSession(ToadletContext toadletContext) { - Collection localSones = getCore().getLocalSones(); - if (localSones.size() == 1) { - return localSones.iterator().next(); - } - return getCurrentSone(getOrCreateCurrentSession(toadletContext)); - } - - public Sone getCurrentSoneWithoutCreatingSession(ToadletContext toadletContext) { - Collection localSones = getCore().getLocalSones(); - if (localSones.size() == 1) { - return localSones.iterator().next(); - } - return getCurrentSone(getCurrentSessionWithoutCreation(toadletContext)); - } - - /** - * Returns the currently logged in Sone. - * - * @param session - * The session - * @return The currently logged in Sone, or {@code null} if no Sone is - * currently logged in - */ - private Sone getCurrentSone(Session session) { - if (session == null) { - return null; - } - String soneId = (String) session.getAttribute("Sone.CurrentSone"); - if (soneId == null) { - return null; - } - return getCore().getLocalSone(soneId); - } - - @Override @Nullable - public Sone getCurrentSone(@Nonnull ToadletContext toadletContext, boolean createSession) { - return createSession ? getCurrentSoneCreatingSession(toadletContext) : getCurrentSoneWithoutCreatingSession(toadletContext); + @Override + public Sone getCurrentSone(@Nonnull ToadletContext toadletContext) { + return sessionProvider.getCurrentSone(toadletContext); } - /** - * Sets the currently logged in Sone. - * - * @param toadletContext - * The toadlet context - * @param sone - * The Sone to set as currently logged in - */ @Override public void setCurrentSone(@Nonnull ToadletContext toadletContext, @Nullable Sone sone) { - Session session = getOrCreateCurrentSession(toadletContext); - if (sone == null) { - session.removeAttribute("Sone.CurrentSone"); - } else { - session.setAttribute("Sone.CurrentSone", sone.getId()); - } + sessionProvider.setCurrentSone(toadletContext, sone); } /** @@ -317,15 +223,6 @@ public class WebInterface implements SessionProvider { } /** - * Returns the session manager of the node. - * - * @return The node’s session manager - */ - public SessionManager getSessionManager() { - return sonePlugin.pluginRespirator().getSessionManager("Sone"); - } - - /** * Returns the node’s form password. * * @return The form password @@ -336,44 +233,12 @@ public class WebInterface implements SessionProvider { @Nonnull public Collection getNewPosts(@Nullable Sone currentSone) { - Set allNewPosts = ImmutableSet. builder() - .addAll(newPostNotification.getElements()) - .addAll(localPostNotification.getElements()) - .build(); - return from(allNewPosts).filter(postVisibilityFilter.isVisible(currentSone)).toSet(); - } - - /** - * Returns the replies that have been announced as new in the - * {@link #newReplyNotification}. - * - * @return The new replies - */ - public Set getNewReplies() { - return ImmutableSet. builder().addAll(newReplyNotification.getElements()).addAll(localReplyNotification.getElements()).build(); + return newElements.getNewPosts(); } @Nonnull public Collection getNewReplies(@Nullable Sone currentSone) { - Set allNewReplies = ImmutableSet.builder() - .addAll(newReplyNotification.getElements()) - .addAll(localReplyNotification.getElements()) - .build(); - return from(allNewReplies).filter(replyVisibilityFilter.isVisible(currentSone)).toSet(); - } - - // - // PRIVATE ACCESSORS - // - - /** - * Returns whether the first start notification is currently displayed. - * - * @return {@code true} if the first-start notification is currently - * displayed, {@code false} otherwise - */ - private boolean hasFirstStartNotification() { - return notificationManager.getNotification("first-start-notification") != null; + return newElements.getNewReplies(); } // @@ -408,7 +273,7 @@ public class WebInterface implements SessionProvider { pageToadletRegistry.addPage(new RedirectPage("", "index.html")); pageToadletRegistry.addPage(new IndexPage(this, loaders, templateRenderer, postVisibilityFilter)); - pageToadletRegistry.addPage(new NewPage(this, loaders, templateRenderer)); + pageToadletRegistry.addPage(new NewPage(this, loaders, templateRenderer, newElements)); pageToadletRegistry.addPage(new CreateSonePage(this, loaders, templateRenderer)); pageToadletRegistry.addPage(new KnownSonesPage(this, loaders, templateRenderer)); pageToadletRegistry.addPage(new EditProfilePage(this, loaders, templateRenderer)); @@ -457,7 +322,7 @@ public class WebInterface implements SessionProvider { pageToadletRegistry.addPage(new TemplatePage("OpenSearch.xml", "application/opensearchdescription+xml", templateContextFactory, openSearchTemplate)); pageToadletRegistry.addPage(new GetImagePage(this)); pageToadletRegistry.addPage(new GetTranslationAjaxPage(this)); - pageToadletRegistry.addPage(new GetStatusAjaxPage(this, elementLoader, timeTextConverter, l10nFilter, TimeZone.getDefault())); + pageToadletRegistry.addPage(new GetStatusAjaxPage(this, elementLoader, newElements, timeTextConverter, l10nFilter, TimeZone.getDefault())); pageToadletRegistry.addPage(new GetNotificationsAjaxPage(this)); pageToadletRegistry.addPage(new DismissNotificationAjaxPage(this)); pageToadletRegistry.addPage(new CreatePostAjaxPage(this)); @@ -487,74 +352,6 @@ public class WebInterface implements SessionProvider { pageToadletRegistry.registerToadlets(); } - /** - * Returns the Sone insert notification for the given Sone. If no - * notification for the given Sone exists, a new notification is created and - * cached. - * - * @param sone - * The Sone to get the insert notification for - * @return The Sone insert notification - */ - private TemplateNotification getSoneInsertNotification(Sone sone) { - synchronized (soneInsertNotifications) { - TemplateNotification templateNotification = soneInsertNotifications.get(sone); - if (templateNotification == null) { - templateNotification = new TemplateNotification(loaders.loadTemplate("/templates/notify/soneInsertNotification.html")); - templateNotification.set("insertSone", sone); - soneInsertNotifications.put(sone, templateNotification); - } - return templateNotification; - } - } - - /** - * Notifies the web interface that a {@link Sone} is being inserted. - * - * @param soneInsertingEvent - * The event - */ - @Subscribe - public void soneInserting(SoneInsertingEvent soneInsertingEvent) { - TemplateNotification soneInsertNotification = getSoneInsertNotification(soneInsertingEvent.getSone()); - soneInsertNotification.set("soneStatus", "inserting"); - if (soneInsertingEvent.getSone().getOptions().isSoneInsertNotificationEnabled()) { - notificationManager.addNotification(soneInsertNotification); - } - } - - /** - * Notifies the web interface that a {@link Sone} was inserted. - * - * @param soneInsertedEvent - * The event - */ - @Subscribe - public void soneInserted(SoneInsertedEvent soneInsertedEvent) { - TemplateNotification soneInsertNotification = getSoneInsertNotification(soneInsertedEvent.getSone()); - soneInsertNotification.set("soneStatus", "inserted"); - soneInsertNotification.set("insertDuration", soneInsertedEvent.getInsertDuration() / 1000); - if (soneInsertedEvent.getSone().getOptions().isSoneInsertNotificationEnabled()) { - notificationManager.addNotification(soneInsertNotification); - } - } - - /** - * Notifies the web interface that a {@link Sone} insert was aborted. - * - * @param soneInsertAbortedEvent - * The event - */ - @Subscribe - public void soneInsertAborted(SoneInsertAbortedEvent soneInsertAbortedEvent) { - TemplateNotification soneInsertNotification = getSoneInsertNotification(soneInsertAbortedEvent.getSone()); - soneInsertNotification.set("soneStatus", "insert-aborted"); - soneInsertNotification.set("insert-error", soneInsertAbortedEvent.getCause()); - if (soneInsertAbortedEvent.getSone().getOptions().isSoneInsertNotificationEnabled()) { - notificationManager.addNotification(soneInsertNotification); - } - } - @Subscribe public void debugActivated(@Nonnull DebugActivatedEvent debugActivatedEvent) { pageToadletRegistry.activateDebugMode();