diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java
index 83bb95ca0e..dc161f0daa 100644
--- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java
+++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java
@@ -987,9 +987,9 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
/**
- * Add a header entry for the given name.
- *
While this method can take any {@code Object} as a parameter, it
- * is recommended to use the following types:
+ * Add an HTTP header entry for the given name.
+ *
While this method can take any {@code Object} as a parameter,
+ * it is recommended to use the following types:
*
* String or any Object to be converted using {@code toString()}; see {@link #getHeader}.
* String, Number, or Date for date headers; see {@link #getDateHeader}.
@@ -1041,6 +1041,15 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
}
+ /**
+ * Remove already registered values for the specified HTTP header, if any.
+ * @since 5.1.1
+ */
+ public void removeHeader(String name) {
+ Assert.notNull(name, "Header name must not be null");
+ this.headers.remove(name);
+ }
+
/**
* Return the long timestamp for the date header with the given {@code name}.
* If the internal value representation is a String, this method will try
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/HeaderValueHolder.java b/spring-web/src/test/java/org/springframework/mock/web/test/HeaderValueHolder.java
index 6588a633e5..c5cf43172a 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/HeaderValueHolder.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/HeaderValueHolder.java
@@ -23,6 +23,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
@@ -38,7 +39,7 @@ class HeaderValueHolder {
private final List values = new LinkedList<>();
- public void setValue(Object value) {
+ public void setValue(@Nullable Object value) {
this.values.clear();
if (value != null) {
this.values.add(value);
@@ -69,10 +70,12 @@ class HeaderValueHolder {
return Collections.unmodifiableList(stringList);
}
+ @Nullable
public Object getValue() {
return (!this.values.isEmpty() ? this.values.get(0) : null);
}
+ @Nullable
public String getStringValue() {
return (!this.values.isEmpty() ? String.valueOf(this.values.get(0)) : null);
}
@@ -90,6 +93,7 @@ class HeaderValueHolder {
* @return the corresponding HeaderValueHolder,
* or {@code null} if none found
*/
+ @Nullable
public static HeaderValueHolder getByName(Map headers, String name) {
Assert.notNull(name, "Header name must not be null");
for (String headerName : headers.keySet()) {
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockAsyncContext.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockAsyncContext.java
index 33f97100a7..ebe752cd22 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockAsyncContext.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockAsyncContext.java
@@ -116,7 +116,7 @@ public class MockAsyncContext implements AsyncContext {
@Override
public void complete() {
- MockHttpServletRequest mockRequest = WebUtils.getNativeRequest(request, MockHttpServletRequest.class);
+ MockHttpServletRequest mockRequest = WebUtils.getNativeRequest(this.request, MockHttpServletRequest.class);
if (mockRequest != null) {
mockRequest.setAsyncStarted(false);
}
@@ -154,6 +154,17 @@ public class MockAsyncContext implements AsyncContext {
return BeanUtils.instantiateClass(clazz);
}
+ /**
+ * By default this is set to 10000 (10 seconds) even though the Servlet API
+ * specifies a default async request timeout of 30 seconds. Keep in mind the
+ * timeout could further be impacted by global configuration through the MVC
+ * Java config or the XML namespace, as well as be overridden per request on
+ * {@link org.springframework.web.context.request.async.DeferredResult DeferredResult}
+ * or on
+ * {@link org.springframework.web.servlet.mvc.method.annotation.SseEmitter SseEmitter}.
+ * @param timeout the timeout value to use.
+ * @see AsyncContext#setTimeout(long)
+ */
@Override
public void setTimeout(long timeout) {
this.timeout = timeout;
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockBodyContent.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockBodyContent.java
index 0c13774c0a..d02bb4c145 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockBodyContent.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockBodyContent.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2018 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,6 +24,8 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
+import org.springframework.lang.Nullable;
+
/**
* Mock implementation of the {@link javax.servlet.jsp.tagext.BodyContent} class.
* Only necessary for testing applications when testing custom JSP tags.
@@ -60,12 +62,12 @@ public class MockBodyContent extends BodyContent {
* @param response the servlet response to wrap
* @param targetWriter the target Writer to wrap
*/
- public MockBodyContent(String content, HttpServletResponse response, Writer targetWriter) {
+ public MockBodyContent(String content, @Nullable HttpServletResponse response, @Nullable Writer targetWriter) {
super(adaptJspWriter(targetWriter, response));
this.content = content;
}
- private static JspWriter adaptJspWriter(Writer targetWriter, HttpServletResponse response) {
+ private static JspWriter adaptJspWriter(@Nullable Writer targetWriter, @Nullable HttpServletResponse response) {
if (targetWriter instanceof JspWriter) {
return (JspWriter) targetWriter;
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterChain.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterChain.java
index 7136d2160d..037465c90a 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterChain.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterChain.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2017 the original author or authors.
+ * Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@ import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
@@ -49,12 +50,15 @@ import org.springframework.util.ObjectUtils;
*/
public class MockFilterChain implements FilterChain {
+ @Nullable
private ServletRequest request;
+ @Nullable
private ServletResponse response;
private final List filters;
+ @Nullable
private Iterator iterator;
@@ -97,6 +101,7 @@ public class MockFilterChain implements FilterChain {
/**
* Return the request that {@link #doFilter} has been called with.
*/
+ @Nullable
public ServletRequest getRequest() {
return this.request;
}
@@ -104,12 +109,13 @@ public class MockFilterChain implements FilterChain {
/**
* Return the response that {@link #doFilter} has been called with.
*/
+ @Nullable
public ServletResponse getResponse() {
return this.response;
}
/**
- * Invoke registered {@link Filter}s and/or {@link Servlet} also saving the
+ * Invoke registered {@link Filter Filters} and/or {@link Servlet} also saving the
* request and response.
*/
@Override
@@ -144,7 +150,7 @@ public class MockFilterChain implements FilterChain {
/**
* A filter that simply delegates to a Servlet.
*/
- private static class ServletFilterProxy implements Filter {
+ private static final class ServletFilterProxy implements Filter {
private final Servlet delegateServlet;
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterConfig.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterConfig.java
index fbfc1a17f3..01a1979cc7 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterConfig.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockFilterConfig.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2017 the original author or authors.
+ * Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@ import java.util.Map;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -64,7 +65,7 @@ public class MockFilterConfig implements FilterConfig {
* Create a new MockFilterConfig.
* @param servletContext the ServletContext that the servlet runs in
*/
- public MockFilterConfig(ServletContext servletContext) {
+ public MockFilterConfig(@Nullable ServletContext servletContext) {
this(servletContext, "");
}
@@ -73,7 +74,7 @@ public class MockFilterConfig implements FilterConfig {
* @param servletContext the ServletContext that the servlet runs in
* @param filterName the name of the filter
*/
- public MockFilterConfig(ServletContext servletContext, String filterName) {
+ public MockFilterConfig(@Nullable ServletContext servletContext, String filterName) {
this.servletContext = (servletContext != null ? servletContext : new MockServletContext());
this.filterName = filterName;
}
@@ -81,12 +82,12 @@ public class MockFilterConfig implements FilterConfig {
@Override
public String getFilterName() {
- return filterName;
+ return this.filterName;
}
@Override
public ServletContext getServletContext() {
- return servletContext;
+ return this.servletContext;
}
public void addInitParameter(String name, String value) {
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java
index 357239d1ed..d09c869745 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java
@@ -58,6 +58,7 @@ import javax.servlet.http.Part;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.LinkedCaseInsensitiveMap;
import org.springframework.util.LinkedMultiValueMap;
@@ -101,7 +102,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
new BufferedReader(new StringReader(""));
/**
- * Date formats as specified in the HTTP RFC
+ * Date formats as specified in the HTTP RFC.
* @see Section 7.1.1.1 of RFC 7231
*/
private static final String[] DATE_FORMATS = new String[] {
@@ -168,14 +169,19 @@ public class MockHttpServletRequest implements HttpServletRequest {
private final Map attributes = new LinkedHashMap<>();
+ @Nullable
private String characterEncoding;
+ @Nullable
private byte[] content;
+ @Nullable
private String contentType;
+ @Nullable
private ServletInputStream inputStream;
+ @Nullable
private BufferedReader reader;
private final Map parameters = new LinkedHashMap<>(16);
@@ -192,7 +198,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
private String remoteHost = DEFAULT_REMOTE_HOST;
- /** List of locales in descending order */
+ /** List of locales in descending order. */
private final List locales = new LinkedList<>();
private boolean secure = false;
@@ -209,6 +215,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
private boolean asyncSupported = false;
+ @Nullable
private MockAsyncContext asyncContext;
private DispatcherType dispatcherType = DispatcherType.REQUEST;
@@ -218,32 +225,42 @@ public class MockHttpServletRequest implements HttpServletRequest {
// HttpServletRequest properties
// ---------------------------------------------------------------------
+ @Nullable
private String authType;
+ @Nullable
private Cookie[] cookies;
private final Map headers = new LinkedCaseInsensitiveMap<>();
+ @Nullable
private String method;
+ @Nullable
private String pathInfo;
private String contextPath = "";
+ @Nullable
private String queryString;
+ @Nullable
private String remoteUser;
private final Set userRoles = new HashSet<>();
+ @Nullable
private Principal userPrincipal;
+ @Nullable
private String requestedSessionId;
+ @Nullable
private String requestURI;
private String servletPath = "";
+ @Nullable
private HttpSession session;
private boolean requestedSessionIdValid = true;
@@ -277,7 +294,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
* @see #setRequestURI
* @see #MockHttpServletRequest(ServletContext, String, String)
*/
- public MockHttpServletRequest(String method, String requestURI) {
+ public MockHttpServletRequest(@Nullable String method, @Nullable String requestURI) {
this(null, method, requestURI);
}
@@ -287,7 +304,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
* (may be {@code null} to use a default {@link MockServletContext})
* @see #MockHttpServletRequest(ServletContext, String, String)
*/
- public MockHttpServletRequest(ServletContext servletContext) {
+ public MockHttpServletRequest(@Nullable ServletContext servletContext) {
this(servletContext, "", "");
}
@@ -304,7 +321,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
* @see #setPreferredLocales
* @see MockServletContext
*/
- public MockHttpServletRequest(ServletContext servletContext, String method, String requestURI) {
+ public MockHttpServletRequest(@Nullable ServletContext servletContext, @Nullable String method, @Nullable String requestURI) {
this.servletContext = (servletContext != null ? servletContext : new MockServletContext());
this.method = method;
this.requestURI = requestURI;
@@ -373,12 +390,13 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public String getCharacterEncoding() {
return this.characterEncoding;
}
@Override
- public void setCharacterEncoding(String characterEncoding) {
+ public void setCharacterEncoding(@Nullable String characterEncoding) {
this.characterEncoding = characterEncoding;
updateContentTypeHeader();
}
@@ -403,7 +421,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
* @see #getContentAsByteArray()
* @see #getContentAsString()
*/
- public void setContent(byte[] content) {
+ public void setContent(@Nullable byte[] content) {
this.content = content;
}
@@ -414,6 +432,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
* @see #setContent(byte[])
* @see #getContentAsString()
*/
+ @Nullable
public byte[] getContentAsByteArray() {
return this.content;
}
@@ -429,6 +448,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
* @see #setCharacterEncoding(String)
* @see #getContentAsByteArray()
*/
+ @Nullable
public String getContentAsString() throws IllegalStateException, UnsupportedEncodingException {
Assert.state(this.characterEncoding != null,
"Cannot get content as a String for a null character encoding. " +
@@ -450,7 +470,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
return getContentLength();
}
- public void setContentType(String contentType) {
+ public void setContentType(@Nullable String contentType) {
this.contentType = contentType;
if (contentType != null) {
try {
@@ -471,6 +491,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public String getContentType() {
return this.contentType;
}
@@ -536,7 +557,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
* If there are already one or more values registered for the given
* parameter name, the given value will be added to the end of the list.
*/
- public void addParameter(String name, String value) {
+ public void addParameter(String name, @Nullable String value) {
addParameter(name, new String[] {value});
}
@@ -596,6 +617,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public String getParameter(String name) {
Assert.notNull(name, "Parameter name must not be null");
String[] arr = this.parameters.get(name);
@@ -725,7 +747,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
- public void setAttribute(String name, Object value) {
+ public void setAttribute(String name, @Nullable Object value) {
checkActive();
Assert.notNull(name, "Attribute name must not be null");
if (value != null) {
@@ -763,8 +785,8 @@ public class MockHttpServletRequest implements HttpServletRequest {
/**
* Set the list of preferred locales, in descending order, effectively replacing
* any existing locales.
- * @see #addPreferredLocale
* @since 3.2
+ * @see #addPreferredLocale
*/
public void setPreferredLocales(List locales) {
Assert.notEmpty(locales, "Locale list must not be empty");
@@ -889,7 +911,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
- public AsyncContext startAsync(ServletRequest request, ServletResponse response) {
+ public AsyncContext startAsync(ServletRequest request, @Nullable ServletResponse response) {
Assert.state(this.asyncSupported, "Async not supported");
this.asyncStarted = true;
this.asyncContext = new MockAsyncContext(request, response);
@@ -914,11 +936,12 @@ public class MockHttpServletRequest implements HttpServletRequest {
return this.asyncSupported;
}
- public void setAsyncContext(MockAsyncContext asyncContext) {
+ public void setAsyncContext(@Nullable MockAsyncContext asyncContext) {
this.asyncContext = asyncContext;
}
@Override
+ @Nullable
public AsyncContext getAsyncContext() {
return this.asyncContext;
}
@@ -937,16 +960,17 @@ public class MockHttpServletRequest implements HttpServletRequest {
// HttpServletRequest interface
// ---------------------------------------------------------------------
- public void setAuthType(String authType) {
+ public void setAuthType(@Nullable String authType) {
this.authType = authType;
}
@Override
+ @Nullable
public String getAuthType() {
return this.authType;
}
- public void setCookies(Cookie... cookies) {
+ public void setCookies(@Nullable Cookie... cookies) {
this.cookies = (ObjectUtils.isEmpty(cookies) ? null : cookies);
this.headers.remove(HttpHeaders.COOKIE);
if (this.cookies != null) {
@@ -957,14 +981,15 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public Cookie[] getCookies() {
return this.cookies;
}
/**
- * Add a header entry for the given name.
- * While this method can take any {@code Object} as a parameter, it
- * is recommended to use the following types:
+ * Add an HTTP header entry for the given name.
+ *
While this method can take any {@code Object} as a parameter,
+ * it is recommended to use the following types:
*
* String or any Object to be converted using {@code toString()}; see {@link #getHeader}.
* String, Number, or Date for date headers; see {@link #getDateHeader}.
@@ -998,7 +1023,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
}
- private void doAddHeaderValue(String name, Object value, boolean replace) {
+ private void doAddHeaderValue(String name, @Nullable Object value, boolean replace) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
Assert.notNull(value, "Header value must not be null");
if (header == null || replace) {
@@ -1016,6 +1041,15 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
}
+ /**
+ * Remove already registered values for the specified HTTP header, if any.
+ * @since 5.1.1
+ */
+ public void removeHeader(String name) {
+ Assert.notNull(name, "Header name must not be null");
+ this.headers.remove(name);
+ }
+
/**
* Return the long timestamp for the date header with the given {@code name}.
* If the internal value representation is a String, this method will try
@@ -1065,6 +1099,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public String getHeader(String name) {
HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
return (header != null ? header.getStringValue() : null);
@@ -1099,25 +1134,28 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
}
- public void setMethod(String method) {
+ public void setMethod(@Nullable String method) {
this.method = method;
}
@Override
+ @Nullable
public String getMethod() {
return this.method;
}
- public void setPathInfo(String pathInfo) {
+ public void setPathInfo(@Nullable String pathInfo) {
this.pathInfo = pathInfo;
}
@Override
+ @Nullable
public String getPathInfo() {
return this.pathInfo;
}
@Override
+ @Nullable
public String getPathTranslated() {
return (this.pathInfo != null ? getRealPath(this.pathInfo) : null);
}
@@ -1131,20 +1169,22 @@ public class MockHttpServletRequest implements HttpServletRequest {
return this.contextPath;
}
- public void setQueryString(String queryString) {
+ public void setQueryString(@Nullable String queryString) {
this.queryString = queryString;
}
@Override
+ @Nullable
public String getQueryString() {
return this.queryString;
}
- public void setRemoteUser(String remoteUser) {
+ public void setRemoteUser(@Nullable String remoteUser) {
this.remoteUser = remoteUser;
}
@Override
+ @Nullable
public String getRemoteUser() {
return this.remoteUser;
}
@@ -1159,29 +1199,32 @@ public class MockHttpServletRequest implements HttpServletRequest {
((MockServletContext) this.servletContext).getDeclaredRoles().contains(role)));
}
- public void setUserPrincipal(Principal userPrincipal) {
+ public void setUserPrincipal(@Nullable Principal userPrincipal) {
this.userPrincipal = userPrincipal;
}
@Override
+ @Nullable
public Principal getUserPrincipal() {
return this.userPrincipal;
}
- public void setRequestedSessionId(String requestedSessionId) {
+ public void setRequestedSessionId(@Nullable String requestedSessionId) {
this.requestedSessionId = requestedSessionId;
}
@Override
+ @Nullable
public String getRequestedSessionId() {
return this.requestedSessionId;
}
- public void setRequestURI(String requestURI) {
+ public void setRequestURI(@Nullable String requestURI) {
this.requestURI = requestURI;
}
@Override
+ @Nullable
public String getRequestURI() {
return this.requestURI;
}
@@ -1222,6 +1265,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public HttpSession getSession(boolean create) {
checkActive();
// Reset session if invalidated.
@@ -1236,6 +1280,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public HttpSession getSession() {
return getSession(true);
}
@@ -1249,7 +1294,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
public String changeSessionId() {
Assert.isTrue(this.session != null, "The request does not have a session");
if (this.session instanceof MockHttpSession) {
- return ((MockHttpSession) session).changeSessionId();
+ return ((MockHttpSession) this.session).changeSessionId();
}
return this.session.getId();
}
@@ -1309,6 +1354,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
}
@Override
+ @Nullable
public Part getPart(String name) throws IOException, ServletException {
return this.parts.getFirst(name);
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpSession.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpSession.java
index 03d4e2cf5a..1013b6b507 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpSession.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpSession.java
@@ -29,6 +29,7 @@ import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -84,7 +85,7 @@ public class MockHttpSession implements HttpSession {
* Create a new MockHttpSession.
* @param servletContext the ServletContext that the session runs in
*/
- public MockHttpSession(ServletContext servletContext) {
+ public MockHttpSession(@Nullable ServletContext servletContext) {
this(servletContext, null);
}
@@ -93,7 +94,7 @@ public class MockHttpSession implements HttpSession {
* @param servletContext the ServletContext that the session runs in
* @param id a unique identifier for this session
*/
- public MockHttpSession(ServletContext servletContext, String id) {
+ public MockHttpSession(@Nullable ServletContext servletContext, @Nullable String id) {
this.servletContext = (servletContext != null ? servletContext : new MockServletContext());
this.id = (id != null ? id : Integer.toString(nextId++));
}
@@ -176,7 +177,7 @@ public class MockHttpSession implements HttpSession {
}
@Override
- public void setAttribute(String name, Object value) {
+ public void setAttribute(String name, @Nullable Object value) {
assertIsValid();
Assert.notNull(name, "Attribute name must not be null");
if (value != null) {
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockJspWriter.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockJspWriter.java
index 23df842dbf..e1447d0a35 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockJspWriter.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockJspWriter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2018 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,6 +22,8 @@ import java.io.Writer;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
+import org.springframework.lang.Nullable;
+
/**
* Mock implementation of the {@link javax.servlet.jsp.JspWriter} class.
* Only necessary for testing applications when testing custom JSP tags.
@@ -33,6 +35,7 @@ public class MockJspWriter extends JspWriter {
private final HttpServletResponse response;
+ @Nullable
private PrintWriter targetWriter;
@@ -58,7 +61,7 @@ public class MockJspWriter extends JspWriter {
* @param response the servlet response to wrap
* @param targetWriter the target Writer to wrap
*/
- public MockJspWriter(HttpServletResponse response, Writer targetWriter) {
+ public MockJspWriter(@Nullable HttpServletResponse response, @Nullable Writer targetWriter) {
super(DEFAULT_BUFFER, true);
this.response = (response != null ? response : new MockHttpServletResponse());
if (targetWriter instanceof PrintWriter) {
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartFile.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartFile.java
index 29193640f5..62cf0e9391 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartFile.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartFile.java
@@ -21,6 +21,7 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
@@ -43,6 +44,7 @@ public class MockMultipartFile implements MultipartFile {
private String originalFilename;
+ @Nullable
private String contentType;
private final byte[] content;
@@ -53,7 +55,7 @@ public class MockMultipartFile implements MultipartFile {
* @param name the name of the file
* @param content the content of the file
*/
- public MockMultipartFile(String name, byte[] content) {
+ public MockMultipartFile(String name, @Nullable byte[] content) {
this(name, "", null, content);
}
@@ -74,7 +76,9 @@ public class MockMultipartFile implements MultipartFile {
* @param contentType the content type (if known)
* @param content the content of the file
*/
- public MockMultipartFile(String name, String originalFilename, String contentType, byte[] content) {
+ public MockMultipartFile(
+ String name, @Nullable String originalFilename, @Nullable String contentType, @Nullable byte[] content) {
+
Assert.hasLength(name, "Name must not be null");
this.name = name;
this.originalFilename = (originalFilename != null ? originalFilename : "");
@@ -90,7 +94,8 @@ public class MockMultipartFile implements MultipartFile {
* @param contentStream the content of the file as stream
* @throws IOException if reading from the stream failed
*/
- public MockMultipartFile(String name, String originalFilename, String contentType, InputStream contentStream)
+ public MockMultipartFile(
+ String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream)
throws IOException {
this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));
@@ -108,6 +113,7 @@ public class MockMultipartFile implements MultipartFile {
}
@Override
+ @Nullable
public String getContentType() {
return this.contentType;
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartHttpServletRequest.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartHttpServletRequest.java
index d74c24c077..3f6ca2c55e 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartHttpServletRequest.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockMultipartHttpServletRequest.java
@@ -25,6 +25,7 @@ import javax.servlet.ServletContext;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@@ -65,7 +66,7 @@ public class MockMultipartHttpServletRequest extends MockHttpServletRequest impl
* @param servletContext the ServletContext that the request runs in
* (may be {@code null} to use a default {@link MockServletContext})
*/
- public MockMultipartHttpServletRequest(ServletContext servletContext) {
+ public MockMultipartHttpServletRequest(@Nullable ServletContext servletContext) {
super(servletContext);
setMethod("POST");
setContentType("multipart/form-data");
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockPageContext.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockPageContext.java
index 16cc0f3413..8812a51e47 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockPageContext.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockPageContext.java
@@ -36,6 +36,7 @@ import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -61,6 +62,7 @@ public class MockPageContext extends PageContext {
private final Map attributes = new LinkedHashMap<>();
+ @Nullable
private JspWriter out;
@@ -79,7 +81,7 @@ public class MockPageContext extends PageContext {
* @param servletContext the ServletContext that the JSP page runs in
* (only necessary when actually accessing the ServletContext)
*/
- public MockPageContext(ServletContext servletContext) {
+ public MockPageContext(@Nullable ServletContext servletContext) {
this(servletContext, null, null, null);
}
@@ -90,7 +92,7 @@ public class MockPageContext extends PageContext {
* @param request the current HttpServletRequest
* (only necessary when actually accessing the request)
*/
- public MockPageContext(ServletContext servletContext, HttpServletRequest request) {
+ public MockPageContext(@Nullable ServletContext servletContext, @Nullable HttpServletRequest request) {
this(servletContext, request, null, null);
}
@@ -101,7 +103,9 @@ public class MockPageContext extends PageContext {
* @param response the current HttpServletResponse
* (only necessary when actually writing to the response)
*/
- public MockPageContext(ServletContext servletContext, HttpServletRequest request, HttpServletResponse response) {
+ public MockPageContext(@Nullable ServletContext servletContext, @Nullable HttpServletRequest request,
+ @Nullable HttpServletResponse response) {
+
this(servletContext, request, response, null);
}
@@ -112,8 +116,8 @@ public class MockPageContext extends PageContext {
* @param response the current HttpServletResponse
* @param servletConfig the ServletConfig (hardly ever accessed from within a tag)
*/
- public MockPageContext(ServletContext servletContext, HttpServletRequest request,
- HttpServletResponse response, ServletConfig servletConfig) {
+ public MockPageContext(@Nullable ServletContext servletContext, @Nullable HttpServletRequest request,
+ @Nullable HttpServletResponse response, @Nullable ServletConfig servletConfig) {
this.servletContext = (servletContext != null ? servletContext : new MockServletContext());
this.request = (request != null ? request : new MockHttpServletRequest(servletContext));
@@ -135,7 +139,7 @@ public class MockPageContext extends PageContext {
}
@Override
- public void setAttribute(String name, Object value) {
+ public void setAttribute(String name, @Nullable Object value) {
Assert.notNull(name, "Attribute name must not be null");
if (value != null) {
this.attributes.put(name, value);
@@ -146,7 +150,7 @@ public class MockPageContext extends PageContext {
}
@Override
- public void setAttribute(String name, Object value, int scope) {
+ public void setAttribute(String name, @Nullable Object value, int scope) {
Assert.notNull(name, "Attribute name must not be null");
switch (scope) {
case PAGE_SCOPE:
@@ -167,12 +171,14 @@ public class MockPageContext extends PageContext {
}
@Override
+ @Nullable
public Object getAttribute(String name) {
Assert.notNull(name, "Attribute name must not be null");
return this.attributes.get(name);
}
@Override
+ @Nullable
public Object getAttribute(String name, int scope) {
Assert.notNull(name, "Attribute name must not be null");
switch (scope) {
@@ -191,6 +197,7 @@ public class MockPageContext extends PageContext {
}
@Override
+ @Nullable
public Object findAttribute(String name) {
Object value = getAttribute(name);
if (value == null) {
@@ -290,12 +297,14 @@ public class MockPageContext extends PageContext {
}
@Override
+ @Nullable
public ELContext getELContext() {
return null;
}
@Override
@Deprecated
+ @Nullable
public javax.servlet.jsp.el.VariableResolver getVariableResolver() {
return null;
}
@@ -321,6 +330,7 @@ public class MockPageContext extends PageContext {
}
@Override
+ @Nullable
public Exception getException() {
return null;
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockPart.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockPart.java
index a5429b3847..8233baaa96 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockPart.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockPart.java
@@ -25,6 +25,7 @@ import javax.servlet.http.Part;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -40,6 +41,7 @@ public class MockPart implements Part {
private final String name;
+ @Nullable
private final String filename;
private final byte[] content;
@@ -51,7 +53,7 @@ public class MockPart implements Part {
* Constructor for a part with byte[] content only.
* @see #getHeaders()
*/
- public MockPart(String name, byte[] content) {
+ public MockPart(String name, @Nullable byte[] content) {
this(name, null, content);
}
@@ -59,7 +61,7 @@ public class MockPart implements Part {
* Constructor for a part with a filename and byte[] content.
* @see #getHeaders()
*/
- public MockPart(String name, String filename, byte[] content) {
+ public MockPart(String name, @Nullable String filename, @Nullable byte[] content) {
Assert.hasLength(name, "'name' must not be empty");
this.name = name;
this.filename = filename;
@@ -74,11 +76,13 @@ public class MockPart implements Part {
}
@Override
+ @Nullable
public String getSubmittedFileName() {
return this.filename;
}
@Override
+ @Nullable
public String getContentType() {
MediaType contentType = this.headers.getContentType();
return (contentType != null ? contentType.toString() : null);
@@ -105,6 +109,7 @@ public class MockPart implements Part {
}
@Override
+ @Nullable
public String getHeader(String name) {
return this.headers.getFirst(name);
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockServletConfig.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockServletConfig.java
index c73d05d657..a6d3cd87bc 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockServletConfig.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockServletConfig.java
@@ -23,6 +23,7 @@ import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -60,7 +61,7 @@ public class MockServletConfig implements ServletConfig {
* Create a new MockServletConfig.
* @param servletContext the ServletContext that the servlet runs in
*/
- public MockServletConfig(ServletContext servletContext) {
+ public MockServletConfig(@Nullable ServletContext servletContext) {
this(servletContext, "");
}
@@ -69,7 +70,7 @@ public class MockServletConfig implements ServletConfig {
* @param servletContext the ServletContext that the servlet runs in
* @param servletName the name of the servlet
*/
- public MockServletConfig(ServletContext servletContext, String servletName) {
+ public MockServletConfig(@Nullable ServletContext servletContext, String servletName) {
this.servletContext = (servletContext != null ? servletContext : new MockServletContext());
this.servletName = servletName;
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java
index e66cb14266..11caa42471 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java
@@ -48,6 +48,7 @@ import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.MediaType;
import org.springframework.http.MediaTypeFactory;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.MimeType;
@@ -129,14 +130,17 @@ public class MockServletContext implements ServletContext {
private final Set declaredRoles = new LinkedHashSet<>();
+ @Nullable
private Set sessionTrackingModes;
private final SessionCookieConfig sessionCookieConfig = new MockSessionCookieConfig();
private int sessionTimeout;
+ @Nullable
private String requestCharacterEncoding;
+ @Nullable
private String responseCharacterEncoding;
private final Map mimeTypes = new LinkedHashMap<>();
@@ -165,7 +169,7 @@ public class MockServletContext implements ServletContext {
* and no base path.
* @param resourceLoader the ResourceLoader to use (or null for the default)
*/
- public MockServletContext(ResourceLoader resourceLoader) {
+ public MockServletContext(@Nullable ResourceLoader resourceLoader) {
this("", resourceLoader);
}
@@ -178,7 +182,7 @@ public class MockServletContext implements ServletContext {
* @param resourceLoader the ResourceLoader to use (or null for the default)
* @see #registerNamedDispatcher
*/
- public MockServletContext(String resourceBasePath, ResourceLoader resourceLoader) {
+ public MockServletContext(String resourceBasePath, @Nullable ResourceLoader resourceLoader) {
this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader());
this.resourceBasePath = resourceBasePath;
@@ -262,6 +266,7 @@ public class MockServletContext implements ServletContext {
}
@Override
+ @Nullable
public String getMimeType(String filePath) {
String extension = StringUtils.getFilenameExtension(filePath);
if (this.mimeTypes.containsKey(extension)) {
@@ -285,6 +290,7 @@ public class MockServletContext implements ServletContext {
}
@Override
+ @Nullable
public Set getResourcePaths(String path) {
String actualPath = (path.endsWith("/") ? path : path + "/");
Resource resource = this.resourceLoader.getResource(getResourceLocation(actualPath));
@@ -313,6 +319,7 @@ public class MockServletContext implements ServletContext {
}
@Override
+ @Nullable
public URL getResource(String path) throws MalformedURLException {
Resource resource = this.resourceLoader.getResource(getResourceLocation(path));
if (!resource.exists()) {
@@ -333,6 +340,7 @@ public class MockServletContext implements ServletContext {
}
@Override
+ @Nullable
public InputStream getResourceAsStream(String path) {
Resource resource = this.resourceLoader.getResource(getResourceLocation(path));
if (!resource.exists()) {
@@ -414,6 +422,7 @@ public class MockServletContext implements ServletContext {
@Deprecated
@Override
+ @Nullable
public Servlet getServlet(String name) {
return null;
}
@@ -447,6 +456,7 @@ public class MockServletContext implements ServletContext {
}
@Override
+ @Nullable
public String getRealPath(String path) {
Resource resource = this.resourceLoader.getResource(getResourceLocation(path));
try {
@@ -492,6 +502,7 @@ public class MockServletContext implements ServletContext {
}
@Override
+ @Nullable
public Object getAttribute(String name) {
Assert.notNull(name, "Attribute name must not be null");
return this.attributes.get(name);
@@ -503,7 +514,7 @@ public class MockServletContext implements ServletContext {
}
@Override
- public void setAttribute(String name, Object value) {
+ public void setAttribute(String name, @Nullable Object value) {
Assert.notNull(name, "Attribute name must not be null");
if (value != null) {
this.attributes.put(name, value);
@@ -529,6 +540,7 @@ public class MockServletContext implements ServletContext {
}
@Override
+ @Nullable
public ClassLoader getClassLoader() {
return ClassUtils.getDefaultClassLoader();
}
@@ -579,21 +591,23 @@ public class MockServletContext implements ServletContext {
}
@Override // on Servlet 4.0
- public void setRequestCharacterEncoding(String requestCharacterEncoding) {
+ public void setRequestCharacterEncoding(@Nullable String requestCharacterEncoding) {
this.requestCharacterEncoding = requestCharacterEncoding;
}
@Override // on Servlet 4.0
+ @Nullable
public String getRequestCharacterEncoding() {
return this.requestCharacterEncoding;
}
@Override // on Servlet 4.0
- public void setResponseCharacterEncoding(String responseCharacterEncoding) {
+ public void setResponseCharacterEncoding(@Nullable String responseCharacterEncoding) {
this.responseCharacterEncoding = responseCharacterEncoding;
}
@Override // on Servlet 4.0
+ @Nullable
public String getResponseCharacterEncoding() {
return this.responseCharacterEncoding;
}
@@ -638,6 +652,7 @@ public class MockServletContext implements ServletContext {
* @see javax.servlet.ServletContext#getServletRegistration(java.lang.String)
*/
@Override
+ @Nullable
public ServletRegistration getServletRegistration(String servletName) {
return null;
}
@@ -676,6 +691,7 @@ public class MockServletContext implements ServletContext {
* @see javax.servlet.ServletContext#getFilterRegistration(java.lang.String)
*/
@Override
+ @Nullable
public FilterRegistration getFilterRegistration(String filterName) {
return null;
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockSessionCookieConfig.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockSessionCookieConfig.java
index 5933d2c781..5f4e1326e9 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/MockSessionCookieConfig.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockSessionCookieConfig.java
@@ -18,6 +18,8 @@ package org.springframework.mock.web.test;
import javax.servlet.SessionCookieConfig;
+import org.springframework.lang.Nullable;
+
/**
* Mock implementation of the {@link javax.servlet.SessionCookieConfig} interface.
*
@@ -27,12 +29,16 @@ import javax.servlet.SessionCookieConfig;
*/
public class MockSessionCookieConfig implements SessionCookieConfig {
+ @Nullable
private String name;
+ @Nullable
private String domain;
+ @Nullable
private String path;
+ @Nullable
private String comment;
private boolean httpOnly;
@@ -43,41 +49,45 @@ public class MockSessionCookieConfig implements SessionCookieConfig {
@Override
- public void setName(String name) {
+ public void setName(@Nullable String name) {
this.name = name;
}
@Override
+ @Nullable
public String getName() {
return this.name;
}
@Override
- public void setDomain(String domain) {
+ public void setDomain(@Nullable String domain) {
this.domain = domain;
}
@Override
+ @Nullable
public String getDomain() {
return this.domain;
}
@Override
- public void setPath(String path) {
+ public void setPath(@Nullable String path) {
this.path = path;
}
@Override
+ @Nullable
public String getPath() {
return this.path;
}
@Override
- public void setComment(String comment) {
+ public void setComment(@Nullable String comment) {
this.comment = comment;
}
@Override
+ @Nullable
public String getComment() {
return this.comment;
}
diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/PassThroughFilterChain.java b/spring-web/src/test/java/org/springframework/mock/web/test/PassThroughFilterChain.java
index 3fb2b44a93..412492b7e7 100644
--- a/spring-web/src/test/java/org/springframework/mock/web/test/PassThroughFilterChain.java
+++ b/spring-web/src/test/java/org/springframework/mock/web/test/PassThroughFilterChain.java
@@ -24,6 +24,7 @@ import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -40,10 +41,13 @@ import org.springframework.util.Assert;
*/
public class PassThroughFilterChain implements FilterChain {
+ @Nullable
private Filter filter;
+ @Nullable
private FilterChain nextFilterChain;
+ @Nullable
private Servlet servlet;