001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry.request;
016
017import java.util.ArrayList;
018import java.util.Enumeration;
019import java.util.List;
020
021import javax.servlet.http.HttpServletRequest;
022import javax.servlet.http.HttpServletResponse;
023import javax.servlet.http.HttpSession;
024
025/**
026 * This class encapsulates all the relevant data for one request cycle of an
027 * {@link ApplicationServlet}. This includes:
028 * <ul>
029 * <li>{@link HttpServletRequest}
030 * <li>{@link HttpServletResponse}
031 * <li>{@link HttpSession}
032 * </ul>
033 * <p>
034 * This is a limited and crippled version of the RequestContext as it was available in release 3.0,
035 * that exists as a bridge for compatibility only. This saves developers from having to modify their
036 * classes to have the {@link javax.servlet.http.HttpServletRequest} or (preferrably)
037 * {@link org.apache.tapestry.web.WebRequest} injected into their pages, components, or services. It
038 * will be removed in the next release of Tapestry.
039 * 
040 * @author Howard Lewis Ship
041 * @deprecated To be removed in 4.1. Use injection to gain access to the necessary objects.
042 */
043
044public class RequestContext
045{
046    private final HttpServletRequest _request;
047
048    private final HttpServletResponse _response;
049
050    public RequestContext(HttpServletRequest request, HttpServletResponse response)
051    {
052        _request = request;
053        _response = response;
054    }
055
056    /**
057     * Returns the named parameter from the {@link HttpServletRequest}.
058     * <p>
059     * Use {@link #getParameters(String)}for parameters that may include multiple values.
060     */
061
062    public String getParameter(String name)
063    {
064        return _request.getParameter(name);
065    }
066
067    /**
068     * Convienience method for getting a {@link HttpServletRequest}attribute.
069     * 
070     * @since 2.3
071     */
072
073    public Object getAttribute(String name)
074    {
075        return _request.getAttribute(name);
076    }
077
078    /**
079     * For parameters that are, or are possibly, multi-valued, this method returns all the values as
080     * an array of Strings.
081     * 
082     * @see #getParameter(String)
083     */
084
085    public String[] getParameters(String name)
086    {
087        return _request.getParameterValues(name);
088    }
089
090    public String[] getParameterNames()
091    {
092        Enumeration e = _request.getParameterNames();
093        List names = new ArrayList();
094
095        while (e.hasMoreElements())
096            names.add(e.nextElement());
097
098        int count = names.size();
099
100        String[] result = new String[count];
101
102        return (String[]) names.toArray(result);
103    }
104
105    /**
106     * Returns the request which initiated the current request cycle. Note that the methods
107     * {@link #getParameter(String)}and {@link #getParameters(String)}should be used, rather than
108     * obtaining parameters directly from the request (since the RequestContext handles the
109     * differences between normal and multipart/form requests).
110     */
111
112    public HttpServletRequest getRequest()
113    {
114        return _request;
115    }
116
117    public HttpServletResponse getResponse()
118    {
119        return _response;
120    }
121
122    /**
123     * Returns the {@link HttpSession}, if necessary, invoking
124     * {@link HttpServletRequest#getSession(boolean)}. However, this method will <em>not</em>
125     * create a session.
126     */
127
128    public HttpSession getSession()
129    {
130        return _request.getSession(false);
131    }
132
133    /**
134     * Like {@link #getSession()}, but forces the creation of the {@link HttpSession}, if
135     * necessary.
136     */
137
138    public HttpSession createSession()
139    {
140        return _request.getSession(true);
141    }
142
143}