Please create a Jira issue...

> -----Original Message-----
> From: Manyuan Jin [mailto:[EMAIL PROTECTED] 
> Sent: Monday, January 12, 2004 11:19 AM
> To: [EMAIL PROTECTED]
> Subject: [OS-webwork] A fix for JasperReportViewServlet
> 
> 
> I am not aware if the issue has been solved by others, but 
> when I tried to use JasperReportViewServlet for displaying 
> charts/images in html files, it didn't work. Then I checked 
> the source code, there is a line marked "// todo fixme... 
> currently not working...". After exploring more on Jasper 
> report document, I got the problem solved. Basically we need 
> to load images from IMAGES_MAP. The following is the modified 
> code. Anybody can check the code and compile it into the lib?
> 
> Thanks.
> Manyuan Jin
> 
> 
> /*
>  * Copyright (c) 2002-2003 by OpenSymphony
>  * All rights reserved.
>  */
> package com.opensymphony.webwork.views.jasperreports;
> 
> import com.opensymphony.webwork.ServletActionContext;
> import com.opensymphony.xwork.util.OgnlValueStack;
> import dori.jasper.engine.*;
> import dori.jasper.engine.export.*;
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> 
> import javax.servlet.ServletException;
> import javax.servlet.ServletOutputStream;
> import javax.servlet.http.HttpServlet;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> import java.io.ByteArrayOutputStream;
> import java.io.File;
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.Map;
> 
> 
> /**
>  * Provide a view of a webwork action as a jasper report. The 
> report format will be determined by
>  * the format parameter passed in the xwork action definition.
>  * Example action definition:
>  *
>  * <action name="jasperTest" 
> class="com.opensymphony.webwork.views.jasperreports.example.Or
> derListAction"
> >
>  *    <param name="dataSource">orders</param>
>  *    <param name="format">PDF</param>
>  *    <result name="success" type="dispatcher">
>  *        <param name="location">orderList.jasper</param>
>  *    </result>
>  *    <interceptor-ref name="defaultStack"/>
>  * </action>
>  *
>  * Valid report format strings are the following:
>  * <ul>
>  * <li>PDF</li>
>  * <li>XML</li>
>  * <li>HTML</li>
>  * <li>XLS</li>
>  * <li>CSV</li>
>  * </ul>
>  * It will then look for a compiled report definition of the 
> form <code><view name>.jasper</code>,
>  * run it to the appropriate output format and stream the 
> results as the HTTP response.
>  *
>  * Ported to WebWork2:
>  *
>  * @author <a href="[EMAIL PROTECTED]">Rainer 
> Hermanns</a>
>  * @version $Id: JasperReportViewServlet.java,v 1.1 
> 2003/10/03 05:45:27 cameronbraid Exp $  */ public class 
> JasperReportViewServlet extends HttpServlet implements 
> JasperReportConstants {
> 
>     //~ Static fields/initializers 
> /////////////////////////////////////////////
>     protected static Log log = 
> LogFactory.getLog(JasperReportViewServlet.class);
> 
>     //~ Instance fields 
> ////////////////////////////////////////////////////////
> 
>     protected String IMAGES_URI = "/images/";
> 
>     //~ Methods 
> ////////////////////////////////////////////////////////////////
> 
>     /* (non-Javadoc)
>      * @see javax.servlet.GenericServlet#init()
>      */
>     public void init() throws ServletException {
>         super.init();
> 
>         if (getServletConfig().getInitParameter("IMAGES_URI") 
> != null) {
>             IMAGES_URI = 
> getServletConfig().getInitParameter("IMAGES_URI");
>         }
>     }
> 
> 
>      /**
>      * Service a HTTP request
>      * @param request the request to service
>      * @param response the response to send to the client
>      */
>     public void service(HttpServletRequest request, 
> HttpServletResponse
> response) throws ServletException {
>         String imageName=request.getParameter("image");
>         //load image from IMAGES_MAP
>   if(imageName !=null){
>             Map imagesMap = (Map) 
> request.getSession().getAttribute("IMAGES_MAP");
>    if (imagesMap != null){
>     byte[] imageData = (byte[]) imagesMap.get(imageName);
>                try{
>      response.setContentLength(imageData.length);
>      ServletOutputStream ouputStream = response.getOutputStream();
>      ouputStream.write(imageData, 0, imageData.length);
>      ouputStream.flush();
>      ouputStream.close();
>     }
>     catch(IOException ioe){
>      log.warn(ioe.toString());
>     }
>    }
>         }
>         else{
>         //construct the data source for the report
>         OgnlValueStack stack = 
> ServletActionContext.getContext().getValueStack();
>         String dataSource = "" + request.getAttribute("dataSource");
>         OgnlValueStackDataSource stackDataSource = new 
> OgnlValueStackDataSource(stack, dataSource);
> 
>         //get the output format
>         String outputFormat = "" + request.getAttribute("format");
>         // (Map) 
> ActionContext.getContext().getSession().get("IMAGES_MAP");
>         if (outputFormat == null) {
>             outputFormat = FORMAT_PDF;
>         }
> 
>         if (!"contype".equals(request.getHeader("User-Agent"))) {
>             // Determine the directory that the report file 
> is in and set the reportDirectory parameter
>             String systemId = 
> getServletContext().getRealPath(request.getServletPath());
>             Map parameters = new OgnlValueStackShadowMap(stack);
>             File directory = new File(systemId.substring(0, 
> systemId.lastIndexOf(File.separator)));
>             parameters.put("reportDirectory", directory);
> 
>             byte[] output = null;
>             JasperPrint jasperPrint = null;
> 
>             // Fill the report and produce a print object
>             try {
>                 JasperReport jasperReport = 
> JasperManager.loadReport(systemId);
>                 jasperPrint = 
> JasperFillManager.fillReport(jasperReport,
> parameters, stackDataSource);
>             } catch (JRException e) {
>                 log.error("Error building report for uri " + 
> systemId, e);
>                 throw new ServletException(e.getMessage(), e);
>             }
> 
>             // Export the print object to the desired output format
>             try {
>                 if (outputFormat.equals(FORMAT_PDF)) {
>                     response.setContentType("application/pdf");
> 
>                     // 
> response.setHeader("Content-disposition", "inline; 
> filename=report.pdf");
>                     output = 
> JasperExportManager.exportReportToPdf(jasperPrint);
>                 } else {
>                     JRExporter exporter = null;
> 
>                     if (outputFormat.equals(FORMAT_CSV)) {
>                         response.setContentType("text/plain");
>                         exporter = new JRCsvExporter();
>                     } else if (outputFormat.equals(FORMAT_HTML)) {
>                         response.setContentType("text/html");
> 
>                         Map imagesMap = new HashMap();
> 
>                         
> request.getSession().setAttribute("IMAGES_MAP",
> imagesMap);
>                         exporter = new JRHtmlExporter();
> 
> exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
> 
> exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
> "*.jasper?image=");
> 
>                     } else if (outputFormat.equals(FORMAT_XLS)) {
>                         
> response.setContentType("application/vnd.ms-excel");
>                         exporter = new JRXlsExporter();
>                     } else if (outputFormat.equals(FORMAT_XML)) {
>                         response.setContentType("text/xml");
>                         exporter = new JRXmlExporter();
>                     } else {
>                         throw new ServletException("Unknown 
> report format: "
> + outputFormat);
>                     }
> 
>                     output = exportReportToBytes(jasperPrint, 
> exporter);
>                 }
>             } catch (JRException e) {
>                 String message = "Error producing " + 
> outputFormat + " report for uri " + systemId;
>                 log.error(message, e);
>                 throw new ServletException(e.getMessage(), e);
>             }
> 
>             response.setContentLength(output.length);
> 
>             ServletOutputStream ouputStream;
> 
>             try {
>                 if (log.isDebugEnabled()) {
>                     //log.debug("Writing " + output.length + 
> " bytes to output stream");
>                 }
> 
>                 ouputStream = response.getOutputStream();
>                 ouputStream.write(output);
>                 ouputStream.flush();
>                 ouputStream.close();
>             } catch (IOException e) {
>                 log.error("Error writing report output", e);
>                 throw new ServletException(e.getMessage(), e);
>             }
>         } else {
>             // Code to handle "contype" request from IE
>             try {
>                 ServletOutputStream outputStream;
>                 response.setContentType("application/pdf");
>                 response.setContentLength(0);
>                 outputStream = response.getOutputStream();
>                 outputStream.close();
>             } catch (IOException e) {
>                 log.error("Error writing report output", e);
>                 throw new ServletException(e.getMessage(), e);
>             }
>         }
>         }
>     }
> 
>     /**
>      * Run a Jasper report to CSV format and put the results 
> in a byte array
>      * @param jasperPrint The Print object to render as CSV
>      * @param exporter The exporter to use to export the report
>      * @return A CSV formatted report
>      * @throws dori.jasper.engine.JRException If there is a 
> problem running the report
>      */
>     private byte[] exportReportToBytes(JasperPrint 
> jasperPrint, JRExporter
> exporter) throws JRException {
>         byte[] output;
>         ByteArrayOutputStream baos = new ByteArrayOutputStream();
> 
>         exporter.setParameter(JRExporterParameter.JASPER_PRINT,
> jasperPrint);
>         
> exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
> 
>         exporter.exportReport();
> 
>         output = baos.toByteArray();
> 
>         return output;
>     }
> }
> 
> 
> 
> -------------------------------------------------------
> This SF.net email is sponsored by: Perforce Software.
> Perforce is the Fast Software Configuration Management System 
> offering advanced branching capabilities and atomic changes 
> on 50+ platforms. Free Eval! 
> http://www.perforce.com/perforce/loadprog.html
> 
> _______________________________________________
> Opensymphony-webwork mailing list 
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork
> 


-------------------------------------------------------
This SF.net email is sponsored by: Perforce Software.
Perforce is the Fast Software Configuration Management System offering
advanced branching capabilities and atomic changes on 50+ platforms.
Free Eval! http://www.perforce.com/perforce/loadprog.html
_______________________________________________
Opensymphony-webwork mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork

Reply via email to