/*
- * 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 static java.util.stream.Collectors.toSet;
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 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.
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 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,
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("localReply") ListNotification<PostReply> localReplyNotification) {
this.l10nFilter = l10nFilter;
this.translation = translation;
this.notificationManager = notificationManager;
+ this.sessionProvider = sessionProvider;
this.newPostNotification = newPostNotification;
this.newReplyNotification = newReplyNotification;
this.localPostNotification = localPostNotification;
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);
}
/**
}
/**
- * 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
.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();
+ return allNewPosts.stream().filter(p -> postVisibilityFilter.isPostVisible(currentSone, p)).collect(toSet());
}
@Nonnull
.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 allNewReplies.stream().filter(r -> replyVisibilityFilter.isReplyVisible(currentSone, r)).collect(toSet());
}
//
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
- //
-
- @Subscribe
- public void markPostKnown(MarkPostKnownEvent markPostKnownEvent) {
- removePost(markPostKnownEvent.getPost());
- }
-
- @Subscribe
- public void postRemoved(PostRemovedEvent postRemovedEvent) {
- removePost(postRemovedEvent.getPost());
- }
-
- private void removePost(Post post) {
- newPostNotification.remove(post);
- }
-
- /**
- * 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();