001// Copyright 2006, 2007, 2008, 2010, 2011 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.tapestry5.internal.services;
016
017import org.apache.tapestry5.ioc.internal.util.InternalUtils;
018import org.apache.tapestry5.services.Request;
019import org.apache.tapestry5.services.Session;
020
021import javax.servlet.http.HttpServletRequest;
022import java.io.UnsupportedEncodingException;
023import java.util.List;
024import java.util.Locale;
025
026/**
027 * Basic implementation of {@link org.apache.tapestry5.services.Request} that wraps around an
028 * {@link javax.servlet.http.HttpServletRequest}.
029 */
030public class RequestImpl implements Request
031{
032    static final String REQUESTED_WITH_HEADER = "X-Requested-With";
033
034    static final String XML_HTTP_REQUEST = "XMLHttpRequest";
035
036    private final HttpServletRequest request;
037
038    private final String requestEncoding;
039
040    private final TapestrySessionFactory sessionFactory;
041
042    private boolean encodingSet;
043
044    Session session;
045
046    public RequestImpl(
047            HttpServletRequest request,
048            String requestEncoding,
049            TapestrySessionFactory sessionFactory)
050    {
051        this.request = request;
052        this.requestEncoding = requestEncoding;
053        this.sessionFactory = sessionFactory;
054    }
055
056    public List<String> getParameterNames()
057    {
058        setupEncoding();
059
060        return InternalUtils.toList(request.getParameterNames());
061    }
062
063    public List<String> getHeaderNames()
064    {
065        return InternalUtils.toList(request.getHeaderNames());
066    }
067
068    public String getParameter(String name)
069    {
070        setupEncoding();
071
072        return request.getParameter(name);
073    }
074
075    public String[] getParameters(String name)
076    {
077        setupEncoding();
078
079        return request.getParameterValues(name);
080    }
081
082    public String getHeader(String name)
083    {
084        return request.getHeader(name);
085    }
086
087    public String getPath()
088    {
089        String pathInfo = request.getPathInfo();
090
091        if (pathInfo == null)
092            return request.getServletPath();
093
094        // Websphere 6.1 is a bit wonky (see TAPESTRY-1713), and tends to return the empty string
095        // for the servlet path, and return the true path in pathInfo.
096
097        return pathInfo.length() == 0 ? "/" : pathInfo;
098    }
099
100    public String getContextPath()
101    {
102        return request.getContextPath();
103    }
104
105    public Session getSession(boolean create)
106    {
107        if (session != null && session.isInvalidated())
108        {
109            session = null;
110        }
111
112        if (session == null)
113        {
114            // TAP5-1489 - Re-storage of session attributes at end of request should be configurable
115            session = sessionFactory.getSession(create);
116        }
117
118        return session;
119    }
120
121    public Locale getLocale()
122    {
123        return request.getLocale();
124    }
125
126    public long getDateHeader(String name)
127    {
128        return request.getDateHeader(name);
129    }
130
131    private void setupEncoding()
132    {
133        if (encodingSet)
134            return;
135
136        try
137        {
138            request.setCharacterEncoding(requestEncoding);
139        } catch (UnsupportedEncodingException ex)
140        {
141            throw new RuntimeException(ex);
142        }
143
144        encodingSet = true;
145    }
146
147    public boolean isXHR()
148    {
149        return XML_HTTP_REQUEST.equals(request.getHeader(REQUESTED_WITH_HEADER));
150    }
151
152    public boolean isSecure()
153    {
154        return request.isSecure();
155    }
156
157    public boolean isRequestedSessionIdValid()
158    {
159        return request.isRequestedSessionIdValid();
160    }
161
162    public Object getAttribute(String name)
163    {
164        return request.getAttribute(name);
165    }
166
167    public void setAttribute(String name, Object value)
168    {
169        request.setAttribute(name, value);
170    }
171
172    public String getMethod()
173    {
174        return request.getMethod();
175    }
176
177    public String getServerName()
178    {
179        return request.getServerName();
180    }
181
182    public int getLocalPort()
183    {
184        return request.getLocalPort();
185    }
186
187    /**
188     * @since 5.2.5
189     */
190    public int getServerPort()
191    {
192        return request.getServerPort();
193    }
194
195    public String getRemoteHost()
196    {
197        return request.getRemoteHost();
198    }
199}