X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FWebInterface.java;h=ee8b9bf6d04ba716f800e042d45f8fe05991fcda;hb=0ac5c61faa54b62f29bf8c8e9903919315810c80;hp=db1880bb6aed1b15942a6a8a71bef6485891c212;hpb=2a9b6883dfa5a8e2d13c1ab0fbe8b30c609bf9e9;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 db1880b..ee8b9bf 100644 --- a/src/main/java/net/pterodactylus/sone/web/WebInterface.java +++ b/src/main/java/net/pterodactylus/sone/web/WebInterface.java @@ -21,11 +21,12 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; @@ -48,18 +49,21 @@ import net.pterodactylus.sone.template.ReplyAccessor; import net.pterodactylus.sone.template.RequestChangeFilter; import net.pterodactylus.sone.template.SoneAccessor; import net.pterodactylus.sone.template.SubstringFilter; +import net.pterodactylus.sone.web.ajax.CreatePostAjaxPage; import net.pterodactylus.sone.web.ajax.CreateReplyAjaxPage; import net.pterodactylus.sone.web.ajax.DeletePostAjaxPage; import net.pterodactylus.sone.web.ajax.DeleteReplyAjaxPage; import net.pterodactylus.sone.web.ajax.DismissNotificationAjaxPage; import net.pterodactylus.sone.web.ajax.FollowSoneAjaxPage; import net.pterodactylus.sone.web.ajax.GetLikesAjaxPage; -import net.pterodactylus.sone.web.ajax.GetNotificationsAjaxPage; +import net.pterodactylus.sone.web.ajax.GetPostAjaxPage; import net.pterodactylus.sone.web.ajax.GetReplyAjaxPage; -import net.pterodactylus.sone.web.ajax.GetSoneStatusPage; +import net.pterodactylus.sone.web.ajax.GetStatusAjaxPage; import net.pterodactylus.sone.web.ajax.GetTranslationPage; import net.pterodactylus.sone.web.ajax.LikeAjaxPage; import net.pterodactylus.sone.web.ajax.LockSoneAjaxPage; +import net.pterodactylus.sone.web.ajax.MarkPostAsKnownPage; +import net.pterodactylus.sone.web.ajax.MarkReplyAsKnownPage; import net.pterodactylus.sone.web.ajax.UnfollowSoneAjaxPage; import net.pterodactylus.sone.web.ajax.UnlikeAjaxPage; import net.pterodactylus.sone.web.ajax.UnlockSoneAjaxPage; @@ -81,7 +85,9 @@ import net.pterodactylus.util.template.TemplateProvider; import net.pterodactylus.util.template.XmlFilter; import net.pterodactylus.util.thread.Ticker; import freenet.clients.http.SessionManager; +import freenet.clients.http.SessionManager.Session; import freenet.clients.http.ToadletContainer; +import freenet.clients.http.ToadletContext; import freenet.l10n.BaseL10n; /** @@ -119,6 +125,12 @@ public class WebInterface implements CoreListener { /** The “new reply” notification. */ private final ListNotification newReplyNotification; + /** The “rescuing Sone” notification. */ + private final ListNotification rescuingSonesNotification; + + /** The “Sone rescued” notification. */ + private final ListNotification sonesRescuedNotification; + /** * Creates a new web interface. * @@ -133,8 +145,8 @@ public class WebInterface implements CoreListener { templateFactory.addAccessor(Object.class, new ReflectionAccessor()); templateFactory.addAccessor(Collection.class, new CollectionAccessor()); templateFactory.addAccessor(Sone.class, new SoneAccessor(getCore())); - templateFactory.addAccessor(Post.class, new PostAccessor(getCore())); - templateFactory.addAccessor(Reply.class, new ReplyAccessor(getCore())); + templateFactory.addAccessor(Post.class, new PostAccessor(getCore(), templateFactory)); + templateFactory.addAccessor(Reply.class, new ReplyAccessor(getCore(), templateFactory)); templateFactory.addAccessor(Identity.class, new IdentityAccessor(getCore())); templateFactory.addAccessor(NotificationManager.class, new NotificationManagerAccessor()); templateFactory.addFilter("date", new DateFilter()); @@ -158,6 +170,12 @@ public class WebInterface implements CoreListener { Template newReplyNotificationTemplate = templateFactory.createTemplate(createReader("/templates/notify/newReplyNotification.html")); newReplyNotification = new ListNotification("new-replies-notification", "replies", newReplyNotificationTemplate); + + Template rescuingSonesTemplate = templateFactory.createTemplate(createReader("/templates/notify/rescuingSonesNotification.html")); + rescuingSonesNotification = new ListNotification("sones-being-rescued-notification", "sones", rescuingSonesTemplate); + + Template sonesRescuedTemplate = templateFactory.createTemplate(createReader("/templates/notify/sonesRescuedNotification.html")); + sonesRescuedNotification = new ListNotification("sones-rescued-notification", "sones", sonesRescuedTemplate); } // @@ -174,6 +192,87 @@ public class WebInterface implements CoreListener { } /** + * Returns the current session, creating a new session if there is no + * current session. + * + * @param toadletContenxt + * The toadlet context + * @return The current session, or {@code null} if there is no current + * session + */ + public Session getCurrentSession(ToadletContext toadletContenxt) { + return getCurrentSession(toadletContenxt, true); + } + + /** + * Returns the current session, creating a new session if there is no + * current session and {@code create} is {@code true}. + * + * @param toadletContenxt + * The toadlet context + * @param create + * {@code true} to create a new session if there is no current + * session, {@code false} otherwise + * @return The current session, or {@code null} if there is no current + * session + */ + public Session getCurrentSession(ToadletContext toadletContenxt, boolean create) { + Session session = getSessionManager().useSession(toadletContenxt); + if (create && (session == null)) { + session = getSessionManager().createSession(UUID.randomUUID().toString(), toadletContenxt); + } + return session; + } + + /** + * Returns the currently logged in Sone. + * + * @param toadletContext + * The toadlet context + * @return The currently logged in Sone, or {@code null} if no Sone is + * currently logged in + */ + public Sone getCurrentSone(ToadletContext toadletContext) { + return getCurrentSone(getCurrentSession(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 + */ + public 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, false); + } + + /** + * Sets the currently logged in Sone. + * + * @param toadletContext + * The toadlet context + * @param sone + * The Sone to set as currently logged in + */ + public void setCurrentSone(ToadletContext toadletContext, Sone sone) { + Session session = getCurrentSession(toadletContext); + if (sone == null) { + session.removeAttribute("Sone.CurrentSone"); + } else { + session.setAttribute("Sone.CurrentSone", sone.getId()); + } + } + + /** * Returns the notification manager. * * @return The notification manager @@ -197,12 +296,7 @@ public class WebInterface implements CoreListener { * @return The node’s session manager */ public SessionManager getSessionManager() { - try { - return sonePlugin.pluginRespirator().getSessionManager(new URI("/")); - } catch (URISyntaxException use1) { - logger.log(Level.SEVERE, "Could not get Session Manager!", use1); - return null; - } + return sonePlugin.pluginRespirator().getSessionManager("Sone"); } /** @@ -214,6 +308,26 @@ public class WebInterface implements CoreListener { return formPassword; } + /** + * Returns the posts that have been announced as new in the + * {@link #newPostNotification}. + * + * @return The new posts + */ + public Set getNewPosts() { + return new HashSet(newPostNotification.getElements()); + } + + /** + * Returns the replies that have been announced as new in the + * {@link #newReplyNotification}. + * + * @return The new replies + */ + public Set getNewReplies() { + return new HashSet(newReplyNotification.getElements()); + } + // // ACTIONS // @@ -295,6 +409,7 @@ public class WebInterface implements CoreListener { Template logoutTemplate = templateFactory.createTemplate(createReader("/templates/logout.html")); Template optionsTemplate = templateFactory.createTemplate(createReader("/templates/options.html")); Template aboutTemplate = templateFactory.createTemplate(createReader("/templates/about.html")); + Template postTemplate = templateFactory.createTemplate(createReader("/templates/include/viewPost.html")); Template replyTemplate = templateFactory.createTemplate(createReader("/templates/include/viewReply.html")); PageToadletFactory pageToadletFactory = new PageToadletFactory(sonePlugin.pluginRespirator().getHLSimpleClient(), "/Sone/"); @@ -325,11 +440,14 @@ public class WebInterface implements CoreListener { pageToadlets.add(pageToadletFactory.createPageToadlet(new StaticPage("javascript/", "/static/javascript/", "text/javascript"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new StaticPage("images/", "/static/images/", "image/png"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetTranslationPage(this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new GetNotificationsAjaxPage(this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new GetStatusAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DismissNotificationAjaxPage(this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new GetSoneStatusPage(this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new CreatePostAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new CreateReplyAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new GetReplyAjaxPage(this, replyTemplate))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new GetPostAjaxPage(this, postTemplate))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new MarkPostAsKnownPage(this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new MarkReplyAsKnownPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DeletePostAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DeleteReplyAjaxPage(this))); pageToadlets.add(pageToadletFactory.createPageToadlet(new LockSoneAjaxPage(this))); @@ -387,6 +505,25 @@ public class WebInterface implements CoreListener { * {@inheritDoc} */ @Override + public void rescuingSone(Sone sone) { + rescuingSonesNotification.add(sone); + notificationManager.addNotification(rescuingSonesNotification); + } + + /** + * {@inheritDoc} + */ + @Override + public void rescuedSone(Sone sone) { + rescuingSonesNotification.remove(sone); + sonesRescuedNotification.add(sone); + notificationManager.addNotification(sonesRescuedNotification); + } + + /** + * {@inheritDoc} + */ + @Override public void newSoneFound(Sone sone) { newSoneNotification.add(sone); notificationManager.addNotification(newSoneNotification); @@ -419,9 +556,6 @@ public class WebInterface implements CoreListener { @Override public void markSoneKnown(Sone sone) { newSoneNotification.remove(sone); - if (newSoneNotification.isEmpty()) { - newSoneNotification.dismiss(); - } } /** @@ -430,9 +564,6 @@ public class WebInterface implements CoreListener { @Override public void markPostKnown(Post post) { newPostNotification.remove(post); - if (newPostNotification.isEmpty()) { - newPostNotification.dismiss(); - } } /** @@ -441,9 +572,22 @@ public class WebInterface implements CoreListener { @Override public void markReplyKnown(Reply reply) { newReplyNotification.remove(reply); - if (newReplyNotification.isEmpty()) { - newReplyNotification.dismiss(); - } + } + + /** + * {@inheritDoc} + */ + @Override + public void postRemoved(Post post) { + /* TODO */ + } + + /** + * {@inheritDoc} + */ + @Override + public void replyRemoved(Reply reply) { + /* TODO */ } /**