From d733e103bae18e7284abb453cae980fb0e4dc794 Mon Sep 17 00:00:00 2001 From: Rainer Hermanns Date: Sat, 21 Jun 2008 10:12:56 +0000 Subject: [PATCH] WW-2637 add timezone support to Jasper Reports Plugin git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@670172 13f79535-47bb-0310-9956-ffa450edef68 --- .../jasperreports/JasperReportsResult.java | 210 ++++++++++-------- 1 file changed, 115 insertions(+), 95 deletions(-) diff --git a/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java b/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java index cf8010e4b..b08505b03 100644 --- a/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java +++ b/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.TimeZone; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -61,68 +62,68 @@ import com.opensymphony.xwork2.util.logging.LoggerFactory; /** * - * + *

* Generates a JasperReports report using the specified format or PDF if no * format is specified. - * + *

* *

* This result type takes the following parameters: - * + *

* - * + *

*

- * + *

*

- * This result follows the same rules from {@link StrutsResultSupport}. - * Specifically, all parameters will be parsed if the "parse" parameter - * is not set to false. + * This result follows the same rules from {@link StrutsResultSupport}. + * Specifically, all parameters will be parsed if the "parse" parameter + * is not set to false. *

* - * + *

* Example: - * + *

*


  * <result name="success" type="jasper">
  *   <param name="location">foo.jasper</param>
@@ -137,7 +138,6 @@ import com.opensymphony.xwork2.util.logging.LoggerFactory;
  *   <param name="dataSource">mySource</param>
  * </result>
  * 
- * */ public class JasperReportsResult extends StrutsResultSupport implements JasperReportConstants { @@ -151,13 +151,14 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe protected String contentDisposition; protected String delimiter; protected String imageServletUrl = "/images/"; - + protected String timeZone; + /** - * Names a report parameters map stack value, allowing - * additional report parameters from the action. + * 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. @@ -173,7 +174,7 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe /** * Default ctor with location. - * + * * @param location Result location. */ public JasperReportsResult(String location) { @@ -208,24 +209,33 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe this.delimiter = delimiter; } - public String getReportParameters() { - return reportParameters; - } + /** + * set time zone id + * + * @param timeZone + */ + public void setTimeZone(final String timeZone) { + this.timeZone = timeZone; + } - public void setReportParameters(String reportParameters) { - this.reportParameters = reportParameters; - } - - public String getExportParameters() { - return exportParameters; - } + public String getReportParameters() { + return reportParameters; + } - public void setExportParameters(String exportParameters) { - this.exportParameters = exportParameters; - } + public void setReportParameters(String reportParameters) { + this.reportParameters = reportParameters; + } - protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { - // Will throw a runtime exception if no "datasource" property. TODO Best place for that is...? + public String getExportParameters() { + return exportParameters; + } + + public void setExportParameters(String exportParameters) { + this.exportParameters = exportParameters; + } + + protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { + // Will throw a runtime exception if no "datasource" property. TODO Best place for that is...? initializeProperties(invocation); if (LOG.isDebugEnabled()) { @@ -238,17 +248,17 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe // Handle IE special case: it sends a "contype" request first. // TODO Set content type to config settings? if ("contype".equals(request.getHeader("User-Agent"))) { - try { - response.setContentType("application/pdf"); - response.setContentLength(0); - - ServletOutputStream outputStream = response.getOutputStream(); - outputStream.close(); - } catch (IOException e) { - LOG.error("Error writing report output", e); - throw new ServletException(e.getMessage(), e); - } - return; + try { + response.setContentType("application/pdf"); + response.setContentLength(0); + + ServletOutputStream outputStream = response.getOutputStream(); + outputStream.close(); + } catch (IOException e) { + LOG.error("Error writing report output", e); + throw new ServletException(e.getMessage(), e); + } + return; } // Construct the data source for the report. @@ -265,11 +275,21 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe parameters.put("reportDirectory", directory); parameters.put(JRParameter.REPORT_LOCALE, invocation.getInvocationContext().getLocale()); + // put timezone in jasper report parameter + if (timeZone != null) { + timeZone = conditionalParse(timeZone, invocation); + final TimeZone tz = TimeZone.getTimeZone(timeZone); + if (tz != null) { + // put the report time zone + parameters.put(JRParameter.REPORT_TIME_ZONE, tz); + } + } + // Add any report parameters from action to param map. Map reportParams = (Map) stack.findValue(reportParameters); if (reportParams != null) { - LOG.debug("Found report parameters; adding to parameters..."); - parameters.putAll(reportParams); + LOG.debug("Found report parameters; adding to parameters..."); + parameters.putAll(reportParams); } byte[] output; @@ -319,7 +339,7 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe exporter = new JRHtmlExporter(); exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap); exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, request.getContextPath() + imageServletUrl); - + // Needed to support chart images: exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); request.getSession().setAttribute("net.sf.jasperreports.j2ee.jasper_print", jasperPrint); @@ -335,11 +355,11 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe } else { throw new ServletException("Unknown report format: " + format); } - + Map exportParams = (Map) stack.findValue(exportParameters); if (exportParams != null) { - LOG.debug("Found export parameters; adding to exporter parameters..."); - exporter.getParameters().putAll(exportParams); + LOG.debug("Found export parameters; adding to exporter parameters..."); + exporter.getParameters().putAll(exportParams); } output = exportReportToBytes(jasperPrint, exporter); @@ -355,15 +375,15 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe writeReport(response, output); } - /** - * Writes report bytes to response output stream. - * - * @param response Current response. - * @param output Report bytes to write. - * @throws ServletException on stream IOException. - */ - private void writeReport(HttpServletResponse response, byte[] output) throws ServletException { - ServletOutputStream outputStream = null; + /** + * Writes report bytes to response output stream. + * + * @param response Current response. + * @param output Report bytes to write. + * @throws ServletException on stream IOException. + */ + private void writeReport(HttpServletResponse response, byte[] output) throws ServletException { + ServletOutputStream outputStream = null; try { outputStream = response.getOutputStream(); outputStream.write(output); @@ -372,25 +392,25 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe LOG.error("Error writing report output", e); throw new ServletException(e.getMessage(), e); } finally { - try { - if (outputStream != null) { - outputStream.close(); - } - } catch (IOException e) { - LOG.error("Error closing report output stream", e); - throw new ServletException(e.getMessage(), e); - } + try { + if (outputStream != null) { + outputStream.close(); + } + } catch (IOException e) { + LOG.error("Error closing report output stream", e); + throw new ServletException(e.getMessage(), e); + } } - } + } - /** - * Sets up result properties, parsing etc. - * - * @param invocation Current invocation. - * @throws Exception on initialization error. - */ - private void initializeProperties(ActionInvocation invocation) throws Exception { - if (dataSource == null) { + /** + * Sets up result properties, parsing etc. + * + * @param invocation Current invocation. + * @throws Exception on initialization error. + */ + private void initializeProperties(ActionInvocation invocation) throws Exception { + if (dataSource == null) { String message = "No dataSource specified..."; LOG.error(message); throw new RuntimeException(message); @@ -412,7 +432,7 @@ public class JasperReportsResult extends StrutsResultSupport implements JasperRe reportParameters = conditionalParse(reportParameters, invocation); exportParameters = conditionalParse(exportParameters, invocation); - } + } /** * Run a Jasper report to CSV format and put the results in a byte array