From ef06fc758cce6aee0cdfd44d912da72c0fd40e8e Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 31 May 2012 09:30:30 +0000 Subject: [PATCH 01/20] Show news headings in the /home sidebar when the main news div is hidden Note: this now refreshes along with the rest of the sidebar, so the news.xml file is read once every 15s - it may be better to cache the headings somewhere, though it's debatable whether reading the cache file is better than reading the news.xml file... --- .../src/net/i2p/router/web/NewsHelper.java | 41 ++++++++++++++++++- apps/routerconsole/jsp/home.jsp | 16 +++----- apps/routerconsole/jsp/xhr1.jsi | 7 ++++ apps/routerconsole/jsp/xhr1.jsp | 7 ++++ .../resources/themes/console/dark/console.css | 9 ++++ 5 files changed, 68 insertions(+), 12 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index 709c4505f..3e4bfc19f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -16,7 +16,46 @@ public class NewsHelper extends ContentHelper { if (!news.exists()) _page = (new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml")).getAbsolutePath(); return super.getContent(); - } + } + + /** @since 0.9.1 */ + public String getNewsHeadings() { + StringBuilder buf = new StringBuilder(512); + String consoleNonce = System.getProperty("router.consoleNonce"); + if (consoleNonce != null) { + // Set up string containing to show news. + String newsUrl = ""; + // Set up title and pre-headings stuff. + buf.append("

").append(_("News & Updates")) + .append("


\n"); + // Get news content. + String newsContent = getContent(); + if (newsContent != "") { + buf.append("\n"); + buf.append(newsUrl).append(Messages.getString("Show news", _context)).append("\n"); + } else { + buf.append("
").append(_("none")).append("
"); + } + // Add post-headings stuff. + buf.append("
\n"); + } + return buf.toString(); + } /** @since 0.8.12 */ public boolean shouldShowNews() { diff --git a/apps/routerconsole/jsp/home.jsp b/apps/routerconsole/jsp/home.jsp index 21b4f6d3c..f4088cc03 100644 --- a/apps/routerconsole/jsp/home.jsp +++ b/apps/routerconsole/jsp/home.jsp @@ -20,6 +20,11 @@ %> " /> +<% + java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + + " /> @@ -33,14 +38,6 @@ <%@include file="xhr1.jsi" %> -<% - if (!newshelper.shouldShowNews()) { -%> -

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


- -<% - } // !shouldShowNews() -%> @@ -48,11 +45,8 @@ <% if (newshelper.shouldShowNews()) { - java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); %>
- -

diff --git a/apps/routerconsole/jsp/xhr1.jsi b/apps/routerconsole/jsp/xhr1.jsi index a171d0c85..c75ec3eac 100644 --- a/apps/routerconsole/jsp/xhr1.jsi +++ b/apps/routerconsole/jsp/xhr1.jsi @@ -17,6 +17,13 @@

"><%=intl._("Network")%>:


