001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.chain.web.servlet;
018    
019    
020    import java.util.Map;
021    import javax.servlet.ServletContext;
022    import javax.servlet.http.HttpServletRequest;
023    import javax.servlet.http.HttpServletResponse;
024    import org.apache.commons.chain.web.WebContext;
025    
026    
027    /**
028     * <p>Concrete implementation of {@link WebContext} suitable for use in
029     * Servlets and JSP pages.  The abstract methods are mapped to the appropriate
030     * collections of the underlying servlet context, request, and response
031     * instances that are passed to the constructor (or the initialize method).</p>
032     *
033     * @author Craig R. McClanahan
034     * @version $Revision: 480477 $ $Date: 2006-11-29 08:34:52 +0000 (Wed, 29 Nov 2006) $
035     */
036    
037    public class ServletWebContext extends WebContext {
038    
039    
040        // ------------------------------------------------------------ Constructors
041    
042    
043        /**
044         * <p>Construct an uninitialized {@link ServletWebContext} instance.</p>
045         */
046        public ServletWebContext() {
047        }
048    
049    
050        /**
051         * <p>Construct a {@link ServletWebContext} instance that is initialized
052         * with the specified Servlet API objects.</p>
053         *
054         * @param context The <code>ServletContext</code> for this web application
055         * @param request The <code>HttpServletRequest</code> for this request
056         * @param response The <code>HttpServletResponse</code> for this request
057         */
058        public ServletWebContext(ServletContext context,
059                                 HttpServletRequest request,
060                                 HttpServletResponse response) {
061    
062            initialize(context, request, response);
063    
064        }
065    
066    
067        // ------------------------------------------------------ Instance Variables
068    
069    
070        /**
071         * <p>The lazily instantiated <code>Map</code> of application scope
072         * attributes.</p>
073         */
074        private Map applicationScope = null;
075    
076    
077        /**
078         * <p>The <code>ServletContext</code> for this web application.</p>
079         */
080        protected ServletContext context = null;
081    
082    
083        /**
084         * <p>The lazily instantiated <code>Map</code> of header name-value
085         * combinations (immutable).</p>
086         */
087        private Map header = null;
088    
089    
090        /**
091         * <p>The lazily instantitated <code>Map</code> of header name-values
092         * combinations (immutable).</p>
093         */
094        private Map headerValues = null;
095    
096    
097        /**
098         * <p>The lazily instantiated <code>Map</code> of context initialization
099         * parameters.</p>
100         */
101        private Map initParam = null;
102    
103    
104        /**
105         * <p>The lazily instantiated <code>Map</code> of cookies.</p>
106         */
107        private Map cookieValues = null;
108    
109    
110        /**
111         * <p>The lazily instantiated <code>Map</code> of request
112         * parameter name-value.</p>
113         */
114        private Map param = null;
115    
116    
117        /**
118         * <p>The lazily instantiated <code>Map</code> of request
119         * parameter name-values.</p>
120         */
121        private Map paramValues = null;
122    
123    
124        /**
125         * <p>The <code>HttpServletRequest</code> for this request.</p>
126         */
127        protected HttpServletRequest request = null;
128    
129    
130        /**
131         * <p>The lazily instantiated <code>Map</code> of request scope
132         * attributes.</p>
133         */
134        private Map requestScope = null;
135    
136    
137        /**
138         * <p>The <code>HttpServletResponse</code> for this request.</p>
139         */
140        protected HttpServletResponse response = null;
141    
142    
143        /**
144         * <p>The lazily instantiated <code>Map</code> of session scope
145         * attributes.</p>
146         */
147        private Map sessionScope = null;
148    
149    
150        // ---------------------------------------------------------- Public Methods
151    
152    
153        /**
154         * <p>Return the {@link ServletContext} for this context.</p>
155         *
156         * @return The <code>ServletContext</code> for this context.
157         */
158        public ServletContext getContext() {
159    
160        return (this.context);
161    
162        }
163    
164    
165        /**
166         * <p>Return the {@link HttpServletRequest} for this context.</p>
167         *
168         * @return The <code>HttpServletRequest</code> for this context.
169         */
170        public HttpServletRequest getRequest() {
171    
172        return (this.request);
173    
174        }
175    
176    
177        /**
178         * <p>Return the {@link HttpServletResponse} for this context.</p>
179         *
180         * @return The <code>HttpServletResponse</code> for this context.
181         */
182        public HttpServletResponse getResponse() {
183    
184        return (this.response);
185    
186        }
187    
188    
189        /**
190         * <p>Initialize (or reinitialize) this {@link ServletWebContext} instance
191         * for the specified Servlet API objects.</p>
192         *
193         * @param context The <code>ServletContext</code> for this web application
194         * @param request The <code>HttpServletRequest</code> for this request
195         * @param response The <code>HttpServletResponse</code> for this request
196         */
197        public void initialize(ServletContext context,
198                               HttpServletRequest request,
199                               HttpServletResponse response) {
200    
201            // Save the specified Servlet API object references
202            this.context = context;
203            this.request = request;
204            this.response = response;
205    
206            // Perform other setup as needed
207    
208        }
209    
210    
211        /**
212         * <p>Release references to allocated resources acquired in
213         * <code>initialize()</code> of via subsequent processing.  After this
214         * method is called, subsequent calls to any other method than
215         * <code>initialize()</code> will return undefined results.</p>
216         */
217        public void release() {
218    
219            // Release references to allocated collections
220            applicationScope = null;
221            header = null;
222            headerValues = null;
223            initParam = null;
224            param = null;
225            paramValues = null;
226            cookieValues = null;
227            requestScope = null;
228            sessionScope = null;
229    
230            // Release references to Servlet API objects
231            context = null;
232            request = null;
233            response = null;
234    
235        }
236    
237    
238    
239        // ------------------------------------------------------ WebContext Methods
240    
241    
242        /**
243         * See the {@link WebContext}'s Javadoc.
244         *
245         * @return Application scope Map.
246         */
247        public Map getApplicationScope() {
248    
249            if ((applicationScope == null) && (context != null)) {
250                applicationScope = new ServletApplicationScopeMap(context);
251            }
252            return (applicationScope);
253    
254        }
255    
256    
257        /**
258         * See the {@link WebContext}'s Javadoc.
259         *
260         * @return Header values Map.
261         */
262        public Map getHeader() {
263    
264            if ((header == null) && (request != null)) {
265                header = new ServletHeaderMap(request);
266            }
267            return (header);
268    
269        }
270    
271    
272        /**
273         * See the {@link WebContext}'s Javadoc.
274         *
275         * @return Header values Map.
276         */
277        public Map getHeaderValues() {
278    
279            if ((headerValues == null) && (request != null)) {
280                headerValues = new ServletHeaderValuesMap(request);
281            }
282            return (headerValues);
283    
284        }
285    
286    
287        /**
288         * See the {@link WebContext}'s Javadoc.
289         *
290         * @return Initialization parameter Map.
291         */
292        public Map getInitParam() {
293    
294            if ((initParam == null) && (context != null)) {
295                initParam = new ServletInitParamMap(context);
296            }
297            return (initParam);
298    
299        }
300    
301    
302        /**
303         * See the {@link WebContext}'s Javadoc.
304         *
305         * @return Request parameter Map.
306         */
307        public Map getParam() {
308    
309            if ((param == null) && (request != null)) {
310                param = new ServletParamMap(request);
311            }
312            return (param);
313    
314        }
315    
316    
317        /**
318         * See the {@link WebContext}'s Javadoc.
319         *
320         * @return Request parameter Map.
321         */
322        public Map getParamValues() {
323    
324            if ((paramValues == null) && (request != null)) {
325                paramValues = new ServletParamValuesMap(request);
326            }
327            return (paramValues);
328    
329        }
330    
331    
332        /**
333         * See the {@link WebContext}'s Javadoc.
334         *
335         * @return Map of Cookies.
336         * @since Chain 1.1
337         */
338        public Map getCookies() {
339    
340            if ((cookieValues == null) && (request != null)) {
341                cookieValues = new ServletCookieMap(request);
342            }
343            return (cookieValues);
344    
345        }
346    
347    
348        /**
349         * See the {@link WebContext}'s Javadoc.
350         *
351         * @return Request scope Map.
352         */
353        public Map getRequestScope() {
354    
355            if ((requestScope == null) && (request != null)) {
356                requestScope = new ServletRequestScopeMap(request);
357            }
358            return (requestScope);
359    
360        }
361    
362    
363        /**
364         * See the {@link WebContext}'s Javadoc.
365         *
366         * @return Session scope Map.
367         */
368        public Map getSessionScope() {
369    
370            if ((sessionScope == null) && (request != null)) {
371                sessionScope = new ServletSessionScopeMap(request);
372            }
373            return (sessionScope);
374    
375        }
376    
377    
378    
379    }