de.escidoc.core.sm.business.renderer.VelocityXmlReportDefinitionRenderer.java Source code

Java tutorial

Introduction

Here is the source code for de.escidoc.core.sm.business.renderer.VelocityXmlReportDefinitionRenderer.java

Source

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at license/ESCIDOC.LICENSE
 * or http://www.escidoc.de/license.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at license/ESCIDOC.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2006-2008 Fachinformationszentrum Karlsruhe Gesellschaft
 * fuer wissenschaftlich-technische Information mbH and Max-Planck-
 * Gesellschaft zur Foerderung der Wissenschaft e.V.  
 * All rights reserved.  Use is subject to license terms.
 */
package de.escidoc.core.sm.business.renderer;

import de.escidoc.core.common.business.Constants;
import de.escidoc.core.common.business.filter.RecordPacking;
import de.escidoc.core.common.exceptions.system.SystemException;
import de.escidoc.core.common.util.xml.XmlUtility;
import de.escidoc.core.common.util.xml.factory.ReportDefinitionXmlProvider;
import de.escidoc.core.common.util.xml.factory.XmlTemplateProviderConstants;
import de.escidoc.core.sm.business.persistence.hibernate.ReportDefinition;
import de.escidoc.core.sm.business.persistence.hibernate.ReportDefinitionRole;
import de.escidoc.core.sm.business.renderer.interfaces.ReportDefinitionRendererInterface;
import de.escidoc.core.sm.business.util.comparator.ReportDefinitionRoleComparator;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;

/**
 * ReportDefinition renderer implementation using the velocity template engine.
 *
 * @author Michael Hoppe
 */
@Service("eSciDoc.core.aa.business.renderer.VelocityXmlReportDefinitionRenderer")
public final class VelocityXmlReportDefinitionRenderer implements ReportDefinitionRendererInterface {

    /**
     * Private constructor to prevent initialization.
     */
    private VelocityXmlReportDefinitionRenderer() {
    }

    /**
     * See Interface for functional description.
     *
     */
    @Override
    public String render(final ReportDefinition reportDefinition) throws SystemException {
        final Map<String, Object> values = new HashMap<String, Object>();
        values.put("isRootReportDefinition", XmlTemplateProviderConstants.TRUE);
        addReportDefinitionNamespaceValues(values);
        addReportDefinitionValues(reportDefinition, values);
        return getReportDefinitionXmlProvider().getReportDefinitionXml(values);
    }

    /**
     * Adds the values of the {@link ReportDefinition} to the provided {@link Map}.
     *
     * @param reportDefinition The {@link ReportDefinition}.
     * @param values           The {@link Map} to add the values to.
     * @throws SystemException Thrown in case of an internal error.
     */
    private static void addReportDefinitionValues(final ReportDefinition reportDefinition,
            final Map<String, Object> values) {
        DateTime createDateTime = new DateTime(reportDefinition.getCreationDate());
        createDateTime = createDateTime.withZone(DateTimeZone.UTC);
        final String create = createDateTime.toString(Constants.TIMESTAMP_FORMAT);
        DateTime lmdDateTime = new DateTime(reportDefinition.getLastModificationDate());
        lmdDateTime = lmdDateTime.withZone(DateTimeZone.UTC);
        final String lmd = lmdDateTime.toString(Constants.TIMESTAMP_FORMAT);

        values.put("reportDefinitionCreationDate", create);
        values.put("reportDefinitionCreatedById", reportDefinition.getCreatorId());
        values.put("reportDefinitionCreatedByTitle", "user " + reportDefinition.getCreatorId());
        values.put("reportDefinitionCreatedByHref", XmlUtility.getUserAccountHref(reportDefinition.getCreatorId()));
        values.put("reportDefinitionLastModificationDate", lmd);
        values.put("reportDefinitionModifiedById", reportDefinition.getModifiedById());
        values.put("reportDefinitionModifiedByTitle", "user " + reportDefinition.getModifiedById());
        values.put("reportDefinitionModifiedByHref",
                XmlUtility.getUserAccountHref(reportDefinition.getModifiedById()));
        values.put("reportDefinitionId", reportDefinition.getId());
        values.put("reportDefinitionName", reportDefinition.getName());
        values.put("reportDefinitionHref", XmlUtility.getReportDefinitionHref(reportDefinition.getId()));
        values.put("reportDefinitionScopeId", reportDefinition.getScope().getId());
        values.put("reportDefinitionScopeTitle", reportDefinition.getScope().getName());
        values.put("reportDefinitionScopeHref", XmlUtility.getScopeHref(reportDefinition.getScope().getId()));
        values.put("reportDefinitionSql", reportDefinition.getSql());
        addReportDefinitionRoleValues(reportDefinition.getReportDefinitionRoles(), values);
    }

