diff --git a/build.gradle b/build.gradle index 9c0ea10f02728418cb4ea340246e33cd3bb033f2..2b859c104bd2d7bfe03204bfc316fd4614ccba62 100644 --- a/build.gradle +++ b/build.gradle @@ -55,6 +55,7 @@ configure(allprojects) { project -> ext.jettyVersion = "9.3.10.v20160621" ext.jodaVersion = "2.9.4" ext.jpaVersion = "2.1.1" + ext.jspVersion = "2.3.2-b02" ext.jtaVersion = "1.2" ext.junitVersion = "4.12" ext.junitJupiterVersion = '5.0.0-M1' @@ -69,6 +70,7 @@ configure(allprojects) { project -> ext.reactorNettyVersion = '2.5.0.BUILD-SNAPSHOT' ext.rxJavaVersion = '1.1.6' ext.romeVersion = "1.6.0" + ext.servletVersion = "3.1.0" ext.slf4jVersion = "1.7.21" ext.snakeyamlVersion = "1.17" ext.snifferVersion = "1.15" @@ -77,6 +79,7 @@ configure(allprojects) { project -> ext.tomcatVersion = "8.5.3" ext.tyrusVersion = "1.13" ext.undertowVersion = "1.4.0.CR3" + ext.websocketVersion = "1.1" ext.woodstoxVersion = "5.0.2" ext.xmlunitVersion = "1.6" ext.xstreamVersion = "1.4.9" @@ -516,7 +519,7 @@ project("spring-messaging") { optional("org.eclipse.jetty.websocket:websocket-client:${jettyVersion}") optional("com.fasterxml.jackson.core:jackson-databind:${jackson2Version}") testCompile("javax.inject:javax.inject-tck:1") - testCompile("javax.servlet:javax.servlet-api:3.1.0") + testCompile("javax.servlet:javax.servlet-api:${servletVersion}") testCompile("javax.validation:validation-api:${beanvalVersion}") testCompile("com.thoughtworks.xstream:xstream:${xstreamVersion}") testCompile("org.apache.activemq:activemq-broker:5.8.0") @@ -674,9 +677,9 @@ project("spring-web") { compile(project(":spring-beans")) // for MultipartFilter compile(project(":spring-context")) compile(project(":spring-core")) - provided "javax.servlet:javax.servlet-api:3.1.0" + provided "javax.servlet:javax.servlet-api:${servletVersion}" optional(project(":spring-oxm")) // for MarshallingHttpMessageConverter - optional("javax.servlet.jsp:javax.servlet.jsp-api:2.2.1") + optional("javax.servlet.jsp:javax.servlet.jsp-api:${jspVersion}") optional("javax.el:javax.el-api:2.2.5") optional("javax.faces:javax.faces-api:2.2") optional("javax.validation:validation-api:${beanvalVersion}") @@ -750,7 +753,7 @@ project("spring-orm") { exclude group: 'org.eclipse.persistence', module: 'javax.persistence' } optional("org.hibernate:hibernate-core:${hibernate5Version}") - optional("javax.servlet:javax.servlet-api:3.0.1") + optional("javax.servlet:javax.servlet-api:${servletVersion}") testCompile("org.aspectj:aspectjweaver:${aspectjVersion}") testCompile("org.hsqldb:hsqldb:${hsqldbVersion}") testCompile("org.slf4j:slf4j-jcl:${slf4jVersion}") @@ -768,10 +771,10 @@ project("spring-webmvc") { compile(files(project(":spring-core").objenesisRepackJar)) compile(project(":spring-expression")) compile(project(":spring-web")) - provided("javax.servlet:javax.servlet-api:3.1.0") + provided("javax.servlet:javax.servlet-api:${servletVersion}") optional(project(":spring-context-support")) // for FreeMarker support optional(project(":spring-oxm")) // for MarshallingView - optional("javax.servlet.jsp:javax.servlet.jsp-api:2.2.1") + optional("javax.servlet.jsp:javax.servlet.jsp-api:${jspVersion}") optional("javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.1") optional("org.apache.poi:poi:${poiVersion}") optional("org.apache.poi:poi-ooxml:${poiVersion}") @@ -838,7 +841,7 @@ project("spring-web-reactive") { compile "org.reactivestreams:reactive-streams:1.0.0" compile "io.projectreactor:reactor-core:${reactorCoreVersion}" optional(project(":spring-context-support")) // for FreeMarker support - provided "javax.servlet:javax.servlet-api:3.1.0" + provided "javax.servlet:javax.servlet-api:${servletVersion}" optional("com.fasterxml.jackson.core:jackson-databind:${jackson2Version}") optional("org.freemarker:freemarker:${freemarkerVersion}") optional "org.apache.httpcomponents:httpclient:4.5.1" // Needed to run Javadoc without error @@ -868,8 +871,8 @@ project("spring-websocket") { compile(project(":spring-web")) optional(project(":spring-messaging")) optional(project(":spring-webmvc")) - optional("javax.servlet:javax.servlet-api:3.1.0") - optional("javax.websocket:javax.websocket-api:1.0") + optional("javax.servlet:javax.servlet-api:${servletVersion}") + optional("javax.websocket:javax.websocket-api:${websocketVersion}") optional("org.apache.tomcat:tomcat-websocket:${tomcatVersion}") { exclude group: "org.apache.tomcat", module: "tomcat-websocket-api" exclude group: "org.apache.tomcat", module: "tomcat-servlet-api" @@ -926,14 +929,14 @@ project("spring-test") { optional("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}") optional("org.testng:testng:${testngVersion}") optional("javax.inject:javax.inject:1") - optional("javax.servlet:javax.servlet-api:3.0.1") - optional("javax.servlet.jsp:javax.servlet.jsp-api:2.2.1") + optional("javax.servlet:javax.servlet-api:${servletVersion}") + optional("javax.servlet.jsp:javax.servlet.jsp-api:${jspVersion}") optional("javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.1") optional("org.apache.taglibs:taglibs-standard-jstlel:1.2.1") { exclude group: "org.apache.taglibs", module: "taglibs-standard-spec" } optional("javax.el:javax.el-api:2.2.5") - optional("javax.websocket:javax.websocket-api:1.0") + optional("javax.websocket:javax.websocket-api:${websocketVersion}") optional("org.aspectj:aspectjweaver:${aspectjVersion}") optional("org.codehaus.groovy:groovy-all:${groovyVersion}") optional("org.hamcrest:hamcrest-core:${hamcrestVersion}") @@ -1131,7 +1134,7 @@ configure(rootProject) { testCompile(project(":spring-test")) testCompile(project(":spring-tx")) testCompile(project(":spring-web")) - testCompile("javax.servlet:javax.servlet-api:3.0.1") + testCompile("javax.servlet:javax.servlet-api:${servletVersion}") testCompile("javax.inject:javax.inject:1") testCompile("javax.resource:javax.resource-api:${jcaVersion}") testCompile("org.aspectj:aspectjweaver:${aspectjVersion}") diff --git a/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletInputStream.java b/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletInputStream.java index 1b8cf3eeba6b5e1ecf126cab9af1c296220730a6..f40e776264730d187a605d804b0b3126bdf5d313 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletInputStream.java +++ b/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletInputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 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. @@ -18,6 +18,7 @@ package org.springframework.mock.web; import java.io.IOException; import java.io.InputStream; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import org.springframework.util.Assert; @@ -36,6 +37,8 @@ public class DelegatingServletInputStream extends ServletInputStream { private final InputStream sourceStream; + private boolean finished = false; + /** * Create a DelegatingServletInputStream for the given source stream. @@ -56,7 +59,11 @@ public class DelegatingServletInputStream extends ServletInputStream { @Override public int read() throws IOException { - return this.sourceStream.read(); + int data = this.sourceStream.read(); + if (data == -1) { + this.finished = true; + } + return data; } @Override @@ -65,4 +72,19 @@ public class DelegatingServletInputStream extends ServletInputStream { this.sourceStream.close(); } + @Override + public boolean isFinished() { + return this.finished; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } + } diff --git a/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletOutputStream.java b/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletOutputStream.java index d580974a6084c5b73bab0b1ec4ab0f4f79d332dd..bf12ea906b5b469aae24e4e693a69997414995d5 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletOutputStream.java +++ b/spring-test/src/main/java/org/springframework/mock/web/DelegatingServletOutputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 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. @@ -19,6 +19,7 @@ package org.springframework.mock.web; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import org.springframework.util.Assert; @@ -71,4 +72,14 @@ public class DelegatingServletOutputStream extends ServletOutputStream { this.targetStream.close(); } + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + throw new UnsupportedOperationException(); + } + } 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 45897aa08d24765423cab8b31c46acfc5eefb92f..8fa1a191ce14ebdb242b44712e78bd71d1a82956 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 @@ -51,6 +51,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.Part; import org.springframework.http.MediaType; @@ -68,7 +69,7 @@ import org.springframework.util.StringUtils; * is {@link Locale#ENGLISH}. This value can be changed via {@link #addPreferredLocale} * or {@link #setPreferredLocales}. * - *

As of Spring Framework 4.0, this set of mocks is designed on a Servlet 3.0 baseline. + *

As of Spring Framework 5.0, this set of mocks is designed on a Servlet 3.1 baseline. * * @author Juergen Hoeller * @author Rod Johnson @@ -1216,4 +1217,9 @@ public class MockHttpServletRequest implements HttpServletRequest { return result; } + @Override + public T upgrade(Class handlerClass) throws IOException, ServletException { + throw new UnsupportedOperationException(); + } + } diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java index 5d63c2f5402e34b36c2afd70cb6e93e316425587..1d112875261d25202ce76e648f0dc31fb1b741ff 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java @@ -45,9 +45,7 @@ import org.springframework.web.util.WebUtils; /** * Mock implementation of the {@link javax.servlet.http.HttpServletResponse} interface. * - *

As of Spring 4.0, this set of mocks is designed on a Servlet 3.0 baseline. - * Beyond that, {@code MockHttpServletResponse} is also compatible with Servlet - * 3.1's {@code setContentLengthLong()} method. + *

As of Spring Framework 5.0, this set of mocks is designed on a Servlet 3.1 baseline. * * @author Juergen Hoeller * @author Rod Johnson diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java b/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java index 6861381fbca99636ea39cb41f12411be5704e7bc..9d45cb7247955dbcf1a4b1f20b1efd2b71f838fc 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java @@ -676,4 +676,9 @@ public class MockServletContext implements ServletContext { throw new UnsupportedOperationException(); } + @Override + public String getVirtualServerName() { + throw new UnsupportedOperationException(); + } + } diff --git a/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java b/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java index eac685801a74821d4323fd803589df28db3f528f..79bca0ca7aa9a2d24df5586daf5a35117322e41b 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java @@ -42,6 +42,9 @@ import org.springframework.web.util.WebUtils; * (e.g. a {@link org.springframework.web.servlet.View}) is still rendered. * As such, this filter only saves bandwidth, not server performance. * + *

NOTE: As of Spring Framework 5.0, this filter uses request/response + * decorators built on the Servlet 3.1 API. + * * @author Arjen Poutsma * @author Rossen Stoyanchev * @author Juergen Hoeller diff --git a/spring-web/src/main/java/org/springframework/web/util/ContentCachingRequestWrapper.java b/spring-web/src/main/java/org/springframework/web/util/ContentCachingRequestWrapper.java index 6029e5170a4a14898174853567332868d4272d50..1ad54d202ce81a1495bcda3eb5c7a85946fb8163 100644 --- a/spring-web/src/main/java/org/springframework/web/util/ContentCachingRequestWrapper.java +++ b/spring-web/src/main/java/org/springframework/web/util/ContentCachingRequestWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -39,6 +39,7 @@ import org.springframework.http.HttpMethod; * and allows this content to be retrieved via a {@link #getContentAsByteArray() byte array}. * *

Used e.g. by {@link org.springframework.web.filter.AbstractRequestLoggingFilter}. + * Note: As of Spring Framework 5.0, this wrapper is built on the Servlet 3.1 API. * * @author Juergen Hoeller * @author Brian Clozel @@ -166,7 +167,6 @@ public class ContentCachingRequestWrapper extends HttpServletRequestWrapper { return this.cachedContent.toByteArray(); } - // TODO: this is no longer usable in Servlet 3.0 environment private class ContentCachingInputStream extends ServletInputStream { @@ -197,7 +197,7 @@ public class ContentCachingRequestWrapper extends HttpServletRequestWrapper { @Override public void setReadListener(ReadListener readListener) { - this.setReadListener(readListener); + this.is.setReadListener(readListener); } } diff --git a/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java b/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java index 164963981d71533e7e30a4951874081db9a2dc8e..4a4cc0adfbfff739678a66e292c247e21707059e 100644 --- a/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java +++ b/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -34,6 +34,7 @@ import org.springframework.util.FastByteArrayOutputStream; * and allows this content to be retrieved via a {@link #getContentAsByteArray() byte array}. * *

Used e.g. by {@link org.springframework.web.filter.ShallowEtagHeaderFilter}. + * Note: As of Spring Framework 5.0, this wrapper is built on the Servlet 3.1 API. * * @author Juergen Hoeller * @since 4.1.3 @@ -228,7 +229,6 @@ public class ContentCachingResponseWrapper extends HttpServletResponseWrapper { } } - // TODO: this is no longer usable in Servlet 3.0 environment private class ResponseServletOutputStream extends ServletOutputStream { diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletInputStream.java b/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletInputStream.java index 336968d99600a6d150c9a27b2a092d9809335cca..d5e0c40eb76bf1cc9dc921d6eb975da021dc6ae2 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletInputStream.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletInputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 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. @@ -37,6 +37,8 @@ public class DelegatingServletInputStream extends ServletInputStream { private final InputStream sourceStream; + private boolean finished = false; + /** * Create a DelegatingServletInputStream for the given source stream. @@ -57,7 +59,11 @@ public class DelegatingServletInputStream extends ServletInputStream { @Override public int read() throws IOException { - return this.sourceStream.read(); + int data = this.sourceStream.read(); + if (data == -1) { + this.finished = true; + } + return data; } @Override @@ -68,16 +74,17 @@ public class DelegatingServletInputStream extends ServletInputStream { @Override public boolean isFinished() { - throw new UnsupportedOperationException(); + return this.finished; } @Override public boolean isReady() { - throw new UnsupportedOperationException(); + return true; } @Override public void setReadListener(ReadListener readListener) { throw new UnsupportedOperationException(); } + } diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletOutputStream.java b/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletOutputStream.java index 94317e42c13c986e728e962ba129311ca8d1fe4f..ecad14ebfa6fae9700534b133b83da5bce035dbf 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletOutputStream.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/DelegatingServletOutputStream.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 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. @@ -74,11 +74,12 @@ public class DelegatingServletOutputStream extends ServletOutputStream { @Override public boolean isReady() { - throw new UnsupportedOperationException(); + return true; } @Override public void setWriteListener(WriteListener writeListener) { throw new UnsupportedOperationException(); } + } 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 633895797a714cea9b0123037f382ba4189383be..b97ab429d576f1c27c2588dd11c87d5221fb2d0a 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 @@ -69,7 +69,7 @@ import org.springframework.util.StringUtils; * is {@link Locale#ENGLISH}. This value can be changed via {@link #addPreferredLocale} * or {@link #setPreferredLocales}. * - *

As of Spring Framework 4.0, this set of mocks is designed on a Servlet 3.0 baseline. + *

As of Spring Framework 5.0, this set of mocks is designed on a Servlet 3.1 baseline. * * @author Juergen Hoeller * @author Rod Johnson @@ -329,9 +329,7 @@ public class MockHttpServletRequest implements HttpServletRequest { * throwing an IllegalStateException if not active anymore. */ protected void checkActive() throws IllegalStateException { - if (!this.active) { - throw new IllegalStateException("Request is not active anymore"); - } + Assert.state(this.active, "Request is not active anymore"); } @@ -808,9 +806,7 @@ public class MockHttpServletRequest implements HttpServletRequest { @Override public AsyncContext startAsync(ServletRequest request, ServletResponse response) { - if (!this.asyncSupported) { - throw new IllegalStateException("Async not supported"); - } + Assert.state(this.asyncSupported, "Async not supported"); this.asyncStarted = true; this.asyncContext = new MockAsyncContext(request, response); return this.asyncContext; diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java index 5f3f56eefd2605a1488236d51113e60804659db4..541953c2608f411a8578cbb880999198592b6e1e 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletResponse.java @@ -45,9 +45,7 @@ import org.springframework.web.util.WebUtils; /** * Mock implementation of the {@link javax.servlet.http.HttpServletResponse} interface. * - *

As of Spring 4.0, this set of mocks is designed on a Servlet 3.0 baseline. - * Beyond that, {@code MockHttpServletResponse} is also compatible with Servlet - * 3.1's {@code setContentLengthLong()} method. + *

As of Spring Framework 5.0, this set of mocks is designed on a Servlet 3.1 baseline. * * @author Juergen Hoeller * @author Rod Johnson @@ -154,7 +152,7 @@ public class MockHttpServletResponse implements HttpServletResponse { *

If {@code false}, {@link #getCharacterEncoding()} will return a default encoding value. */ public boolean isCharset() { - return charset; + return this.charset; } @Override @@ -181,17 +179,13 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public ServletOutputStream getOutputStream() { - if (!this.outputStreamAccessAllowed) { - throw new IllegalStateException("OutputStream access not allowed"); - } + Assert.state(this.outputStreamAccessAllowed, "OutputStream access not allowed"); return this.outputStream; } @Override public PrintWriter getWriter() throws UnsupportedEncodingException { - if (!this.writerAccessAllowed) { - throw new IllegalStateException("Writer access not allowed"); - } + Assert.state(this.writerAccessAllowed, "Writer access not allowed"); if (this.writer == null) { Writer targetWriter = (this.characterEncoding != null ? new OutputStreamWriter(this.content, this.characterEncoding) : new OutputStreamWriter(this.content)); @@ -275,9 +269,7 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public void resetBuffer() { - if (isCommitted()) { - throw new IllegalStateException("Cannot reset buffer - response is already committed"); - } + Assert.state(!isCommitted(), "Cannot reset buffer - response is already committed"); this.content.reset(); } @@ -456,9 +448,7 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public void sendError(int status, String errorMessage) throws IOException { - if (isCommitted()) { - throw new IllegalStateException("Cannot set error status - response is already committed"); - } + Assert.state(!isCommitted(), "Cannot set error status - response is already committed"); this.status = status; this.errorMessage = errorMessage; setCommitted(true); @@ -466,18 +456,14 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public void sendError(int status) throws IOException { - if (isCommitted()) { - throw new IllegalStateException("Cannot set error status - response is already committed"); - } + Assert.state(!isCommitted(), "Cannot set error status - response is already committed"); this.status = status; setCommitted(true); } @Override public void sendRedirect(String url) throws IOException { - if (isCommitted()) { - throw new IllegalStateException("Cannot send redirect - response is already committed"); - } + Assert.state(!isCommitted(), "Cannot send redirect - response is already committed"); Assert.notNull(url, "Redirect URL must not be null"); setHeader(LOCATION_HEADER, url); setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); @@ -627,10 +613,8 @@ public class MockHttpServletResponse implements HttpServletResponse { public String getIncludedUrl() { int count = this.includedUrls.size(); - if (count > 1) { - throw new IllegalStateException( - "More than 1 URL included - check getIncludedUrls instead: " + this.includedUrls); - } + Assert.state(count <= 1, + () -> "More than 1 URL included - check getIncludedUrls instead: " + this.includedUrls); return (count == 1 ? this.includedUrls.get(0) : null); } 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 cfa3608a44309deff32eefe588a3e4cc06a58bdd..f6fff852b0305282a158c5d19c03389a23fb0559 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 @@ -355,9 +355,8 @@ public class MockServletContext implements ServletContext { @Override public RequestDispatcher getRequestDispatcher(String path) { - if (!path.startsWith("/")) { - throw new IllegalArgumentException("RequestDispatcher path at ServletContext level must start with '/'"); - } + Assert.isTrue(path.startsWith("/"), + () -> "RequestDispatcher path [" + path + "] at ServletContext level must start with '/'"); return new MockRequestDispatcher(path); } @@ -545,11 +544,6 @@ public class MockServletContext implements ServletContext { } } - @Override - public String getVirtualServerName() { - throw new UnsupportedOperationException(); - } - public Set getDeclaredRoles() { return Collections.unmodifiableSet(this.declaredRoles); } @@ -682,4 +676,9 @@ public class MockServletContext implements ServletContext { throw new UnsupportedOperationException(); } + @Override + public String getVirtualServerName() { + throw new UnsupportedOperationException(); + } + }