package ddth.dasp.framework.stats; import java.util.HashMap; import java.util.Map; import java.util.Timer; /** * Factory to create {@link RateCounter} instances. * * @author NBThanh <btnguyen2k@gmail.com> */ public class RateCounterFactory { /* * Number of slots should be power of 2 (e.g. 2, 4, 8, 16, etc) */ private int defaultNumSlots; /* * Resolution is best to be power of 2 (e.g. 2, 4, 8, 16, etc) */ private int defaultSlotResolution; private String name; private Map<String, RateCounter> cacheCounters = new HashMap<String, RateCounter>(); 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 defaultNumSlots * * @return defaultNumSlots int */ public int getDefaultNumSlots() { return defaultNumSlots; } /** * Setter for defaultNumSlots * * @param defaultNumSlots * int */ public void setDefaultNumSlots(int defaultNumSlots) { this.defaultNumSlots = defaultNumSlots; } /** * 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 RateCounter getCounter(String name) { synchronized (cacheCounters) { RateCounter result = cacheCounters.get(name); if (result == null) { result = new RateCounter(); result.setTimer(timer); result.setName(this.name + "-" + name); result.setNumSlots(getDefaultNumSlots()); result.setSlotResolution(getDefaultSlotResolution()); result.init(); cacheCounters.put(name, result); } return result; } } /** * Gets a counter by name and specified its number of slots and slot * resolution. * * @param name * @param numSlots * @param slotResolution * @return */ public RateCounter getCounter(String name, int numSlots, int slotResolution) { synchronized (cacheCounters) { RateCounter result = cacheCounters.get(name); if (result == null) { result = new RateCounter(); result.setTimer(timer); result.setName(this.name + "-" + name); result.setNumSlots(numSlots); result.setSlotResolution(slotResolution); result.init(); cacheCounters.put(name, result); } return result; } } /** * Gets all current counters. * * @return RateCounter[] */ public RateCounter[] getAllCounters() { synchronized (cacheCounters) { return cacheCounters.values().toArray(new RateCounter[0]); } } }