modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/ReportFormatHelper.java
| 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricHandler.java
| 165 ++++++----
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricLocal.java
| 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
| 36 +-
4 files changed, 137 insertions(+), 72 deletions(-)
New commits:
commit 288cd69dbefd4a55e748df82e583742d315f3292
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 30 15:17:39 2012 -0400
[BZ 800453] convert suspect metrics report to streaming response
This commit also fixes the band and outlier fields that previously
displayed null for each row.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/ReportFormatHelper.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/ReportFormatHelper.java
index 9e0f533..03ce6c9 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/ReportFormatHelper.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/ReportFormatHelper.java
@@ -20,11 +20,11 @@
*/
package org.rhq.enterprise.server.rest.reporting;
-import org.rhq.core.domain.resource.Resource;
-
import java.text.DateFormat;
import java.util.Date;
+import org.rhq.core.domain.resource.Resource;
+
/**
* Formatting tools for rest reporting.
*/
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricHandler.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricHandler.java
index c2b4726..21327ee 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricHandler.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricHandler.java
@@ -1,22 +1,32 @@
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.ws.rs.WebApplicationException;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
+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.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementOOBManagerLocal;
import org.rhq.enterprise.server.rest.AbstractRestBean;
import org.rhq.enterprise.server.rest.SetCallerInterceptor;
+import org.rhq.enterprise.server.util.CriteriaQuery;
+import org.rhq.enterprise.server.util.CriteriaQueryExecutor;
-import javax.ejb.EJB;
-import javax.ejb.Stateless;
-import javax.interceptor.Interceptors;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
+import static org.rhq.enterprise.server.rest.reporting.ReportFormatHelper.cleanForCSV;
+import static org.rhq.enterprise.server.rest.reporting.ReportFormatHelper.parseAncestry;
@Interceptors(SetCallerInterceptor.class)
@Stateless
@@ -27,55 +37,108 @@ public class SuspectMetricHandler extends AbstractRestBean implements
SuspectMet
@EJB
private MeasurementOOBManagerLocal measurementOOBMManager;
- @EJB
- private SubjectManagerLocal subjectMgr;
-
@Override
- public Response suspectMetrics(UriInfo uriInfo, javax.ws.rs.core.Request request,
HttpHeaders headers ) {
- StringBuilder sb;
- log.info(" ** Suspect Metric History REST invocation");
-
- PageControl pageControl = new PageControl(0, 200); // not sure what the paging
size should be?
- PageList<MeasurementOOBComposite> comps =
measurementOOBMManager.getSchedulesWithOOBs(caller, null, null, null, pageControl);
- log.info(" Found MeasurementOOBComposite records: " + comps.size());
- Response.ResponseBuilder builder =
Response.status(Response.Status.NOT_ACCEPTABLE); // default error response
- MediaType mediaType = headers.getAcceptableMediaTypes().get(0);
- log.debug(" Suspect Metric media type: "+mediaType.toString());
- if (mediaType.equals(MediaType.APPLICATION_XML_TYPE)) {
- builder = Response.ok(comps.getValues(), mediaType);
-
- } else if (mediaType.toString().equals("text/csv")) {
- // CSV version
- log.info("text/csv Suspect handler for REST");
- sb = new StringBuilder("Id,Name,ResourceTypeId,\n"); // set title
row
- if(!comps.isEmpty()){
- for (MeasurementOOBComposite oobComposite : comps) {
- sb.append( oobComposite.getResourceName());
- sb.append(",");
-
sb.append(ReportFormatHelper.parseAncestry(oobComposite.getResourceAncestry()));
- sb.append(",");
- sb.append( oobComposite.getUnits()); // Metric
- sb.append(",");
- sb.append( oobComposite.getFormattedBaseband());
- sb.append(",");
- sb.append( oobComposite.getOutlier());
- sb.append(",");
- sb.append( oobComposite.getFactor());
- sb.append("\n");
+ public StreamingOutput suspectMetrics(UriInfo uriInfo, Request request, HttpHeaders
headers ) {
+// StringBuilder sb;
+// log.info(" ** Suspect Metric History REST invocation");
+//
+// PageControl pageControl = new PageControl(0, 200); // not sure what the paging
size should be?
+// PageList<MeasurementOOBComposite> comps =
measurementOOBMManager.getSchedulesWithOOBs(caller, null, null, null, pageControl);
+// log.info(" Found MeasurementOOBComposite records: " + comps.size());
+// Response.ResponseBuilder builder =
Response.status(Response.Status.NOT_ACCEPTABLE); // default error response
+// MediaType mediaType = headers.getAcceptableMediaTypes().get(0);
+// log.debug(" Suspect Metric media type: "+mediaType.toString());
+// if (mediaType.equals(MediaType.APPLICATION_XML_TYPE)) {
+// builder = Response.ok(comps.getValues(), mediaType);
+//
+// } else if (mediaType.toString().equals("text/csv")) {
+// // CSV version
+// log.info("text/csv Suspect handler for REST");
+// sb = new StringBuilder("Id,Name,ResourceTypeId,\n"); // set title
row
+// if(!comps.isEmpty()){
+// for (MeasurementOOBComposite oobComposite : comps) {
+// sb.append( oobComposite.getResourceName());
+// sb.append(",");
+//
sb.append(ReportFormatHelper.parseAncestry(oobComposite.getResourceAncestry()));
+// sb.append(",");
+// sb.append( oobComposite.getUnits()); // Metric
+// sb.append(",");
+// sb.append( oobComposite.getFormattedBaseband());
+// sb.append(",");
+// sb.append( oobComposite.getOutlier());
+// sb.append(",");
+// sb.append( oobComposite.getFactor());
+// sb.append("\n");
+// }
+// } else {
+// //empty
+// sb.append("No Data Available");
+// }
+// builder = Response.ok(sb.toString(), mediaType);
+//
+// } else {
+// log.debug("Unknown Media Type: "+ mediaType.toString());
+// builder = Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE);
+//
+// }
+// return builder.build();
+
+ return new StreamingOutput() {
+ @Override
+ public void write(OutputStream output) throws IOException,
WebApplicationException {
+ PageControl pageControl = new PageControl(0, 5);
+ 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);
+
+ output.write((getHeader() + "\n").getBytes());
+ for (MeasurementOOBComposite composite : query) {
+ applyFormatting(composite);
+ formatBaseband(composite);
+ String record = toCSV(composite) + "\n";
+ output.write(record.getBytes());
}
- } else {
- //empty
- sb.append("No Data Available");
}
- builder = Response.ok(sb.toString(), mediaType);
+ };
+ }
- } else {
- log.debug("Unknown Media Type: "+ mediaType.toString());
- builder = Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE);
+ private String getHeader() {
+ return "Resource,Ancestry,Metric,Band,Outlier,Out of Range Factor
(%)";
+ }
- }
- return builder.build();
+ private String toCSV(MeasurementOOBComposite composite) {
+ return cleanForCSV(composite.getResourceName()) + "," +
+ cleanForCSV(parseAncestry(composite.getResourceAncestry())) + ","
+
+ cleanForCSV(composite.getScheduleName()) + "," +
+ cleanForCSV(composite.getFormattedBaseband()) + "," +
+ cleanForCSV(composite.getFormattedOutlier()) + "," +
+ composite.getFactor();
}
+ 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);
+ }
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricLocal.java
index ed284b3..3e283b0 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/SuspectMetricLocal.java
@@ -10,8 +10,8 @@ public interface SuspectMetricLocal {
@GET
@Path("/")
- @Produces({"text/csv", "application/xml"})
- Response suspectMetrics(
+ @Produces("text/csv")
+ StreamingOutput suspectMetrics(
@Context UriInfo uriInfo,
@Context Request request,
@Context HttpHeaders headers);
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
index c353571..be5b5a3 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
@@ -1,30 +1,32 @@
/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 Red Hat, Inc.
- * All rights reserved.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
+ * * RHQ Management Platform
+ * * Copyright (C) 2005-2012 Red Hat, Inc.
+ * * All rights reserved.
+ * *
+ * * This program is free software; you can redistribute it and/or modify
+ * * it under the terms of the GNU General Public License as published by
+ * * the Free Software Foundation version 2 of the License.
+ * *
+ * * This program is distributed in the hope that it will be useful,
+ * * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * * GNU General Public License for more details.
+ * *
+ * * You should have received a copy of the GNU General Public License
+ * * along with this program; if not, write to the Free Software
+ * * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.util;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
import org.rhq.core.domain.criteria.BaseCriteria;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
public class CriteriaQuery<T, C extends BaseCriteria> implements Iterable<T>
{
private C criteria;