    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
    015    package org.apache.tapestry5.internal.services;
    016
    017    import org.apache.tapestry5.ioc.internal.util.InternalUtils;
    018    import org.apache.tapestry5.services.Request;
    019    import org.apache.tapestry5.services.Session;
    020
    021    import javax.servlet.http.HttpServletRequest;
    022    import java.io.UnsupportedEncodingException;
    023    import java.util.List;
    024    import 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     */
    030    public 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    }