package net.i2p.router.web; import java.io.IOException; import java.io.Writer; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.TreeSet; import net.i2p.data.DataHelper; import net.i2p.stat.Rate; public class GraphHelper extends FormHandler { protected Writer _out; private int _periodCount; private boolean _showEvents; private int _width; private int _height; private int _refreshDelaySeconds; private boolean _persistent; private static final String PROP_X = "routerconsole.graphX"; private static final String PROP_Y = "routerconsole.graphY"; private static final String PROP_REFRESH = "routerconsole.graphRefresh"; private static final String PROP_PERIODS = "routerconsole.graphPeriods"; private static final String PROP_EVENTS = "routerconsole.graphEvents"; public static final int DEFAULT_X = 250; public static final int DEFAULT_Y = 100; private static final int DEFAULT_REFRESH = 60; private static final int DEFAULT_PERIODS = 60; static final int MAX_X = 2048; static final int MAX_Y = 1024; private static final int MIN_REFRESH = 15; /** set the defaults after we have a context */ @Override public void setContextId(String contextId) { super.setContextId(contextId); _width = _context.getProperty(PROP_X, DEFAULT_X); _height = _context.getProperty(PROP_Y, DEFAULT_Y); _periodCount = _context.getProperty(PROP_PERIODS, DEFAULT_PERIODS); _refreshDelaySeconds = _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH); _showEvents = _context.getBooleanProperty(PROP_EVENTS); } /** * This must be output in the jsp since must be in the
* @since 0.8.6 */ public String getRefreshMeta() { if (_refreshDelaySeconds <= 8 || ConfigRestartBean.getRestartTimeRemaining() < (1000 * (_refreshDelaySeconds + 30))) return ""; // shorten the refresh by 3 seconds so we beat the iframe return ""; } /** * This was a HelperBase but now it's a FormHandler * @since 0.8.2 */ public void storeWriter(Writer out) { _out = out; } public void setPeriodCount(String str) { try { _periodCount = Integer.parseInt(str); } catch (NumberFormatException nfe) {} } public void setShowEvents(boolean b) { _showEvents = b; } public void setHeight(String str) { try { _height = Math.min(Integer.parseInt(str), MAX_Y); } catch (NumberFormatException nfe) {} } public void setWidth(String str) { try { _width = Math.min(Integer.parseInt(str), MAX_X); } catch (NumberFormatException nfe) {} } public void setRefreshDelay(String str) { try { int rds = Integer.parseInt(str); if (rds > 0) _refreshDelaySeconds = Math.max(rds, MIN_REFRESH); else _refreshDelaySeconds = -1; } catch (NumberFormatException nfe) {} } /** @since 0.8.6 */ public void setPersistent(String foo) { _persistent = true; } public String getImages() { try { List listeners = StatSummarizer.instance().getListeners(); TreeSet ordered = new TreeSet(new AlphaComparator()); ordered.addAll(listeners); // go to some trouble to see if we have the data for the combined bw graph boolean hasTx = false; boolean hasRx = false; for (Iterator iter = ordered.iterator(); iter.hasNext(); ) { SummaryListener lsnr = (SummaryListener)iter.next(); String title = lsnr.getRate().getRateStat().getName(); if (title.equals("bw.sendRate")) hasTx = true; else if (title.equals("bw.recvRate")) hasRx = true; } if (hasTx && hasRx && !_showEvents) { _out.write(""); String title = _("Combined bandwidth graph"); _out.write("" + _("All times are UTC.") + "
\n"); } catch (IOException ioe) { ioe.printStackTrace(); } return ""; } private static final int[] times = { 60, 2*60, 5*60, 10*60, 30*60, 60*60, -1 }; public String getForm() { String prev = System.getProperty("net.i2p.router.web.GraphHelper.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.GraphHelper.noncePrev", prev); String nonce = "" + _context.random().nextLong(); System.setProperty("net.i2p.router.web.GraphHelper.nonce", nonce); try { _out.write("