View Javadoc

1   /*
2    * $Header: /cvsroot/jdbforms/dbforms/src/org/dbforms/util/external/SetCharacterEncodingFilter.java,v 1.4 2005/02/19 21:26:32 hkollmann Exp $
3    * $Revision: 1.4 $
4    * $Date: 2005/02/19 21:26:32 $
5    *
6    * DbForms - a Rapid Application Development Framework
7    * Copyright (C) 2001 Joachim Peer <joepeer@excite.com>
8    *
9    * This library is free software; you can redistribute it and/or
10   * modify it under the terms of the GNU Lesser General Public
11   * License as published by the Free Software Foundation; either
12   * version 2.1 of the License, or (at your option) any later version.
13   *
14   * This library is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17   * Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public
20   * License along with this library; if not, write to the Free Software
21   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
22   */
23  
24  /*
25   * $Header: /cvsroot/jdbforms/dbforms/src/org/dbforms/util/external/SetCharacterEncodingFilter.java,v 1.4 2005/02/19 21:26:32 hkollmann Exp $
26   * $Revision: 1.4 $
27   * $Date: 2005/02/19 21:26:32 $
28   *
29   * ====================================================================
30   *
31   * The Apache Software License, Version 1.1
32   *
33   * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
34   * reserved.
35   *
36   * Redistribution and use in source and binary forms, with or without
37   * modification, are permitted provided that the following conditions
38   * are met:
39   *
40   * 1. Redistributions of source code must retain the above copyright
41   *    notice, this list of conditions and the following disclaimer.
42   *
43   * 2. Redistributions in binary form must reproduce the above copyright
44   *    notice, this list of conditions and the following disclaimer in
45   *    the documentation and/or other materials provided with the
46   *    distribution.
47   *
48   * 3. The end-user documentation included with the redistribution, if
49   *    any, must include the following acknowlegement:
50   *       "This product includes software developed by the
51   *        Apache Software Foundation (http://www.apache.org/)."
52   *    Alternately, this acknowlegement may appear in the software itself,
53   *    if and wherever such third-party acknowlegements normally appear.
54   *
55   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
56   *    Foundation" must not be used to endorse or promote products derived
57   *    from this software without prior written permission. For written
58   *    permission, please contact apache@apache.org.
59   *
60   * 5. Products derived from this software may not be called "Apache"
61   *    nor may "Apache" appear in their names without prior written
62   *    permission of the Apache Group.
63   *
64   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
65   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
66   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
67   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
68   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
69   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
70   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
71   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
72   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
73   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
74   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
75   * SUCH DAMAGE.
76   * ====================================================================
77   *
78   * This software consists of voluntary contributions made by many
79   * individuals on behalf of the Apache Software Foundation.  For more
80   * information on the Apache Software Foundation, please see
81   * <http://www.apache.org/>.
82   *
83   * [Additional notices, if required by prior licensing conditions]
84   *
85   */
86  package org.dbforms.util.external;
87  
88  import java.io.IOException;
89  
90  import javax.servlet.Filter;
91  import javax.servlet.FilterChain;
92  import javax.servlet.FilterConfig;
93  import javax.servlet.ServletException;
94  import javax.servlet.ServletRequest;
95  import javax.servlet.ServletResponse;
96  
97  
98  
99  /***
100  * <p>
101  * Example filter that sets the character encoding to be used in parsing the
102  * incoming request, either unconditionally or only if the client did not
103  * specify a character encoding.  Configuration of this filter is based on the
104  * following initialization parameters:
105  * </p>
106  *
107  * <ul>
108  * <li>
109  * <strong>encoding</strong> - The character encoding to be configured for this
110  * request, either conditionally or unconditionally based on the
111  * <code>ignore</code> initialization parameter.  This parameter is required,
112  * so there is no default.
113  * </li>
114  * <li>
115  * <strong>ignore</strong> - If set to "true", any character encoding specified
116  * by the client is ignored, and the value returned by the
117  * <code>selectEncoding()</code> method is set.  If set to "false,
118  * <code>selectEncoding()</code> is called <strong>only</strong> if the client
119  * has not already specified an encoding.  By default, this parameter is set
120  * to "true".
121  * </li>
122  * </ul>
123  *
124  * <p>
125  * Although this filter can be used unchanged, it is also easy to subclass it
126  * and make the <code>selectEncoding()</code> method more intelligent about
127  * what encoding to choose, based on characteristics of the incoming request
128  * (such as the values of the <code>Accept-Language</code> and
129  * <code>User-Agent</code> headers, or a value stashed in the current user's
130  * session.
131  * </p>
132  *
133  * @author Craig McClanahan
134  * @version $Revision: 1.4 $ $Date: 2005/02/19 21:26:32 $
135  */
136 public class SetCharacterEncodingFilter implements Filter {
137    /***
138     * The filter configuration object we are associated with.  If this value is
139     * null, this filter instance is not currently configured.
140     */
141    protected FilterConfig filterConfig = null;
142 
143    // ----------------------------------------------------- Instance Variables
144 
145    /***
146     * The default character encoding to set for requests that pass through this
147     * filter.
148     */
149    protected String encoding = null;
150 
151    /*** Should a character encoding specified by the client be ignored? */
152    protected boolean ignore = true;
153 
154    // --------------------------------------------------------- Public Methods
155 
156    /***
157     * Take this filter out of service.
158     */
159    public void destroy() {
160       this.encoding     = null;
161       this.filterConfig = null;
162    }
163 
164 
165    /***
166     * Select and set (if specified) the character encoding to be used to
167     * interpret request parameters for this request.
168     *
169     * @param request The servlet request we are processing
170     * @param response The servlet response we are creating
171     * @param chain The filter chain we are processing
172     *
173     * @exception IOException if an input/output error occurs
174     * @exception ServletException if a servlet error occurs
175     */
176    public void doFilter(ServletRequest  request,
177                         ServletResponse response,
178                         FilterChain     chain)
179                  throws IOException, ServletException {
180       // Conditionally select and set the character encoding to be used
181       if (ignore || (request.getCharacterEncoding() == null)) {
182          String pencoding = selectEncoding(request);
183 
184          if (pencoding != null) {
185             request.setCharacterEncoding(pencoding);
186          }
187       }
188 
189       // Pass control on to the next filter
190       chain.doFilter(request, response);
191    }
192 
193 
194    /***
195     * Place this filter into service.
196     *
197     * @param filterConfig The filter configuration object
198     */
199    public void init(FilterConfig afilterConfig) throws ServletException {
200       this.filterConfig = afilterConfig;
201       this.encoding     = filterConfig.getInitParameter("encoding");
202 
203       String value      = filterConfig.getInitParameter("ignore");
204 
205       if (value == null) {
206          this.ignore = true;
207       } else if (value.equalsIgnoreCase("true")) {
208          this.ignore = true;
209       } else if (value.equalsIgnoreCase("yes")) {
210          this.ignore = true;
211       } else {
212          this.ignore = false;
213       }
214    }
215 
216 
217    // ------------------------------------------------------ Protected Methods
218 
219    /***
220     * Select an appropriate character encoding to be used, based on the
221     * characteristics of the current request and/or filter initialization
222     * parameters.  If no character encoding should be set, return
223     * <code>null</code>.
224     *
225     * <p>
226     * The default implementation unconditionally returns the value configured
227     * by the <strong>encoding</strong> initialization parameter for this
228     * filter.
229     * </p>
230     *
231     * @param request The servlet request we are processing
232     *
233     * @return DOCUMENT ME!
234     */
235    protected String selectEncoding(ServletRequest request) {
236       return (this.encoding);
237    }
238 }