KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > displaytag > filter > ResponseOverrideFilter


1 /**
2  * Licensed under the Artistic License; you may not use this file
3  * except in compliance with the License.
4  * You may obtain a copy of the License at
5  *
6  * http://displaytag.sourceforge.net/license.html
7  *
8  * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
9  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
10  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
11  */

12 package org.displaytag.filter;
13
14 import java.io.IOException JavaDoc;
15 import java.util.HashMap JavaDoc;
16 import java.util.Map JavaDoc;
17
18 import javax.servlet.Filter JavaDoc;
19 import javax.servlet.FilterChain JavaDoc;
20 import javax.servlet.FilterConfig JavaDoc;
21 import javax.servlet.ServletException JavaDoc;
22 import javax.servlet.ServletRequest JavaDoc;
23 import javax.servlet.ServletResponse JavaDoc;
24 import javax.servlet.http.HttpServletRequest JavaDoc;
25 import javax.servlet.http.HttpServletResponse JavaDoc;
26
27 import org.apache.commons.lang.StringUtils;
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.displaytag.Messages;
31 import org.displaytag.tags.TableTag;
32 import org.displaytag.tags.TableTagParameters;
33
34
35 /**
36  * <p>
37  * Allow the author of an included JSP page to reset the content type to something else (like a binary stream), and then
38  * write the new info back as the exclusive response, clearing the buffers of all previously added content.
39  * </p>
40  * <p>
41  * This filter allows TableTag users to perform exports from pages that are run as includes, such as from Struts or a
42  * jsp:include. If that is your intention, just add this Filter to your web.xml and map it to the appropriate requests,
43  * using something like:
44  * </p>
45  *
46  * <pre>
47  * &lt;filter>
48  * &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>
49  * &lt;filter-class>org.displaytag.filter.ResponseOverrideFilter&lt;/filter-class>
50  * &lt;/filter>
51  * &lt;filter-mapping>
52  * &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>
53  * &lt;url-pattern>*.do&lt;/url-pattern>
54  * &lt;/filter-mapping>
55  * &lt;filter-mapping>
56  * &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>
57  * &lt;url-pattern>*.jsp&lt;/url-pattern>
58  * &lt;/filter-mapping>
59  * </pre>
60  *
61  * <p>
62  * By default the filter buffers all the export content before writing it out. You can set an optional parameter
63  * <code>buffer</code> to <code>false</code> to make the filter write directly to the output stream. This could be
64  * faster and uses less memory, but the content length will not be set.
65  * </p>
66  *
67  * <pre>
68  * &lt;filter>
69  * &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>
70  * &lt;filter-class>org.displaytag.filter.ResponseOverrideFilter&lt;/filter-class>
71  * &lt;init-param>
72  * &lt;param-name>buffer&lt;/param-name>
73  * &lt;param-value>false&lt;/param-value>
74  * &lt;/init-param>
75  * &lt;/filter>
76  * </pre>
77  *
78  * @author rapruitt
79  * @author Fabrizio Giustina
80  * @version $Revision: 720 $ ($Author: fgiust $)
81  */

82 public class ResponseOverrideFilter implements Filter JavaDoc
83 {
84
85     /**
86      * Logger.
87      */

88     private Log log;
89
90     /**
91      * Force response buffering. Enabled by default.
92      */

93     private boolean buffer = true;
94
95     /**
96      * {@inheritDoc}
97      */

98     public void init(FilterConfig JavaDoc filterConfig)
99     {
100         log = LogFactory.getLog(ResponseOverrideFilter.class);
101         String JavaDoc bufferParam = filterConfig.getInitParameter("buffer");
102         if (log.isDebugEnabled())
103         {
104             log.debug("bufferParam=" + bufferParam);
105         }
106         buffer = bufferParam == null || StringUtils.equalsIgnoreCase("true", bufferParam);
107
108         log.info("Filter initialized. Response buffering is " + (buffer ? "enabled" : "disabled"));
109     }
110
111     /**
112      * {@inheritDoc}
113      */

114     public void doFilter(ServletRequest JavaDoc servletRequest, ServletResponse JavaDoc servletResponse, FilterChain JavaDoc filterChain)
115         throws IOException JavaDoc, ServletException JavaDoc
116     {
117
118         if (servletRequest.getParameter(TableTagParameters.PARAMETER_EXPORTING) == null)
119         {
120             if (log.isDebugEnabled())
121             {
122                 log.debug(Messages.getString("ResponseOverrideFilter.parameternotfound")); //$NON-NLS-1$
123
}
124             // don't filter!
125
filterChain.doFilter(servletRequest, servletResponse);
126             return;
127         }
128
129         HttpServletRequest JavaDoc request = (HttpServletRequest JavaDoc) servletRequest;
130
131         BufferedResponseWrapper wrapper = new BufferedResponseWrapper13Impl((HttpServletResponse JavaDoc) servletResponse);
132
133         Map JavaDoc contentBean = new HashMap JavaDoc(4);
134         if (buffer)
135         {
136             contentBean.put(TableTagParameters.BEAN_BUFFER, Boolean.TRUE);
137         }
138         request.setAttribute(TableTag.FILTER_CONTENT_OVERRIDE_BODY, contentBean);
139
140         filterChain.doFilter(request, wrapper);
141
142         ExportDelegate.writeExport((HttpServletResponse JavaDoc) servletResponse, servletRequest, wrapper);
143     }
144
145     /**
146      * {@inheritDoc}
147      */

148     public void destroy()
149     {
150         // nothing to destroy
151
}
152 }
Popular Tags