X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FWebInterface.java;h=1d9087fb3b4aa77c6647474c84237fef5a1386d7;hp=49f1158fa55a4f6bc0e0c4aed1c3eef8392cfd3d;hb=f8b5fd8c832cbea8571fc9db9db6d6bc027b8e0f;hpb=b0994fc0dd621d8af229286932e9aaf0d975e801 diff --git a/src/main/java/net/pterodactylus/sone/web/WebInterface.java b/src/main/java/net/pterodactylus/sone/web/WebInterface.java index 49f1158..1d9087f 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–2016 David Roden + * Sone - WebInterface.java - Copyright © 2010–2019 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 @@ -61,49 +61,24 @@ import net.pterodactylus.sone.core.event.SoneLockedEvent; import net.pterodactylus.sone.core.event.SoneRemovedEvent; import net.pterodactylus.sone.core.event.SoneUnlockedEvent; import net.pterodactylus.sone.core.event.UpdateFoundEvent; -import net.pterodactylus.sone.data.Album; import net.pterodactylus.sone.data.Image; import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.PostReply; -import net.pterodactylus.sone.data.Profile; -import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.freenet.L10nFilter; -import net.pterodactylus.sone.freenet.wot.Identity; -import net.pterodactylus.sone.freenet.wot.Trust; import net.pterodactylus.sone.main.Loaders; -import net.pterodactylus.sone.main.ReparseFilter; +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.main.SonePlugin.PluginHomepage; -import net.pterodactylus.sone.main.SonePlugin.PluginVersion; -import net.pterodactylus.sone.main.SonePlugin.PluginYear; 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.AlbumAccessor; -import net.pterodactylus.sone.template.CollectionAccessor; -import net.pterodactylus.sone.template.CssClassNameFilter; -import net.pterodactylus.sone.template.HttpRequestAccessor; -import net.pterodactylus.sone.template.IdentityAccessor; -import net.pterodactylus.sone.template.ImageAccessor; -import net.pterodactylus.sone.template.ImageLinkFilter; -import net.pterodactylus.sone.template.JavascriptFilter; import net.pterodactylus.sone.template.LinkedElementRenderFilter; -import net.pterodactylus.sone.template.LinkedElementsFilter; import net.pterodactylus.sone.template.ParserFilter; -import net.pterodactylus.sone.template.PostAccessor; -import net.pterodactylus.sone.template.ProfileAccessor; import net.pterodactylus.sone.template.RenderFilter; -import net.pterodactylus.sone.template.ReplyAccessor; -import net.pterodactylus.sone.template.ReplyGroupFilter; -import net.pterodactylus.sone.template.RequestChangeFilter; import net.pterodactylus.sone.template.ShortenFilter; -import net.pterodactylus.sone.template.SoneAccessor; -import net.pterodactylus.sone.template.SubstringFilter; -import net.pterodactylus.sone.template.TrustAccessor; -import net.pterodactylus.sone.template.UniqueElementFilter; -import net.pterodactylus.sone.template.UnknownDateFilter; import net.pterodactylus.sone.text.Part; import net.pterodactylus.sone.text.SonePart; import net.pterodactylus.sone.text.SoneTextParser; @@ -187,21 +162,8 @@ import net.pterodactylus.sone.web.pages.ViewSonePage; import net.pterodactylus.util.notify.Notification; import net.pterodactylus.util.notify.NotificationManager; import net.pterodactylus.util.notify.TemplateNotification; -import net.pterodactylus.util.template.CollectionSortFilter; -import net.pterodactylus.util.template.ContainsFilter; -import net.pterodactylus.util.template.DateFilter; -import net.pterodactylus.util.template.FormatFilter; -import net.pterodactylus.util.template.HtmlFilter; -import net.pterodactylus.util.template.MatchFilter; -import net.pterodactylus.util.template.ModFilter; -import net.pterodactylus.util.template.PaginationFilter; -import net.pterodactylus.util.template.ReflectionAccessor; -import net.pterodactylus.util.template.ReplaceFilter; -import net.pterodactylus.util.template.StoreFilter; import net.pterodactylus.util.template.Template; import net.pterodactylus.util.template.TemplateContextFactory; -import net.pterodactylus.util.template.TemplateProvider; -import net.pterodactylus.util.template.XmlFilter; import net.pterodactylus.util.web.RedirectPage; import net.pterodactylus.util.web.TemplatePage; @@ -210,7 +172,6 @@ import freenet.clients.http.SessionManager.Session; import freenet.clients.http.ToadletContainer; import freenet.clients.http.ToadletContext; import freenet.l10n.BaseL10n; -import freenet.support.api.HTTPRequest; import com.google.common.base.Optional; import com.google.common.collect.Collections2; @@ -221,8 +182,6 @@ import com.google.inject.Inject; /** * Bundles functionality that a web interface of a Freenet plugin needs, e.g. * references to l10n helpers. - * - * @author David ‘Bombe’ Roden */ public class WebInterface implements SessionProvider { @@ -239,7 +198,7 @@ public class WebInterface implements SessionProvider { private final SonePlugin sonePlugin; /** The registered toadlets. */ - private final List pageToadlets = new ArrayList(); + private final List pageToadlets = new ArrayList<>(); /** The form password. */ private final String formPassword; @@ -262,7 +221,7 @@ public class WebInterface implements SessionProvider { private final ElementLoader elementLoader; private final LinkedElementRenderFilter linkedElementRenderFilter; private final TimeTextConverter timeTextConverter = new TimeTextConverter(); - private final L10nFilter l10nFilter = new L10nFilter(this); + private final L10nFilter l10nFilter; /** The “new Sone” notification. */ private final ListNotification newSoneNotification; @@ -283,7 +242,7 @@ public class WebInterface implements SessionProvider { private final ListNotification mentionNotification; /** Notifications for sone inserts. */ - private final Map soneInsertNotifications = new HashMap(); + private final Map soneInsertNotifications = new HashMap<>(); /** Sone locked notification ticker objects. */ private final Map> lockedSonesTickerObjects = Collections.synchronizedMap(new HashMap>()); @@ -306,99 +265,64 @@ public class WebInterface implements SessionProvider { /** Scheduled executor for time-based notifications. */ private final ScheduledExecutorService ticker = Executors.newScheduledThreadPool(1); - /** - * Creates a new web interface. - * - * @param sonePlugin - * The Sone plugin - */ @Inject - public WebInterface(SonePlugin sonePlugin, Loaders loaders, ListNotificationFilter listNotificationFilter, PostVisibilityFilter postVisibilityFilter, ReplyVisibilityFilter replyVisibilityFilter, ElementLoader elementLoader) { + public WebInterface(SonePlugin sonePlugin, Loaders loaders, ListNotificationFilter listNotificationFilter, + PostVisibilityFilter postVisibilityFilter, ReplyVisibilityFilter replyVisibilityFilter, + ElementLoader elementLoader, TemplateContextFactory templateContextFactory, + ParserFilter parserFilter, ShortenFilter shortenFilter, + RenderFilter renderFilter, + LinkedElementRenderFilter linkedElementRenderFilter) { this.sonePlugin = sonePlugin; this.loaders = loaders; this.listNotificationFilter = listNotificationFilter; this.postVisibilityFilter = postVisibilityFilter; this.replyVisibilityFilter = replyVisibilityFilter; this.elementLoader = elementLoader; + this.parserFilter = parserFilter; + this.shortenFilter = shortenFilter; + this.renderFilter = renderFilter; + this.linkedElementRenderFilter = linkedElementRenderFilter; formPassword = sonePlugin.pluginRespirator().getToadletContainer().getFormPassword(); soneTextParser = new SoneTextParser(getCore(), getCore()); + l10nFilter = new L10nFilter(getL10n()); - templateContextFactory = new TemplateContextFactory(); - templateContextFactory.addAccessor(Object.class, new ReflectionAccessor()); - templateContextFactory.addAccessor(Collection.class, new CollectionAccessor()); - templateContextFactory.addAccessor(Sone.class, new SoneAccessor(getCore(), new TimeTextConverter())); - templateContextFactory.addAccessor(Post.class, new PostAccessor(getCore())); - templateContextFactory.addAccessor(Reply.class, new ReplyAccessor(getCore())); - templateContextFactory.addAccessor(Album.class, new AlbumAccessor()); - templateContextFactory.addAccessor(Image.class, new ImageAccessor()); - templateContextFactory.addAccessor(Identity.class, new IdentityAccessor(getCore())); - templateContextFactory.addAccessor(Trust.class, new TrustAccessor()); - templateContextFactory.addAccessor(HTTPRequest.class, new HttpRequestAccessor()); - templateContextFactory.addAccessor(Profile.class, new ProfileAccessor(getCore())); - templateContextFactory.addFilter("date", new DateFilter()); - templateContextFactory.addFilter("html", new HtmlFilter()); - templateContextFactory.addFilter("replace", new ReplaceFilter()); - templateContextFactory.addFilter("store", new StoreFilter()); - templateContextFactory.addFilter("l10n", new L10nFilter(this)); - templateContextFactory.addFilter("substring", new SubstringFilter()); - templateContextFactory.addFilter("xml", new XmlFilter()); - templateContextFactory.addFilter("change", new RequestChangeFilter()); - templateContextFactory.addFilter("match", new MatchFilter()); - templateContextFactory.addFilter("css", new CssClassNameFilter()); - templateContextFactory.addFilter("js", new JavascriptFilter()); - templateContextFactory.addFilter("parse", parserFilter = new ParserFilter(getCore(), soneTextParser)); - templateContextFactory.addFilter("shorten", shortenFilter = new ShortenFilter()); - templateContextFactory.addFilter("render", renderFilter = new RenderFilter(getCore(), templateContextFactory)); - templateContextFactory.addFilter("linked-elements", new LinkedElementsFilter(elementLoader)); - templateContextFactory.addFilter("render-linked-element", linkedElementRenderFilter = new LinkedElementRenderFilter(templateContextFactory)); - templateContextFactory.addFilter("reparse", new ReparseFilter()); - templateContextFactory.addFilter("unknown", new UnknownDateFilter(getL10n(), "View.Sone.Text.UnknownDate")); - templateContextFactory.addFilter("format", new FormatFilter()); - templateContextFactory.addFilter("sort", new CollectionSortFilter()); - templateContextFactory.addFilter("image-link", new ImageLinkFilter(getCore(), templateContextFactory)); - templateContextFactory.addFilter("replyGroup", new ReplyGroupFilter()); - templateContextFactory.addFilter("in", new ContainsFilter()); - templateContextFactory.addFilter("unique", new UniqueElementFilter()); - templateContextFactory.addFilter("mod", new ModFilter()); - templateContextFactory.addFilter("paginate", new PaginationFilter()); - templateContextFactory.addProvider(TemplateProvider.TEMPLATE_CONTEXT_PROVIDER); - templateContextFactory.addProvider(loaders.getTemplateProvider()); + this.templateContextFactory = templateContextFactory; templateContextFactory.addTemplateObject("webInterface", this); templateContextFactory.addTemplateObject("formPassword", formPassword); /* create notifications. */ Template newSoneNotificationTemplate = loaders.loadTemplate("/templates/notify/newSoneNotification.html"); - newSoneNotification = new ListNotification("new-sone-notification", "sones", newSoneNotificationTemplate, false); + newSoneNotification = new ListNotification<>("new-sone-notification", "sones", newSoneNotificationTemplate, false); Template newPostNotificationTemplate = loaders.loadTemplate("/templates/notify/newPostNotification.html"); - newPostNotification = new ListNotification("new-post-notification", "posts", newPostNotificationTemplate, false); + newPostNotification = new ListNotification<>("new-post-notification", "posts", newPostNotificationTemplate, false); Template localPostNotificationTemplate = loaders.loadTemplate("/templates/notify/newPostNotification.html"); - localPostNotification = new ListNotification("local-post-notification", "posts", localPostNotificationTemplate, false); + localPostNotification = new ListNotification<>("local-post-notification", "posts", localPostNotificationTemplate, false); Template newReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html"); - newReplyNotification = new ListNotification("new-reply-notification", "replies", newReplyNotificationTemplate, false); + 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); + localReplyNotification = new ListNotification<>("local-reply-notification", "replies", localReplyNotificationTemplate, false); Template mentionNotificationTemplate = loaders.loadTemplate("/templates/notify/mentionNotification.html"); - mentionNotification = new ListNotification("mention-notification", "posts", mentionNotificationTemplate, false); + mentionNotification = new ListNotification<>("mention-notification", "posts", mentionNotificationTemplate, false); Template lockedSonesTemplate = loaders.loadTemplate("/templates/notify/lockedSonesNotification.html"); - lockedSonesNotification = new ListNotification("sones-locked-notification", "sones", lockedSonesTemplate); + lockedSonesNotification = new ListNotification<>("sones-locked-notification", "sones", lockedSonesTemplate); Template newVersionTemplate = loaders.loadTemplate("/templates/notify/newVersionNotification.html"); newVersionNotification = new TemplateNotification("new-version-notification", newVersionTemplate); Template insertingImagesTemplate = loaders.loadTemplate("/templates/notify/inserting-images-notification.html"); - insertingImagesNotification = new ListNotification("inserting-images-notification", "images", insertingImagesTemplate); + insertingImagesNotification = new ListNotification<>("inserting-images-notification", "images", insertingImagesTemplate); Template insertedImagesTemplate = loaders.loadTemplate("/templates/notify/inserted-images-notification.html"); - insertedImagesNotification = new ListNotification("inserted-images-notification", "images", insertedImagesTemplate); + insertedImagesNotification = new ListNotification<>("inserted-images-notification", "images", insertedImagesTemplate); Template imageInsertFailedTemplate = loaders.loadTemplate("/templates/notify/image-insert-failed-notification.html"); - imageInsertFailedNotification = new ListNotification("image-insert-failed-notification", "images", imageInsertFailedTemplate); + imageInsertFailedNotification = new ListNotification<>("image-insert-failed-notification", "images", imageInsertFailedTemplate); } // @@ -410,6 +334,7 @@ public class WebInterface implements SessionProvider { * * @return The Sone core */ + @Nonnull public Core getCore() { return sonePlugin.core(); } @@ -754,12 +679,12 @@ public class WebInterface implements SessionProvider { pageToadlets.add(pageToadletFactory.createPageToadlet(new LogoutPage(emptyTemplate, this), "Logout")); pageToadlets.add(pageToadletFactory.createPageToadlet(new OptionsPage(optionsTemplate, this), "Options")); pageToadlets.add(pageToadletFactory.createPageToadlet(new RescuePage(rescueTemplate, this), "Rescue")); - pageToadlets.add(pageToadletFactory.createPageToadlet(new AboutPage(aboutTemplate, this, new PluginVersion(SonePlugin.getPluginVersion()), new PluginYear(SonePlugin.getYear()), new PluginHomepage(SonePlugin.getHomepage())), "About")); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("noPermission.html", noPermissionTemplate, "Page.NoPermission.Title", this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyImageTitle.html", emptyImageTitleTemplate, "Page.EmptyImageTitle.Title", this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyAlbumTitle.html", emptyAlbumTitleTemplate, "Page.EmptyAlbumTitle.Title", this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new AboutPage(aboutTemplate, this, new PluginVersion(SonePlugin.getPluginVersion()), new PluginYear(sonePlugin.getYear()), new PluginHomepage(sonePlugin.getHomepage())), "About")); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("noPermission.html", this, noPermissionTemplate, "Page.NoPermission.Title"))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyImageTitle.html", this, emptyImageTitleTemplate, "Page.EmptyImageTitle.Title"))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("emptyAlbumTitle.html", this, emptyAlbumTitleTemplate, "Page.EmptyAlbumTitle.Title"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new DismissNotificationPage(emptyTemplate, this))); - pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("invalid.html", invalidTemplate, "Page.Invalid.Title", this))); + pageToadlets.add(pageToadletFactory.createPageToadlet(new SoneTemplatePage("invalid.html", this, invalidTemplate, "Page.Invalid.Title"))); pageToadlets.add(pageToadletFactory.createPageToadlet(loaders.loadStaticPage("css/", "/static/css/", "text/css"))); pageToadlets.add(pageToadletFactory.createPageToadlet(loaders.loadStaticPage("javascript/", "/static/javascript/", "text/javascript"))); pageToadlets.add(pageToadletFactory.createPageToadlet(loaders.loadStaticPage("images/", "/static/images/", "image/png"))); @@ -830,7 +755,7 @@ public class WebInterface implements SessionProvider { */ private Collection getMentionedSones(String text) { /* we need no context to find mentioned Sones. */ - Set mentionedSones = new HashSet(); + Set mentionedSones = new HashSet<>(); for (Part part : soneTextParser.parse(text, null)) { if (part instanceof SonePart) { mentionedSones.add(((SonePart) part).getSone());