package com.limegroup.gnutella.statistics;
import org.limewire.statistic.BasicKilobytesStatistic;
import org.limewire.statistic.Statistic;
import org.limewire.statistic.StatisticAccumulator;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
class TcpBandwidthStatisticsImpl implements TcpBandwidthStatistics {
private final StatisticAccumulator statisticAccumulator;
private final Statistic UPSTREAM;
private final Statistic DOWNSTREAM;
private final Statistic HTTP_DOWNSTREAM;
private final Statistic HTTP_UPSTREAM;
private final Statistic HTTP_DOWNSTREAM_INNETWORK;
private final Statistic HTTP_UPSTREAM_INNETWORK;
private final Statistic HTTP_HEADER_DOWNSTREAM;
private final Statistic HTTP_HEADER_DOWNSTREAM_INNETWORK;
private final Statistic HTTP_BODY_DOWNSTREAM;
private final Statistic HTTP_BODY_DOWNSTREAM_INNETWORK;
private final Statistic HTTP_HEADER_UPSTREAM;
private final Statistic HTTP_HEADER_UPSTREAM_INNETWORK;
private final Statistic HTTP_BODY_UPSTREAM;
private final Statistic HTTP_BODY_UPSTREAM_INNETWORK;
@Inject
TcpBandwidthStatisticsImpl(StatisticAccumulator statisticAccumulator) {
this.statisticAccumulator = statisticAccumulator;
UPSTREAM = new BandwidthStat();
DOWNSTREAM = new BandwidthStat();
HTTP_DOWNSTREAM = new DelegateStat(DOWNSTREAM);
HTTP_UPSTREAM = new DelegateStat(UPSTREAM);
// In-network stats purposely don't add into the global HTTP,
// otherwise the stats in the UI would look very strange showing
// bandwidth w/o a visible download
HTTP_DOWNSTREAM_INNETWORK = new DelegateStat(DOWNSTREAM);
HTTP_UPSTREAM_INNETWORK = new DelegateStat(UPSTREAM);
HTTP_HEADER_DOWNSTREAM_INNETWORK = new DelegateStat(HTTP_DOWNSTREAM_INNETWORK);
HTTP_BODY_DOWNSTREAM_INNETWORK = new DelegateStat(HTTP_DOWNSTREAM_INNETWORK);
HTTP_HEADER_UPSTREAM_INNETWORK = new DelegateStat(HTTP_UPSTREAM_INNETWORK);
HTTP_BODY_UPSTREAM_INNETWORK = new DelegateStat(HTTP_UPSTREAM_INNETWORK);
HTTP_HEADER_DOWNSTREAM = new DelegateStat(HTTP_DOWNSTREAM);
HTTP_BODY_DOWNSTREAM = new DelegateStat(HTTP_DOWNSTREAM);
HTTP_HEADER_UPSTREAM = new DelegateStat(HTTP_UPSTREAM);
HTTP_BODY_UPSTREAM = new DelegateStat(HTTP_UPSTREAM);
}
public Statistic getStatistic(StatisticType statisticType) {
switch (statisticType) {
case HTTP_BODY_DOWNSTREAM:
return HTTP_BODY_DOWNSTREAM;
case HTTP_BODY_INNETWORK_DOWNSTREAM:
return HTTP_BODY_DOWNSTREAM_INNETWORK;
case HTTP_BODY_INNETWORK_UPSTREAM:
return HTTP_BODY_UPSTREAM_INNETWORK;
case HTTP_BODY_UPSTREAM:
return HTTP_BODY_UPSTREAM;
case HTTP_HEADER_DOWNSTREAM:
return HTTP_HEADER_DOWNSTREAM;
case HTTP_HEADER_INNETWORK_DOWNSTREAM:
return HTTP_HEADER_DOWNSTREAM_INNETWORK;
case HTTP_HEADER_INNETWORK_UPSTREAM:
return HTTP_HEADER_UPSTREAM_INNETWORK;
case HTTP_HEADER_UPSTREAM:
return HTTP_HEADER_UPSTREAM;
default:
throw new IllegalArgumentException("invalid statistic type: " + statisticType);
}
}
public long getTotalDownstream() {
return (long) DOWNSTREAM.getTotal();
}
public long getTotalUpstream() {
return (long) UPSTREAM.getTotal();
}
public double getAverageHttpUpstream() {
return HTTP_UPSTREAM.getAverage();
}
private class BandwidthStat extends BasicKilobytesStatistic {
public BandwidthStat() {
super(statisticAccumulator);
}
}
private class DelegateStat extends BandwidthStat {
private final Statistic delegate;
DelegateStat(Statistic delegate) {
this.delegate = delegate;
}
@Override
public void addData(int data) {
super.addData(data);
delegate.addData(data);
}
}
}