alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Spring Framework example source code file (JasperReportsMultiFormatView.java)

This example Spring Framework source code file (JasperReportsMultiFormatView.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Spring Framework tags/keywords

abstractjasperreportsview, abstractjasperreportsview, class, default_format_key, http, illegalargumentexception, illegalargumentexception, jasperreportsmultiformatview, map, no, properties, properties, rendering, request, response, servlet, string, string, util

The Spring Framework JasperReportsMultiFormatView.java source code

/*
 * Copyright 2002-2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.servlet.view.jasperreports;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperPrint;

import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationContextException;
import org.springframework.util.ClassUtils;

/**
 * Jasper Reports view class that allows for the actual rendering format to be
 * specified at runtime using a parameter contained in the model.
 *
 * <p>This view works on the concept of a format key and a mapping key.
 * The format key is used to pass the mapping key from your
 * <code>Controller to Spring through as part of the model and the
 * mapping key is used to map a logical format to an actual JasperReports
 * view class. For example you might add the following code to your
 * <code>Controller:
 *
 * <pre>
 * Map model = new HashMap();
 * model.put("format", "pdf");</pre>
 *
 * Here <code>format is the format key and pdf is
 * the mapping key. When rendering a report, this class looks for a
 * model parameter under the format key, which by default is
 * <code>format. It then uses the value of this parameter to lookup
 * the actual <code>View class to use. The default mappings for this
 * lookup are:
 *
 * <p>
    * <li>csv - JasperReportsCsvView * <li>html - JasperReportsHtmlView * <li>pdf - JasperReportsPdfView * <li>xls - JasperReportsXlsView * </ul> * * <p>The format key can be changed using the formatKey * property and the mapping key to view class mappings can be changed using the * <code>formatMappings property. * * @author Rob Harrop * @author Juergen Hoeller * @since 1.1.5 * @see #setFormatKey * @see #setFormatMappings */ public class JasperReportsMultiFormatView extends AbstractJasperReportsView { /** * Default value used for format key: "format" */ public static final String DEFAULT_FORMAT_KEY = "format"; /** * The key of the model parameter that holds the format key. */ private String formatKey = DEFAULT_FORMAT_KEY; /** * Stores the format mappings, with the format discriminator * as key and the corresponding view class as value. */ private Map formatMappings; /** * Stores the mappings of mapping keys to Content-Disposition header values. */ private Properties contentDispositionMappings; /** * Creates a new <code>JasperReportsMultiFormatView instance * with a default set of mappings. */ public JasperReportsMultiFormatView() { this.formatMappings = new HashMap(4); this.formatMappings.put("csv", JasperReportsCsvView.class); this.formatMappings.put("html", JasperReportsHtmlView.class); this.formatMappings.put("pdf", JasperReportsPdfView.class); this.formatMappings.put("xls", JasperReportsXlsView.class); } /** * Set the key of the model parameter that holds the format discriminator. * Default is "format". */ public void setFormatKey(String formatKey) { this.formatKey = formatKey; } /** * Set the mappings of format discriminators to view class names. * The default mappings are: * <p>
      * <li>csv - JasperReportsCsvView * <li>html - JasperReportsHtmlView * <li>pdf - JasperReportsPdfView * <li>xls - JasperReportsXlsView * </ul> */ public void setFormatMappings(Properties mappingsWithClassNames) { if (mappingsWithClassNames == null || mappingsWithClassNames.isEmpty()) { throw new IllegalArgumentException("formatMappings must not be empty"); } this.formatMappings = new HashMap(mappingsWithClassNames.size()); for (Enumeration discriminators = mappingsWithClassNames.propertyNames(); discriminators.hasMoreElements();) { String discriminator = (String) discriminators.nextElement(); String className = mappingsWithClassNames.getProperty(discriminator); try { if (logger.isDebugEnabled()) { logger.debug("Mapped view class [" + className + "] to mapping key [" + discriminator + "]"); } this.formatMappings.put(discriminator, ClassUtils.forName(className)); } catch (ClassNotFoundException ex) { throw new ApplicationContextException( "Class [" + className + "] mapped to format [" + discriminator + "] cannot be found", ex); } } } /** * Set the mappings of <code>Content-Disposition header values to * mapping keys. If specified, Spring will look at these mappings to determine * the value of the <code>Content-Disposition header for a given * format mapping. */ public void setContentDispositionMappings(Properties mappings) { this.contentDispositionMappings = mappings; } /** * Return the mappings of <code>Content-Disposition header values to * mapping keys. Mainly available for configuration through property paths * that specify individual keys. */ public Properties getContentDispositionMappings() { if (this.contentDispositionMappings == null) { this.contentDispositionMappings = new Properties(); } return this.contentDispositionMappings; } protected boolean generatesDownloadContent() { return true; } /** * Locates the format key in the model using the configured discriminator key and uses this * key to lookup the appropriate view class from the mappings. The rendering of the * report is then delegated to an instance of that view class. */ protected void renderReport(JasperPrint populatedReport, Map model, HttpServletResponse response) throws Exception { String format = (String) model.get(this.formatKey); if (format == null) { throw new IllegalArgumentException("No format format found in model"); } if (logger.isDebugEnabled()) { logger.debug("Rendering report using format mapping key [" + format + "]"); } Class viewClass = (Class) this.formatMappings.get(format); if (viewClass == null) { throw new IllegalArgumentException("Format discriminator [" + format + "] is not a configured mapping"); } if (logger.isDebugEnabled()) { logger.debug("Rendering report using view class [" + viewClass.getName() + "]"); } AbstractJasperReportsView view = (AbstractJasperReportsView) BeanUtils.instantiateClass(viewClass); // Copy appropriate properties across. view.setExporterParameters(getExporterParameters()); // Can skip most initialization since all relevant URL processing // has been done - just need to convert parameters on the sub view. view.convertExporterParameters(); // Prepare response and render report. populateContentDispositionIfNecessary(response, format); view.renderReport(populatedReport, model, response); } /** * Adds/overwrites the <code>Content-Disposition header value with the format-specific * value if the mappings have been specified and a valid one exists for the given format. * @param response the <code>HttpServletResponse to set the header in * @param format the format key of the mapping * @see #setContentDispositionMappings */ private void populateContentDispositionIfNecessary(HttpServletResponse response, String format) { if (this.contentDispositionMappings != null) { String header = this.contentDispositionMappings.getProperty(format); if (header != null) { if (logger.isDebugEnabled()) { logger.debug("Setting Content-Disposition header to: [" + header + "]"); } response.setHeader(HEADER_CONTENT_DISPOSITION, header); } } } }

Other Spring Framework examples (source code examples)

Here is a short list of links related to this Spring Framework JasperReportsMultiFormatView.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.