package eu.dnetlib.iis.common.counter; import java.io.Serializable; import java.util.Collection; import java.util.Map; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; /** * Class that groups several counters which are identified by name (<code>String</code> value). * * @author madryk */ public class NamedCounters implements Serializable { private static final long serialVersionUID = 1L; private final Map<String, Long> counters; //------------------------ CONSTRUCTORS -------------------------- /** * Creates {@link NamedCounters} with empty initial counters. */ public NamedCounters() { this.counters = Maps.newHashMap(); } /** * Creates {@link NamedCounters} with initial counters.<br/> * Starting value of initial counters is zero. * * @param initialCounterNames - names of initial counters */ public NamedCounters(String[] initialCounterNames) { Preconditions.checkNotNull(initialCounterNames); this.counters = Maps.newHashMap(); for (String initialCounterName : initialCounterNames) { this.counters.put(initialCounterName, 0L); } } /** * Creates {@link NamedCounters} with initial counters.<br/> * Starting value of initial counters is zero. * * @param initialCounterNamesEnumClass - enum class providing names of initial counters */ public <E extends Enum<E>> NamedCounters(Class<E> initialCounterNamesEnumClass) { Preconditions.checkNotNull(initialCounterNamesEnumClass); this.counters = Maps.newHashMap(); Enum<?>[] enumConstants = initialCounterNamesEnumClass.getEnumConstants(); for (int i=0; i<enumConstants.length; ++i) { this.counters.put(enumConstants[i].name(), 0L); } } //------------------------ LOGIC -------------------------- /** * Increments value by 1 of a counter with the name specified as parameter.<br/> * Internally uses {@link #increment(String, Long)} */ public void increment(String counterName) { increment(counterName, 1L); } /** * Increments value of a counter with the name specified as parameter by the given value.<br/> * If current instance of {@link NamedCounters} does not contain counter * with provided name, then before incrementing counter will be created with starting * value equal to zero. */ public void increment(String counterName, Long incrementValue) { long oldValue = counters.getOrDefault(counterName, 0L); counters.put(counterName, oldValue + incrementValue); } /** * Returns current value of a counter with the name specified as parameter. * * @throws IllegalArgumentException when {@link NamedCounters} does not contain counter * with provided name */ public long currentValue(String counterName) { if (!counters.containsKey(counterName)) { throw new IllegalArgumentException("Couldn't find counter with name: " + counterName); } return counters.get(counterName); } /** * Returns names of currently tracked counters. */ public Collection<String> counterNames() { return counters.keySet(); } }