package org.limewire.statistic;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.limewire.i18n.I18nMarker;
import org.limewire.inject.EagerSingleton;
import org.limewire.lifecycle.Service;
import org.limewire.lifecycle.ServiceRegistry;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/**
* Manages recording {@link Statistic Statistics}. This will handle
* ensuring that every statistic added to this accumulator is stored
* every second.
*/
@EagerSingleton
final class StatisticsAccumulatorImpl implements StatisticAccumulator, Service {
private final ScheduledExecutorService backgroundExecutor;
private volatile ScheduledFuture<?> scheduledFuture;
private final List<Statistic> basicStatistics = new CopyOnWriteArrayList<Statistic>();
@Inject
StatisticsAccumulatorImpl(@Named("backgroundExecutor") ScheduledExecutorService backgroundExecutor) {
this.backgroundExecutor = backgroundExecutor;
}
@Inject void register(ServiceRegistry registry) {
registry.register(this);
}
public void initialize() {
}
public void start() {
if(scheduledFuture != null)
throw new IllegalStateException("already started!");
scheduledFuture = backgroundExecutor.scheduleWithFixedDelay(new Runner(), 0, 1000, TimeUnit.MILLISECONDS);
}
public void stop() {
ScheduledFuture<?> f = scheduledFuture;
if(f != null) {
f.cancel(false);
scheduledFuture = null;
}
}
public String getServiceName() {
return I18nMarker.marktr("Statistic Management");
}
/* (non-Javadoc)
* @see org.limewire.statistic.StatisticAccumulator#addBasicStatistic(org.limewire.statistic.Statistic)
*/
public void addBasicStatistic(Statistic stat) {
basicStatistics.add(stat);
}
private class Runner implements Runnable {
public void run() {
for(Statistic stat : basicStatistics) {
stat.storeCurrentStat();
}
}
}
}