diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java index 15043ceb8bde0f5b2f71be741abfa2750fb88d75..9998feaf4971dcf150a9f6de10a5ed8e36f240eb 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java @@ -5,6 +5,7 @@ import java.util.Locale; import net.i2p.crypto.SigType; import net.i2p.data.DataHelper; +import net.i2p.util.SystemVersion; import net.i2p.router.web.HelperBase; public class NetDbHelper extends HelperBase { @@ -12,11 +13,15 @@ public class NetDbHelper extends HelperBase { private String _version; private String _country; private String _family, _caps, _ip, _sybil, _mtu, _ssucaps, _ipv6, _transport; - private int _full, _port, _cost; + private int _full, _port, _cost, _page; + private int _limit = DEFAULT_LIMIT; private boolean _lease; private boolean _debug; private boolean _graphical; private SigType _type; + + private static final int DEFAULT_LIMIT = SystemVersion.isARM() ? 250 : 500; + private static final int DEFAULT_PAGE = 0; private static final String titles[] = {_x("Summary"), // 0 @@ -146,6 +151,26 @@ public class NetDbHelper extends HelperBase { _debug = "2".equals(l); _lease = _debug || "1".equals(l); } + + /** @since 0.9.36 */ + public void setLimit(String f) { + try { + _limit = Integer.parseInt(f); + if (_limit <= 0) + _limit = Integer.MAX_VALUE; + else if (_limit <= 10) + _limit = 10; + } catch (NumberFormatException nfe) {} + } + + /** @since 0.9.36 */ + public void setPage(String f) { + try { + _page = Integer.parseInt(f) - 1; + if (_page < 0) + _page = 0; + } catch (NumberFormatException nfe) {} + } /** * call for non-text-mode browsers @@ -166,7 +191,8 @@ public class NetDbHelper extends HelperBase { _family != null || _caps != null || _ip != null || _sybil != null || _port != 0 || _type != null || _mtu != null || _ipv6 != null || _ssucaps != null || _transport != null || _cost != 0) - renderer.renderRouterInfoHTML(_out, _routerPrefix, _version, _country, + renderer.renderRouterInfoHTML(_out, _limit, _page, + _routerPrefix, _version, _country, _family, _caps, _ip, _sybil, _port, _type, _mtu, _ipv6, _ssucaps, _transport, _cost); else if (_lease) @@ -176,7 +202,7 @@ public class NetDbHelper extends HelperBase { else if (_full == 4) renderLookupForm(); else - renderer.renderStatusHTML(_out, _full); + renderer.renderStatusHTML(_out, _limit, _page, _full); } catch (IOException ioe) { ioe.printStackTrace(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java index 655bb9279c98f9b3266a05a170966ef5d242f87c..7a842eedd66e74478258053c71f93821bb270439 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java @@ -86,12 +86,14 @@ class NetDbRenderer { /** * One String must be non-null * + * @param page zero-based * @param routerPrefix may be null. "." for our router only * @param version may be null * @param country may be null * @param family may be null */ - public void renderRouterInfoHTML(Writer out, String routerPrefix, String version, + public void renderRouterInfoHTML(Writer out, int pageSize, int page, + String routerPrefix, String version, String country, String family, String caps, String ip, String sybil, int port, SigType type, String mtu, String ipv6, String ssucaps, @@ -101,6 +103,44 @@ class NetDbRenderer { if (".".equals(routerPrefix)) { renderRouterInfo(buf, _context.router().getRouterInfo(), true, true); } else { + StringBuilder ubuf = new StringBuilder(); + if (routerPrefix != null) + ubuf.append("&r=").append(routerPrefix); + if (version != null) + ubuf.append("&v=").append(version); + if (country != null) + ubuf.append("&c=").append(country); + if (family != null) + ubuf.append("&fam=").append(family); + if (caps != null) + ubuf.append("&caps=").append(caps); + if (tr != null) + ubuf.append("&tr=").append(tr); + if (type != null) + ubuf.append("&type=").append(type); + if (ip != null) + ubuf.append("&ip=").append(ip); + if (port != 0) + ubuf.append("&port=").append(port); + if (mtu != null) + ubuf.append("&mtu=").append(mtu); + if (ipv6 != null) + ubuf.append("&ipv6=").append(ipv6); + if (ssucaps != null) + ubuf.append("&ssucaps=").append(ssucaps); + if (cost != 0) + ubuf.append("&cost=").append(cost); + if (sybil != null) + ubuf.append("&sybil=").append(sybil); + if (page > 0) { + buf.append("<div class=\"netdbnotfound\">" + + "<a href=\"/netdb?pg=").append(page) + .append("&ps=").append(pageSize).append(ubuf).append("\">"); + buf.append(_t("Previous Page")); + buf.append("</a> "); + buf.append(_t("Page")).append(' ').append(page + 1); + buf.append("</div>"); + } boolean notFound = true; Set<RouterInfo> routers = _context.netDb().getRouters(); int ipMode = 0; @@ -122,6 +162,11 @@ class NetDbRenderer { } } } + int toSkip = pageSize * page; + int skipped = 0; + int written = 0; + boolean morePages = false; + outerloop: for (RouterInfo ri : routers) { Hash key = ri.getIdentity().getHash(); if ((routerPrefix != null && key.toBase64().startsWith(routerPrefix)) || @@ -131,6 +176,14 @@ class NetDbRenderer { (caps != null && ri.getCapabilities().contains(caps)) || (tr != null && ri.getTargetAddress(tr) != null) || (type != null && type == ri.getIdentity().getSigType())) { + if (skipped < toSkip) { + skipped++; + continue; + } + if (written++ >= pageSize) { + morePages = true; + break; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -139,6 +192,14 @@ class NetDbRenderer { for (RouterAddress ra : ri.getAddresses()) { if (ipMode == 0) { if (ip.equals(ra.getHost())) { + if (skipped < toSkip) { + skipped++; + break; + } + if (written++ >= pageSize) { + morePages = true; + break outerloop; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -148,6 +209,14 @@ class NetDbRenderer { } else { String host = ra.getHost(); if (host != null && host.startsWith(ip)) { + if (skipped < toSkip) { + skipped++; + break; + } + if (written++ >= pageSize) { + morePages = true; + break outerloop; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -159,6 +228,14 @@ class NetDbRenderer { } else if (port != 0) { for (RouterAddress ra : ri.getAddresses()) { if (port == ra.getPort()) { + if (skipped < toSkip) { + skipped++; + break; + } + if (written++ >= pageSize) { + morePages = true; + break outerloop; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -169,6 +246,14 @@ class NetDbRenderer { } else if (mtu != null) { for (RouterAddress ra : ri.getAddresses()) { if (mtu.equals(ra.getOption("mtu"))) { + if (skipped < toSkip) { + skipped++; + break; + } + if (written++ >= pageSize) { + morePages = true; + break outerloop; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -180,6 +265,14 @@ class NetDbRenderer { for (RouterAddress ra : ri.getAddresses()) { String host = ra.getHost(); if (host != null && host.startsWith(ipv6)) { + if (skipped < toSkip) { + skipped++; + break; + } + if (written++ >= pageSize) { + morePages = true; + break outerloop; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -192,6 +285,14 @@ class NetDbRenderer { if (!"SSU".equals(ra.getTransportStyle())) continue; if (ssucaps.equals(ra.getOption("caps"))) { + if (skipped < toSkip) { + skipped++; + break; + } + if (written++ >= pageSize) { + morePages = true; + break outerloop; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -202,6 +303,14 @@ class NetDbRenderer { } else if (cost != 0) { for (RouterAddress ra : ri.getAddresses()) { if (cost == ra.getCost()) { + if (skipped < toSkip) { + skipped++; + break; + } + if (written++ >= pageSize) { + morePages = true; + break outerloop; + } renderRouterInfo(buf, ri, false, true); if (sybil != null) sybils.add(key); @@ -224,6 +333,22 @@ class NetDbRenderer { buf.append(_t("Family")).append(' ').append(family); buf.append(' ').append(_t("not found in network database")); buf.append("</div>"); + } else if (page > 0 || morePages) { + buf.append("<div class=\"netdbnotfound\">"); + if (page > 0) { + buf.append("<a href=\"/netdb?pg=").append(page) + .append("&ps=").append(pageSize).append(ubuf).append("\">"); + buf.append(_t("Previous Page")); + buf.append("</a> "); + } + buf.append(_t("Page")).append(' ').append(page + 1); + if (morePages) { + buf.append(" <a href=\"/netdb?pg=").append(page + 2) + .append("&ps=").append(pageSize).append(ubuf).append("\">"); + buf.append(_t("Next Page")); + buf.append("</a>"); + } + buf.append("</div>"); } } out.write(buf.toString()); @@ -450,7 +575,7 @@ class NetDbRenderer { /** * @param mode 0: charts only; 1: full routerinfos; 2: abbreviated routerinfos */ - public void renderStatusHTML(Writer out, int mode) throws IOException { + public void renderStatusHTML(Writer out, int pageSize, int page, int mode) throws IOException { if (!_context.netDb().isInitialized()) { out.write("<div id=\"notinitialized\">"); out.write(_t("Not initialized")); @@ -466,8 +591,29 @@ class NetDbRenderer { boolean showStats = full || shortStats; // this means show the router infos Hash us = _context.routerHash(); + Set<RouterInfo> routers = new TreeSet<RouterInfo>(new RouterInfoComparator()); + routers.addAll(_context.netDb().getRouters()); + int toSkip = pageSize * page; + boolean nextpg = routers.size() > toSkip + pageSize; StringBuilder buf = new StringBuilder(8192); - if (showStats) { + if (showStats && (page > 0 || nextpg)) { + buf.append("<div class=\"netdbnotfound\">"); + if (page > 0) { + buf.append("<a href=\"/netdb?f=").append(mode).append("&pg=").append(page) + .append("&ps=").append(pageSize).append("\">"); + buf.append(_t("Previous Page")); + buf.append("</a> "); + } + buf.append(_t("Page")).append(' ').append(page + 1); + if (nextpg) { + buf.append(" <a href=\"/netdb?f=").append(mode).append("&pg=").append(page + 2) + .append("&ps=").append(pageSize).append("\">"); + buf.append(_t("Next Page")); + buf.append("</a>"); + } + buf.append("</div>"); + } + if (showStats && page == 0) { RouterInfo ourInfo = _context.router().getRouterInfo(); renderRouterInfo(buf, ourInfo, true, true); out.write(buf.toString()); @@ -478,13 +624,22 @@ class NetDbRenderer { ObjectCounter<String> countries = new ObjectCounter<String>(); int[] transportCount = new int[TNAMES.length]; - Set<RouterInfo> routers = new TreeSet<RouterInfo>(new RouterInfoComparator()); - routers.addAll(_context.netDb().getRouters()); + int skipped = 0; + int written = 0; + boolean morePages = false; for (RouterInfo ri : routers) { Hash key = ri.getIdentity().getHash(); boolean isUs = key.equals(us); if (!isUs) { if (showStats) { + if (skipped < toSkip) { + skipped++; + continue; + } + if (written++ >= pageSize) { + morePages = true; + break; + } renderRouterInfo(buf, ri, false, full); out.write(buf.toString()); buf.setLength(0); @@ -498,6 +653,21 @@ class NetDbRenderer { transportCount[classifyTransports(ri)]++; } } + if (showStats && (page > 0 || morePages)) { + buf.append("<div class=\"netdbnotfound\">"); + if (page > 0) { + buf.append("<a href=\"/netdb?f=").append(mode).append("&pg=").append(page).append("&ps=").append(pageSize).append("\">"); + buf.append(_t("Previous Page")); + buf.append("</a> "); + } + buf.append(_t("Page")).append(' ').append(page + 1); + if (morePages) { + buf.append(" <a href=\"/netdb?f=").append(mode).append("&pg=").append(page + 2).append("&ps=").append(pageSize).append("\">"); + buf.append(_t("Next Page")); + buf.append("</a>"); + } + buf.append("</div>"); + } long end = System.currentTimeMillis(); if (log.shouldWarn()) log.warn("part 1 took " + (end - start)); diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index 4c77f5918430b17b6e655c6a5f716a91eeba6cdd..46fe94fb86f7a82efed1bfb06e0eb0abfca606c0 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -36,5 +36,7 @@ <jsp:setProperty name="netdbHelper" property="mtu" value="<%=request.getParameter(\"mtu\")%>" /> <jsp:setProperty name="netdbHelper" property="ssucaps" value="<%=request.getParameter(\"ssucaps\")%>" /> <jsp:setProperty name="netdbHelper" property="transport" value="<%=request.getParameter(\"tr\")%>" /> + <jsp:setProperty name="netdbHelper" property="limit" value="<%=request.getParameter(\"ps\")%>" /> + <jsp:setProperty name="netdbHelper" property="page" value="<%=request.getParameter(\"pg\")%>" /> <jsp:getProperty name="netdbHelper" property="netDbSummary" /> </div></body></html>