org.rhq.enterprise.server.rest.reporting.InventorySummaryHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.rhq.enterprise.server.rest.reporting.InventorySummaryHandler.java

Source

/*
 * 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.
 */
package org.rhq.enterprise.server.rest.reporting;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

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.ResourceCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.composite.ResourceInstallCount;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
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.core.domain.resource.InventoryStatus.COMMITTED;
import static org.rhq.core.domain.util.PageOrdering.ASC;

@Interceptors(ReportsInterceptor.class)
@Stateless
public class InventorySummaryHandler extends AbstractRestBean implements InventorySummaryLocal {

    private final Log log = LogFactory.getLog(getClass());

    @EJB
    protected ResourceManagerLocal resourceMgr;

    public StreamingOutput generateReportInternal(HttpServletRequest request, String resourceTypeId, String version,
            Subject user) {
        this.caller = user;

        return generateReport(request, resourceTypeId, version);
    }

    @Override
    public StreamingOutput generateReport(final HttpServletRequest request, final String resourceTypeId,
            final String version) {

        if (log.isDebugEnabled()) {
            log.debug("Received request to generate " + getDebugReportName() + " report for " + caller);
        }

        final List<ResourceInstallCount> results = getSummaryCounts();

        if (StringUtil.isEmpty(resourceTypeId)) {
            // output only resource types
            return new StreamingOutput() {
                @Override
                public void write(OutputStream stream) throws IOException, WebApplicationException {
                    if (log.isDebugEnabled()) {
                        log.debug("Generating inventory summary CSV report for resource types.");
                    }
                    CsvWriter<ResourceInstallCount> csvWriter = new CsvWriter<ResourceInstallCount>();
                    List<String> columns = getColumns();
                    csvWriter.setColumns(columns.toArray(new String[columns.size()]));

                    stream.write((getHeader() + "\n").getBytes());
                    for (ResourceInstallCount installCount : results) {
                        csvWriter.write(installCount, stream);
                    }
                }
            };
        } else {
            // output resource details for specified type and version
            return new StreamingOutput() {
                @Override
                public void write(OutputStream stream) throws IOException, WebApplicationException {
                    if (log.isDebugEnabled()) {
                        log.debug("Generating detailed inventory summary CSV report for [resourceTypeId: "
                                + resourceTypeId + ", version: " + version + "]");
                    }
                    ResourceCriteria criteria = getDetailsQueryCriteria(Integer.parseInt(resourceTypeId), version);

                    CriteriaQueryExecutor<Resource, ResourceCriteria> 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);

                    CsvWriter<Resource> csvWriter = new CsvWriter<Resource>();
                    List<String> columns = getDetailsColumns();
                    csvWriter.setColumns(columns.toArray(new String[columns.size()]));

                    Map<String, PropertyConverter<Resource>> propertyConverters = getPropertyConverters(request);
                    for (String property : propertyConverters.keySet()) {
                        csvWriter.setPropertyConverter(property, propertyConverters.get(property));
                    }

                    stream.write((getDetailsHeader() + "\n").getBytes());
                    for (Resource resource : query) {
                        csvWriter.write(resource, stream);
                    }
                }
            };
        }
    }

    protected String getDebugReportName() {
        return "inventory summary";
    }

    protected List<String> getColumns() {
        List<String> columns = new ArrayList<String>(20);
        Collections.addAll(columns, "typeName", "typePlugin", "category.displayName", "version", "count");
        return columns;
    }

    protected List<String> getDetailsColumns() {
        List<String> columns = new ArrayList<String>(10);
        Collections.addAll(columns, "resourceType.name", "resourceType.plugin", "resourceType.category.displayName",
                "version", "name", "ancestry", "description", "currentAvailability.availabilityType", "detailsURL");
        return columns;
    }

    protected ResourceCriteria getDetailsQueryCriteria(Integer resourceTypeId, String version) {
        ResourceCriteria criteria = new ResourceCriteria();
        criteria.addFilterResourceTypeId(resourceTypeId);
        criteria.addFilterVersion(version);
        criteria.addFilterInventoryStatus(COMMITTED);
        criteria.addSortResourceCategory(ASC);
        criteria.addSortPluginName(ASC);
        criteria.addSortResourceTypeName(ASC);

        return criteria;
    }

    protected List<ResourceInstallCount> getSummaryCounts() {
        // TODO add support for filtering by resource type id in query
        return resourceMgr.findResourceInstallCounts(caller, true);
    }

    protected String getHeader() {
        return "Resource Type,Plugin,Category,Version,Count";
    }

    protected String getDetailsHeader() {
        return "Resource Type,Plugin,Category,Version,Name,Ancestry,Description,Availability,Details URL";
    }

    protected LinkedHashMap<String, PropertyConverter<Resource>> getPropertyConverters(
            final HttpServletRequest request) {
        LinkedHashMap<String, PropertyConverter<Resource>> propertyConverters = new LinkedHashMap<String, PropertyConverter<Resource>>();
        propertyConverters.put("ancestry", new PropertyConverter<Resource>() {
            @Override
            public Object convert(Resource resource, String propertyName) {
                return ReportFormatHelper.parseAncestry(resource.getAncestry());
            }
        });

        propertyConverters.put("detailsURL", new PropertyConverter<Resource>() {
            @Override
            public Object convert(Resource resource, String propertyName) {
                return getDetailsURL(resource, request);
            }
        });

        return propertyConverters;
    }

    private String getDetailsURL(Resource resource, HttpServletRequest request) {
        String protocol;
        if (request.isSecure()) {
            protocol = "https";
        } else {
            protocol = "http";
        }

        return protocol + "://" + request.getServerName() + ":" + request.getServerPort() + "/coregui/#Resource/"
                + resource.getId();
    }
}