package ddth.dasp.framework.stats; import java.util.HashMap; import java.util.Map; import java.util.Timer; /** * Factory to create {@link SingleRateCounter} instances. * * @author NBThanh <btnguyen2k@gmail.com> */ public class SingleRateCounterFactory { /* * Resolution is best to be power of 2 (e.g. 2, 4, 8, 16, etc) */ private int defaultSlotResolution; private String name; private Map<String, SingleRateCounter> cacheCounters = new HashMap<String, SingleRateCounter>(); private Timer timer; /** * Initializing method. */ public void init() { timer = new Timer(name != null ? name : this.getClass().getName(), true); } /** * Destruction method. */ public void destroy() { timer.cancel(); } /** * Getter for defaultSlotResolution * * @return defaultSlotResolution int */ public int getDefaultSlotResolution() { return defaultSlotResolution; } /** * Setter for defaultSlotResolution * * @param defaultSlotResolution * int */ public void setDefaultSlotResolution(int defaultSlotResolution) { this.defaultSlotResolution = defaultSlotResolution; } /** * Getter for name * * @return name String */ public String getName() { return name; } /** * Setter for name * * @param name * String */ public void setName(String name) { this.name = name; } /** * Gets a counter by name. * * @param name * @return */ public SingleRateCounter getCounter(String name) { synchronized (cacheCounters) { SingleRateCounter result = cacheCounters.get(name); if (result == null) { result = new SingleRateCounter(); result.setTimer(timer); result.setName(this.name + "-" + name); result.setSlotResolution(getDefaultSlotResolution()); result.init(); cacheCounters.put(name, result); } return result; } } /** * Gets a counter by name and specifies a slot resolution * * @param name * @param resolution * @return */ public SingleRateCounter getCounter(String name, int resolution) { synchronized (cacheCounters) { SingleRateCounter result = cacheCounters.get(name); if (result == null) { result = new SingleRateCounter(); result.setTimer(timer); result.setName(this.name + "-" + name); result.setSlotResolution(resolution); result.init(); cacheCounters.put(name, result); } return result; } } private final static SingleRateCounter[] EMPTY_ARRAY = new SingleRateCounter[0]; /** * Gets all current counters. * * @return RateCounter[] */ public SingleRateCounter[] getAllCounters() { synchronized (cacheCounters) { return cacheCounters.values().toArray(EMPTY_ARRAY); } } }