blob: 5b4dd61466bf6ea6744b87935063a9982bbf9f9a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.wicket.mock;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.sql.Time;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import jakarta.servlet.http.Cookie;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.UrlUtils;
import org.apache.wicket.request.http.WebRequest;
/**
* Mutable mock {@link WebRequest}.
*
* @author Matej Knopp
*/
public class MockWebRequest extends WebRequest
{
private Url url;
private List<Cookie> cookies = new ArrayList<>();
private Map<String, List<Object>> headers = new HashMap<String, List<Object>>();
private MockRequestParameters postRequestParameters = new MockRequestParameters();
private Locale locale = Locale.getDefault();
private String contextPath;
private String filterPath;
private String prefixToContextPath = "";
/**
* Construct.
*
* @param url
*/
public MockWebRequest(Url url)
{
this.url = url;
}
/**
* Construct.
*
* @param url
* @param contextPath
* @param filterPath
* @param prefixToContextPath
*/
public MockWebRequest(Url url, String contextPath, String filterPath, String prefixToContextPath)
{
this.url = url;
this.contextPath = contextPath;
this.filterPath = filterPath;
this.prefixToContextPath = prefixToContextPath;
}
MockWebRequest(Url url, List<Cookie> cookies, Map<String, List<Object>> headers,
MockRequestParameters postRequestParameters, Locale locale)
{
this.url = url;
this.cookies.addAll(cookies);
this.headers = headers;
this.postRequestParameters = postRequestParameters;
this.locale = locale;
}
@Override
public MockWebRequest cloneWithUrl(Url url)
{
return new MockWebRequest(url, cookies, headers, postRequestParameters, locale);
}
/**
* @param url
*/
public void setUrl(Url url)
{
this.url = url;
}
@Override
public Url getUrl()
{
return url;
}
@Override
public String toString()
{
return "MockWebRequest [url=" + url + "]";
}
/**
* Sets cookies for current request.
*
* @param cookies
*/
public void setCookies(List<Cookie> cookies)
{
this.cookies.clear();
this.cookies.addAll(cookies);
}
/**
* @param cookie
*/
public void addCookie(Cookie cookie)
{
cookies.add(cookie);
}
@Override
public List<Cookie> getCookies()
{
return Collections.unmodifiableList(cookies);
}
@Override
public Instant getDateHeader(String name)
{
List<Object> dates = headers.get(name);
if (dates == null || dates.isEmpty())
{
return null;
}
Object date = dates.get(0);
if (date instanceof Instant == false)
{
throw new WicketRuntimeException("Date header with name '" + name +
"' is not a valid Instant.");
}
return (Instant)date;
}
private void addHeaderObject(String name, Object value)
{
List<Object> values = headers.get(name);
if (values == null)
{
values = new ArrayList<Object>();
headers.put(name, values);
}
values.add(value);
}
/**
* Sets date header for given name.
*
* @param name
* @param value
*/
public void setDateHeader(String name, Time value)
{
removeHeader(name);
addHeaderObject(name, value);
}
/**
* Adds date header for given name.
*
* @param name
* @param value
*/
public void addDateHeader(String name, Time value)
{
addHeaderObject(name, value);
}
@Override
public String getHeader(String name)
{
List<Object> h = headers.get(name);
return (h == null || h.isEmpty()) ? null : h.get(0).toString();
}
/**
* Sets header for given name.
*
* @param name
* @param value
*/
public void setHeader(String name, String value)
{
removeHeader(name);
addHeader(name, value);
}
/**
* Adds header for given name.
*
* @param name
* @param value
*/
public void addHeader(String name, String value)
{
addHeaderObject(name, value);
}
/**
* Sets request locale.
*
* @param locale
*/
public void setLocale(Locale locale)
{
this.locale = locale;
}
@Override
public Locale getLocale()
{
return locale;
}
@Override
public List<String> getHeaders(String name)
{
List<String> res = new ArrayList<String>();
List<Object> values = headers.get(name);
if (values != null)
{
for (Object value : values)
{
if (value != null)
{
res.add(value.toString());
}
}
}
return res;
}
/**
* Removes header with specified name.
*
* @param header
*/
public void removeHeader(String header)
{
headers.remove(header);
}
@Override
public MockRequestParameters getPostParameters()
{
return postRequestParameters;
}
@Override
public Charset getCharset()
{
return StandardCharsets.UTF_8;
}
@Override
public Url getClientUrl()
{
Url baseUrl = new Url(url);
baseUrl.getQueryParameters().clear();
baseUrl.setContextRelative(url.isContextRelative());
return baseUrl;
}
@Override
public Object getContainerRequest()
{
return this;
}
@Override
public String getContextPath()
{
return UrlUtils.normalizePath(contextPath);
}
/**
* @param contextPath
* @return this
*/
public MockWebRequest setContextPath(String contextPath)
{
this.contextPath = contextPath;
return this;
}
@Override
public String getFilterPath()
{
return UrlUtils.normalizePath(filterPath);
}
/**
* @param filterPath
* @return this
*/
public MockWebRequest setFilterPath(String filterPath)
{
this.filterPath = filterPath;
return this;
}
@Override
public String getPrefixToContextPath()
{
return prefixToContextPath;
}
/**
* @param prefixToContextPath
* @return this
*/
public MockWebRequest setPrefixToContextPath(String prefixToContextPath)
{
this.prefixToContextPath = prefixToContextPath;
return this;
}
}