package com.librato.metrics.client; import java.util.LinkedList; import java.util.List; /** * Represents a bundle of measures */ public class Measures { private final String source; private final Long epoch; private final Integer period; private final List<Tag> tags = new LinkedList<Tag>(); private final List<IMeasure> measures = new LinkedList<IMeasure>(); public Measures() { this.source = null; this.epoch = null; this.period = null; } public Measures(String source, List<Tag> tags, Long epoch) { this.source = source; this.tags.addAll(tags); this.epoch = epoch; this.period = null; } public Measures(String source, List<Tag> tags, Long epoch, Integer period) { this.source = source; this.tags.addAll(tags); this.epoch = epoch; this.period = period; } public Measures(Measures measures, List<IMeasure> batch) { this.source = measures.source; this.epoch = measures.epoch; this.period = measures.period; this.measures.addAll(batch); this.tags.addAll(measures.tags); } public List<Measures> partition(int size) { List<Measures> result = new LinkedList<Measures>(); for (List<IMeasure> batch : Lists.partition(this.measures, size)) { result.add(new Measures(this, batch)); } return result; } public Measures toSD() { return convert(new MeasurePredicate() { @Override public boolean accept(IMeasure measure) { return !measure.isTagged(); } }); } public Measures toMD() { return convert(new MeasurePredicate() { @Override public boolean accept(IMeasure measure) { return measure.isTagged(); } }); } public String getSource() { return source; } public List<Tag> getTags() { return tags; } interface MeasurePredicate { boolean accept(IMeasure measure); } private Measures convert(MeasurePredicate predicate) { Measures result = new Measures(source, tags, epoch, period); for (IMeasure measure : this.measures) { if (predicate.accept(measure)) { result.measures.add(measure); } } return result; } public Measures add(TaggedMeasure measure) { return addMeasure(measure); } public Measures add(CounterMeasure measure) { return addMeasure(measure); } public Measures add(GaugeMeasure measure) { return addMeasure(measure); } private Measures addMeasure(IMeasure measure) { this.measures.add(measure); return this; } public Integer getPeriod() { return period; } public Long getEpoch() { return epoch; } public List<IMeasure> getMeasures() { return measures; } public boolean isEmpty() { return measures.isEmpty(); } }