/*
* $Id: JasperReportsResult.java 767507 2009-04-22 13:09:32Z hermanns $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.struts2.views.jasperreports;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
import java.sql.Connection;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRCsvExporter;
import net.sf.jasperreports.engine.export.JRCsvExporterParameter;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXmlExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import org.apache.commons.lang.xwork.StringUtils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
/**
* <!-- START SNIPPET: description -->
* <p/>
* Generates a JasperReports report using the specified format or PDF if no
* format is specified.
* <p/>
* <!-- END SNIPPET: description -->
* <p />
* <b>This result type takes the following parameters:</b>
* <p/>
* <!-- START SNIPPET: params -->
* <p/>
* <ul>
* <p/>
* <li><b>location (default)</b> - the location where the compiled jasper report
* definition is (foo.jasper), relative from current URL.</li>
* <p/>
* <li><b>dataSource (required)</b> - the EL expression used to retrieve the
* datasource from the value stack (usually a List).</li>
* <p/>
* <li><b>parse</b> - true by default. If set to false, the location param will
* not be parsed for EL expressions.</li>
* <p/>
* <li><b>format</b> - the format in which the report should be generated. Valid
* values can be found in {@link JasperReportConstants}. If no format is
* specified, PDF will be used.</li>
* <p/>
* <li><b>contentDisposition</b> - disposition (defaults to "inline", values are
* typically <i>filename="document.pdf"</i>).</li>
* <p/>
* <li><b>documentName</b> - name of the document (will generate the http header
* <code>Content-disposition = X; filename=X.[format]</code>).</li>
* <p/>
* <li><b>delimiter</b> - the delimiter used when generating CSV reports. By
* default, the character used is ",".</li>
* <p/>
* <li><b>imageServletUrl</b> - name of the url that, when prefixed with the
* context page, can return report images.</li>
* <p/>
* <li>
* <b>reportParameters</b> - (2.1.2+) OGNL expression used to retrieve a map of
* report parameters from the value stack. The parameters may be accessed in the
* report via the usual JR mechanism and might include data not part of the
* dataSource, such as the user name of the report creator, etc.</li>
* <p/>
* <li>
* <b>exportParameters</b> - (2.1.2+) OGNL expression used to retrieve a map of
* JR exporter parameters from the value stack. The export parameters are used
* to customize the JR export. For example, a PDF export might enable encryption
* and set the user password to a string known to the report creator.</li>
* <p/>
* <li>
* <b>connection</b> - (2.1.7+) JDBC Connection which can be passed to the
* report instead of dataSource</li>
* <p/>
* </ul>
* <p/>
* <p>
* This result follows the same rules from {@link StrutsResultSupport}.
* Specifically, all parameters will be parsed if the "parse" parameter is not
* set to false.
* </p>
* <!-- END SNIPPET: params -->
* <p/>
* <b>Example:</b>
* <p/>
*
* <pre>
* <!-- START SNIPPET: example1 -->
* <result name="success" type="jasper">
* <param name="location">foo.jasper</param>
* <param name="dataSource">mySource</param>
* <param name="format">CSV</param>
* </result>
* <!-- END SNIPPET: example1 -->
* </pre>
*
* or for pdf
*
* <pre>
* <!-- START SNIPPET: example2 -->
* <result name="success" type="jasper">
* <param name="location">foo.jasper</param>
* <param name="dataSource">mySource</param>
* </result>
* <!-- END SNIPPET: example2 -->
* </pre>
*/
public class JasperReportsResult extends StrutsResultSupport implements
JasperReportConstants {
private static final long serialVersionUID = -2523174799621182907L;
private final static Logger LOG = LoggerFactory
.getLogger(JasperReportsResult.class);
protected String dataSource;
protected String format;
protected String documentName;
protected String contentDisposition;
protected String delimiter;
protected String imageServletUrl = "/images/";
protected String timeZone;
/**
* Connection which can be passed to the report instead od dataSource.
*/
protected String connection;
/**
* Names a report parameters map stack value, allowing additional report
* parameters from the action.
*/
protected String reportParameters;
/**
* Names an exporter parameters map stack value, allowing the use of custom
* export parameters.
*/
protected String exportParameters;
/**
* Default ctor.
*/
public JasperReportsResult() {
super();
}
/**
* Default ctor with location.
*
* @param location
* Result location.
*/
public JasperReportsResult(String location) {
super(location);
}
public String getImageServletUrl() {
return imageServletUrl;
}
public void setImageServletUrl(final String imageServletUrl) {
this.imageServletUrl = imageServletUrl;
}
public void setDataSource(String dataSource) {
this.dataSource = dataSource;
}
public void setFormat(String format) {
this.format = format;
}
public void setDocumentName(String documentName) {
this.documentName = documentName;
}
public void setContentDisposition(String contentDisposition) {
this.contentDisposition = contentDisposition;
}
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
/**
* set time zone id
*
* @param timeZone
*/
public void setTimeZone(final String timeZone) {
this.timeZone = timeZone;
}
public String getReportParameters() {
return reportParameters;
}
public void setReportParameters(String reportParameters) {
this.reportParameters = reportParameters;
}
public String getExportParameters() {
return exportParameters;
}
public void setE