/*
- * 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
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.template.JavascriptFilter;
import net.pterodactylus.sone.template.ParserFilter;
import net.pterodactylus.sone.template.PostAccessor;
+import net.pterodactylus.sone.template.ProfileAccessor;
import net.pterodactylus.sone.template.ReplyAccessor;
import net.pterodactylus.sone.template.ReplyGroupFilter;
import net.pterodactylus.sone.template.RequestChangeFilter;
import net.pterodactylus.sone.web.ajax.EditProfileFieldAjaxPage;
import net.pterodactylus.sone.web.ajax.FollowSoneAjaxPage;
import net.pterodactylus.sone.web.ajax.GetLikesAjaxPage;
-import net.pterodactylus.sone.web.ajax.GetNotificationAjaxPage;
+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.GetStatusAjaxPage;
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.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.Provider;
import net.pterodactylus.util.template.ReflectionAccessor;
import net.pterodactylus.util.template.ReplaceFilter;
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;
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(getL10n()));
+ templateContextFactory.addFilter("l10n", new L10nFilter(this));
templateContextFactory.addFilter("substring", new SubstringFilter());
templateContextFactory.addFilter("xml", new XmlFilter());
templateContextFactory.addFilter("change", new RequestChangeFilter());
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(templateContextFactory));
+ 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(Provider.TEMPLATE_CONTEXT_PROVIDER);
templateContextFactory.addProvider(new ClassPathTemplateProvider());
templateContextFactory.addTemplateObject("webInterface", this);
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"));
PageToadletFactory pageToadletFactory = new PageToadletFactory(sonePlugin.pluginRespirator().getHLSimpleClient(), "/Sone/");
pageToadlets.add(pageToadletFactory.createPageToadlet(new RedirectPage<FreenetRequest>("", "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"));
pageToadlets.add(pageToadletFactory.createPageToadlet(new GetImagePage(this)));
pageToadlets.add(pageToadletFactory.createPageToadlet(new GetTranslationPage(this)));
pageToadlets.add(pageToadletFactory.createPageToadlet(new GetStatusAjaxPage(this)));
- pageToadlets.add(pageToadletFactory.createPageToadlet(new GetNotificationAjaxPage(this)));
+ pageToadlets.add(pageToadletFactory.createPageToadlet(new GetNotificationsAjaxPage(this)));
pageToadlets.add(pageToadletFactory.createPageToadlet(new DismissNotificationAjaxPage(this)));
pageToadlets.add(pageToadletFactory.createPageToadlet(new CreatePostAjaxPage(this)));
pageToadlets.add(pageToadletFactory.createPageToadlet(new CreateReplyAjaxPage(this)));
}
}
} 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);
}
public void postRemoved(Post post) {
newPostNotification.remove(post);
localPostNotification.remove(post);
+ mentionNotification.remove(post);
}
/**
public void replyRemoved(PostReply reply) {
newReplyNotification.remove(reply);
localReplyNotification.remove(reply);
+ if (!getMentionedSones(reply.getText()).isEmpty()) {
+ boolean isMentioned = false;
+ for (PostReply existingReply : getCore().getReplies(reply.getPost())) {
+ isMentioned |= !reply.isKnown() && !getMentionedSones(existingReply.getText()).isEmpty();
+ }
+ if (!isMentioned) {
+ mentionNotification.remove(reply.getPost());
+ }
+ }
}
/**
try {
return templateCache.get(templateName);
} catch (CacheException ce1) {
- logger.log(Level.WARNING, "Could not get template for " + templateName + "!", ce1);
+ logger.log(Level.WARNING, String.format("Could not get template for %s!", templateName), ce1);
return null;
}
}
try {
template = TemplateParser.parse(templateReader);
} catch (TemplateException te1) {
- logger.log(Level.WARNING, "Could not parse template “" + templateName + "” for inclusion!", te1);
+ logger.log(Level.WARNING, String.format("Could not parse template “%s” for inclusion!", templateName), te1);
}
return template;
}