diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
index e867a8b32f..8a46e80f51 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
@@ -50,16 +50,16 @@ public class ConfigStatsHandler extends FormHandler {
public void setGraphList(String stats[]) {
if (stats != null) {
- String s = "";
+ StringBuilder s = new StringBuilder(128);
for (int i = 0; i < stats.length; i++) {
String cur = stats[i].trim();
if (cur.length() > 0) {
if (s.length() > 0)
- s = s + ",";
- s = s + cur;
+ s.append(",");
+ s.append(cur);
}
}
- _graphs = s;
+ _graphs = s.toString();
} else {
_graphs = "";
}
@@ -122,7 +122,7 @@ public class ConfigStatsHandler extends FormHandler {
addFormNotice(_("Restart required to take effect"));
}
if (graphsChanged)
- addFormNotice(_("Graph list updated, may take up to 60s to be reflected here and on the Graphs Page"));
+ addFormNotice(_("Graph list updated, may take up to 60s to be reflected on the {0}Graphs Page{1}", "", ""));
}
}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java
index b890f1bc66..7ecf78b3c4 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java
@@ -21,9 +21,10 @@ import net.i2p.util.Log;
public class ConfigStatsHelper extends HelperBase {
private Log _log;
private String _filter;
- private Set _filters;
+ private final Set _filters;
+ private final Set _graphs;
/** list of names of stats which are remaining, ordered by nested groups */
- private List _stats;
+ private final List _stats;
private String _currentStatName;
private String _currentGraphName;
private String _currentStatDescription;
@@ -35,6 +36,12 @@ public class ConfigStatsHelper extends HelperBase {
private boolean _currentIsGraphed;
private boolean _currentCanBeGraphed;
+ public ConfigStatsHelper() {
+ _stats = new ArrayList();
+ _filters = new HashSet();
+ _graphs = new HashSet();
+ }
+
/**
* Configure this bean to query a particular router context
*
@@ -46,7 +53,6 @@ public class ConfigStatsHelper extends HelperBase {
super.setContextId(contextId);
_log = _context.logManager().getLog(ConfigStatsHelper.class);
- _stats = new ArrayList();
Map> unsorted = _context.statManager().getStatsByGroup();
Map> groups = new TreeMap(new AlphaComparator());
groups.putAll(unsorted);
@@ -57,10 +63,17 @@ public class ConfigStatsHelper extends HelperBase {
if (_filter == null)
_filter = "";
- _filters = new HashSet();
StringTokenizer tok = new StringTokenizer(_filter, ",");
while (tok.hasMoreTokens())
_filters.add(tok.nextToken().trim());
+
+ // create a local copy of the config. Querying r.getSummaryListener()
+ // lags behind, as StatSummarizer only runs once a minute.
+ String specs = _context.getProperty("stat.summaries", StatSummarizer.DEFAULT_DATABASES);
+ tok = new StringTokenizer(specs, ",");
+ while (tok.hasMoreTokens()) {
+ _graphs.add(tok.nextToken().trim());
+ }
}
/**
@@ -100,9 +113,12 @@ public class ConfigStatsHelper extends HelperBase {
if (period <= 10*60*1000) {
Rate r = rs.getRate(period);
_currentCanBeGraphed = r != null;
- if (_currentCanBeGraphed)
- _currentIsGraphed = r.getSummaryListener() != null;
+ if (_currentCanBeGraphed) {
+ // see above
+ //_currentIsGraphed = r.getSummaryListener() != null;
_currentGraphName = _currentStatName + "." + period;
+ _currentIsGraphed = _graphs.contains(_currentGraphName);
+ }
} else {
_currentCanBeGraphed = false;
}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java
index 404519df9e..b9a73a8040 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java
@@ -7,6 +7,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.TreeSet;
import net.i2p.data.DataHelper;
@@ -220,12 +221,12 @@ public class GraphHelper extends FormHandler {
name = _stat;
displayName = _("Bandwidth usage");
} else {
- List rates = StatSummarizer.instance().parseSpecs(_stat);
+ Set rates = StatSummarizer.instance().parseSpecs(_stat);
if (rates.size() != 1) {
_out.write("Graphs not enabled for " + _stat);
return "";
}
- Rate r = rates.get(0);
+ Rate r = rates.iterator().next();
period = r.getPeriod();
name = r.getRateStat().getName();
displayName = name;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
index 662df8f54b..b14c28ac88 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
@@ -3,8 +3,9 @@ package net.i2p.router.web;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
-import java.util.ArrayList;
import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
import java.util.StringTokenizer;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Semaphore;
@@ -96,7 +97,7 @@ public class StatSummarizer implements Runnable {
/** list of SummaryListener instances */
List getListeners() { return _listeners; }
- private static final String DEFAULT_DATABASES = "bw.sendRate.60000" +
+ static final String DEFAULT_DATABASES = "bw.sendRate.60000" +
",bw.recvRate.60000" +
// ",tunnel.testSuccessTime.60000" +
// ",udp.outboundActiveCount.60000" +
@@ -127,8 +128,8 @@ public class StatSummarizer implements Runnable {
( (spec != null) && (oldSpecs != null) && (oldSpecs.equals(spec))) )
return oldSpecs;
- List old = parseSpecs(oldSpecs);
- List newSpecs = parseSpecs(spec);
+ Set old = parseSpecs(oldSpecs);
+ Set newSpecs = parseSpecs(spec);
// remove old ones
for (Rate r : old) {
@@ -307,9 +308,9 @@ public class StatSummarizer implements Runnable {
* @param specs statName.period,statName.period,statName.period
* @return list of Rate objects
*/
- List parseSpecs(String specs) {
+ Set parseSpecs(String specs) {
StringTokenizer tok = new StringTokenizer(specs, ",");
- List rv = new ArrayList();
+ Set rv = new HashSet();
while (tok.hasMoreTokens()) {
String spec = tok.nextToken();
int split = spec.lastIndexOf('.');