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.router.RouterContext; import net.i2p.stat.Rate; public class GraphHelper { private RouterContext _context; private Writer _out; private int _periodCount; private boolean _showEvents; private int _width; private int _height; private int _refreshDelaySeconds; /** * Configure this bean to query a particular router context * * @param contextId begging few characters of the routerHash, or null to pick * the first one we come across. */ public void setContextId(String contextId) { try { _context = ContextHelper.getContext(contextId); } catch (Throwable t) { t.printStackTrace(); } } public GraphHelper() { _periodCount = 60; // SummaryListener.PERIODS; _showEvents = false; _width = 250; _height = 100; _refreshDelaySeconds = 60; } public void setOut(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 = Integer.parseInt(str); } catch (NumberFormatException nfe) {} } public void setWidth(String str) { try { _width = Integer.parseInt(str); } catch (NumberFormatException nfe) {} } public void setRefreshDelay(String str) { try { _refreshDelaySeconds = Integer.parseInt(str); } catch (NumberFormatException nfe) {} } 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(""); _out.write("\n"); } for (Iterator iter = ordered.iterator(); iter.hasNext(); ) { SummaryListener lsnr = (SummaryListener)iter.next(); Rate r = lsnr.getRate(); String title = r.getRateStat().getName() + " for " + DataHelper.formatDuration(_periodCount * r.getPeriod()); _out.write(""); _out.write("\n"); } if (_refreshDelaySeconds > 0) _out.write("\n"); } catch (IOException ioe) { ioe.printStackTrace(); } return ""; } public String getForm() { try { _out.write("

Select Stats to Graph

"); _out.write("

"); _out.write("Periods:
\n"); _out.write("Plot averages: "); _out.write("or plot events:
\n"); _out.write("Image sizes: width: pixels, height:
\n"); _out.write("Refresh delay:
\n"); _out.write(""); } catch (IOException ioe) { ioe.printStackTrace(); } return ""; } public String getPeerSummary() { try { _context.commSystem().renderStatusHTML(_out); _context.bandwidthLimiter().renderStatusHTML(_out); } catch (IOException ioe) { ioe.printStackTrace(); } return ""; } } class AlphaComparator implements Comparator { public int compare(Object lhs, Object rhs) { SummaryListener l = (SummaryListener)lhs; SummaryListener r = (SummaryListener)rhs; String lName = l.getRate().getRateStat().getName() + "." + l.getRate().getPeriod(); String rName = r.getRate().getRateStat().getName() + "." + r.getRate().getPeriod(); return lName.compareTo(rName); } }