+<% + if (!newshelper.shouldShowNews()) { +%> +
+<% + } // !shouldShowNews() +%>
diff --git a/apps/routerconsole/jsp/xhr1.jsp b/apps/routerconsole/jsp/xhr1.jsp index 95c27683b..b48e82442 100644 --- a/apps/routerconsole/jsp/xhr1.jsp +++ b/apps/routerconsole/jsp/xhr1.jsp @@ -11,4 +11,11 @@ %> " /> + +" /> +<% + java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + + <%@include file="xhr1.jsi" %> diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css index acc5d6b9b..2c32a68f3 100644 --- a/installer/resources/themes/console/dark/console.css +++ b/installer/resources/themes/console/dark/console.css @@ -170,6 +170,10 @@ div.routersummary h4 { line-height: 100%; } +div.routersummary ul { + text-align: left !important; +} + div.routersummary table { border: 0; text-align: center !important; @@ -227,6 +231,11 @@ div routersummary hr:last-child { margin-bottom: -5px !important; } +div.newsheadings { + text-align: right; + margin: 0 0 0 10px; +} + div.tunnels { padding-top: 3px !important; margin-left: -4px; From b23414eab1c17e9150541ad1a2b7f86d9482e52d Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 1 Jun 2012 01:21:57 +0000 Subject: [PATCH 02/20] Reordered /home summarybar, added
after update download button --- .../java/src/net/i2p/router/web/SummaryHelper.java | 2 +- apps/routerconsole/jsp/xhr1.jsi | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 4e7d2f23f..80456d604 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -651,7 +651,7 @@ public class SummaryHelper extends HelperBase { .append(_("Download Unsigned
Update {0}", getUnsignedUpdateVersion())) .append("
\n"); } - buf.append("\n"); + buf.append("
\n"); } } return buf.toString(); diff --git a/apps/routerconsole/jsp/xhr1.jsi b/apps/routerconsole/jsp/xhr1.jsi index c75ec3eac..4a646c759 100644 --- a/apps/routerconsole/jsp/xhr1.jsi +++ b/apps/routerconsole/jsp/xhr1.jsi @@ -14,9 +14,6 @@ reqURI = reqURI.replace("/xhr1.jsp", "/home"); helper.setRequestURI(reqURI); %> -

"><%=intl._("Network")%>: -

-
<% if (!newshelper.shouldShowNews()) { %> @@ -25,7 +22,10 @@ } // !shouldShowNews() %> - +

"><%=intl._("Network")%>: +


+
+ From 69d909d3eb2bf35f6e7fa314ce53f0de71840518 Mon Sep 17 00:00:00 2001 From: str4d Date: Sun, 3 Jun 2012 00:22:03 +0000 Subject: [PATCH 03/20] Added
s to separate the various logs on /logs --- apps/routerconsole/jsp/logs.jsp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp index 373e386eb..0f470e7c9 100644 --- a/apps/routerconsole/jsp/logs.jsp +++ b/apps/routerconsole/jsp/logs.jsp @@ -33,8 +33,10 @@

<%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%>

<%=intl._("Critical Logs")%>

+

<%=intl._("Router Logs")%> (<%=intl._("configure")%>)

+

<%=intl._("Service (Wrapper) Logs")%>


From 910001e3a141dc9f9a33802f51b87c39a69b1e31 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 4 Jun 2012 13:10:12 +0000 Subject: [PATCH 04/20] Split HTML rendering of summary bar into separate methods This solidifies the summary bar design pattern of modular sections separated by
s which in future could be reordered or hidden without affecting the theme. --- .../i2p/router/web/SummaryBarRenderer.java | 346 +++++++++++------- 1 file changed, 204 insertions(+), 142 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index a61e543cc..435388dca 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -39,13 +39,10 @@ public class SummaryBarRenderer { .append(_("I2P Router Console")) .append("\" title=\"") .append(_("I2P Router Console")) - .append("\">
") - - .append("

") - .append(_("Help & FAQ")) - .append("


"); + .append("\">\n") + .append("
\n") + .append(renderHelpAndFAQHTML()) + .append("
\n"); File lpath = new File(_context.getBaseDir(), "docs/toolbar.html"); // you better have target="_top" for the links in there... @@ -55,118 +52,172 @@ public class SummaryBarRenderer { linkhelper.setMaxLines("100"); buf.append(linkhelper.getContent()); } else { - buf.append("

") - .append(_("I2P Services")) - .append("

\n" + - - "
" + - - "") - .append(_("Email")) - .append("\n" + - - "") - .append(_("Torrents")) - .append("\n" + - - "") - .append(_("Website")) - .append("\n") - - .append(NavHelper.getClientAppLinks(_context)) - - .append("
\n" + - - "

") - .append(_("I2P Internals")) - .append("


\n" + - - "
\n" + - - "") - .append(_("Tunnels")) - .append("\n" + - - "") - .append(_("Peers")) - .append("\n" + - - "") - .append(_("Profiles")) - .append("\n" + - - "") - .append(_("NetDB")) - .append("\n" + - - "") - .append(_("Logs")) - .append("\n"); - - // "") - // .append(_("Jobs")) - // .append("\n" + - - if (!StatSummarizer.isDisabled()) { - buf.append("") - .append(_("Graphs")) - .append("\n"); - } - - buf.append("") - .append(_("Stats")) - .append("\n" + - - "") - .append(_("I2PTunnel")) - .append("\n" + - - "") - .append(_("Addressbook")) - .append("\n"); - - File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html"); - if (javadoc.exists()) - buf.append("Javadoc\n"); - buf.append("
\n"); + buf.append(renderI2PServicesHTML()) + .append("
\n") + .append(renderI2PInternalsHTML()); out.write(buf.toString()); buf.setLength(0); } + buf.append("
\n") + .append(renderGeneralHTML()) + .append("
\n") + .append(renderNetworkReachabilityHTML()) + .append("
\n") + .append(_helper.getUpdateStatus()) + .append(_helper.getRestartStatus()) + .append("
\n") + .append(renderPeersHTML()) + .append("
\n"); + + out.write(buf.toString()); + buf.setLength(0); + + buf.append(_helper.getFirewallAndReseedStatus()); + + buf.append(renderBandwidthHTML()) + .append("
\n") + .append(renderTunnelsHTML()) + .append("
\n") + .append(renderCongestionHTML()) + .append("
\n") + .append(renderTunnelStatusHTML()) + .append("
\n") + .append(_helper.getDestinations()) + .append("
\n"); - buf.append("

") + .append(_("Help & FAQ")) + .append("

"); + return buf.toString(); + } + + public String renderI2PServicesHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") + .append(_("I2P Services")) + .append("

\n" + + + "
" + + + "") + .append(_("Email")) + .append("\n" + + + "") + .append(_("Torrents")) + .append("\n" + + + "") + .append(_("Website")) + .append("\n") + + .append(NavHelper.getClientAppLinks(_context)) + + .append("
\n"); + return buf.toString(); + } + + public String renderI2PInternalsHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") + .append(_("I2P Internals")) + .append("


\n" + + + "
\n" + + + "") + .append(_("Tunnels")) + .append("\n" + + + "") + .append(_("Peers")) + .append("\n" + + + "") + .append(_("Profiles")) + .append("\n" + + + "") + .append(_("NetDB")) + .append("\n" + + + "") + .append(_("Logs")) + .append("\n"); + + // "") + // .append(_("Jobs")) + // .append("\n" + + + if (!StatSummarizer.isDisabled()) { + buf.append("") + .append(_("Graphs")) + .append("\n"); + } + + buf.append("") + .append(_("Stats")) + .append("\n" + + + "") + .append(_("I2PTunnel")) + .append("\n" + + + "") + .append(_("Addressbook")) + .append("\n"); + + File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html"); + if (javadoc.exists()) + buf.append("Javadoc\n"); + buf.append("
\n"); + return buf.toString(); + } + + public String renderGeneralHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("General")) @@ -202,24 +253,25 @@ public class SummaryBarRenderer { .append(":" + "") .append(_helper.getUptime()) - .append("\n" + + .append("\n"); + return buf.toString(); + } - "

") .append(_("Network")) .append(": ") .append(_helper.getReachability()) - .append("


\n") + .append("

\n"); + return buf.toString(); + } - - .append(_helper.getUpdateStatus()) - - - .append(_helper.getRestartStatus()) - - - .append("

") .append(_("Peers")) @@ -260,14 +312,12 @@ public class SummaryBarRenderer { .append(_helper.getAllPeers()) .append("\n" + - "
\n"); - - - out.write(buf.toString()); - buf.setLength(0); - - buf.append(_helper.getFirewallAndReseedStatus()); + "\n"); + return buf.toString(); + } + public String renderBandwidthHTML() { + StringBuilder buf = new StringBuilder(512); buf.append("

") @@ -303,9 +353,15 @@ public class SummaryBarRenderer { .append(_helper.getInboundTransferred()) .append(SummaryHelper.THINSP) .append(_helper.getOutboundTransferred()) - .append("\n" + + .append("\n" + - "

\n"); + return buf.toString(); + } + + public String renderTunnelsHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("Tunnels")) @@ -336,7 +392,13 @@ public class SummaryBarRenderer { .append(_helper.getShareRatio()) .append("\n" + - "

\n"); + return buf.toString(); + } + + public String renderCongestionHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("Congestion")) @@ -369,16 +431,16 @@ public class SummaryBarRenderer { .append(_helper.getInboundBacklog()) .append("\n" + - "

") + "\n"); + return buf.toString(); + } + + public String renderTunnelStatusHTML() { + StringBuilder buf = new StringBuilder(50); + buf.append("

") .append(_(_helper.getTunnelStatus())) - .append("


\n") - - .append(_helper.getDestinations()) - .append("
\n"); - - - - out.write(buf.toString()); + .append("

\n"); + return buf.toString(); } /** translate a string */ From 9333cd56f96e61d3fc870e62fa8ec920e872300f Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 4 Jun 2012 13:28:52 +0000 Subject: [PATCH 05/20] Moved calls to external renderers into separate methods to match the rest --- .../i2p/router/web/SummaryBarRenderer.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 435388dca..86ad13141 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -65,8 +65,8 @@ public class SummaryBarRenderer { .append("
\n") .append(renderNetworkReachabilityHTML()) .append("
\n") - .append(_helper.getUpdateStatus()) - .append(_helper.getRestartStatus()) + .append(renderUpdateStatusHTML()) + .append(renderRestartStatusHTML()) .append("
\n") .append(renderPeersHTML()) .append("
\n"); @@ -74,9 +74,8 @@ public class SummaryBarRenderer { out.write(buf.toString()); buf.setLength(0); - buf.append(_helper.getFirewallAndReseedStatus()); - - buf.append(renderBandwidthHTML()) + buf.append(renderFirewallAndReseedStatusHTML()) + .append(renderBandwidthHTML()) .append("
\n") .append(renderTunnelsHTML()) .append("
\n") @@ -87,8 +86,6 @@ public class SummaryBarRenderer { .append(_helper.getDestinations()) .append("
\n"); - - out.write(buf.toString()); } @@ -269,6 +266,18 @@ public class SummaryBarRenderer { return buf.toString(); } + public String renderUpdateStatusHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append(_helper.getUpdateStatus()); + return buf.toString(); + } + + public String renderRestartStatusHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append(_helper.getRestartStatus()); + return buf.toString(); + } + public String renderPeersHTML() { StringBuilder buf = new StringBuilder(512); buf.append("

Date: Mon, 4 Jun 2012 23:46:03 +0000 Subject: [PATCH 06/20] Moved rendering of news headings into SummaryBarRenderer An instance of NewsHelper needs to be passed in to get output. --- .../src/net/i2p/router/web/NewsHelper.java | 37 +-------- .../i2p/router/web/SummaryBarRenderer.java | 77 ++++++++++++++++++- 2 files changed, 78 insertions(+), 36 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index 3e4bfc19f..833e197a0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -20,41 +20,8 @@ public class NewsHelper extends ContentHelper { /** @since 0.9.1 */ public String getNewsHeadings() { - StringBuilder buf = new StringBuilder(512); - String consoleNonce = System.getProperty("router.consoleNonce"); - if (consoleNonce != null) { - // Set up string containing to show news. - String newsUrl = ""; - // Set up title and pre-headings stuff. - buf.append("

").append(_("News & Updates")) - .append("


\n"); - // Get news content. - String newsContent = getContent(); - if (newsContent != "") { - buf.append("
    \n"); - // Parse news content for headings. - int start = newsContent.indexOf("

    "); - while (start >= 0) { - // Add offset to start: - // 4 - gets rid of

    - // 16 - gets rid of the date as well (assuming form "

    yyyy-mm-dd: Foobarbaz...") - newsContent = newsContent.substring(start+16, newsContent.length()); - int end = newsContent.indexOf("

    "); - if (end >= 0) { - String heading = newsContent.substring(0, end); - buf.append("
  • ").append(heading).append("
  • \n"); - } - start = newsContent.indexOf("

    "); - } - buf.append("

\n"); - buf.append(newsUrl).append(Messages.getString("Show news", _context)).append("\n"); - } else { - buf.append("
").append(_("none")).append("
"); - } - // Add post-headings stuff. - buf.append("
\n"); - } - return buf.toString(); + SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this); + return renderer.renderNewsHeadingsHTML(); } /** @since 0.8.12 */ diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 86ad13141..2fd6c8073 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -14,10 +14,20 @@ import net.i2p.router.RouterContext; public class SummaryBarRenderer { private final RouterContext _context; private final SummaryHelper _helper; + private final NewsHelper _newshelper; public SummaryBarRenderer(RouterContext context, SummaryHelper helper) { + this(context, helper, null); + } + + public SummaryBarRenderer(RouterContext context, NewsHelper newshelper) { + this(context, null, newshelper); + } + + public SummaryBarRenderer(RouterContext context, SummaryHelper helper, NewsHelper newshelper) { _context = context; _helper = helper; + _newshelper = newshelper; } /** @@ -83,7 +93,7 @@ public class SummaryBarRenderer { .append("
\n") .append(renderTunnelStatusHTML()) .append("
\n") - .append(_helper.getDestinations()) + .append(renderDestinationsHTML()) .append("
\n"); out.write(buf.toString()); @@ -213,6 +223,7 @@ public class SummaryBarRenderer { } public String renderGeneralHTML() { + if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

") .append(_(_helper.getTunnelStatus())) @@ -458,6 +478,61 @@ public class SummaryBarRenderer { return buf.toString(); } + public String renderDestinationsHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append(_helper.getDestinations()); + return buf.toString(); + } + + /** @since 0.9.1 */ + public String renderNewsHeadingsHTML() { + if (_newshelper == null) return ""; + StringBuilder buf = new StringBuilder(512); + String consoleNonce = System.getProperty("router.consoleNonce"); + if (consoleNonce != null) { + // Set up title and pre-headings stuff. + buf.append("

") + .append(_("News & Updates")) + .append("


\n"); + // Get news content. + String newsContent = _newshelper.getContent(); + if (newsContent != "") { + buf.append("
    \n"); + // Parse news content for headings. + int start = newsContent.indexOf("

    "); + while (start >= 0) { + // Add offset to start: + // 4 - gets rid of

    + // 16 - gets rid of the date as well (assuming form "

    yyyy-mm-dd: Foobarbaz...") + newsContent = newsContent.substring(start+16, newsContent.length()); + int end = newsContent.indexOf("

    "); + if (end >= 0) { + String heading = newsContent.substring(0, end); + buf.append("
  • ") + .append(heading) + .append("
  • \n"); + } + start = newsContent.indexOf("

    "); + } + buf.append("

\n"); + // Set up string containing to show news. + buf.append("") + .append(_("Show news")) + .append("\n"); + } else { + buf.append("
") + .append(_("none")) + .append("
"); + } + // Add post-headings stuff. + buf.append("
\n"); + } + return buf.toString(); + } + /** translate a string */ private String _(String s) { return Messages.getString(s, _context); From 5699b4515b593b0b4fa33f01063f753d949008d1 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 5 Jun 2012 02:12:30 +0000 Subject: [PATCH 07/20] Preparations for making the summary bar customisable --- .../i2p/router/web/SummaryBarRenderer.java | 53 ++++++++++++++++++- .../src/net/i2p/router/web/SummaryHelper.java | 29 ++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 2fd6c8073..fa04bccad 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -3,6 +3,9 @@ package net.i2p.router.web; import java.io.File; import java.io.IOException; import java.io.Writer; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; @@ -12,6 +15,31 @@ import net.i2p.router.RouterContext; * */ public class SummaryBarRenderer { + static final Map sections; + static { + Map aMap = new HashMap();; + try { + aMap.put("HelpAndFAQ", SummaryBarRenderer.class.getMethod("renderHelpAndFAQHTML")); + aMap.put("I2PServices", SummaryBarRenderer.class.getMethod("renderI2PServicesHTML")); + aMap.put("I2PInternals", SummaryBarRenderer.class.getMethod("renderI2PInternalsHTML")); + aMap.put("General", SummaryBarRenderer.class.getMethod("renderGeneralHTML")); + aMap.put("ShortGeneral", SummaryBarRenderer.class.getMethod("renderShortGeneralHTML")); + aMap.put("NetworkReachability", SummaryBarRenderer.class.getMethod("renderNetworkReachabilityHTML")); + aMap.put("UpdateStatus", SummaryBarRenderer.class.getMethod("renderUpdateStatusHTML")); + aMap.put("RestartStatus", SummaryBarRenderer.class.getMethod("renderRestartStatusHTMLHTML")); + aMap.put("Peers", SummaryBarRenderer.class.getMethod("renderPeersHTML")); + aMap.put("FirewallAndReseedStatus", SummaryBarRenderer.class.getMethod("renderFirewallAndReseedStatusHTML")); + aMap.put("Bandwidth", SummaryBarRenderer.class.getMethod("renderBandwidthHTML")); + aMap.put("Tunnels", SummaryBarRenderer.class.getMethod("renderTunnelsHTML")); + aMap.put("Congestion", SummaryBarRenderer.class.getMethod("renderCongestionHTML")); + aMap.put("TunnelStatus", SummaryBarRenderer.class.getMethod("renderTunnelStatusHTML")); + aMap.put("Destinations", SummaryBarRenderer.class.getMethod("renderDestinationsHTML")); + aMap.put("NewsHeadings", SummaryBarRenderer.class.getMethod("renderNewsHeadingsHTML")); + } catch (java.lang.NoSuchMethodException e) { + } + sections = Collections.unmodifiableMap(aMap); + } + private final RouterContext _context; private final SummaryHelper _helper; private final NewsHelper _newshelper; @@ -265,6 +293,29 @@ public class SummaryBarRenderer { return buf.toString(); } + public String renderShortGeneralHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append("" + + "" + + "\n" + + + "" + + "" + + "
") + .append(_("Version")) + .append(":") + .append(_helper.getVersion()) + .append("
") + .append(_("Uptime")) + .append(":") + .append(_helper.getUptime()) + .append("
\n"); + return buf.toString(); + } + public String renderNetworkReachabilityHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); @@ -487,7 +538,7 @@ public class SummaryBarRenderer { /** @since 0.9.1 */ public String renderNewsHeadingsHTML() { - if (_newshelper == null) return ""; + if (_newshelper == null || _newshelper.shouldShowNews()) return ""; StringBuilder buf = new StringBuilder(512); String consoleNonce = System.getProperty("router.consoleNonce"); if (consoleNonce != null) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 80456d604..282c1be1e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -35,6 +35,35 @@ public class SummaryHelper extends HelperBase { // Opera 10.63 doesn't have the char, TODO check UA //static final String THINSP = " / "; static final String THINSP = " / "; + private static final char S = ','; + static final String PROP_SUMMARYBAR = "routerconsole.summarybar"; + + static final String PRESET_FULL = + "HelpAndFAQ" + S + + "I2PServices" + S + + "I2PInternals" + S + + "General" + S + + "NetworkReachability" + S + + "UpdateStatus" + S + + "RestartStatus" + S + + "Peers" + S + + "FirewallAndReseedStatus" + S + + "Bandwidth" + S + + "Tunnels" + S + + "Congestion" + S + + "TunnelStatus" + S + + "Destinations" + S + + ""; + + static final String PRESET_SHORT = + "ShortGeneral" + S + + "NewsHeadings" + S + + "UpdateStatus" + S + + "NetworkReachability" + S + + "FirewallAndReseedStatus" + S + + "Destinations" + S + + "RestartStatus" + S + + ""; /** * Retrieve the shortened 4 character ident for the router located within From 531c6c0f4c4e8cea259e42550da58a419345b951 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 5 Jun 2012 07:36:24 +0000 Subject: [PATCH 08/20] Implementation of customisable summary bar via routerconsole.summaryBar property The initial attempt using mapping of strings to methods is shorter and neater, but also doesn't work so is commented out. --- .../i2p/router/web/SummaryBarRenderer.java | 102 ++++++++++-------- .../src/net/i2p/router/web/SummaryHelper.java | 14 ++- apps/routerconsole/jsp/summaryframe.jsp | 2 +- 3 files changed, 69 insertions(+), 49 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index fa04bccad..756126895 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -15,7 +15,7 @@ import net.i2p.router.RouterContext; * */ public class SummaryBarRenderer { - static final Map sections; + /*static final Map ALL_SECTIONS; static { Map aMap = new HashMap();; try { @@ -37,8 +37,8 @@ public class SummaryBarRenderer { aMap.put("NewsHeadings", SummaryBarRenderer.class.getMethod("renderNewsHeadingsHTML")); } catch (java.lang.NoSuchMethodException e) { } - sections = Collections.unmodifiableMap(aMap); - } + ALL_SECTIONS = Collections.unmodifiableMap(aMap); + }*/ private final RouterContext _context; private final SummaryHelper _helper; @@ -77,54 +77,62 @@ public class SummaryBarRenderer { .append(_("I2P Router Console")) .append("\" title=\"") .append(_("I2P Router Console")) - .append("\">\n") - .append("
\n") - .append(renderHelpAndFAQHTML()) - .append("
\n"); + .append("\">\n"); - File lpath = new File(_context.getBaseDir(), "docs/toolbar.html"); - // you better have target="_top" for the links in there... - if (lpath.exists()) { - ContentHelper linkhelper = new ContentHelper(); - linkhelper.setPage(lpath.getAbsolutePath()); - linkhelper.setMaxLines("100"); - buf.append(linkhelper.getContent()); - } else { - buf.append(renderI2PServicesHTML()) - .append("
\n") - .append(renderI2PInternalsHTML()); + out.write(buf.toString()); - out.write(buf.toString()); + String[] sections = _helper.getSummaryBarSections(); + for (int i = 0; i < sections.length; i++) { + /*try { + String section = (String)ALL_SECTIONS.get(sections[i]).invoke(this); + if (section != null && section != "") { + out.write("
" + i + "
\n" + section); + } + } catch (Exception e) { + out.write("
" +i + " - Exception
\n" + e); + }*/ buf.setLength(0); + + String section = sections[i]; + + buf.append("
\n"); + if ("HelpAndFAQ".equals(section)) + buf.append(renderHelpAndFAQHTML()); + else if ("I2PServices".equals(section)) + buf.append(renderI2PServicesHTML()); + else if ("I2PInternals".equals(section)) + buf.append(renderI2PInternalsHTML()); + else if ("General".equals(section)) + buf.append(renderGeneralHTML()); + else if ("ShortGeneral".equals(section)) + buf.append(renderShortGeneralHTML()); + else if ("NetworkReachability".equals(section)) + buf.append(renderNetworkReachabilityHTML()); + else if ("UpdateStatus".equals(section)) + buf.append(renderUpdateStatusHTML()); + else if ("RestartStatus".equals(section)) + buf.append(renderRestartStatusHTML()); + else if ("Peers".equals(section)) + buf.append(renderPeersHTML()); + else if ("FirewallAndReseedStatus".equals(section)) + buf.append(renderFirewallAndReseedStatusHTML()); + else if ("Bandwidth".equals(section)) + buf.append(renderBandwidthHTML()); + else if ("Tunnels".equals(section)) + buf.append(renderTunnelsHTML()); + else if ("Congestion".equals(section)) + buf.append(renderCongestionHTML()); + else if ("TunnelStatus".equals(section)) + buf.append(renderTunnelStatusHTML()); + else if ("Destinations".equals(section)) + buf.append(renderDestinationsHTML()); + else if ("NewsHeadings".equals(section)) + buf.append(renderNewsHeadingsHTML()); + + // Only output section if there's more than the
to print + if (buf.length() > 5) + out.write(buf.toString()); } - - buf.append("
\n") - .append(renderGeneralHTML()) - .append("
\n") - .append(renderNetworkReachabilityHTML()) - .append("
\n") - .append(renderUpdateStatusHTML()) - .append(renderRestartStatusHTML()) - .append("
\n") - .append(renderPeersHTML()) - .append("
\n"); - - out.write(buf.toString()); - buf.setLength(0); - - buf.append(renderFirewallAndReseedStatusHTML()) - .append(renderBandwidthHTML()) - .append("
\n") - .append(renderTunnelsHTML()) - .append("
\n") - .append(renderCongestionHTML()) - .append("
\n") - .append(renderTunnelStatusHTML()) - .append("
\n") - .append(renderDestinationsHTML()) - .append("
\n"); - - out.write(buf.toString()); } public String renderHelpAndFAQHTML() { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 282c1be1e..46c6d58af 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -36,7 +36,7 @@ public class SummaryHelper extends HelperBase { //static final String THINSP = " / "; static final String THINSP = " / "; private static final char S = ','; - static final String PROP_SUMMARYBAR = "routerconsole.summarybar"; + static final String PROP_SUMMARYBAR = "routerconsole.summaryBar"; static final String PRESET_FULL = "HelpAndFAQ" + S + @@ -739,6 +739,18 @@ public class SummaryHelper extends HelperBase { return buf.toString(); } + public String[] getSummaryBarSections() { + String config = _context.getProperty(PROP_SUMMARYBAR, PRESET_FULL); + return config.split("" + S); + } + + public void saveSummaryBarSections(String[] sections) { + StringBuilder buf = new StringBuilder(512); + for(int i = 0; i < sections.length; i++) + buf.append(sections[i]).append(S); + _context.router().saveConfig(PROP_SUMMARYBAR, buf.toString()); + } + /** output the summary bar to _out */ public void renderSummaryBar() throws IOException { SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this); diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp index bdd4a8cbc..5822c9f64 100644 --- a/apps/routerconsole/jsp/summaryframe.jsp +++ b/apps/routerconsole/jsp/summaryframe.jsp @@ -56,7 +56,7 @@ <% // d and shutdownSoon defined above if (!shutdownSoon) { - out.print("
\n"); + out.print("
\n
\n"); if ("0".equals(d)) { out.print(""); out.print(intl._("Refresh (s)")); From 52a38607175b7ae22c3d5723f218d65cf843514b Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 5 Jun 2012 12:44:17 +0000 Subject: [PATCH 09/20] Rearrange summary bar code to consolidate Ajax and IFrame, and /home and /console Now, Ajax will be used first, and will fall back to IFrame if JS is disabled, and a separate page if on a text or mobile browser. Also, /home and /console (and everywhere) now all have the same summary bar content, which currently defaults to the original full listing. --- .../src/net/i2p/router/web/NewsHelper.java | 6 --- .../i2p/router/web/SummaryBarRenderer.java | 35 +++------------ .../src/net/i2p/router/web/SummaryHelper.java | 4 ++ apps/routerconsole/jsp/console.jsp | 17 ++++--- apps/routerconsole/jsp/home.jsp | 3 +- apps/routerconsole/jsp/summary.jsi | 15 +++++-- apps/routerconsole/jsp/summaryframe.jsp | 7 +++ apps/routerconsole/jsp/summarynoframe.jsi | 44 ++++++------------- apps/routerconsole/jsp/xhr1.jsi | 44 ++++++++++++------- 9 files changed, 79 insertions(+), 96 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index 833e197a0..d5d702e8f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -18,12 +18,6 @@ public class NewsHelper extends ContentHelper { return super.getContent(); } - /** @since 0.9.1 */ - public String getNewsHeadings() { - SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this); - return renderer.renderNewsHeadingsHTML(); - } - /** @since 0.8.12 */ public boolean shouldShowNews() { return NewsFetcher.getInstance(_context).shouldShowNews(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 756126895..84f140102 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -15,6 +15,7 @@ import net.i2p.router.RouterContext; * */ public class SummaryBarRenderer { + // Commented out because broken. Replaced by if-elseif blob below. /*static final Map ALL_SECTIONS; static { Map aMap = new HashMap();; @@ -42,20 +43,10 @@ public class SummaryBarRenderer { private final RouterContext _context; private final SummaryHelper _helper; - private final NewsHelper _newshelper; public SummaryBarRenderer(RouterContext context, SummaryHelper helper) { - this(context, helper, null); - } - - public SummaryBarRenderer(RouterContext context, NewsHelper newshelper) { - this(context, null, newshelper); - } - - public SummaryBarRenderer(RouterContext context, SummaryHelper helper, NewsHelper newshelper) { _context = context; _helper = helper; - _newshelper = newshelper; } /** @@ -64,25 +55,9 @@ public class SummaryBarRenderer { */ public void renderSummaryHTML(Writer out) throws IOException { StringBuilder buf = new StringBuilder(8*1024); - String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME); - - // TODO - the bar would render more cleanly if we specified the img height and width here, - // but unfortunately the images in the different themes are different sizes. - // They range in height from 37 to 43 px. But there's a -2 bottom margin... - // So put it in a div. - buf.append("
\"")
\n"); - - out.write(buf.toString()); - String[] sections = _helper.getSummaryBarSections(); for (int i = 0; i < sections.length; i++) { + // Commented out because broken. Replaced by if-elseif blob below. /*try { String section = (String)ALL_SECTIONS.get(sections[i]).invoke(this); if (section != null && section != "") { @@ -546,7 +521,9 @@ public class SummaryBarRenderer { /** @since 0.9.1 */ public String renderNewsHeadingsHTML() { - if (_newshelper == null || _newshelper.shouldShowNews()) return ""; + if (_helper == null) return ""; + NewsHelper newshelper = _helper.getNewsHelper(); + if (newshelper == null || newshelper.shouldShowNews()) return ""; StringBuilder buf = new StringBuilder(512); String consoleNonce = System.getProperty("router.consoleNonce"); if (consoleNonce != null) { @@ -555,7 +532,7 @@ public class SummaryBarRenderer { .append(_("News & Updates")) .append("


\n"); // Get news content. - String newsContent = _newshelper.getContent(); + String newsContent = newshelper.getContent(); if (newsContent != "") { buf.append("
    \n"); // Parse news content for headings. diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 46c6d58af..32d3b2bbc 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -739,6 +739,10 @@ public class SummaryHelper extends HelperBase { return buf.toString(); } + private NewsHelper _newshelper; + public void storeNewsHelper(NewsHelper n) { _newshelper = n; } + public NewsHelper getNewsHelper() { return _newshelper; } + public String[] getSummaryBarSections() { String config = _context.getProperty(PROP_SUMMARYBAR, PRESET_FULL); return config.split("" + S); diff --git a/apps/routerconsole/jsp/console.jsp b/apps/routerconsole/jsp/console.jsp index c02b64b9a..7a080d2b9 100644 --- a/apps/routerconsole/jsp/console.jsp +++ b/apps/routerconsole/jsp/console.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("home")%> - + + + <% String consoleNonce = System.getProperty("router.consoleNonce"); if (consoleNonce == null) { @@ -15,16 +21,13 @@ } %> -<%@include file="summary.jsi" %>

    <%=intl._("I2P Router Console")%>

    +<%@include file="summary.jsi" %> + +

    <%=intl._("I2P Router Console")%>

    - - " /> <% if (newshelper.shouldShowNews()) { - java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); %> - -
    <% diff --git a/apps/routerconsole/jsp/home.jsp b/apps/routerconsole/jsp/home.jsp index f4088cc03..5183f64a8 100644 --- a/apps/routerconsole/jsp/home.jsp +++ b/apps/routerconsole/jsp/home.jsp @@ -6,7 +6,7 @@ <%=intl.title("home")%> @@ -33,7 +33,6 @@ -
    <%@include file="xhr1.jsi" %> diff --git a/apps/routerconsole/jsp/summary.jsi b/apps/routerconsole/jsp/summary.jsi index 847e42d52..0eb9d77b0 100644 --- a/apps/routerconsole/jsp/summary.jsi +++ b/apps/routerconsole/jsp/summary.jsi @@ -1,3 +1,10 @@ + +" /> +<% + java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + +
    <% // The refresh delay, 0 to disable @@ -15,7 +22,7 @@ newDelay = "?refresh=" + d; } if (!"0".equals(d)) - out.print("\n"); + out.print("
    \n"); } else if (allowIFrame) { // since we don't have an iframe this will reload the base page, and // the new delay will be passed to the iframe above - out.print("
    \n" + + out.print("
    \n"); + "
    \n"); } else { out.print("
\n"); } diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp index 5822c9f64..218e78ba6 100644 --- a/apps/routerconsole/jsp/summaryframe.jsp +++ b/apps/routerconsole/jsp/summaryframe.jsp @@ -52,6 +52,13 @@ } %>
+ +" /> +<% + java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + + <%@include file="summarynoframe.jsi" %> <% // d and shutdownSoon defined above diff --git a/apps/routerconsole/jsp/summarynoframe.jsi b/apps/routerconsole/jsp/summarynoframe.jsi index 63c39e6e5..6fae7c901 100644 --- a/apps/routerconsole/jsp/summarynoframe.jsi +++ b/apps/routerconsole/jsp/summarynoframe.jsi @@ -1,35 +1,17 @@ -<%@page import="net.i2p.router.web.SummaryHelper" %> <% /* - * Note: - * This is included almost 30 times, so keep whitespace etc. to a minimum. + * TODO - the bar would render more cleanly if we specified the img height and width here, + * but unfortunately the images in the different themes are different sizes. + * They range in height from 37 to 43 px. But there's a -2 bottom margin... + * So put it in a div. */ %> - -" /> -" /> -" /> -" /> - -<% helper.storeWriter(out); %> -<% -/* - * The following is required for the reseed button to work, although we probably - * only need the reseedNonce property. - */ -%> - - -<% -/* - * The following is required for the update buttons to work, although we probably - * only need the updateNonce property. - */ -%> - - -" /> -<% - // moved to java for ease of translation and to avoid 30 copies - helper.renderSummaryBar(); -%> + +
+ +<%@include file="xhr1.jsi" %> +
diff --git a/apps/routerconsole/jsp/xhr1.jsi b/apps/routerconsole/jsp/xhr1.jsi index 4a646c759..1362cca1f 100644 --- a/apps/routerconsole/jsp/xhr1.jsi +++ b/apps/routerconsole/jsp/xhr1.jsi @@ -1,31 +1,41 @@ +<%@page import="net.i2p.router.web.SummaryHelper" %> +<% +/* + * Note: + * This is included on every refresh, so keep whitespace etc. to a minimum. + */ +%> " /> " /> -
<%=intl._("Version")%>: - -
<%=intl._("Uptime")%>: - -

" /> " /> <% String reqURI = request.getRequestURI(); if (reqURI != null) - reqURI = reqURI.replace("/xhr1.jsp", "/home"); + reqURI = reqURI.replace("/xhr1.jsp", "/"); helper.setRequestURI(reqURI); %> +<% helper.storeWriter(out); %> +<% helper.storeNewsHelper(newshelper); %> <% - if (!newshelper.shouldShowNews()) { +/* + * The following is required for the reseed button to work, although we probably + * only need the reseedNonce property. + */ %> -
+ + <% - } // !shouldShowNews() +/* + * The following is required for the update buttons to work, although we probably + * only need the updateNonce property. + */ +%> + + +" /> +<% + // moved to java for ease of translation + helper.renderSummaryBar(); %> - -

"><%=intl._("Network")%>: -

-
- - -
- From 83c82338127a8fd52e9176538813460d7999992b Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 5 Jun 2012 13:00:40 +0000 Subject: [PATCH 10/20] Insert routerconsole.summaryRefresh config value into Ajax script This way, both Ajax and IFrame get their refresh time from config (though IFrame one can still be modified live). --- apps/routerconsole/jsp/console.jsp | 4 ++-- apps/routerconsole/jsp/home.jsp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/routerconsole/jsp/console.jsp b/apps/routerconsole/jsp/console.jsp index 7a080d2b9..96c255fc9 100644 --- a/apps/routerconsole/jsp/console.jsp +++ b/apps/routerconsole/jsp/console.jsp @@ -9,8 +9,8 @@ <% diff --git a/apps/routerconsole/jsp/home.jsp b/apps/routerconsole/jsp/home.jsp index 5183f64a8..c9379fb3a 100644 --- a/apps/routerconsole/jsp/home.jsp +++ b/apps/routerconsole/jsp/home.jsp @@ -7,8 +7,8 @@ <% From 420bf851b536374989ab1ff75a38ae9f0d6e2a52 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 5 Jun 2012 13:37:10 +0000 Subject: [PATCH 11/20] Added Ajax script to every routerconsole page that includes summary.jsi --- apps/routerconsole/jsp/config.jsp | 8 +++++++- apps/routerconsole/jsp/configadvanced.jsp | 8 +++++++- apps/routerconsole/jsp/configclients.jsp | 9 ++++++++- apps/routerconsole/jsp/confighome.jsp | 8 +++++++- apps/routerconsole/jsp/configkeyring.jsp | 8 +++++++- apps/routerconsole/jsp/configlogging.jsp | 8 +++++++- apps/routerconsole/jsp/confignet.jsp | 8 +++++++- apps/routerconsole/jsp/configpeer.jsp | 8 +++++++- apps/routerconsole/jsp/configreseed.jsp | 8 +++++++- apps/routerconsole/jsp/configservice.jsp | 8 +++++++- apps/routerconsole/jsp/configstats.jsp | 7 +++++++ apps/routerconsole/jsp/configtunnels.jsp | 8 +++++++- apps/routerconsole/jsp/configui.jsp | 8 +++++++- apps/routerconsole/jsp/configupdate.jsp | 8 +++++++- apps/routerconsole/jsp/debug.jsp | 8 +++++++- apps/routerconsole/jsp/error.jsp | 8 +++++++- apps/routerconsole/jsp/graph.jsp | 8 +++++++- apps/routerconsole/jsp/graphs.jsp | 8 +++++++- apps/routerconsole/jsp/help.jsp | 8 +++++++- apps/routerconsole/jsp/help_ar.jsp | 8 +++++++- apps/routerconsole/jsp/help_fr.jsp | 8 +++++++- apps/routerconsole/jsp/help_nl.jsp | 8 +++++++- apps/routerconsole/jsp/help_ru.jsp | 8 +++++++- apps/routerconsole/jsp/jars.jsp | 8 +++++++- apps/routerconsole/jsp/jobs.jsp | 8 +++++++- apps/routerconsole/jsp/logs.jsp | 8 +++++++- apps/routerconsole/jsp/netdb.jsp | 8 +++++++- apps/routerconsole/jsp/nowebapp.jsp | 8 +++++++- apps/routerconsole/jsp/oldconsole.jsp | 8 +++++++- apps/routerconsole/jsp/peers.jsp | 8 +++++++- apps/routerconsole/jsp/profiles.jsp | 9 ++++++++- apps/routerconsole/jsp/stats.jsp | 8 +++++++- apps/routerconsole/jsp/tunnels.jsp | 8 +++++++- apps/routerconsole/jsp/viewprofile.jsp | 8 +++++++- 34 files changed, 240 insertions(+), 33 deletions(-) diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 70c0e64f0..9cc6f81a4 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("configure bandwidth")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index 1dbf23e7d..27405c0c4 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config advanced")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index c8575b490..0662afffe 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -10,7 +10,14 @@ button span.hide{ display:none; } input.default { width: 1px; height: 1px; visibility: hidden; } - + + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/confighome.jsp b/apps/routerconsole/jsp/confighome.jsp index ca0dbdc6c..5ddf6f200 100644 --- a/apps/routerconsole/jsp/confighome.jsp +++ b/apps/routerconsole/jsp/confighome.jsp @@ -12,7 +12,13 @@ input.default { visibility: hidden; } - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Home Page Configuration")%>

diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 7acdf1126..2719fe333 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config keyring")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Keyring Configuration")%>

diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 8274fcb43..d00d34321 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config logging")%> - + + + " /> diff --git a/apps/routerconsole/jsp/confignet.jsp b/apps/routerconsole/jsp/confignet.jsp index 6e340a659..e85c9e6df 100644 --- a/apps/routerconsole/jsp/confignet.jsp +++ b/apps/routerconsole/jsp/confignet.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config networking")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index b5968abed..0f9b98a21 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config peers")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Peer Configuration")%>

diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index 67d2334c9..c0f3faaae 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config reseeding")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index 3ee1ef796..21ae39a6b 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config service")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Service Configuration")%>

diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index d380d7783..6d75d673c 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -6,10 +6,17 @@ <%@include file="css.jsi" %> <%=intl.title("config stats")%> + + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 4a214c852..c5b8c4d81 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config UI")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index e2bd49ab2..dafac8d45 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config update")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Update Configuration")%>

diff --git a/apps/routerconsole/jsp/debug.jsp b/apps/routerconsole/jsp/debug.jsp index b9e66345f..191d73e18 100644 --- a/apps/routerconsole/jsp/debug.jsp +++ b/apps/routerconsole/jsp/debug.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - Debug <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

Router SKM

diff --git a/apps/routerconsole/jsp/error.jsp b/apps/routerconsole/jsp/error.jsp index 69f9fbfa3..95218cc53 100644 --- a/apps/routerconsole/jsp/error.jsp +++ b/apps/routerconsole/jsp/error.jsp @@ -16,7 +16,13 @@ <%@include file="css.jsi" %> <%=intl.title("Page Not Found")%> - + + + <%@include file="summary.jsi" %>

<%=ERROR_CODE%> <%=ERROR_MESSAGE%>

diff --git a/apps/routerconsole/jsp/graph.jsp b/apps/routerconsole/jsp/graph.jsp index 6147fd96d..4be37b339 100644 --- a/apps/routerconsole/jsp/graph.jsp +++ b/apps/routerconsole/jsp/graph.jsp @@ -12,7 +12,13 @@ <% graphHelper.storeWriter(out); %> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Performance Graphs")%>

diff --git a/apps/routerconsole/jsp/graphs.jsp b/apps/routerconsole/jsp/graphs.jsp index 4b65cca75..e3287e98c 100644 --- a/apps/routerconsole/jsp/graphs.jsp +++ b/apps/routerconsole/jsp/graphs.jsp @@ -19,7 +19,13 @@ out.print(graphHelper.getRefreshMeta()); } %> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Performance Graphs")%>

diff --git a/apps/routerconsole/jsp/help.jsp b/apps/routerconsole/jsp/help.jsp index 265bbfb62..8c68cb5e9 100644 --- a/apps/routerconsole/jsp/help.jsp +++ b/apps/routerconsole/jsp/help.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - help <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

I2P Router Help & Support

diff --git a/apps/routerconsole/jsp/help_ar.jsp b/apps/routerconsole/jsp/help_ar.jsp index 4b471f594..7e058678f 100644 --- a/apps/routerconsole/jsp/help_ar.jsp +++ b/apps/routerconsole/jsp/help_ar.jsp @@ -9,7 +9,13 @@ %> I2P مساعدة لوحة التحكم <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

I2P مساعدة لوحة التحكم

diff --git a/apps/routerconsole/jsp/help_fr.jsp b/apps/routerconsole/jsp/help_fr.jsp index fd0f8bc26..01b000ac9 100644 --- a/apps/routerconsole/jsp/help_fr.jsp +++ b/apps/routerconsole/jsp/help_fr.jsp @@ -9,7 +9,13 @@ %> Console du routeur I2P - Aide <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %> Traduction de mars 2011 (magma@mail.i2p)

Aide et assistance du routeur I2P

diff --git a/apps/routerconsole/jsp/help_nl.jsp b/apps/routerconsole/jsp/help_nl.jsp index 944e65e7b..20defacaa 100644 --- a/apps/routerconsole/jsp/help_nl.jsp +++ b/apps/routerconsole/jsp/help_nl.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - help <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

I2P Router Help & Support

diff --git a/apps/routerconsole/jsp/help_ru.jsp b/apps/routerconsole/jsp/help_ru.jsp index d14da0138..55ea530c7 100644 --- a/apps/routerconsole/jsp/help_ru.jsp +++ b/apps/routerconsole/jsp/help_ru.jsp @@ -9,7 +9,13 @@ %> Консоль маршрутизатора I2P - справка <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

Справка маршрутизатора I2P

diff --git a/apps/routerconsole/jsp/jars.jsp b/apps/routerconsole/jsp/jars.jsp index 4fa200b70..dacd3d93f 100644 --- a/apps/routerconsole/jsp/jars.jsp +++ b/apps/routerconsole/jsp/jars.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("Jar File Dump")%> - + + + <%@include file="summary.jsi" %>

Jar File Dump

diff --git a/apps/routerconsole/jsp/jobs.jsp b/apps/routerconsole/jsp/jobs.jsp index 2e2e71248..247fa298e 100644 --- a/apps/routerconsole/jsp/jobs.jsp +++ b/apps/routerconsole/jsp/jobs.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("job queue")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Router Job Queue")%>

diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp index 0f470e7c9..ed4b5c121 100644 --- a/apps/routerconsole/jsp/logs.jsp +++ b/apps/routerconsole/jsp/logs.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("logs")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Router Logs")%>

diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index cfbd3b2ac..52ccd1b0c 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("network database summary")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Network Database Summary")%>

diff --git a/apps/routerconsole/jsp/nowebapp.jsp b/apps/routerconsole/jsp/nowebapp.jsp index 1bbec502d..03ad771b9 100644 --- a/apps/routerconsole/jsp/nowebapp.jsp +++ b/apps/routerconsole/jsp/nowebapp.jsp @@ -8,7 +8,13 @@ <%@include file="css.jsi" %> <%=intl.title("WebApp Not Found")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("Web Application Not Running")%>

diff --git a/apps/routerconsole/jsp/oldconsole.jsp b/apps/routerconsole/jsp/oldconsole.jsp index 7edb76240..cb0c18663 100644 --- a/apps/routerconsole/jsp/oldconsole.jsp +++ b/apps/routerconsole/jsp/oldconsole.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - internals <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %> " /> diff --git a/apps/routerconsole/jsp/peers.jsp b/apps/routerconsole/jsp/peers.jsp index 6b0ed6b67..e23e4f73b 100644 --- a/apps/routerconsole/jsp/peers.jsp +++ b/apps/routerconsole/jsp/peers.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("peer connections")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Network Peers")%>

diff --git a/apps/routerconsole/jsp/profiles.jsp b/apps/routerconsole/jsp/profiles.jsp index 8441838e2..6f81b857b 100644 --- a/apps/routerconsole/jsp/profiles.jsp +++ b/apps/routerconsole/jsp/profiles.jsp @@ -6,7 +6,14 @@ <%@include file="css.jsi" %> <%=intl.title("peer profiles")%> -<%@include file="summary.jsi" %> + + + +<%@include file="summary.jsi" %>

<%=intl._("I2P Network Peer Profiles")%>

diff --git a/apps/routerconsole/jsp/stats.jsp b/apps/routerconsole/jsp/stats.jsp index c0596f796..5750fae1c 100644 --- a/apps/routerconsole/jsp/stats.jsp +++ b/apps/routerconsole/jsp/stats.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("statistics")%> - + + + <%@include file="summary.jsi" %> " /> diff --git a/apps/routerconsole/jsp/tunnels.jsp b/apps/routerconsole/jsp/tunnels.jsp index 32f86475a..332381a95 100644 --- a/apps/routerconsole/jsp/tunnels.jsp +++ b/apps/routerconsole/jsp/tunnels.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("tunnel summary")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Tunnel Summary")%>

