X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FWebInterface.java;h=75b5f50c9b0f7517c4d0e4bc79a2f91789b18667;hb=refs%2Fheads%2Fnew-database-38;hp=a007222435a0541d634670d202b050a7cfb5c2bf;hpb=0206f400c986a38cd91978059e98838c02af0b99;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 a007222..75b5f50 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 David Roden + * Sone - WebInterface.java - Copyright © 2010–2012 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 @@ -103,18 +103,13 @@ import net.pterodactylus.sone.web.ajax.UntrustAjaxPage; import net.pterodactylus.sone.web.page.FreenetRequest; import net.pterodactylus.sone.web.page.PageToadlet; import net.pterodactylus.sone.web.page.PageToadletFactory; -import net.pterodactylus.util.cache.Cache; -import net.pterodactylus.util.cache.CacheException; -import net.pterodactylus.util.cache.CacheItem; -import net.pterodactylus.util.cache.DefaultCacheItem; -import net.pterodactylus.util.cache.MemoryCache; -import net.pterodactylus.util.cache.ValueRetriever; import net.pterodactylus.util.collection.SetBuilder; -import net.pterodactylus.util.filter.Filters; +import net.pterodactylus.util.collection.filter.Filters; import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.notify.Notification; import net.pterodactylus.util.notify.NotificationManager; import net.pterodactylus.util.notify.TemplateNotification; +import net.pterodactylus.util.template.ClassPathTemplateProvider; import net.pterodactylus.util.template.CollectionSortFilter; import net.pterodactylus.util.template.ContainsFilter; import net.pterodactylus.util.template.DateFilter; @@ -122,15 +117,14 @@ 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.Provider; +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.TemplateContext; import net.pterodactylus.util.template.TemplateContextFactory; -import net.pterodactylus.util.template.TemplateException; import net.pterodactylus.util.template.TemplateParser; +import net.pterodactylus.util.template.TemplateProvider; import net.pterodactylus.util.template.XmlFilter; import net.pterodactylus.util.thread.Ticker; import net.pterodactylus.util.version.Version; @@ -138,9 +132,9 @@ import net.pterodactylus.util.web.RedirectPage; import net.pterodactylus.util.web.StaticPage; import net.pterodactylus.util.web.TemplatePage; import freenet.clients.http.SessionManager; +import freenet.clients.http.SessionManager.Session; import freenet.clients.http.ToadletContainer; import freenet.clients.http.ToadletContext; -import freenet.clients.http.SessionManager.Session; import freenet.l10n.BaseL10n; import freenet.support.api.HTTPRequest; @@ -221,7 +215,6 @@ public class WebInterface implements CoreListener { * @param sonePlugin * The Sone plugin */ - @SuppressWarnings("synthetic-access") public WebInterface(SonePlugin sonePlugin) { this.sonePlugin = sonePlugin; formPassword = sonePlugin.pluginRespirator().getToadletContainer().getFormPassword(); @@ -243,7 +236,7 @@ public class WebInterface implements CoreListener { templateContextFactory.addFilter("html", new HtmlFilter()); templateContextFactory.addFilter("replace", new ReplaceFilter()); templateContextFactory.addFilter("store", new StoreFilter()); - templateContextFactory.addFilter("l10n", new L10nFilter(getL10n())); + templateContextFactory.addFilter("l10n", new L10nFilter(this)); templateContextFactory.addFilter("substring", new SubstringFilter()); templateContextFactory.addFilter("xml", new XmlFilter()); templateContextFactory.addFilter("change", new RequestChangeFilter()); @@ -259,8 +252,9 @@ public class WebInterface implements CoreListener { templateContextFactory.addFilter("in", new ContainsFilter()); templateContextFactory.addFilter("unique", new UniqueElementFilter()); templateContextFactory.addFilter("mod", new ModFilter()); - templateContextFactory.addProvider(Provider.TEMPLATE_CONTEXT_PROVIDER); - templateContextFactory.addProvider(new ClassPathTemplateProvider()); + templateContextFactory.addFilter("paginate", new PaginationFilter()); + templateContextFactory.addProvider(TemplateProvider.TEMPLATE_CONTEXT_PROVIDER); + templateContextFactory.addProvider(new ClassPathTemplateProvider(WebInterface.class, "/templates/")); templateContextFactory.addTemplateObject("webInterface", this); templateContextFactory.addTemplateObject("formPassword", formPassword); @@ -378,7 +372,7 @@ public class WebInterface implements CoreListener { * currently logged in */ public Sone getCurrentSone(ToadletContext toadletContext, boolean create) { - Set localSones = getCore().getLocalSones(); + Collection localSones = getCore().getLocalSones(); if (localSones.size() == 1) { return localSones.iterator().next(); } @@ -583,6 +577,7 @@ public class WebInterface implements CoreListener { Template emptyTemplate = TemplateParser.parse(new StringReader("")); Template loginTemplate = TemplateParser.parse(createReader("/templates/login.html")); Template indexTemplate = TemplateParser.parse(createReader("/templates/index.html")); + Template newTemplate = TemplateParser.parse(createReader("/templates/new.html")); Template knownSonesTemplate = TemplateParser.parse(createReader("/templates/knownSones.html")); Template createSoneTemplate = TemplateParser.parse(createReader("/templates/createSone.html")); Template createPostTemplate = TemplateParser.parse(createReader("/templates/createPost.html")); @@ -613,6 +608,7 @@ public class WebInterface implements CoreListener { PageToadletFactory pageToadletFactory = new PageToadletFactory(sonePlugin.pluginRespirator().getHLSimpleClient(), "/Sone/"); pageToadlets.add(pageToadletFactory.createPageToadlet(new RedirectPage("", "index.html"))); pageToadlets.add(pageToadletFactory.createPageToadlet(new IndexPage(indexTemplate, this), "Index")); + pageToadlets.add(pageToadletFactory.createPageToadlet(new NewPage(newTemplate, this), "New")); pageToadlets.add(pageToadletFactory.createPageToadlet(new CreateSonePage(createSoneTemplate, this), "CreateSone")); pageToadlets.add(pageToadletFactory.createPageToadlet(new KnownSonesPage(knownSonesTemplate, this), "KnownSones")); pageToadlets.add(pageToadletFactory.createPageToadlet(new EditProfilePage(editProfileTemplate, this), "EditProfile")); @@ -729,8 +725,8 @@ public class WebInterface implements CoreListener { } /** - * Returns all {@link Core#isLocalSone(Sone) local Sone}s that are - * referenced by {@link SonePart}s in the given text (after parsing it using + * Returns all {@link Core#getLocalSones() local Sone}s that are referenced + * by {@link SonePart}s in the given text (after parsing it using * {@link SoneTextParser}). * * @param text @@ -747,7 +743,7 @@ public class WebInterface implements CoreListener { } } } catch (IOException ioe1) { - logger.log(Level.WARNING, "Could not parse post text: " + text, ioe1); + logger.log(Level.WARNING, String.format("Could not parse post text: %s", text), ioe1); } return Filters.filteredSet(mentionedSones, Sone.LOCAL_SONE_FILTER); } @@ -793,15 +789,14 @@ public class WebInterface implements CoreListener { */ @Override public void newPostFound(Post post) { - boolean isLocal = getCore().isLocalSone(post.getSone()); - if (isLocal) { + if (post.getSone().isLocal()) { localPostNotification.add(post); } else { newPostNotification.add(post); } if (!hasFirstStartNotification()) { - notificationManager.addNotification(isLocal ? localPostNotification : newPostNotification); - if (!getMentionedSones(post.getText()).isEmpty() && !isLocal) { + notificationManager.addNotification(post.getSone().isLocal() ? localPostNotification : newPostNotification); + if (!getMentionedSones(post.getText()).isEmpty() && !post.getSone().isLocal()) { mentionNotification.add(post); notificationManager.addNotification(mentionNotification); } @@ -815,15 +810,14 @@ public class WebInterface implements CoreListener { */ @Override public void newReplyFound(PostReply reply) { - boolean isLocal = getCore().isLocalSone(reply.getSone()); - if (isLocal) { + if (reply.getSone().isLocal()) { localReplyNotification.add(reply); } else { newReplyNotification.add(reply); } if (!hasFirstStartNotification()) { - notificationManager.addNotification(isLocal ? localReplyNotification : newReplyNotification); - if (!getMentionedSones(reply.getText()).isEmpty() && !isLocal && (reply.getPost().getSone() != null) && (reply.getTime() <= System.currentTimeMillis())) { + notificationManager.addNotification(reply.getSone().isLocal() ? localReplyNotification : newReplyNotification); + if (!getMentionedSones(reply.getText()).isEmpty() && !reply.getSone().isLocal() && (reply.getPost().getSone() != null) && (reply.getTime() <= System.currentTimeMillis())) { mentionNotification.add(reply.getPost()); notificationManager.addNotification(mentionNotification); } @@ -888,7 +882,7 @@ public class WebInterface implements CoreListener { if (!getMentionedSones(reply.getText()).isEmpty()) { boolean isMentioned = false; for (PostReply existingReply : getCore().getReplies(reply.getPost())) { - isMentioned |= getCore().isNewReply(reply.getId()) && !getMentionedSones(existingReply.getText()).isEmpty(); + isMentioned |= !reply.isKnown() && !getMentionedSones(existingReply.getText()).isEmpty(); } if (!isMentioned) { mentionNotification.remove(reply.getPost()); @@ -1009,66 +1003,4 @@ public class WebInterface implements CoreListener { notificationManager.addNotification(imageInsertFailedNotification); } - /** - * Template provider implementation that uses - * {@link WebInterface#createReader(String)} to load templates for - * inclusion. - * - * @author David ‘Bombe’ Roden - */ - private class ClassPathTemplateProvider implements Provider { - - /** Cache for templates. */ - private final Cache templateCache = new MemoryCache(new ValueRetriever() { - - @Override - @SuppressWarnings("synthetic-access") - public CacheItem