Skip to content

Commit ae0b7c2

Browse files
committed
Drop Servlet 2.5 runtime compatibility
Issue: SPR-13189
1 parent ff6ead1 commit ae0b7c2

File tree

10 files changed

+56
-216
lines changed

10 files changed

+56
-216
lines changed

spring-web/src/main/java/org/springframework/http/server/ServletServerHttpResponse.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,6 @@
3939
*/
4040
public class ServletServerHttpResponse implements ServerHttpResponse {
4141

42-
/** Checking for Servlet 3.0+ HttpServletResponse.getHeader(String) */
43-
private static final boolean servlet3Present =
44-
ClassUtils.hasMethod(HttpServletResponse.class, "getHeader", String.class);
45-
46-
4742
private final HttpServletResponse servletResponse;
4843

4944
private final HttpHeaders headers;
@@ -60,7 +55,7 @@ public class ServletServerHttpResponse implements ServerHttpResponse {
6055
public ServletServerHttpResponse(HttpServletResponse servletResponse) {
6156
Assert.notNull(servletResponse, "HttpServletResponse must not be null");
6257
this.servletResponse = servletResponse;
63-
this.headers = (servlet3Present ? new ServletResponseHttpHeaders() : new HttpHeaders());
58+
this.headers = new ServletResponseHttpHeaders();
6459
}
6560

6661

spring-web/src/main/java/org/springframework/web/bind/support/WebRequestDataBinder.java

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import javax.servlet.http.Part;
2323

2424
import org.springframework.beans.MutablePropertyValues;
25-
import org.springframework.util.ClassUtils;
2625
import org.springframework.util.LinkedMultiValueMap;
2726
import org.springframework.util.MultiValueMap;
2827
import org.springframework.util.StringUtils;
@@ -116,9 +115,9 @@ public void bind(WebRequest request) {
116115
if (multipartRequest != null) {
117116
bindMultipart(multipartRequest.getMultiFileMap(), mpvs);
118117
}
119-
else if (ClassUtils.hasMethod(HttpServletRequest.class, "getParts")) {
120-
HttpServletRequest serlvetRequest = ((NativeWebRequest) request).getNativeRequest(HttpServletRequest.class);
121-
new Servlet3MultipartHelper(isBindEmptyMultipartFiles()).bindParts(serlvetRequest, mpvs);
118+
else {
119+
HttpServletRequest servletRequest = ((NativeWebRequest) request).getNativeRequest(HttpServletRequest.class);
120+
bindParts(servletRequest, mpvs);
122121
}
123122
}
124123
doBind(mpvs);
@@ -133,6 +132,29 @@ private boolean isMultipartRequest(WebRequest request) {
133132
return (contentType != null && StringUtils.startsWithIgnoreCase(contentType, "multipart"));
134133
}
135134

135+
private void bindParts(HttpServletRequest request, MutablePropertyValues mpvs) {
136+
try {
137+
MultiValueMap<String, Part> map = new LinkedMultiValueMap<String, Part>();
138+
for (Part part : request.getParts()) {
139+
map.add(part.getName(), part);
140+
}
141+
for (Map.Entry<String, List<Part>> entry: map.entrySet()) {
142+
if (entry.getValue().size() == 1) {
143+
Part part = entry.getValue().get(0);
144+
if (isBindEmptyMultipartFiles() || part.getSize() > 0) {
145+
mpvs.add(entry.getKey(), part);
146+
}
147+
}
148+
else {
149+
mpvs.add(entry.getKey(), entry.getValue());
150+
}
151+
}
152+
}
153+
catch (Exception ex) {
154+
throw new MultipartException("Failed to get request parts", ex);
155+
}
156+
}
157+
136158
/**
137159
* Treats errors as fatal.
138160
* <p>Use this method only if it's an error if the input isn't valid.
@@ -145,41 +167,4 @@ public void closeNoCatch() throws BindException {
145167
}
146168
}
147169

148-
149-
/**
150-
* Encapsulate Part binding code for Servlet 3.0+ only containers.
151-
* @see javax.servlet.http.Part
152-
*/
153-
private static class Servlet3MultipartHelper {
154-
155-
private final boolean bindEmptyMultipartFiles;
156-
157-
public Servlet3MultipartHelper(boolean bindEmptyMultipartFiles) {
158-
this.bindEmptyMultipartFiles = bindEmptyMultipartFiles;
159-
}
160-
161-
public void bindParts(HttpServletRequest request, MutablePropertyValues mpvs) {
162-
try {
163-
MultiValueMap<String, Part> map = new LinkedMultiValueMap<String, Part>();
164-
for (Part part : request.getParts()) {
165-
map.add(part.getName(), part);
166-
}
167-
for (Map.Entry<String, List<Part>> entry: map.entrySet()) {
168-
if (entry.getValue().size() == 1) {
169-
Part part = entry.getValue().get(0);
170-
if (this.bindEmptyMultipartFiles || part.getSize() > 0) {
171-
mpvs.add(entry.getKey(), part);
172-
}
173-
}
174-
else {
175-
mpvs.add(entry.getKey(), entry.getValue());
176-
}
177-
}
178-
}
179-
catch (Exception ex) {
180-
throw new MultipartException("Failed to get request parts", ex);
181-
}
182-
}
183-
}
184-
185170
}

spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,12 @@
2323
import java.util.Map;
2424
import java.util.regex.Matcher;
2525
import java.util.regex.Pattern;
26-
2726
import javax.servlet.http.HttpServletRequest;
2827
import javax.servlet.http.HttpServletResponse;
2928
import javax.servlet.http.HttpSession;
3029

3130
import org.springframework.http.HttpMethod;
3231
import org.springframework.http.HttpStatus;
33-
import org.springframework.util.ClassUtils;
3432
import org.springframework.util.CollectionUtils;
3533
import org.springframework.util.ObjectUtils;
3634
import org.springframework.util.StringUtils;
@@ -73,10 +71,6 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ
7371
private static final Pattern ETAG_HEADER_VALUE_PATTERN = Pattern.compile("\\*|\\s*((W\\/)?(\"[^\"]*\"))\\s*,?");
7472

7573

76-
/** Checking for Servlet 3.0+ HttpServletResponse.getHeader(String) */
77-
private static final boolean servlet3Present =
78-
ClassUtils.hasMethod(HttpServletResponse.class, "getHeader", String.class);
79-
8074
private boolean notModified = false;
8175

8276

@@ -283,19 +277,19 @@ public boolean isNotModified() {
283277

284278
private boolean isCompatibleWithConditionalRequests(HttpServletResponse response) {
285279
try {
286-
if (response == null || !servlet3Present) {
280+
if (response == null) {
287281
// Can't check response.getStatus() - let's assume we're good
288282
return true;
289283
}
290284
return HttpStatus.valueOf(response.getStatus()).is2xxSuccessful();
291285
}
292-
catch (IllegalArgumentException e) {
286+
catch (IllegalArgumentException ex) {
293287
return true;
294288
}
295289
}
296290

297291
private boolean isHeaderAbsent(HttpServletResponse response, String header) {
298-
if (response == null || !servlet3Present) {
292+
if (response == null) {
299293
// Can't check response.getHeader(header) - let's assume it's not set
300294
return true;
301295
}

spring-web/src/main/java/org/springframework/web/context/request/async/NoSupportAsyncWebRequest.java

Lines changed: 0 additions & 75 deletions
This file was deleted.

spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncUtils.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2015 the original author or authors.
2+
* Copyright 2002-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,7 +20,6 @@
2020
import javax.servlet.http.HttpServletRequest;
2121
import javax.servlet.http.HttpServletResponse;
2222

23-
import org.springframework.util.ClassUtils;
2423
import org.springframework.web.context.request.RequestAttributes;
2524
import org.springframework.web.context.request.WebRequest;
2625

@@ -35,9 +34,6 @@ public abstract class WebAsyncUtils {
3534

3635
public static final String WEB_ASYNC_MANAGER_ATTRIBUTE = WebAsyncManager.class.getName() + ".WEB_ASYNC_MANAGER";
3736

38-
// Determine whether Servlet 3.0's ServletRequest.startAsync method is available
39-
private static final boolean startAsyncAvailable = ClassUtils.hasMethod(ServletRequest.class, "startAsync");
40-
4137

4238
/**
4339
* Obtain the {@link WebAsyncManager} for the current request, or if not
@@ -76,19 +72,7 @@ public static WebAsyncManager getAsyncManager(WebRequest webRequest) {
7672
* @return an AsyncWebRequest instance (never {@code null})
7773
*/
7874
public static AsyncWebRequest createAsyncWebRequest(HttpServletRequest request, HttpServletResponse response) {
79-
return (startAsyncAvailable ? AsyncWebRequestFactory.createStandardAsyncWebRequest(request, response) :
80-
new NoSupportAsyncWebRequest(request, response));
81-
}
82-
83-
84-
/**
85-
* Inner class to avoid a hard dependency on the Servlet 3.0 API.
86-
*/
87-
private static class AsyncWebRequestFactory {
88-
89-
public static AsyncWebRequest createStandardAsyncWebRequest(HttpServletRequest request, HttpServletResponse response) {
90-
return new StandardServletAsyncWebRequest(request, response);
91-
}
75+
return new StandardServletAsyncWebRequest(request, response);
9276
}
9377

9478
}

spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.io.IOException;
2020
import java.io.InputStream;
2121
import java.io.PrintWriter;
22-
2322
import javax.servlet.FilterChain;
2423
import javax.servlet.ServletException;
2524
import javax.servlet.ServletOutputStream;
@@ -29,7 +28,6 @@
2928

3029
import org.springframework.http.HttpMethod;
3130
import org.springframework.util.Assert;
32-
import org.springframework.util.ClassUtils;
3331
import org.springframework.util.DigestUtils;
3432
import org.springframework.web.util.ContentCachingResponseWrapper;
3533
import org.springframework.web.util.WebUtils;
@@ -61,29 +59,30 @@ public class ShallowEtagHeaderFilter extends OncePerRequestFilter {
6159

6260
private static final String STREAMING_ATTRIBUTE = ShallowEtagHeaderFilter.class.getName() + ".STREAMING";
6361

64-
/** Checking for Servlet 3.0+ HttpServletResponse.getHeader(String) */
65-
private static final boolean servlet3Present =
66-
ClassUtils.hasMethod(HttpServletResponse.class, "getHeader", String.class);
6762

6863
private boolean writeWeakETag = false;
6964

65+
7066
/**
71-
* Set whether the ETag value written to the response should be weak, as per rfc7232.
67+
* Set whether the ETag value written to the response should be weak, as per RFC 7232.
7268
* <p>Should be configured using an {@code <init-param>} for parameter name
7369
* "writeWeakETag" in the filter definition in {@code web.xml}.
74-
* @see <a href="https://tools.ietf.org/html/rfc7232#section-2.3">rfc7232 section-2.3</a>
70+
* @see <a href="https://tools.ietf.org/html/rfc7232#section-2.3">RFC 7232 section 2.3</a>
71+
* @since 4.3
7572
*/
76-
public boolean isWriteWeakETag() {
77-
return writeWeakETag;
73+
public void setWriteWeakETag(boolean writeWeakETag) {
74+
this.writeWeakETag = writeWeakETag;
7875
}
7976

8077
/**
81-
* Return whether the ETag value written to the response should be weak, as per rfc7232.
78+
* Return whether the ETag value written to the response should be weak, as per RFC 7232.
79+
* @since 4.3
8280
*/
83-
public void setWriteWeakETag(boolean writeWeakETag) {
84-
this.writeWeakETag = writeWeakETag;
81+
public boolean isWriteWeakETag() {
82+
return this.writeWeakETag;
8583
}
8684

85+
8786
/**
8887
* The default value is "false" so that the filter may delay the generation of
8988
* an ETag until the last asynchronously dispatched thread.
@@ -169,10 +168,7 @@ protected boolean isEligibleForEtag(HttpServletRequest request, HttpServletRespo
169168
if (responseStatusCode >= 200 && responseStatusCode < 300 &&
170169
(HttpMethod.GET.matches(method) || HttpMethod.HEAD.matches(method))) {
171170

172-
String cacheControl = null;
173-
if (servlet3Present) {
174-
cacheControl = response.getHeader(HEADER_CACHE_CONTROL);
175-
}
171+
String cacheControl = response.getHeader(HEADER_CACHE_CONTROL);
176172
if (cacheControl == null || !cacheControl.contains(DIRECTIVE_NO_STORE)) {
177173
return true;
178174
}

0 commit comments

Comments
 (0)