diff --git a/apps/routerconsole/jsp/viewprofile.jsp b/apps/routerconsole/jsp/viewprofile.jsp index 8747a6d88..635aafb34 100644 --- a/apps/routerconsole/jsp/viewprofile.jsp +++ b/apps/routerconsole/jsp/viewprofile.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("Peer Profile")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("Peer Profile")%>

From b75d28fd0d75d264d6e6d8c25798887f6c932e22 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 5 Jun 2012 15:19:40 +0000 Subject: [PATCH 12/20] Added /i2ptunnelmanager which wraps /i2ptunnel/ in an IFrame /i2ptunnelmanager redirects to /i2ptunnel/ if the browser doesn't support IFrames. --- .../i2p/router/web/SummaryBarRenderer.java | 2 +- .../src/net/i2p/router/web/SummaryHelper.java | 2 +- apps/routerconsole/jsp/i2ptunnelmanager.jsp | 41 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 apps/routerconsole/jsp/i2ptunnelmanager.jsp diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 84f140102..46a5185d1 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -214,7 +214,7 @@ public class SummaryBarRenderer { .append(_("Stats")) .append("\n" + - "") .append(_("I2PTunnel")) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 32d3b2bbc..799fc4346 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -404,7 +404,7 @@ public class SummaryHelper extends HelperBase { List clients = new ArrayList(_context.clientManager().listClients()); StringBuilder buf = new StringBuilder(512); - buf.append("