    /**
     * Adds the values of the {@link ReportDefinitionRole} to the provided {@link Map}.
     *
     * @param reportDefinitionRoles set of reportDefinitionRoles.
     * @param values                The {@link Map} to add the values to.
     */
    private static void addReportDefinitionRoleValues(final Collection<ReportDefinitionRole> reportDefinitionRoles,
            final Map<String, Object> values) {
        if (reportDefinitionRoles != null && !reportDefinitionRoles.isEmpty()) {
            final Collection<HashMap<String, String>> reportDefinitionRolesVm = new ArrayList<HashMap<String, String>>();
            final Collection<ReportDefinitionRole> sortedReportDefinitionRoles = new TreeSet<ReportDefinitionRole>(
                    new ReportDefinitionRoleComparator());
            sortedReportDefinitionRoles.addAll(reportDefinitionRoles);
            for (final ReportDefinitionRole reportDefinitionRole : sortedReportDefinitionRoles) {
                final HashMap<String, String> roleMap = new HashMap<String, String>();
                roleMap.put("id", reportDefinitionRole.getRoleId());
                roleMap.put("title", "role " + reportDefinitionRole.getRoleId());
                roleMap.put("href", XmlUtility.getRoleHref(reportDefinitionRole.getRoleId()));

                reportDefinitionRolesVm.add(roleMap);
            }
            values.put("reportDefinitionRoles", reportDefinitionRolesVm);
        }
    }

    /**
     * See Interface for functional description.
     *
     * @param recordPacking A string to determine how the record should be escaped in the response. Defined values are
     *                      'string' and 'xml'. The default is 'xml'.
     * @see de.escidoc.core.sm.business.renderer.interfaces.ReportDefinitionRendererInterface
     *      #renderReportDefinitions(de.escidoc.core.sm.business.ReportDefinition)
     */
    @Override
    public String renderReportDefinitions(final Collection<ReportDefinition> reportDefinitions,
            final RecordPacking recordPacking) throws SystemException {

        final Map<String, Object> values = new HashMap<String, Object>();

        values.put("isRootReportDefinition", XmlTemplateProviderConstants.FALSE);
        values.put("reportDefinitionListTitle", "Report Definition List");
        values.put("recordPacking", recordPacking);
        addReportDefinitionNamespaceValues(values);
        addReportDefinitionListNamespaceValues(values);

        final List<Map<String, Object>> reportDefinitionsValues;
        if (reportDefinitions != null) {
            reportDefinitionsValues = new ArrayList<Map<String, Object>>(reportDefinitions.size());
            for (final ReportDefinition reportDefinition : reportDefinitions) {
                final Map<String, Object> reportDefinitionValues = new HashMap<String, Object>();
                addReportDefinitionNamespaceValues(reportDefinitionValues);
                addReportDefinitionValues(reportDefinition, reportDefinitionValues);
                reportDefinitionsValues.add(reportDefinitionValues);
            }
        } else {
            reportDefinitionsValues = new ArrayList<Map<String, Object>>();
        }
        values.put("reportDefinitions", reportDefinitionsValues);
        return getReportDefinitionXmlProvider().getReportDefinitionsSrwXml(values);
    }

    /**
     * Adds the report definition name space values.
     *
     * @param values The {@link Map} to that the values shall be added.
     */
    private static void addReportDefinitionNamespaceValues(final Map<String, Object> values) {
        addEscidocBaseUrl(values);
        values.put("reportDefinitionNamespacePrefix", Constants.REPORT_DEFINITION_NS_PREFIX);
        values.put("reportDefinitionNamespace", Constants.REPORT_DEFINITION_NS_URI);
        values.put(XmlTemplateProviderConstants.ESCIDOC_PROPERTIES_NS_PREFIX, Constants.PROPERTIES_NS_PREFIX);
        values.put(XmlTemplateProviderConstants.ESCIDOC_PROPERTIES_NS, Constants.PROPERTIES_NS_URI);
        values.put(XmlTemplateProviderConstants.ESCIDOC_SREL_NS_PREFIX, Constants.STRUCTURAL_RELATIONS_NS_PREFIX);
        values.put(XmlTemplateProviderConstants.ESCIDOC_SREL_NS, Constants.STRUCTURAL_RELATIONS_NS_URI);
    }

    /**
     * Adds the report definition list name space values.
     *
     * @param values The {@link Map} to that the values shall be added.
     */
    private static void addReportDefinitionListNamespaceValues(final Map<String, Object> values) {
        addEscidocBaseUrl(values);
        values.put("searchResultNamespace", Constants.SEARCH_RESULT_NS_URI);
        values.put("reportDefinitionListNamespacePrefix", Constants.REPORT_DEFINITION_LIST_NS_PREFIX);
        values.put("reportDefinitionListNamespace", Constants.REPORT_DEFINITION_LIST_NS_URI);
    }

    /**
     * Adds the escidoc base URL to the provided map.
     *
     * @param values The map to add values to.
     */
    private static void addEscidocBaseUrl(final Map<String, Object> values) {

        values.put(XmlTemplateProviderConstants.VAR_ESCIDOC_BASE_URL, XmlUtility.getEscidocBaseUrl());
    }

    /**
     * Gets the {@code ReportDefinitionXmlProvider} object.
     *
     * @return Returns the {@code ReportDefinitionXmlProvider} object.
     */
    private static ReportDefinitionXmlProvider getReportDefinitionXmlProvider() {

        return ReportDefinitionXmlProvider.getInstance();
    }

}