package com.limegroup.gnutella.statistics; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import com.limegroup.gnutella.ErrorService; import com.limegroup.gnutella.RouterService; /** * Class for managing statistics recording. */ public final class StatisticsManager implements Runnable { /** * <tt>List</tt> of all statistics classes. */ private volatile List BASIC_STATS = new LinkedList(); /** * <tt>List</tt> of all advanced statistics classes. */ private volatile List ADVANCED_STATS = new LinkedList(); /** * <tt>List</tt> of all advanced numberical statistics classes. */ private volatile List NUMERICAL_STATS = new LinkedList(); /** * Boolean for whether or not advanced statistics should be * recorded. */ private volatile boolean _recordAdvancedStatistics; /** * Constant for the <tt>StatisticsManager</tt> isntance. */ private static final StatisticsManager INSTANCE = new StatisticsManager(); /** * Accessor for the <tt>StatisticsManager</tt> instance. * * @return the <tt>StatisticsManager</tt> instance */ public static StatisticsManager instance() {return INSTANCE;} /** * Constructor the the <tt>StatisticsManager</tt> -- only accessed once. */ private StatisticsManager() { RouterService.schedule(this, 0, 1000); } /** * Adds a <tt>Statistic</tt> to the set of normal (not advanced) * statistics to record. * * @param stat the <tt>Statistic</tt> to add */ void addBasicStatistic(Statistic stat) { synchronized(BASIC_STATS) { BASIC_STATS.add(stat); } } /** * Adds an <tt>AdvancedStatistic</tt> to the set of advanced * statistics to record. * * @param stat the <tt>AdvancedStatistic</tt> to add */ void addAdvancedStatistic(Statistic stat) { synchronized(ADVANCED_STATS) { ADVANCED_STATS.add(stat); } } /** * Adds an <tt>NumericalStatistic</tt> to the set of Numerical * statistics to record. * * @param stat the <tt>NumericalStatistic</tt> to add */ void addNumericalStatistic(Statistic stat) { synchronized(NUMERICAL_STATS) { NUMERICAL_STATS.add(stat); } } /** * Sets whether or not advanced statistics should be recorded. * * @param record specifies whether or not advanced statistics should * be recorded */ public void setRecordAdvancedStats(boolean record) { _recordAdvancedStatistics = record; } /** * Accessor for whether or not advanced statistics should be recorded. * * @return <tt>true</tt> if advanced statistics should be recorded, * <tt>false</tt> otherwise */ public boolean getRecordAdvancedStats() { return _recordAdvancedStatistics; } /** * Stores the accumulated statistics for all messages into * their collections of historical data. */ public void run() { try { synchronized(BASIC_STATS) { Iterator iter = BASIC_STATS.iterator(); while(iter.hasNext()) { Statistic stat = (Statistic)iter.next(); stat.storeCurrentStat(); } } if(_recordAdvancedStatistics) { synchronized(ADVANCED_STATS) { Iterator advancedIter = ADVANCED_STATS.iterator(); while(advancedIter.hasNext()) { Statistic stat = (Statistic)advancedIter.next(); stat.storeCurrentStat(); } } } } catch(Throwable t) { ErrorService.error(t); } } }