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.List; import java.util.Map; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; /** * Refactored from summarynoframe.jsp to save ~100KB * */ public class SummaryBarRenderer { // Commented out because broken. Replaced by if-elseif blob below. /*static final Map ALL_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) { } 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" }; static final Map SECTION_NAMES; static { Map aMap = new HashMap();; aMap.put("HelpAndFAQ", "Help & FAQ"); aMap.put("I2PServices", "I2P Services"); aMap.put("I2PInternals", "I2P Internals"); aMap.put("General", "General"); aMap.put("ShortGeneral", "Short General"); aMap.put("NetworkReachability", "Network Reachability"); aMap.put("UpdateStatus", "Update Status"); aMap.put("RestartStatus", "Restart Status"); aMap.put("Peers", "Peers"); aMap.put("FirewallAndReseedStatus", "Firewall & Reseed Status"); aMap.put("Bandwidth", "Bandwidth"); aMap.put("Tunnels", "Tunnels"); aMap.put("Congestion", "Congestion"); aMap.put("TunnelStatus", "Tunnel Status"); aMap.put("Destinations", "Local Destinations"); aMap.put("NewsHeadings", "News & Updates"); SECTION_NAMES = Collections.unmodifiableMap(aMap); } private final RouterContext _context; private final SummaryHelper _helper; public SummaryBarRenderer(RouterContext context, SummaryHelper helper) { _context = context; _helper = helper; } /** * Note - ensure all links in here are absolute, as the summary bar may be displayed * on lower-level directory errors. */ public void renderSummaryHTML(Writer out) throws IOException { String requestURI = _helper.getRequestURI(); String page = requestURI.replace("/", "").replace(".jsp", ""); List sections = _helper.getSummaryBarSections(page); StringBuilder buf = new StringBuilder(8*1024); 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); if (section != null && section != "") { out.write("
" + i + "
\n" + section); } } catch (Exception e) { out.write("
" +i + " - Exception
\n" + e); }*/ buf.setLength(0); 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()); } } public String renderHelpAndFAQHTML() { StringBuilder buf = new StringBuilder(512); 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() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

") .append(_("General")) .append("


\n" + "" + "" + "\n" + "" + "" + "\n" + "" + "" + "
") .append(_("Local Identity")) .append(":" + "") .append(_("show")) .append("
") .append(_("Version")) .append(":") .append(_helper.getVersion()) .append("
") .append(_("Uptime")) .append(":") .append(_helper.getUptime()) .append("
\n"); 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); buf.append("

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

\n"); return buf.toString(); } public String renderUpdateStatusHTML() { if (_helper == null) return ""; String updateStatus = _helper.getUpdateStatus(); if ("".equals(updateStatus)) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

") .append(_("I2P Update")) .append("


\n"); buf.append(updateStatus); return buf.toString(); } public String renderRestartStatusHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append(_helper.getRestartStatus()); return buf.toString(); } public String renderPeersHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

") .append(_("Peers")) .append("


\n" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "
") .append(_("Active")) .append(":"); int active = _helper.getActivePeers(); buf.append(active) .append(SummaryHelper.THINSP) .append(Math.max(active, _helper.getActiveProfiles())) .append("
") .append(_("Fast")) .append(":") .append(_helper.getFastPeers()) .append("
") .append(_("High capacity")) .append(":") .append(_helper.getHighCapacityPeers()) .append("
") .append(_("Integrated")) .append(":") .append(_helper.getWellIntegratedPeers()) .append("
") .append(_("Known")) .append(":") .append(_helper.getAllPeers()) .append("
\n"); return buf.toString(); } public String renderFirewallAndReseedStatusHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append(_helper.getFirewallAndReseedStatus()); return buf.toString(); } public String renderBandwidthHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

") .append(_("Bandwidth in/out")) .append("


" + "\n" + "\n"); if (_context.router().getUptime() > 6*60*1000) { buf.append("\n"); } if (_context.router().getUptime() > 2*60*1000) { buf.append("\n"); } buf.append("\n" + "
") .append(DataHelper.formatDuration2(3 * 1000)) // lie and say 3 sec since 1 sec would appear as 1000 ms .append(":") .append(_helper.getSecondKBps()) .append("Bps
") .append(DataHelper.formatDuration2(5 * 60 * 1000)) // 5 min .append(":") .append(_helper.getFiveMinuteKBps()) .append("Bps
") .append(_("Total")) .append(":") .append(_helper.getLifetimeKBps()) .append("Bps
") .append(_("Used")) .append(":") .append(_helper.getInboundTransferred()) .append(SummaryHelper.THINSP) .append(_helper.getOutboundTransferred()) .append("
\n"); return buf.toString(); } public String renderTunnelsHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

") .append(_("Tunnels")) .append("


" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "
") .append(_("Exploratory")) .append(":") .append(_helper.getInboundTunnels() + _helper.getOutboundTunnels()) .append("
") .append(_("Client")) .append(":") .append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels()) .append("
") .append(_("Participating")) .append(":") .append(_helper.getParticipatingTunnels()) .append("
") .append(_("Share ratio")) .append(":") .append(_helper.getShareRatio()) .append("
\n"); return buf.toString(); } public String renderCongestionHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

") .append(_("Congestion")) .append("


" + "\n" + "" + "\n" + "" + "\n"); if (!_context.getBooleanPropertyDefaultTrue("router.disableTunnelTesting")) { buf.append("" + "\n"); } buf.append("" + "\n" + "
") .append(_("Job lag")) .append(":") .append(_helper.getJobLag()) .append("
") .append(_("Message delay")) .append(":") .append(_helper.getMessageDelay()) .append("
") .append(_("Tunnel lag")) .append(":") .append(_helper.getTunnelLag()) .append("
") .append(_("Backlog")) .append(":") .append(_helper.getInboundBacklog()) .append("
\n"); return buf.toString(); } public String renderTunnelStatusHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(50); buf.append("

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

\n"); 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 (_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) { // 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. String requestURI = _helper.getRequestURI(); if (requestURI.contains("/home")) { 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); } }