🔀 Merge branch 'release/v82'
[Sone.git] / src / main / java / net / pterodactylus / sone / web / WebInterface.java
index c757599..40e5708 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
@@ -21,11 +21,8 @@ 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;
@@ -85,21 +82,17 @@ 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.
@@ -143,6 +136,7 @@ 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;
@@ -156,9 +150,6 @@ public class WebInterface implements SessionProvider {
        /** The invisible â€ślocal reply” notification. */
        private final ListNotification<PostReply> localReplyNotification;
 
-       /** Notifications for sone inserts. */
-       private final Map<Sone, TemplateNotification> soneInsertNotifications = new HashMap<>();
-
        @Inject
        public WebInterface(SonePlugin sonePlugin, Loaders loaders, ListNotificationFilter listNotificationFilter,
                        PostVisibilityFilter postVisibilityFilter, ReplyVisibilityFilter replyVisibilityFilter,
@@ -168,9 +159,11 @@ public class WebInterface implements SessionProvider {
                        RenderFilter renderFilter,
                        LinkedElementRenderFilter linkedElementRenderFilter,
                        PageToadletRegistry pageToadletRegistry, MetricRegistry metricRegistry, Translation translation, L10nFilter l10nFilter,
-                       NotificationManager notificationManager, @Named("newRemotePost") ListNotification<Post> newPostNotification,
+                       NotificationManager notificationManager, SessionProvider sessionProvider,
+                       @Named("newRemotePost") ListNotification<Post> newPostNotification,
                        @Named("newRemotePostReply") ListNotification<PostReply> newReplyNotification,
-                       @Named("localPost") ListNotification<Post> localPostNotification) {
+                       @Named("localPost") ListNotification<Post> localPostNotification,
+                       @Named("localReply") ListNotification<PostReply> localReplyNotification) {
                this.sonePlugin = sonePlugin;
                this.loaders = loaders;
                this.listNotificationFilter = listNotificationFilter;
@@ -187,18 +180,16 @@ public class WebInterface implements SessionProvider {
                this.l10nFilter = l10nFilter;
                this.translation = translation;
                this.notificationManager = notificationManager;
+               this.sessionProvider = sessionProvider;
                this.newPostNotification = newPostNotification;
                this.newReplyNotification = newReplyNotification;
                this.localPostNotification = localPostNotification;
+               this.localReplyNotification = localReplyNotification;
                formPassword = sonePlugin.pluginRespirator().getToadletContainer().getFormPassword();
 
                this.templateContextFactory = templateContextFactory;
                templateContextFactory.addTemplateObject("webInterface", this);
                templateContextFactory.addTemplateObject("formPassword", formPassword);
-
-               /* create notifications. */
-               Template localReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html");
-               localReplyNotification = new ListNotification<>("local-reply-notification", "replies", localReplyNotificationTemplate, false);
        }
 
        //
@@ -224,75 +215,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);
        }
 
        /**
@@ -319,15 +250,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
@@ -345,16 +267,6 @@ public class WebInterface implements SessionProvider {
                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()
@@ -365,20 +277,6 @@ public class WebInterface implements SessionProvider {
        }
 
        //
-       // 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
        //
 
@@ -489,124 +387,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);
-                       if (!hasFirstStartNotification()) {
-                               notificationManager.addNotification(localReplyNotification);
-                       }
-               }
-       }
-
-       @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) {
-               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();