🔥 Remove methods from web interface
[Sone.git] / src / main / java / net / pterodactylus / sone / web / WebInterface.java
index ea357d2..8585650 100644 (file)
@@ -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
 
 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;
 import net.pterodactylus.sone.core.event.*;
-import net.pterodactylus.sone.data.Post;
-import net.pterodactylus.sone.data.PostReply;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.freenet.L10nFilter;
 import net.pterodactylus.sone.freenet.Translation;
@@ -44,10 +33,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 +72,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 +89,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 +112,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,38 +121,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<Post> newPostNotification;
-
-       /** The â€śnew reply” notification. */
-       private final ListNotification<PostReply> newReplyNotification;
-
-       /** The invisible â€ślocal post” notification. */
-       private final ListNotification<Post> localPostNotification;
-
-       /** The invisible â€ślocal reply” notification. */
-       private final ListNotification<PostReply> localReplyNotification;
-
-       /** Notifications for sone inserts. */
-       private final Map<Sone, TemplateNotification> 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<Post> newPostNotification,
-                       @Named("localPost") ListNotification<Post> localPostNotification) {
+                                               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;
@@ -186,20 +151,13 @@ public class WebInterface implements SessionProvider {
                this.l10nFilter = l10nFilter;
                this.translation = translation;
                this.notificationManager = notificationManager;
-               this.newPostNotification = newPostNotification;
-               this.localPostNotification = localPostNotification;
+               this.sessionProvider = sessionProvider;
+               this.newElements = newElements;
                formPassword = sonePlugin.pluginRespirator().getToadletContainer().getFormPassword();
 
                this.templateContextFactory = templateContextFactory;
                templateContextFactory.addTemplateObject("webInterface", this);
                templateContextFactory.addTemplateObject("formPassword", formPassword);
-
-               /* create notifications. */
-               Template newReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html");
-               newReplyNotification = new ListNotification<>("new-reply-notification", "replies", newReplyNotificationTemplate, false);
-
-               Template localReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html");
-               localReplyNotification = new ListNotification<>("local-reply-notification", "replies", localReplyNotificationTemplate, false);
        }
 
        //
@@ -225,75 +183,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<Sone> localSones = getCore().getLocalSones();
-               if (localSones.size() == 1) {
-                       return localSones.iterator().next();
-               }
-               return getCurrentSone(getOrCreateCurrentSession(toadletContext));
-       }
-
-       public Sone getCurrentSoneWithoutCreatingSession(ToadletContext toadletContext) {
-               Collection<Sone> 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);
        }
 
        /**
@@ -320,15 +218,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
@@ -337,48 +226,6 @@ public class WebInterface implements SessionProvider {
                return formPassword;
        }
 
-       @Nonnull
-       public Collection<Post> getNewPosts(@Nullable Sone currentSone) {
-               Set<Post> allNewPosts = ImmutableSet.<Post> 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<PostReply> getNewReplies() {
-               return ImmutableSet.<PostReply> builder().addAll(newReplyNotification.getElements()).addAll(localReplyNotification.getElements()).build();
-       }
-
-       @Nonnull
-       public Collection<PostReply> getNewReplies(@Nullable Sone currentSone) {
-               Set<PostReply> allNewReplies = ImmutableSet.<PostReply>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;
-       }
-
        //
        // ACTIONS
        //
@@ -411,7 +258,7 @@ public class WebInterface implements SessionProvider {
 
                pageToadletRegistry.addPage(new RedirectPage<FreenetRequest>("", "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));
@@ -460,7 +307,7 @@ public class WebInterface implements SessionProvider {
                pageToadletRegistry.addPage(new TemplatePage<FreenetRequest>("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));
@@ -490,127 +337,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;
-               }
-       }
-
-       //
-       // EVENT HANDLERS
-       //
-
-       /**
-        * Notifies the web interface that a new {@link PostReply} was found.
-        *
-        * @param newPostReplyFoundEvent
-        *            The event
-        */
-       @Subscribe
-       public void newReplyFound(NewPostReplyFoundEvent newPostReplyFoundEvent) {
-               PostReply reply = newPostReplyFoundEvent.getPostReply();
-               boolean isLocal = reply.getSone().isLocal();
-               if (isLocal) {
-                       localReplyNotification.add(reply);
-               } else {
-                       newReplyNotification.add(reply);
-               }
-               if (!hasFirstStartNotification()) {
-                       notificationManager.addNotification(isLocal ? localReplyNotification : newReplyNotification);
-               }
-       }
-
-       @Subscribe
-       public void markPostKnown(MarkPostKnownEvent markPostKnownEvent) {
-               removePost(markPostKnownEvent.getPost());
-       }
-
-       @Subscribe
-       public void markReplyKnown(MarkPostReplyKnownEvent markPostReplyKnownEvent) {
-               removeReply(markPostReplyKnownEvent.getPostReply());
-       }
-
-       @Subscribe
-       public void postRemoved(PostRemovedEvent postRemovedEvent) {
-               removePost(postRemovedEvent.getPost());
-       }
-
-       private void removePost(Post post) {
-               newPostNotification.remove(post);
-       }
-
-       @Subscribe
-       public void replyRemoved(PostReplyRemovedEvent postReplyRemovedEvent) {
-               removeReply(postReplyRemovedEvent.getPostReply());
-       }
-
-       private void removeReply(PostReply reply) {
-               newReplyNotification.remove(reply);
-               localReplyNotification.remove(reply);
-       }
-
-       /**
-        * 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();