package org.hyperic.hq.api.transfer.mapping;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.hyperic.hq.api.model.ID;
import org.hyperic.hq.api.model.measurements.Measurement;
import org.hyperic.hq.api.model.measurements.Metric;
import org.hyperic.hq.api.model.measurements.MetricFilterDefinition;
import org.hyperic.hq.api.model.measurements.MetricFilterRequest;
import org.hyperic.hq.api.model.measurements.RawMetric;
import org.hyperic.hq.api.model.resources.ResourceFilterDefinition;
import org.hyperic.hq.authz.server.session.Resource;
import org.hyperic.hq.authz.shared.ResourceManager;
import org.hyperic.hq.measurement.server.session.Category;
import org.hyperic.hq.measurement.server.session.MeasurementTemplate;
import org.hyperic.hq.measurement.shared.HighLowMetricValue;
import org.hyperic.hq.measurement.shared.MeasurementManager;
import org.hyperic.hq.notifications.filtering.Filter;
import org.hyperic.hq.notifications.filtering.FilteringCondition;
import org.hyperic.hq.notifications.filtering.MetricFilter;
import org.hyperic.hq.notifications.filtering.MetricFilterByResource;
import org.hyperic.hq.notifications.filtering.ResourceFilteringCondition;
import org.hyperic.hq.notifications.filtering.MetricFilteringCondition;
import org.hyperic.hq.notifications.model.MetricNotification;
import org.hyperic.hq.product.MetricValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MeasurementMapper {
protected final static int MAX_FRACTION_DIGITS = 3;
protected final static DecimalFormat df = new DecimalFormat();
@Autowired
protected MeasurementManager measurementMgr;
@Autowired
private ExceptionToErrorCodeMapper errorHandler ;
static {
df.setMaximumFractionDigits(MAX_FRACTION_DIGITS);
df.setGroupingUsed(false);
df.setRoundingMode(RoundingMode.HALF_EVEN);
}
public List<Integer> toIds(final List<ID> ids) {
List<Integer> ints = new ArrayList<Integer>(ids.size());
for(ID id:ids) {
ints.add(id.getId());
}
return ints;
}
public Measurement toMeasurement(final org.hyperic.hq.measurement.server.session.Measurement hqMsmt) {
Measurement msmt = new Measurement();
msmt.setInterval(hqMsmt.getInterval());
msmt.setAlias(hqMsmt.getTemplate().getAlias());
msmt.setName(hqMsmt.getTemplate().getName());
return msmt;
}
public Measurement toMeasurementExtendedData(final org.hyperic.hq.measurement.server.session.Measurement hqMsmt, MeasurementTemplate templ) {
Measurement msmt = toMeasurement(hqMsmt);
msmt.setIndicator(templ.isDesignate());
msmt.setEnabled(hqMsmt.isEnabled());
msmt.setId(hqMsmt.getId());
return msmt;
}
public Measurement toMeasurement(final org.hyperic.hq.measurement.server.session.Measurement hqMsmt, double avg) {
Measurement msmt = toMeasurement(hqMsmt);
msmt.setAverage(avg);
return msmt;
}
public RawMetric toMetricWithId(final MetricNotification mn) {
RawMetric metric = new RawMetric();
MetricValue hqMetric = mn.getMetricVal();
metric.setValue(Double.valueOf(df.format(hqMetric.getValue())));
metric.setTimestamp(hqMetric.getTimestamp());
metric.setResourceID(mn.getResourceID());
metric.setMeasurementID(mn.getMeasurementId());
metric.setMeasurementName(mn.getMeasurementName());
metric.setMeasurementType(mn.getMeasurementType());
metric.setCategory(mn.getCategory());
metric.setUnits(mn.getUnits());
return metric;
}
public List<RawMetric> toMetricsWithId(final List<MetricNotification> mns) {
List<RawMetric> metrics = new ArrayList<RawMetric>();
for (MetricNotification mn : mns) {
metrics.add(toMetricWithId(mn));
}
return metrics;
}
public List<Metric> toMetrics(final List<HighLowMetricValue> hqMetrics) {
List<Metric> metrics = new ArrayList<Metric>();
for (HighLowMetricValue hqMetric : hqMetrics) {
Metric metric = new Metric();
metric.setHighValue(Double.valueOf(df.format(hqMetric.getHighValue())));
metric.setLowValue(Double.valueOf(df.format(hqMetric.getLowValue())));
metric.setValue(Double.valueOf(df.format(hqMetric.getValue())));
metric.setTimestamp(hqMetric.getTimestamp());
metrics.add(metric);
}
return metrics;
}
public MetricFilterByResource<ResourceFilteringCondition> toMetricFilterByResource(final ResourceFilterDefinition rscFilterDef) {
if (rscFilterDef==null) {
return null;
}
Set<Integer> resourceIds = rscFilterDef.getResourceIds();
if (resourceIds==null) {
return null;
}
ResourceFilteringCondition cond = new ResourceFilteringCondition(resourceIds);
MetricFilterByResource<ResourceFilteringCondition> filter = new MetricFilterByResource<ResourceFilteringCondition>(this.measurementMgr,cond);
return filter;
}
public MetricFilter<MetricFilteringCondition> toMetricFilter(final MetricFilterDefinition metricFilterDef) {
if (metricFilterDef==null) {
return null;
}
Boolean isIndicator = metricFilterDef.getIsIndicator();
MetricFilteringCondition cond = new MetricFilteringCondition(isIndicator);
MetricFilter<MetricFilteringCondition> filter = new MetricFilter<MetricFilteringCondition>(this.measurementMgr,cond);
return filter;
}
public List<Filter<MetricNotification,? extends FilteringCondition<?>>> toMetricFilters(final MetricFilterRequest metricFilterReq) {
List<Filter<MetricNotification,? extends FilteringCondition<?>>> userFilters = new ArrayList<Filter<MetricNotification,? extends FilteringCondition<?>>>();
ResourceFilterDefinition rscFilterDef = metricFilterReq.getResourceFilterDefinition();
MetricFilterByResource<ResourceFilteringCondition> metricFilterByRsc = toMetricFilterByResource(rscFilterDef);
if (metricFilterByRsc!=null) {
userFilters.add(metricFilterByRsc);
}
MetricFilterDefinition metricFilterDef = metricFilterReq.getMetricFilterDefinition();
MetricFilter<? extends FilteringCondition<org.hyperic.hq.measurement.server.session.Measurement>> metricFilter = toMetricFilter(metricFilterDef);
if (metricFilter!=null) {
userFilters.add(metricFilter);
}
return userFilters;
}
}