package org.rhq.enterprise.server.rest.reporting; import java.io.IOException; import java.io.OutputStream; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.interceptor.Interceptors; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.StreamingOutput; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.criteria.Criteria; import org.rhq.core.domain.measurement.composite.MeasurementOOBComposite; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.measurement.MeasurementOOBManagerLocal; import org.rhq.enterprise.server.rest.AbstractRestBean; import org.rhq.enterprise.server.rest.ReportsInterceptor; import org.rhq.enterprise.server.util.CriteriaQuery; import org.rhq.enterprise.server.util.CriteriaQueryExecutor; import static org.rhq.enterprise.server.rest.reporting.ReportFormatHelper.parseAncestry; @Interceptors(ReportsInterceptor.class) @Stateless public class SuspectMetricHandler extends AbstractRestBean implements SuspectMetricLocal { private final Log log = LogFactory.getLog(SuspectMetricHandler.class); @EJB private MeasurementOOBManagerLocal measurementOOBMManager; public StreamingOutput suspectMetricsInternal(HttpServletRequest request, Subject user) { this.caller = user; return suspectMetrics(request); } @Override public StreamingOutput suspectMetrics(HttpServletRequest request) { if (log.isDebugEnabled()) { log.debug("Received request to generate report for " + caller); } return new StreamingOutput() { @Override public void write(OutputStream output) throws IOException, WebApplicationException { Criteria criteria = new Criteria() { @Override public Class<?> getPersistentClass() { return MeasurementOOBComposite.class; } }; criteria.setPaging(0, 5); CriteriaQueryExecutor<MeasurementOOBComposite, Criteria> queryExecutor = new CriteriaQueryExecutor<MeasurementOOBComposite, Criteria>() { @Override public PageList<MeasurementOOBComposite> execute(Criteria criteria) { return measurementOOBMManager.getSchedulesWithOOBs(caller, null, null, null, new PageControl(criteria.getPageNumber(), criteria.getPageSize())); } }; CriteriaQuery<MeasurementOOBComposite, Criteria> query = new CriteriaQuery<MeasurementOOBComposite, Criteria>(criteria, queryExecutor); CsvWriter<MeasurementOOBComposite> csvWriter = new CsvWriter<MeasurementOOBComposite>(); csvWriter.setColumns("resourceName", "ancestry", "scheduleName", "formattedBaseband", "formattedOutlier", "factor"); csvWriter.setPropertyConverter("ancestry", new PropertyConverter<MeasurementOOBComposite>() { @Override public Object convert(MeasurementOOBComposite composite, String propertyName) { return parseAncestry(composite.getResourceAncestry()); } }); output.write((getHeader() + "\n").getBytes()); for (MeasurementOOBComposite composite : query) { applyFormatting(composite); formatBaseband(composite); csvWriter.write(composite, output); } } }; } private String getHeader() { return "Resource,Ancestry,Metric,Band,Outlier,Out of Range Factor (%)"; } private void applyFormatting(MeasurementOOBComposite oob) { oob.setFormattedOutlier(MeasurementConverter.format(oob.getOutlier(), oob.getUnits(), true)); formatBaseband(oob); } private void formatBaseband(MeasurementOOBComposite oob) { String min = MeasurementConverter.format(oob.getBlMin(), oob.getUnits(), true); String max = MeasurementConverter.format(oob.getBlMax(), oob.getUnits(), true); oob.setFormattedBaseband(min + " " + max); } }