package org.radargun.stats;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.radargun.Operation;
/**
* @author Radim Vansa <rvansa@redhat.com>
*/
public abstract class MultiStatistics implements Statistics {
protected final Statistics[] internal;
protected MultiStatistics(Statistics[] internal) {
if (internal == null || internal.length == 0) {
throw new IllegalArgumentException(Arrays.toString(internal));
}
this.internal = internal;
}
@Override
public void begin() {
for (Statistics s : internal) {
s.begin();
}
}
@Override
public void end() {
for (Statistics s : internal) {
s.end();
}
}
@Override
public void reset() {
for (Statistics s : internal) {
s.reset();
}
}
@Override
public void record(Request request, Operation operation) {
for (Statistics s : internal) {
s.record(request, operation);
}
}
@Override
public void record(Message message, Operation operation) {
for (Statistics s : internal) {
s.record(message, operation);
}
}
@Override
public void record(RequestSet requestSet, Operation operation) {
for (Statistics s : internal) {
s.record(requestSet, operation);
}
}
@Override
public Statistics newInstance() {
return newInstance(Stream.of(internal).map(s -> s.newInstance()).toArray(Statistics[]::new));
}
protected abstract MultiStatistics newInstance(Statistics[] internal);
@Override
public Statistics copy() {
return copy(Stream.of(internal).map(s -> s.copy()).toArray(Statistics[]::new));
}
protected abstract MultiStatistics copy(Statistics[] internalCopy);
@Override
public void merge(Statistics otherStats) {
if (!(otherStats instanceof MultiStatistics)) {
throw new IllegalArgumentException(String.valueOf(otherStats));
}
MultiStatistics ms = (MultiStatistics) otherStats;
if (ms.internal.length != internal.length) {
throw new IllegalArgumentException("Internal statistics differ: "
+ Arrays.toString(internal) + " vs. " + Arrays.toString(ms.internal));
}
for (int i = 0; i < ms.internal.length; ++i) {
internal[i].merge(ms.internal[i]);
}
}
@Override
public long getBegin() {
return internal[0].getBegin();
}
@Override
public long getEnd() {
return internal[internal.length - 1].getBegin();
}
@Override
public Set<String> getOperations() {
return Stream.of(internal).flatMap(s -> s.getOperations().stream()).collect(Collectors.toSet());
}
@Override
public <T> T getRepresentation(String operation, Class<T> clazz, Object... args) {
return Stream.of(internal).map(s -> s.getRepresentation(operation, clazz, args)).filter(r -> r != null).findFirst().orElse(null);
}
@Override
public void registerOperationsGroup(String name, Set<Operation> operations) {
internal[0].registerOperationsGroup(name, operations);
}
@Override
public String getOperationsGroup(Operation operation) {
return Stream.of(internal).map(s -> s.getOperationsGroup(operation)).filter(r -> r != null).findFirst().orElse(null);
}
@Override
public List<Map<String, OperationStats>> getOperationStatsForGroups() {
return Stream.of(internal).map(s -> s.getOperationStatsForGroups()).filter(r -> r != null).flatMap(List::stream).collect(Collectors.toList());
}
@Override
public List<Map<String, OperationStats>> getOperationsStats() {
return Stream.of(internal).map(s -> s.getOperationsStats()).filter(r -> r != null).flatMap(List::stream).collect(Collectors.toList());
}
@Override
public OperationStats getOperationStats(String operation) {
return Stream.of(internal).map(s -> s.getOperationStats(operation)).filter(r -> r != null).findFirst().orElse(null);
}
@Override
public Map<String, Set<Operation>> getGroupOperationsMap() {
return Stream.of(internal).map(s -> s.getGroupOperationsMap()).filter(r -> r != null).findFirst().orElse(null);
}
}