From 96575e61f20941ed1e6106ffae5a6002b6076662 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 1 Jun 2012 13:30:38 +0000 Subject: [PATCH] * Console: Tab the netdb and profile pages --- .../src/net/i2p/router/web/NetDbHelper.java | 119 ++++++++++++++---- .../src/net/i2p/router/web/NetDbRenderer.java | 21 +--- .../router/web/ProfileOrganizerRenderer.java | 42 +++++-- .../net/i2p/router/web/ProfilesHelper.java | 96 +++++++++++++- apps/routerconsole/jsp/netdb.jsp | 10 +- apps/routerconsole/jsp/profiles.jsp | 10 +- 6 files changed, 242 insertions(+), 56 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java index 5eb67473e..1eb44bd48 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java @@ -11,9 +11,28 @@ public class NetDbHelper extends HelperBase { private int _full; private boolean _lease; private boolean _debug; + private boolean _graphical; - public NetDbHelper() {} - + private static final String PROP_DEBUG = "routerconsole.debug"; + + private static final String titles[] = + {_x("Summary"), // 0 + _x("Local Router"), // 1 + _x("Router Lookup"), // 2 + _x("All Routers"), // 3 + _x("All Routers with Full Stats"), // 4 + "LeaseSet Debug", // 5 + _x("LeaseSets") }; // 6 + + private static final String links[] = + {"", // 0 + "?r=.", // 1 + "", // 2 + "?f=2", // 3 + "?f=1", // 4 + "?l=2", // 5 + "?l=1" }; // 6 + public void setRouter(String r) { if (r != null) _routerPrefix = DataHelper.stripHTML(r); // XSS @@ -30,30 +49,88 @@ public class NetDbHelper extends HelperBase { _lease = _debug || "1".equals(l); } + /** + * call for non-text-mode browsers + * @since 0.9.1 + */ + public void allowGraphical() { + _graphical = true; + } + + /** + * storeWriter() must be called previously + */ public String getNetDbSummary() { NetDbRenderer renderer = new NetDbRenderer(_context); try { - if (_out != null) { - if (_routerPrefix != null) - renderer.renderRouterInfoHTML(_out, _routerPrefix); - else if (_lease) - renderer.renderLeaseSetHTML(_out, _debug); - else - renderer.renderStatusHTML(_out, _full); - return ""; - } else { - ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024); - if (_routerPrefix != null) - renderer.renderRouterInfoHTML(new OutputStreamWriter(baos), _routerPrefix); - else if (_lease) - renderer.renderLeaseSetHTML(new OutputStreamWriter(baos), _debug); - else - renderer.renderStatusHTML(new OutputStreamWriter(baos), _full); - return new String(baos.toByteArray()); - } + renderNavBar(); + if (_routerPrefix != null) + renderer.renderRouterInfoHTML(_out, _routerPrefix); + else if (_lease) + renderer.renderLeaseSetHTML(_out, _debug); + else + renderer.renderStatusHTML(_out, _full); } catch (IOException ioe) { ioe.printStackTrace(); - return ""; } + return ""; + } + + /** + * @since 0.9.1 + */ + private int getTab() { + if (_debug) + return 5; + if (_lease) + return 6; + if (".".equals(_routerPrefix)) + return 1; + if (_routerPrefix != null) + return 2; + if (_full == 2) + return 3; + if (_full == 1) + return 4; + return 0; + } + + /** + * @since 0.9.1 + */ + private void renderNavBar() throws IOException { + StringBuilder buf = new StringBuilder(1024); + buf.append("
"); + // TODO fix up the non-light themes + String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME); + boolean span = _graphical && (theme == null || theme.equals(CSSHelper.DEFAULT_THEME)); + if (!span) + buf.append("
"); + int tab = getTab(); + for (int i = 0; i < titles.length; i++) { + if (i == 2 && tab != 2) + continue; // can't nav to lookup + if (i == 5 && !_context.getBooleanProperty(PROP_DEBUG)) + continue; + if (i == tab) { + // we are there + if (span) + buf.append(""); + buf.append(_(titles[i])); + } else { + // we are not there, make a link + if (span) + buf.append(""); + buf.append("").append(_(titles[i])).append(""); + } + if (span) + buf.append(" \n"); + else if (i != titles.length - 1) + buf.append(" |\n"); + } + if (!span) + buf.append("
"); + buf.append("
"); + _out.write(buf.toString()); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java index d81dcc855..b4e53ed92 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java @@ -75,7 +75,6 @@ public class NetDbRenderer { public void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException { StringBuilder buf = new StringBuilder(4*1024); - buf.append("

" + _("Network Database RouterInfo Lookup") + "

\n"); if (".".equals(routerPrefix)) { renderRouterInfo(buf, _context.router().getRouterInfo(), true, true); } else { @@ -102,12 +101,8 @@ public class NetDbRenderer { */ public void renderLeaseSetHTML(Writer out, boolean debug) throws IOException { StringBuilder buf = new StringBuilder(4*1024); - buf.append("

" + _("Network Database Contents") + "

\n"); - buf.append("" + _("View RouterInfo") + ""); - buf.append("

").append(_("LeaseSets")); if (debug) - buf.append(" - Debug mode - Sorted by hash distance, closest first"); - buf.append("

\n"); + buf.append("

Debug mode - Sorted by hash distance, closest first

\n"); Hash ourRKey; Set leases; DecimalFormat fmt; @@ -233,7 +228,6 @@ public class NetDbRenderer { * @param mode 0: our info and charts only; 1: full routerinfos and charts; 2: abbreviated routerinfos and charts */ public void renderStatusHTML(Writer out, int mode) throws IOException { - out.write("

" + _("Network Database Contents") + " (" + _("View LeaseSets") + ")

\n"); if (!_context.netDb().isInitialized()) { out.write(_("Not initialized")); out.flush(); @@ -244,12 +238,6 @@ public class NetDbRenderer { boolean shortStats = mode == 2; boolean showStats = full || shortStats; Hash us = _context.routerHash(); - out.write("

" + _("Routers") + " (" + _("Show all routers")); - else - out.write("?f=1#routers\" >" + _("Show all routers with full stats")); - out.write(")

\n"); StringBuilder buf = new StringBuilder(8192); RouterInfo ourInfo = _context.router().getRouterInfo(); @@ -365,11 +353,10 @@ public class NetDbRenderer { buf.append("" + _("Our info") + ": ").append(hash).append("\n"); } else { buf.append("" + _("Peer info for") + ": ").append(hash).append("\n"); - if (full) { - buf.append("[Back]\n"); - } else { - buf.append("[").append(_("Full entry")).append("]\n"); + if (!full) { + buf.append("[").append(_("Full entry")).append("]"); } + buf.append("\n"); } long age = _context.clock().now() - info.getPublished(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java index 152764831..a1dce2534 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java @@ -23,16 +23,21 @@ import net.i2p.stat.RateStat; * */ class ProfileOrganizerRenderer { - private RouterContext _context; - private ProfileOrganizer _organizer; - private ProfileComparator _comparator; + private final RouterContext _context; + private final ProfileOrganizer _organizer; + private final ProfileComparator _comparator; public ProfileOrganizerRenderer(ProfileOrganizer organizer, RouterContext context) { _context = context; _organizer = organizer; _comparator = new ProfileComparator(); } - public void renderStatusHTML(Writer out, boolean full) throws IOException { + + /** + * @param mode 0 = high cap; 1 = all; 2 = floodfill + */ + public void renderStatusHTML(Writer out, int mode) throws IOException { + boolean full = mode == 1; Set peers = _organizer.selectAllPeers(); long now = _context.clock().now(); @@ -68,7 +73,13 @@ class ProfileOrganizerRenderer { int reliable = 0; int integrated = 0; StringBuilder buf = new StringBuilder(16*1024); - buf.append("

").append(_("Peer Profiles")).append("

\n

"); + + //// + //// don't bother reindenting + //// + if (mode < 2) { + + //buf.append("

").append(_("Peer Profiles")).append("

\n

"); buf.append(ngettext("Showing 1 recent profile.", "Showing {0} recent profiles.", order.size())).append('\n'); if (older > 0) buf.append(ngettext("Hiding 1 older profile.", "Hiding {0} older profiles.", older)).append('\n'); @@ -181,8 +192,13 @@ class ProfileOrganizerRenderer { } buf.append(""); - buf.append("

").append(_("Floodfill and Integrated Peers")) - .append(" (").append(integratedPeers.size()).append(")

\n"); + //// + //// don't bother reindenting + //// + } else { + + //buf.append("

").append(_("Floodfill and Integrated Peers")) + // .append(" (").append(integratedPeers.size()).append(")

\n"); buf.append(""); buf.append(""); buf.append(""); @@ -247,6 +263,12 @@ class ProfileOrganizerRenderer { } buf.append("
").append(_("Peer")).append("
"); + //// + //// don't bother reindenting + //// + } + if (mode < 2) { + buf.append("

").append(_("Thresholds")).append("

"); buf.append("

").append(_("Speed")).append(": ").append(num(_organizer.getSpeedThreshold())) .append(" (").append(fast).append(' ').append(_("fast peers")).append(")
"); @@ -262,6 +284,12 @@ class ProfileOrganizerRenderer { buf.append("

  • ").append(_("integration")).append(": ").append(_("how many new peers have they told us about lately?")).append("
  • "); buf.append("
  • ").append(_("status")).append(": ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("
  • "); buf.append(""); + + //// + //// don't bother reindenting + //// + } // mode < 2 + out.write(buf.toString()); out.flush(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java index 3e68c3169..2aa1c2afd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java @@ -4,12 +4,52 @@ import java.io.IOException; public class ProfilesHelper extends HelperBase { - private boolean _full; + private int _full; + private boolean _graphical; + + private static final String titles[] = + {_x("High Capacity"), // 0 + _x("Floodfill "), // 1 + _x("Banned"), // 2 + _x("All"), }; // 3 + + private static final String links[] = + {"", // 0 + "?f=2", // 1 + "?f=3", // 2 + "?f=1" }; // 3 - public ProfilesHelper() {} - public void setFull(String f) { - _full = f != null; + if (f != null) { + try { + _full = Integer.parseInt(f); + if (_full < 0 || _full > 3) + _full = 0; + } catch (NumberFormatException nfe) {} + } + } + + /** + * call for non-text-mode browsers + * @since 0.9.1 + */ + public void allowGraphical() { + _graphical = true; + } + + /** + * @return empty string, writes directly to _out + * @since 0.9.1 + */ + public String getSummary() { + try { + renderNavBar(); + } catch (IOException ioe) {} + if (_full == 3) + getShitlistSummary(); + else + getProfileSummary(); + return ""; } /** @return empty string, writes directly to _out */ @@ -33,4 +73,52 @@ public class ProfilesHelper extends HelperBase { } return ""; } + + /** + * @since 0.9.1 + */ + private int getTab() { + if (_full == 2) + return 1; + if (_full == 3) + return 2; + if (_full == 1) + return 3; + return 0; + } + + /** + * @since 0.9.1 + */ + private void renderNavBar() throws IOException { + StringBuilder buf = new StringBuilder(1024); + buf.append("
    "); + // TODO fix up the non-light themes + String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME); + boolean span = _graphical && (theme == null || theme.equals(CSSHelper.DEFAULT_THEME)); + if (!span) + buf.append("
    "); + int tab = getTab(); + for (int i = 0; i < titles.length; i++) { + if (i == tab) { + // we are there + if (span) + buf.append(""); + buf.append(_(titles[i])); + } else { + // we are not there, make a link + if (span) + buf.append(""); + buf.append("").append(_(titles[i])).append(""); + } + if (span) + buf.append(" \n"); + else if (i != titles.length - 1) + buf.append(" |\n"); + } + if (!span) + buf.append("
    "); + buf.append("
    "); + _out.write(buf.toString()); + } } diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index cfbd3b2ac..1a7a42999 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -5,15 +5,19 @@ <%@include file="css.jsi" %> -<%=intl.title("network database summary")%> +<%=intl.title("network database")%> <%@include file="summary.jsi" %> -

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

    +

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

    " /> - <% netdbHelper.storeWriter(out); %> +<% + netdbHelper.storeWriter(out); + if (allowIFrame) + netdbHelper.allowGraphical(); +%> " /> " /> " /> diff --git a/apps/routerconsole/jsp/profiles.jsp b/apps/routerconsole/jsp/profiles.jsp index 8441838e2..4c33bb1fe 100644 --- a/apps/routerconsole/jsp/profiles.jsp +++ b/apps/routerconsole/jsp/profiles.jsp @@ -11,9 +11,11 @@
    " /> - <% profilesHelper.storeWriter(out); %> +<% + profilesHelper.storeWriter(out); + if (allowIFrame) + profilesHelper.allowGraphical(); +%> " /> - -

    <%=intl._("Banned Peers")%>

    - +