KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > efs > openreports > services > servlet > ReportServiceServlet


1 /*
2  * Copyright (C) 2006 Erik Swenson - erik@oreports.com
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the Free
6  * Software Foundation; either version 2 of the License, or (at your option)
7  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16  * Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  */

19
20 package org.efs.openreports.services.servlet;
21
22 import java.beans.PropertyDescriptor JavaDoc;
23 import java.io.IOException JavaDoc;
24 import java.lang.reflect.InvocationTargetException JavaDoc;
25 import java.lang.reflect.Method JavaDoc;
26
27 import javax.servlet.ServletConfig JavaDoc;
28 import javax.servlet.ServletException JavaDoc;
29 import javax.servlet.ServletOutputStream JavaDoc;
30 import javax.servlet.http.HttpServlet JavaDoc;
31 import javax.servlet.http.HttpServletRequest JavaDoc;
32 import javax.servlet.http.HttpServletResponse JavaDoc;
33
34 import org.apache.commons.beanutils.PropertyUtils;
35 import org.apache.commons.lang.StringUtils;
36 import org.apache.log4j.Logger;
37 import org.efs.openreports.engine.ReportEngine;
38 import org.efs.openreports.engine.output.QueryEngineOutput;
39 import org.efs.openreports.engine.output.ReportEngineOutput;
40 import org.efs.openreports.services.ReportService;
41 import org.efs.openreports.services.input.ServletReportServiceInput;
42 import org.springframework.context.ApplicationContext;
43 import org.springframework.web.context.support.WebApplicationContextUtils;
44
45 /**
46  * Basic servlet for onscreen report delivery. The service method uses
47  * reflection to build a ServletReportServiceInput from the ServletRequest parameters
48  * and calls the generateReport method of the ReportService.
49  *
50  * @author Erik Swenson
51  */

52
53 public class ReportServiceServlet extends HttpServlet JavaDoc
54 {
55     private static Logger log = Logger.getLogger(ReportServiceServlet.class.getName());
56     
57     private ReportService reportService;
58     private PropertyDescriptor JavaDoc[] descriptors;
59     
60     public void init(ServletConfig JavaDoc servletConfig) throws ServletException JavaDoc
61     {
62         ApplicationContext appContext = WebApplicationContextUtils
63                 .getRequiredWebApplicationContext(servletConfig.getServletContext());
64     
65         reportService = (ReportService) appContext.getBean("reportService", ReportService.class);
66         
67         //cache ServletReportServiceInput PropertyDescriptors
68
descriptors = PropertyUtils.getPropertyDescriptors(ServletReportServiceInput.class);
69
70         super.init(servletConfig);
71
72         log.info("Started...");
73     }
74     
75     protected void service(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
76             throws ServletException JavaDoc, IOException JavaDoc
77     {
78         try
79         {
80             ServletReportServiceInput reportInput = buildReportServiceInput(request);
81             reportInput.setParameterMap(request.getParameterMap());
82
83             ReportEngineOutput reportOutput = reportService.generateReport(reportInput);
84             
85             if (reportOutput instanceof QueryEngineOutput)
86             {
87                 QueryEngineOutput queryReport = (QueryEngineOutput) reportOutput;
88                 
89                 request.getSession().setAttribute("properties", queryReport.getProperties());
90                 request.getSession().setAttribute("results", queryReport.getResults());
91                 request.getSession().setAttribute("reportName", StringUtils.deleteWhitespace(reportInput.getReportName()));
92                 
93                 response.sendRedirect("report-viewer/query-report.jsp");
94                 
95                 //getServletContext().getRequestDispatcher("/report-viewer/query-report.jsp").forward(request, response);
96

97                 return;
98             }
99             
100             ServletOutputStream JavaDoc out = response.getOutputStream();
101             
102             if (reportOutput.getContent() != null)
103             {
104                 if (reportInput.getExportType() != ReportEngine.EXPORT_HTML)
105                 {
106                     response.setContentType(reportOutput.getContentType());
107                     response.setContentLength(reportOutput.getContent().length);
108                     response.setHeader("Content-disposition", "inline; filename="
109                             + StringUtils.deleteWhitespace(reportInput.getReportName())
110                             + reportOutput.getContentExtension());
111                 }
112
113                 out.write(reportOutput.getContent(), 0, reportOutput.getContent().length);
114             }
115             else
116             {
117                 out.write(reportOutput.getContentMessage().getBytes());
118             }
119             
120             out.flush();
121             out.close();
122         }
123         catch (Exception JavaDoc e)
124         {
125             response.getOutputStream().write(e.toString().getBytes());
126         }
127     }
128     
129     /*
130      * Use reflection to build a ServletReportServiceInput from a HttpServletRequest.
131      * HttpServletRequest parameter name must match ServletReportServiceInput
132      * property name and the property type must be an int or String.
133      *
134      */

135     protected ServletReportServiceInput buildReportServiceInput(HttpServletRequest JavaDoc request)
136             throws IllegalAccessException JavaDoc, InvocationTargetException JavaDoc
137     {
138         ServletReportServiceInput reportInput = new ServletReportServiceInput();
139         
140         for (int i = 0; i < descriptors.length; i++)
141         {
142             String JavaDoc value = request.getParameter(descriptors[i].getName());
143             if (value != null)
144             {
145                 Method JavaDoc method = descriptors[i].getWriteMethod();
146                 
147                 log.debug("Building ServletReportRequest: " + descriptors[i].getName()
148                         + " | " + method.getName() + " | " + value);
149
150                 if (descriptors[i].getPropertyType() == int.class)
151                 {
152                     method.invoke(reportInput, new Integer JavaDoc[]{Integer.valueOf(value)});
153                 }
154                 else if (descriptors[i].getPropertyType() == String JavaDoc.class)
155                 {
156                     method.invoke(reportInput, new String JavaDoc[]{value});
157                 }
158             }
159         }
160
161         return reportInput;
162     }
163 }
164
Popular Tags