From a2e38503febc9f03a51922061b54668079b895f6 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 14 Sep 2015 16:15:21 +0000 Subject: [PATCH] News: New /news page and helper to show all news WIP, not yet hooked in --- .../src/net/i2p/router/news/NewsManager.java | 6 ++ .../src/net/i2p/router/news/PersistNews.java | 2 +- .../net/i2p/router/web/NewsFeedHelper.java | 81 +++++++++++++++++++ apps/routerconsole/jsp/news.jsp | 18 +++++ 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java create mode 100644 apps/routerconsole/jsp/news.jsp diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java index 5fb8cb492..91290988c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -57,6 +57,8 @@ public class NewsManager implements RouterApp { if (!_currentNews.isEmpty()) return new ArrayList(_currentNews); // load old news.xml + if (_log.shouldWarn()) + _log.warn("no real XML, falling back to news.xml"); List rv = parseOldNews(); if (!rv.isEmpty()) { _currentNews = rv; @@ -65,6 +67,8 @@ public class NewsManager implements RouterApp { } // load and translate initialnews // We don't save it to _currentNews, as the language may change + if (_log.shouldWarn()) + _log.warn("no news.xml, falling back to initialNews"); return parseInitialNews(); } @@ -112,6 +116,8 @@ public class NewsManager implements RouterApp { public synchronized void startup() { changeState(STARTING); _currentNews = PersistNews.load(_context); + if (_log.shouldWarn()) + _log.warn("Initialized with " + _currentNews.size() + " entries"); changeState(RUNNING); if (_cmgr != null) _cmgr.register(this); diff --git a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java index 96b8e062f..47fb63e4a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/PersistNews.java @@ -33,7 +33,7 @@ import org.cybergarage.xml.ParserException; * * @since 0.9.23 */ -public class PersistNews { +class PersistNews { private static final String DIR = "docs/news"; private static final String PFX = "news-"; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java new file mode 100644 index 000000000..a70d0061d --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -0,0 +1,81 @@ +package net.i2p.router.web; + +import java.text.DateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import net.i2p.I2PAppContext; +import net.i2p.app.ClientAppManager; +import net.i2p.router.news.NewsEntry; +import net.i2p.router.news.NewsManager; + + +/** + * HTML-formatted full news entries + * + * @since 0.9.23 + */ +public class NewsFeedHelper extends HelperBase { + + private int _start = 0; + private int _limit = 3; + + /** + * @param limit less than or equal to zero means all + */ + public void setLimit(int limit) { + _limit = limit; + } + + public void setStart(int start) { + _start = start; + } + + public String getEntries() { + return getEntries(_context, _start, _limit); + } + + /** + * @param max less than or equal to zero means all + * @return non-null, "" if none + */ + static String getEntries(I2PAppContext ctx, int start, int max) { + if (max <= 0) + max = Integer.MAX_VALUE; + StringBuilder buf = new StringBuilder(512); + List entries = Collections.emptyList(); + ClientAppManager cmgr = ctx.clientAppManager(); + if (cmgr != null) { + NewsManager nmgr = (NewsManager) cmgr.getRegisteredApp(NewsManager.APP_NAME); + if (nmgr != null) + entries = nmgr.getEntries(); + } + if (!entries.isEmpty()) { + DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + // the router sets the JVM time zone to UTC but saves the original here so we can get it + String systemTimeZone = ctx.getProperty("i2p.systemTimeZone"); + if (systemTimeZone != null) + fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); + int i = 0; + for (NewsEntry entry : entries) { + if (i++ < start) + continue; + buf.append("

"); + if (entry.updated > 0) { + Date date = new Date(entry.updated); + buf.append(fmt.format(date)) + .append(": "); + } + buf.append(entry.title) + .append("

\n") + .append(entry.content) + .append("\n"); + if (i >= start + max) + break; + } + } + return buf.toString(); + } +} diff --git a/apps/routerconsole/jsp/news.jsp b/apps/routerconsole/jsp/news.jsp new file mode 100644 index 000000000..7629083bd --- /dev/null +++ b/apps/routerconsole/jsp/news.jsp @@ -0,0 +1,18 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +<%@include file="css.jsi" %> +<%=intl.title("News")%> + +<%@include file="summaryajax.jsi" %> + +<%@include file="summary.jsi" %> +

<%=intl._("Latest News")%>

+
+ +" /> +<% feedHelper.setLimit(0); %> + +