package org.ovirt.engine.api.restapi.resource; import java.math.BigDecimal; import java.math.MathContext; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.ovirt.engine.api.model.BaseResource; import org.ovirt.engine.api.model.Statistic; import org.ovirt.engine.api.model.StatisticType; import org.ovirt.engine.api.model.StatisticUnit; import org.ovirt.engine.api.model.Value; import org.ovirt.engine.api.model.ValueType; import org.ovirt.engine.api.model.Values; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.api.restapi.resource.BaseBackendResource.BackendFailureException; /** * Subclasses encapsulate the subject-specific aspects of a statistical query */ public abstract class AbstractStatisticalQuery<R extends BaseResource, E> { protected static final long Mb = 1024 * 1024L; protected static final BigDecimal CENT = new BigDecimal(100); protected static final StatisticType GAUGE = StatisticType.GAUGE; protected static final StatisticType COUNTER = StatisticType.COUNTER; protected static final StatisticUnit NONE = StatisticUnit.NONE; protected static final StatisticUnit PERCENT = StatisticUnit.PERCENT; protected static final StatisticUnit BYTES = StatisticUnit.BYTES; protected static final StatisticUnit BYTES_PER_SECOND = StatisticUnit.BYTES_PER_SECOND; protected static final StatisticUnit BITS_PER_SECOND = StatisticUnit.BITS_PER_SECOND; protected static final ValueType INTEGER = ValueType.INTEGER; protected static final ValueType DECIMAL = ValueType.DECIMAL; protected Class<R> parentType; protected R parent; protected AbstractBackendResource<R, E>.EntityIdResolver entityResolver; public AbstractStatisticalQuery(Class<R> parentType, R parent, AbstractBackendResource<R, E>.EntityIdResolver entityResolver) { this.parentType = parentType; this.parent = parent; this.entityResolver = entityResolver; } public Class<R> getParentType() { return parentType; } public E resolve(Guid id) throws BackendFailureException { return entityResolver.resolve(id); } public Statistic setDatum(Statistic statistic, BigDecimal datum) { statistic.getValues().getValues().get(0).setDatum(datum); return statistic; } public Statistic setDatum(Statistic statistic, long datum) { return setDatum(statistic, new BigDecimal(datum)); } public Statistic setDatum(Statistic statistic, double datum) { return setDatum(statistic, new BigDecimal(datum, new MathContext(2))); } public abstract List<Statistic> getStatistics(E entity); public abstract Statistic adopt(Statistic statistic); public static Statistic create(String name, String description, StatisticType type, StatisticUnit unit, ValueType valueType) { Statistic statistic = new Statistic(); statistic.setId(asId(name)); statistic.setName(name); statistic.setDescription(description); statistic.setType(type); statistic.setUnit(unit); statistic.setValues(new Values()); statistic.getValues().setType(valueType); statistic.getValues().getValues().add(new Value()); return statistic; } public static Statistic clone(Statistic s) { return create(s.getName(), s.getDescription(), s.getType(), s.getUnit(), s.getValues().getType()); } public static String asId(String name) { return UUID.nameUUIDFromBytes(name.getBytes()).toString(); } public List<Statistic> asList(Statistic...statistics) { List<Statistic> list = new ArrayList<Statistic>(); for (Statistic statistic : statistics) { list.add(adopt(statistic)); } return list; } }