").append(_("Local Destinations")).append("


"); + buf.append("

").append(_("Local Destinations")).append("


"); if (!clients.isEmpty()) { Collections.sort(clients, new AlphaComparator()); buf.append(""); diff --git a/apps/routerconsole/jsp/i2ptunnelmanager.jsp b/apps/routerconsole/jsp/i2ptunnelmanager.jsp new file mode 100644 index 000000000..6ea41239a --- /dev/null +++ b/apps/routerconsole/jsp/i2ptunnelmanager.jsp @@ -0,0 +1,41 @@ +<%@page contentType="text/html"%> +<%@page trimDirectiveWhitespaces="true"%> +<%@page pageEncoding="UTF-8"%> + +" /> +<% + // CSSHelper is also pulled in by css.jsi below... + boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent")); + if (!testIFrame) { + response.setStatus(302, "Moved"); + response.setHeader("Location", "/i2ptunnel/"); + } else { +%> + + + +<%@include file="css.jsi" %> +<%=intl.title("home")%> + + + + +<%@include file="summary.jsi" %> + +

<%=intl._("I2P Tunnel Manager")%>

+
+ +
+<% + } +%> From 84344b678956491818c5d9356f2d153c95c8e440 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 7 Jun 2012 02:51:22 +0000 Subject: [PATCH 13/20] Added a config page for summary bar --- .../src/net/i2p/router/web/CSSHelper.java | 1 + .../net/i2p/router/web/ConfigNavHelper.java | 4 +- .../src/net/i2p/router/web/SummaryHelper.java | 39 +++++++++- apps/routerconsole/jsp/configsidebar.jsp | 74 +++++++++++++++++++ 4 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 apps/routerconsole/jsp/configsidebar.jsp diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java index 3dd724b08..1c2190970 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java @@ -19,6 +19,7 @@ public class CSSHelper extends HelperBase { private static final String FORCE = "classic"; public static final String PROP_REFRESH = "routerconsole.summaryRefresh"; public static final String DEFAULT_REFRESH = "60"; + public static final int MIN_REFRESH = 5; private static final String PROP_XFRAME = "routerconsole.disableXFrame"; public String getTheme(String userAgent) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java index eb8d504bb..7a6b032c1 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java @@ -11,12 +11,12 @@ public class ConfigNavHelper extends HelperBase { /** configX.jsp */ private static final String pages[] = - {"", "net", "ui", "home", "service", "update", "tunnels", + {"", "net", "ui", "sidebar", "home", "service", "update", "tunnels", "clients", "peer", "keyring", "logging", "stats", "reseed", "advanced" }; private static final String titles[] = - {_x("Bandwidth"), _x("Network"), _x("UI"), _x("Home Page"), + {_x("Bandwidth"), _x("Network"), _x("UI"), _x("Summary Bar"), _x("Home Page"), _x("Service"), _x("Update"), _x("Tunnels"), _x("Clients"), _x("Peers"), _x("Keyring"), _x("Logging"), _x("Stats"), _x("Reseeding"), _x("Advanced") }; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 799fc4346..713183247 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -8,6 +8,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; +import java.util.Map; import net.i2p.data.DataHelper; import net.i2p.data.Destination; @@ -17,6 +18,7 @@ import net.i2p.data.RouterAddress; import net.i2p.data.RouterInfo; import net.i2p.router.CommSystemFacade; import net.i2p.router.Router; +import net.i2p.router.RouterContext; import net.i2p.router.RouterVersion; import net.i2p.router.TunnelPoolSettings; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; @@ -748,11 +750,11 @@ public class SummaryHelper extends HelperBase { return config.split("" + S); } - public void saveSummaryBarSections(String[] sections) { + static void saveSummaryBarSections(RouterContext ctx, Map sections) { StringBuilder buf = new StringBuilder(512); - for(int i = 0; i < sections.length; i++) - buf.append(sections[i]).append(S); - _context.router().saveConfig(PROP_SUMMARYBAR, buf.toString()); + for(String section : sections.values()) + buf.append(section).append(S); + ctx.router().saveConfig(PROP_SUMMARYBAR, buf.toString()); } /** output the summary bar to _out */ @@ -778,4 +780,33 @@ public class SummaryHelper extends HelperBase { private String _requestURI; public void setRequestURI(String s) { _requestURI = s; } public String getRequestURI() { return _requestURI; } + + public String getConfigTable() { + String[] sections = getSummaryBarSections(); + StringBuilder buf = new StringBuilder(1024); + buf.append("
\n"); + for (int i = 0; i < sections.length; i++) { + buf.append("\n"); + } + buf.append("" + + ""); + buf.append("
") + .append(_("Remove")) + .append("") + .append(_("Order")) + .append("") + .append(_("Name")) + .append("
") + .append(sections[i]) + .append("
") + .append(_("Add")).append(":" + + "
\n"); + return buf.toString(); + } } diff --git a/apps/routerconsole/jsp/configsidebar.jsp b/apps/routerconsole/jsp/configsidebar.jsp new file mode 100644 index 000000000..dcbf1fe1e --- /dev/null +++ b/apps/routerconsole/jsp/configsidebar.jsp @@ -0,0 +1,74 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +<%@include file="css.jsi" %> +<%=intl.title("config summary bar")%> + + + + + +<%@include file="summary.jsi" %> +

<%=intl._("I2P Summary Bar Configuration")%>

+
+<%@include file="confignav.jsi" %> + + +<% formhandler.storeMethod(request.getMethod()); %> + +" /> + + +<% + String pageNonce = formhandler.getNewNonce(); +%> + +" /> + +

<%=intl._("Refresh Interval")%>

+
+ + + " > + <%=intl._("seconds")%> + " > +
+ +

<%=intl._("Use preset layout")%>

+

<%=intl._("Several preset layouts for the summary bar are available.")%> + <%=intl._("Note that choosing one of the presets will cause the current summary bar configuration to be lost.")%>

+
+
+ + + " > + " > +
+
+ +

<%=intl._("Customise Summary Bar")%>

+
+ + + +
+ " > + " > + " > + " > + " > +
+ +
From 3a75f8d7d13e52f866223a90a2a000c2be985840 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 7 Jun 2012 04:42:52 +0000 Subject: [PATCH 14/20] Modifying section addition to show an option list Also adding form handler class that I forgot to commit earlier. --- .../i2p/router/web/ConfigSummaryHandler.java | 135 ++++++++++++++++++ .../i2p/router/web/SummaryBarRenderer.java | 11 +- .../src/net/i2p/router/web/SummaryHelper.java | 41 ++++-- 3 files changed, 174 insertions(+), 13 deletions(-) create mode 100644 apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java new file mode 100644 index 000000000..0df3f3f91 --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java @@ -0,0 +1,135 @@ +package net.i2p.router.web; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import net.i2p.data.DataHelper; + +/** + * Simple summary bar configuration. + * + * @since 0.9.1 + */ +public class ConfigSummaryHandler extends FormHandler { + + private Map _settings; + + @Override + protected void processForm() { + if (_action == null) return; + String group = getJettyString("group"); + boolean deleting = _action.equals(_("Delete selected")); + boolean adding = _action.equals(_("Add item")); + boolean saving = _action.equals(_("Save order")); + if (_action.equals(_("Save")) && "0".equals(group)) { + try { + int refreshInterval = Integer.parseInt(getJettyString("refreshInterval")); + if (refreshInterval >= CSSHelper.MIN_REFRESH) { + _context.router().saveConfig(CSSHelper.PROP_REFRESH, "" + refreshInterval); + addFormNotice(_("Refresh interval changed")); + } else + addFormError(_("Refresh interval must be at least {0} seconds", CSSHelper.MIN_REFRESH)); + } catch (java.lang.NumberFormatException e) { + addFormError(_("Refresh interval must be a number")); + return; + } + } else if ("1".equals(group)) { + if (_action.equals(_("Use full preset"))) { + _context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR, SummaryHelper.PRESET_FULL); + addFormNotice(_("Full summary bar preset selected.") + + _("Summary bar will refresh shortly.")); + } else if (_action.equals(_("Use reduced preset"))) { + _context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR, SummaryHelper.PRESET_SHORT); + addFormNotice(_("Reduced summary bar preset selected.") + + _("Summary bar will refresh shortly.")); + } else { + addFormError(_("Unsupported")); + } + } else if (adding || deleting || saving) { + Map sections = new TreeMap(); + for (Object o : _settings.keySet()) { + if (!(o instanceof String)) + continue; + String k = (String) o; + if (!k.startsWith("order_")) + continue; + String v = getJettyString(k); + k = k.substring(6); + k = k.substring(k.indexOf('_') + 1); + try { + int order = Integer.parseInt(v); + sections.put(order, k); + } catch (java.lang.NumberFormatException e) { + addFormError(_("Order must be an integer")); + return; + } + } + if (adding) { + String name = getJettyString("name"); + if (name == null || name.length() <= 0) { + addFormError(_("No section selected")); + return; + } + String order = getJettyString("order"); + if (order == null || order.length() <= 0) { + addFormError(_("No order entered")); + return; + } + name = DataHelper.escapeHTML(name).replace(",", ","); + order = DataHelper.escapeHTML(order).replace(",", ","); + try { + int ki = Integer.parseInt(order); + sections.put(ki, name); + addFormNotice(_("Added") + ": " + name); + } catch (java.lang.NumberFormatException e) { + addFormError(_("Order must be an integer")); + return; + } + } else if (deleting) { + Set toDelete = new HashSet(); + for (Object o : _settings.keySet()) { + if (!(o instanceof String)) + continue; + String k = (String) o; + if (!k.startsWith("delete_")) + continue; + k = k.substring(7); + try { + int ki = Integer.parseInt(k); + toDelete.add(ki); + } catch (java.lang.NumberFormatException e) { + continue; + } + } + for (Iterator iter = sections.keySet().iterator(); iter.hasNext(); ) { + int i = iter.next(); + if (toDelete.contains(i)) { + String removedName = sections.get(i); + iter.remove(); + addFormNotice(_("Removed") + ": " + removedName); + } + } + } + SummaryHelper.saveSummaryBarSections(_context, sections); + addFormError(_("Saved order of sections.") + + _("Summary bar will refresh shortly.")); + } else { + addFormError(_("Unsupported")); + } + } + + public void setSettings(Map settings) { _settings = new HashMap(settings); } + + /** curses Jetty for returning arrays */ + private String getJettyString(String key) { + String[] arr = (String[]) _settings.get(key); + if (arr == null) + return null; + return arr[0].trim(); + } +} diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 46a5185d1..d96e7a4c6 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.Writer; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import net.i2p.data.DataHelper; @@ -40,6 +41,10 @@ public class SummaryBarRenderer { } ALL_SECTIONS = Collections.unmodifiableMap(aMap); }*/ + static final String ALL_SECTIONS[] = + {"HelpAndFAQ", "I2PServices", "I2PInternals", "General", "ShortGeneral", "NetworkReachability", + "UpdateStatus", "RestartStatus", "Peers", "FirewallAndReseedStatus", "Bandwidth", "Tunnels", + "Congestion", "TunnelStatus", "Destinations", "NewsHeadings" }; private final RouterContext _context; private final SummaryHelper _helper; @@ -55,8 +60,8 @@ public class SummaryBarRenderer { */ public void renderSummaryHTML(Writer out) throws IOException { StringBuilder buf = new StringBuilder(8*1024); - String[] sections = _helper.getSummaryBarSections(); - for (int i = 0; i < sections.length; i++) { + List sections = _helper.getSummaryBarSections(); + for (String section : sections) { // Commented out because broken. Replaced by if-elseif blob below. /*try { String section = (String)ALL_SECTIONS.get(sections[i]).invoke(this); @@ -68,8 +73,6 @@ public class SummaryBarRenderer { }*/ buf.setLength(0); - String section = sections[i]; - buf.append("
\n"); if ("HelpAndFAQ".equals(section)) buf.append(renderHelpAndFAQHTML()); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 713183247..6932ec38e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -4,11 +4,13 @@ import java.io.IOException; import java.text.Collator; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.TreeSet; import net.i2p.data.DataHelper; import net.i2p.data.Destination; @@ -745,9 +747,9 @@ public class SummaryHelper extends HelperBase { public void storeNewsHelper(NewsHelper n) { _newshelper = n; } public NewsHelper getNewsHelper() { return _newshelper; } - public String[] getSummaryBarSections() { + public List getSummaryBarSections() { String config = _context.getProperty(PROP_SUMMARYBAR, PRESET_FULL); - return config.split("" + S); + return Arrays.asList(config.split("" + S)); } static void saveSummaryBarSections(RouterContext ctx, Map sections) { @@ -782,8 +784,17 @@ public class SummaryHelper extends HelperBase { public String getRequestURI() { return _requestURI; } public String getConfigTable() { - String[] sections = getSummaryBarSections(); - StringBuilder buf = new StringBuilder(1024); + String[] allSections = SummaryBarRenderer.ALL_SECTIONS; + List sections = getSummaryBarSections(); + TreeSet sortedSections = new TreeSet(); + + for (int i = 0; i < allSections.length; i++) { + String section = allSections[i]; + if (!sections.contains(section)) + sortedSections.add(section); + } + + StringBuilder buf = new StringBuilder(2048); buf.append("\n"); - for (int i = 0; i < sections.length; i++) { + for (String section : sections) { + int i = sections.indexOf(section); buf.append("\n"); } buf.append("" + - ""); - buf.append("
") .append(_("Remove")) .append("") @@ -791,22 +802,34 @@ public class SummaryHelper extends HelperBase { .append("") .append(_("Name")) .append("
") - .append(sections[i]) + .append(section) .append("
") .append(_("Add")).append(":" + "
\n"); + "" + + "") + .append("\n"); return buf.toString(); } } From b00fbfa23d7fe9ed341c2a1f2e6494e58dd162fb Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 7 Jun 2012 10:26:44 +0000 Subject: [PATCH 15/20] Centre box for order of new section, and add default value --- .../java/src/net/i2p/router/web/SummaryHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 6932ec38e..055abcf98 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -816,7 +816,9 @@ public class SummaryHelper extends HelperBase { } buf.append("") .append(_("Add")).append(":" + - "" + + "" + "" + "