001// Copyright 2007, 2008, 2009, 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.test;
016
017import org.apache.tapestry5.ioc.annotations.Inject;
018import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
019import org.apache.tapestry5.ioc.internal.util.InternalUtils;
020import org.apache.tapestry5.services.Session;
021
022import java.util.*;
023
024public class TestableRequestImpl implements TestableRequest
025{
026    private final String contextPath;
027
028    private final Map<String, Object> parameters = CollectionFactory.newMap();
029
030    private final Map<String, Object> attributes = CollectionFactory.newMap();
031
032    private Session session;
033
034    private String path = "/";
035
036    private Locale locale = Locale.getDefault();
037
038    @Inject
039    public TestableRequestImpl()
040    {
041        this("/foo");
042    }
043
044    public TestableRequestImpl(String contextPath)
045    {
046        this.contextPath = contextPath;
047    }
048
049    public TestableRequest clear()
050    {
051        parameters.clear();
052
053        return this;
054    }
055
056    public TestableRequest setPath(String path)
057    {
058        this.path = path;
059
060        return this;
061    }
062
063    public TestableRequest setLocale(Locale locale)
064    {
065        this.locale = locale;
066
067        return this;
068    }
069
070    public TestableRequest loadParameter(String parameterName, String parameterValue)
071    {
072        Object existing = parameters.get(parameterName);
073
074        if (existing == null)
075        {
076            parameters.put(parameterName, parameterValue);
077            return this;
078        }
079
080        if (existing instanceof List)
081        {
082            ((List) existing).add(parameterValue);
083            return this;
084        }
085
086        // Convert from a single String to a List of Strings.
087
088        List list = new ArrayList();
089        list.add(existing);
090        list.add(parameterValue);
091
092        parameters.put(parameterName, list);
093
094        return this;
095    }
096
097    public TestableRequest overrideParameter(String parameterName, String parameterValue)
098    {
099        parameters.put(parameterName, parameterValue);
100
101        return this;
102    }
103
104    public long getDateHeader(String name)
105    {
106        return 0;
107    }
108
109    /**
110     * Returns null.
111     */
112    public String getHeader(String name)
113    {
114        return null;
115    }
116
117    /**
118     * Returns an empty list.
119     */
120    public List<String> getHeaderNames()
121    {
122        return Collections.emptyList();
123    }
124
125    public Locale getLocale()
126    {
127        return locale;
128    }
129
130    public List<String> getParameterNames()
131    {
132        return InternalUtils.sortedKeys(parameters);
133    }
134
135    public String[] getParameters(String name)
136    {
137        Object value = parameters.get(name);
138
139        if (value == null)
140            return null;
141
142        if (value instanceof String)
143            return new String[]
144            { (String) value };
145
146        List list = (List) value;
147
148        return (String[]) list.toArray(new String[list.size()]);
149    }
150
151    public String getPath()
152    {
153        return path;
154    }
155
156    public String getContextPath()
157    {
158        return contextPath;
159    }
160
161    public String getParameter(String name)
162    {
163        Object value = parameters.get(name);
164
165        if (value == null || value instanceof String)
166            return (String) value;
167
168        List<String> list = (List<String>) value;
169
170        return list.get(0);
171    }
172
173    public Session getSession(boolean create)
174    {
175        if (!create)
176            return session;
177
178        if (session == null)
179            session = new PageTesterSession();
180
181        return session;
182    }
183
184    public void setEncoding(String requestEncoding)
185    {
186    }
187
188    /**
189     * Always returns false. If you need to test Ajax functionality, you need to be using Selenium.
190     */
191    public boolean isXHR()
192    {
193        return false;
194    }
195
196    public boolean isSecure()
197    {
198        return false;
199    }
200
201    /**
202     * Always returns true.
203     */
204    public boolean isRequestedSessionIdValid()
205    {
206        return true;
207    }
208
209    public Object getAttribute(String name)
210    {
211        return attributes.get(name);
212    }
213
214    public void setAttribute(String name, Object value)
215    {
216        attributes.put(name, value);
217    }
218
219    /**
220     * Returns "localhost" which is sufficient for testing purposes.
221     */
222    public String getServerName()
223    {
224        return "localhost";
225    }
226
227    /**
228     * Always returns POST, to keep the Form component happy.
229     */
230    public String getMethod()
231    {
232        return "POST";
233    }
234
235    /**
236     * Always returns 80.
237     */
238    public int getLocalPort()
239    {
240        return 80;
241    }
242
243    /**
244     * Always returns 80.
245     * 
246     * @since 5.2.5
247     */
248    public int getServerPort()
249    {
250        return 80;
251    }
252
253    /**
254     * Always returns "localhost".
255     *
256     * @since 5.3
257     */
258    public String getRemoteHost()
259    {
260        return "localhost";
261    }
262}