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 15043ceb8b..9998feaf49 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 655bb9279c..7a842eedd6 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("
");
+ }
boolean notFound = true;
Set 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("");
+ } else if (page > 0 || morePages) {
+ buf.append("");
}
}
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("");
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
routers = new TreeSet(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("");
+ }
+ 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 countries = new ObjectCounter();
int[] transportCount = new int[TNAMES.length];
- Set routers = new TreeSet(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("");
+ }
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 4c77f59184..46fe94fb86 100644
--- a/apps/routerconsole/jsp/netdb.jsp
+++ b/apps/routerconsole/jsp/netdb.jsp
@@ -36,5 +36,7 @@
" />
" />
" />
+ " />
+ " />