modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/ReportExporter.java | 15 - modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/inventory/InventorySummaryReportTable.java | 18 - modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/StringUtility.java | 35 ++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceHandler.java | 21 - modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceLocal.java | 6 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryHandler.java | 137 ++++++---- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryLocal.java | 6 7 files changed, 157 insertions(+), 81 deletions(-)
New commits: commit 7289e4201d26a649df9643aa5580bcbf36f167b1 Author: John Sanda jsanda@redhat.com Date: Fri Mar 30 12:00:24 2012 -0400
[BZ 800453] Refactoring logic for including details
The requirements for the inventory summary and drift compliance reports have changed a bit. This commit makes those changes. All of the resource type rows are always included now. If one or more resource type ids are specified, then the resource details for the types will be included in the report as well. If the showAllDetails param is true, then all resource details for all types will be included.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/ReportExporter.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/ReportExporter.java index 4ed3c5c..d0ff226 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/ReportExporter.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/ReportExporter.java @@ -20,13 +20,15 @@ */ package org.rhq.enterprise.gui.coregui.client.components;
+import java.util.Set; + import com.google.gwt.core.client.GWT; import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Window; + import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.Messages; - -import java.util.Set; +import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
/** * Exporter for building urls to reports (csv). @@ -124,9 +126,12 @@ public class ReportExporter { public String determineUrl() { StringBuilder queryString = new StringBuilder();
-// if (showAllDetail) { -// queryString.append("details=").append(form.getValueAsString(DETAILS_FIELD)); -// } + if (showAllDetail) { + queryString.append("showAllDetails=").append("true"); + } else if (!resourceTypeIds.isEmpty()) { + queryString.append("resourceTypeId=").append(StringUtility.toString(resourceTypeIds)); + } + if(!isEmpty(operationRequestStatuses)){ StringBuilder operationRequestStatusBuffer = new StringBuilder(); for (String operationRequestStatus : operationRequestStatuses) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/inventory/InventorySummaryReportTable.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/inventory/InventorySummaryReportTable.java index bbd00de..a2dfa5a 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/inventory/InventorySummaryReportTable.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/inventory/InventorySummaryReportTable.java @@ -21,6 +21,10 @@
package org.rhq.enterprise.gui.coregui.client.report.inventory;
+import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + import com.smartgwt.client.types.ListGridEditEvent; import com.smartgwt.client.types.ListGridFieldType; import com.smartgwt.client.widgets.events.DoubleClickEvent; @@ -28,7 +32,12 @@ import com.smartgwt.client.widgets.events.DoubleClickHandler; import com.smartgwt.client.widgets.form.fields.CheckboxItem; import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; -import com.smartgwt.client.widgets.grid.*; +import com.smartgwt.client.widgets.grid.CellFormatter; +import com.smartgwt.client.widgets.grid.HoverCustomizer; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; + import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.ImageManager; @@ -37,10 +46,6 @@ import org.rhq.enterprise.gui.coregui.client.components.table.Table; import org.rhq.enterprise.gui.coregui.client.components.table.TableAction; import org.rhq.enterprise.gui.coregui.client.report.ExportChangeHandler;
-import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - /** * @author jsanda */ @@ -188,7 +193,8 @@ public class InventorySummaryReportTable extends Table<InventorySummaryDataSourc
@Override public void executeAction(ListGridRecord[] selection, Object actionValue) { - ReportExporter exportModalWindow = ReportExporter.createExporterForInventorySummary(getReportNameForDownloadURL(), exportAll, exportChangeHandler.getResourceTypeIds()); + ReportExporter exportModalWindow = ReportExporter.createExporterForInventorySummary( + getReportNameForDownloadURL(), exportAll, exportChangeHandler.getResourceTypeIds()); exportModalWindow.export(); refreshTableInfo(); } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceHandler.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceHandler.java index e795cf5..23ce85c 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceHandler.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceHandler.java @@ -18,9 +18,7 @@ */ package org.rhq.enterprise.server.rest.reporting;
-import java.util.Collections; import java.util.List; -import java.util.Map;
import javax.ejb.Stateless; import javax.interceptor.Interceptors; @@ -41,12 +39,9 @@ import org.rhq.enterprise.server.rest.SetCallerInterceptor; public class DriftComplianceHandler extends InventorySummaryHandler implements DriftComplianceLocal {
@Override - public StreamingOutput generateReport(UriInfo uriInfo, Request request, HttpHeaders headers, boolean includeDetails, - List<Integer> resourceTypeIds) { - // We pass an empty list here for the resourceTypeIds param because this report - // not support the typeId query para. - List<Integer> ids = Collections.emptyList(); - return super.generateReport(uriInfo, request, headers, includeDetails, ids); + public StreamingOutput generateReport(UriInfo uriInfo, Request request, HttpHeaders headers, boolean showAllDetails, + String resourceTypeIds) { + return super.generateReport(uriInfo, request, headers, showAllDetails, ""); }
@Override @@ -55,10 +50,9 @@ public class DriftComplianceHandler extends InventorySummaryHandler implements D }
@Override - protected ResourceCriteria getDetailsQueryCriteria(Map <Integer, ResourceInstallCount> installCounts) { - ResourceCriteria criteria = super.getDetailsQueryCriteria(installCounts); + protected ResourceCriteria getDetailsQueryCriteria(Integer resourceTypeId) { + ResourceCriteria criteria = super.getDetailsQueryCriteria(resourceTypeId); criteria.fetchDriftDefinitions(true); - criteria.addFilterResourceTypeIds(installCounts.keySet().toArray(new Integer[installCounts.size()])); return criteria; }
@@ -68,6 +62,11 @@ public class DriftComplianceHandler extends InventorySummaryHandler implements D }
@Override + protected String getDetailsHeader() { + return super.getDetailsHeader() + ",In Compliance?"; + } + + @Override protected String toCSV(ResourceInstallCount installCount) { return super.toCSV(installCount) + "," + installCount.isInCompliance(); } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceLocal.java index b6ea4cc..013e768 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/DriftComplianceLocal.java @@ -18,8 +18,6 @@ */ package org.rhq.enterprise.server.rest.reporting;
-import java.util.List; - import javax.ejb.Local; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; @@ -43,7 +41,7 @@ public interface DriftComplianceLocal { @Context UriInfo uriInfo, @Context Request request, @Context HttpHeaders headers, - @QueryParam("details") @DefaultValue("false") boolean includeDetails, - @QueryParam("resourceTypes") List<Integer> resourceTypeIds); + @QueryParam("showAllDetails") @DefaultValue("false") boolean includeDetails, + @QueryParam("resourceTypeId") String resourceTypeId);
} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryHandler.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryHandler.java index 55ee582..1531b0c 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryHandler.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryHandler.java @@ -18,6 +18,28 @@ */ package org.rhq.enterprise.server.rest.reporting;
+import java.io.IOException; +import java.io.OutputStream; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +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.MediaType; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.StreamingOutput; +import javax.ws.rs.core.UriInfo; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; + import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.composite.ResourceInstallCount; @@ -28,18 +50,6 @@ 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.WebApplicationException; -import javax.ws.rs.core.*; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import java.io.IOException; -import java.io.OutputStream; -import java.util.*; - import static org.rhq.core.domain.resource.InventoryStatus.COMMITTED; import static org.rhq.core.domain.util.PageOrdering.ASC;
@@ -51,13 +61,16 @@ public class InventorySummaryHandler extends AbstractRestBean implements Invento protected ResourceManagerLocal resourceMgr;
@Override - public StreamingOutput generateReport(UriInfo uriInfo, Request request, HttpHeaders headers, boolean includeDetails, - final List<Integer> resourceTypeIds) { + public StreamingOutput generateReport(UriInfo uriInfo, Request request, HttpHeaders headers, + boolean showAllDetails, final String resourceTypeIds) { final List<ResourceInstallCount> results = getSummaryCounts(); final MediaType mediaType = headers.getAcceptableMediaTypes().get(0);
- if (includeDetails) { - return new OutputDetailedInventorySummary(results, new TreeSet<Integer>(resourceTypeIds)); + if (showAllDetails) { + Set<Integer> ids = Collections.emptySet(); + return new OutputDetailedInventorySummary(results, ids); + } else if (resourceTypeIds != null) { + return new OutputDetailedInventorySummary(results, parseIds(resourceTypeIds)); } else { return new StreamingOutput() { @Override @@ -79,20 +92,9 @@ public class InventorySummaryHandler extends AbstractRestBean implements Invento } } else if (mediaType.toString().equals("text/csv")) { stream.write((getHeader() + "\n").getBytes()); - - if (resourceTypeIds.isEmpty()) { - for (ResourceInstallCount installCount : results) { - String record = toCSV(installCount) + "\n"; - stream.write(record.getBytes()); - } - } else { - Set<Integer> ids = new TreeSet<Integer>(resourceTypeIds); - for (ResourceInstallCount installCount : results) { - if (ids.contains(installCount.getTypeId())) { - String record = toCSV(installCount) + "\n"; - stream.write(record.getBytes()); - } - } + for (ResourceInstallCount installCount : results) { + String record = toCSV(installCount) + "\n"; + stream.write(record.getBytes()); } } } @@ -100,56 +102,88 @@ public class InventorySummaryHandler extends AbstractRestBean implements Invento } }
+ private Set<Integer> parseIds(String resourceTypeIdParam) { + Set<Integer> ids = new TreeSet<Integer>(); + for (String id : resourceTypeIdParam.split(",")) { + ids.add(Integer.parseInt(id)); + } + return ids; + } + private class OutputDetailedInventorySummary implements StreamingOutput {
// map of counts keyed by resource type id - private Map<Integer, ResourceInstallCount> installCounts = new HashMap<Integer, ResourceInstallCount>(); + private Map<Integer, ResourceInstallCount> installCounts = new LinkedHashMap<Integer, ResourceInstallCount>();
private Set<Integer> resourceTypeIds;
- public OutputDetailedInventorySummary(List<ResourceInstallCount> installCountList, + public OutputDetailedInventorySummary(List<ResourceInstallCount> installCounts, Set<Integer> resourceTypeIds) { this.resourceTypeIds = resourceTypeIds; - for (ResourceInstallCount installCount : installCountList) { - installCounts.put(installCount.getTypeId(), installCount); + for (ResourceInstallCount installCount : installCounts) { + this.installCounts.put(installCount.getTypeId(), installCount); } }
@Override public void write(OutputStream output) throws IOException, WebApplicationException { - final ResourceCriteria criteria = getDetailsQueryCriteria(installCounts); - if (!resourceTypeIds.isEmpty()) { - criteria.addFilterResourceTypeIds(resourceTypeIds.toArray(new Integer[resourceTypeIds.size()])); - } + ResourceCriteria criteria; + CriteriaQueryExecutor<Resource, ResourceCriteria> queryExecutor; + CriteriaQuery<Resource, ResourceCriteria> query; + + output.write((getHeader() + "," + getDetailsHeader() + "\n").getBytes());
- CriteriaQueryExecutor<Resource, ResourceCriteria> queryExecutor = - new CriteriaQueryExecutor<Resource, ResourceCriteria>() { + // if there are no resource type ids, that means we fetching everything - all + // details for all types. + if (resourceTypeIds.isEmpty()) { + criteria = getDetailsQueryCriteria(null); + queryExecutor = new CriteriaQueryExecutor<Resource, ResourceCriteria>() { @Override public PageList<Resource> execute(ResourceCriteria criteria) { return resourceMgr.findResourcesByCriteria(caller, criteria); } }; - - CriteriaQuery<Resource, ResourceCriteria> query = - new CriteriaQuery<Resource, ResourceCriteria>(criteria, queryExecutor); - output.write((getHeader() + "\n").getBytes()); - for (Resource resource : query) { - ResourceInstallCount installCount = installCounts.get(resource.getResourceType().getId()); - if (installCount != null) { + query = new CriteriaQuery<Resource, ResourceCriteria>(criteria, queryExecutor); + for (Resource resource : query) { + ResourceInstallCount installCount = installCounts.get(resource.getResourceType().getId()); String record = toCSV(installCount) + "," + toCSV(resource) + "\n"; output.write(record.getBytes()); } + } else { + for (ResourceInstallCount installCount : installCounts.values()) { + if (resourceTypeIds.contains(installCount.getTypeId())) { + criteria = getDetailsQueryCriteria(installCount.getTypeId()); + queryExecutor = new CriteriaQueryExecutor<Resource, ResourceCriteria>() { + @Override + public PageList<Resource> execute(ResourceCriteria criteria) { + return resourceMgr.findResourcesByCriteria(caller, criteria); + } + }; + query = new CriteriaQuery<Resource, ResourceCriteria>(criteria, queryExecutor); + for (Resource resource : query) { + String record = toCSV(installCount) + "," + toCSV(resource) + "\n"; + output.write(record.getBytes()); + } + } else { + String record = toCSV(installCount) + ",,,,,,,\n"; + output.write(record.getBytes()); + } + } } } }
- protected ResourceCriteria getDetailsQueryCriteria(Map<Integer, ResourceInstallCount> installCounts) { + protected ResourceCriteria getDetailsQueryCriteria(Integer resourceTypeId) { ResourceCriteria criteria = new ResourceCriteria(); criteria.addFilterInventoryStatus(COMMITTED); criteria.addSortResourceCategory(ASC); criteria.addSortPluginName(ASC); criteria.addSortResourceTypeName(ASC);
+ if (resourceTypeId != null) { + criteria.addFilterResourceTypeId(resourceTypeId); + } + return criteria; }
@@ -162,6 +196,10 @@ public class InventorySummaryHandler extends AbstractRestBean implements Invento return "Resource Type,Plugin,Category,Version,Count"; }
+ protected String getDetailsHeader() { + return "Name,Ancestry,Description,Type,Version,Availability"; + } + protected String toCSV(ResourceInstallCount installCount) { return installCount.getTypeName() + "," + installCount.getTypePlugin() + "," + installCount.getCategory().getDisplayName() + "," + installCount.getVersion() + "," + @@ -169,8 +207,9 @@ public class InventorySummaryHandler extends AbstractRestBean implements Invento }
protected String toCSV(Resource resource) { - return resource.getName() + "," + ReportFormatHelper.parseAncestry(resource.getAncestry()) + "," + + return resource.getName() + "," + ReportHelper.parseAncestry(resource.getAncestry()) + "," + resource.getDescription() + "," + resource.getResourceType().getName() + "," + resource.getVersion() + "," + resource.getCurrentAvailability().getAvailabilityType(); } + } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryLocal.java index b2c7190..882251b 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/reporting/InventorySummaryLocal.java @@ -18,8 +18,6 @@ */ package org.rhq.enterprise.server.rest.reporting;
-import java.util.List; - import javax.ejb.Local; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; @@ -43,7 +41,7 @@ public interface InventorySummaryLocal { @Context UriInfo uriInfo, @Context Request request, @Context HttpHeaders headers, - @QueryParam("details") @DefaultValue("false") boolean includeDetails, - @QueryParam("typeId") List<Integer> resourceTypeIds); + @QueryParam("showAllDetails") @DefaultValue("false") boolean includeDetails, + @QueryParam("resourceTypeId") String resourceTypeId);
}
commit c8a13b163d27b2a1f40d6c5b177bda3d7c1fdada Author: John Sanda jsanda@redhat.com Date: Thu Mar 29 22:02:18 2012 -0400
[BZ 800453] Adding string util methods for converting query params
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/StringUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/StringUtility.java index 97cfe47..2959af6 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/StringUtility.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/StringUtility.java @@ -19,11 +19,12 @@ */ package org.rhq.enterprise.gui.coregui.client.util;
-import com.google.gwt.safehtml.shared.SimpleHtmlSanitizer; - import java.util.ArrayList; +import java.util.Collection; import java.util.List;
+import com.google.gwt.safehtml.shared.SimpleHtmlSanitizer; + /** * A collection of utility methods for working with Strings. * @@ -52,6 +53,36 @@ public class StringUtility { return res; }
+ /** + * Converts the collection into a comma-delimited list, Use + * {@link #toString(Collection, String)} if you need a different delimiter. + * + * @param collection The collection to convert to a String + * @param <T> The type of elements in the collection + * @return A comma-delimited list as a String + */ + public static <T> String toString(Collection<T> collection) { + return toString(collection, ","); + } + + /** + * Converts the collection into a delimited list with the specified delimiter. + * + * @param collection The collection to convert to a String + * @param delimiter The delimiter to use + * @param <T> The type of elements in the collection + * @return A delimited list as a String + */ + public static <T> String toString(Collection<T> collection, String delimiter) { + StringBuilder builder = new StringBuilder(); + for (T obj : collection) { + builder.append(obj).append(delimiter); + } + builder.delete(builder.length() - delimiter.length(), builder.length()); + + return builder.toString(); + } + // TODO: I18N. The logic here may need to be pluggable for different localizations. public static String pluralize(String singularNoun) { String pluralNoun;