Skip to content

Commit fd1db57

Browse files
committed
Change MediaTypeFactory to return Optional
This commit changes the `MediaTypeFactory` to return `Optional<MediaType>` (instead of a plain `MediaType`) for the `getMediaType` methods. Issue: SPR-14908
1 parent 3d68c49 commit fd1db57

File tree

9 files changed

+38
-36
lines changed

9 files changed

+38
-36
lines changed

spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,14 +263,12 @@ public int getEffectiveMinorVersion() {
263263
@Override
264264
public String getMimeType(String filePath) {
265265
String extension = StringUtils.getFilenameExtension(filePath);
266-
MediaType result;
267266
if (this.mimeTypes.containsKey(extension)) {
268-
result = this.mimeTypes.get(extension);
267+
return this.mimeTypes.get(extension).toString();
269268
}
270269
else {
271-
result = MediaTypeFactory.getMediaType(filePath);
270+
return MediaTypeFactory.getMediaType(filePath).orElse(MediaType.APPLICATION_OCTET_STREAM).toString();
272271
}
273-
return result != null ? result.toString() : null;
274272
}
275273

276274
/**

spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,22 @@ private static MultiValueMap<String, MediaType> parseMimeTypes() {
103103
* @param resource the resource to introspect
104104
* @return the corresponding media type, or {@code null} if none found
105105
*/
106-
public static MediaType getMediaType(Resource resource) {
106+
public static Optional<MediaType> getMediaType(Resource resource) {
107+
if (resource == null) {
108+
return Optional.empty();
109+
}
107110
String filename = resource.getFilename();
108-
return (filename != null ? getMediaType(filename) : null);
111+
return (filename != null ? getMediaType(filename) : Optional.empty());
109112
}
110113

111114
/**
112115
* Determine a media type for the given file name, if possible.
113116
* @param filename the file name plus extension
114117
* @return the corresponding media type, or {@code null} if none found
115118
*/
116-
public static MediaType getMediaType(String filename) {
119+
public static Optional<MediaType> getMediaType(String filename) {
117120
List<MediaType> mediaTypes = getMediaTypes(filename);
118-
return (!mediaTypes.isEmpty() ? mediaTypes.get(0) : null);
121+
return (!mediaTypes.isEmpty() ? Optional.of(mediaTypes.get(0)) : Optional.empty());
119122
}
120123

121124
/**

spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ private static MediaType getResourceMediaType(MediaType type, Resource resource)
136136
if (type != null && type.isConcrete() && !type.equals(MediaType.APPLICATION_OCTET_STREAM)) {
137137
return type;
138138
}
139-
type = MediaTypeFactory.getMediaType(resource);
140-
return type != null ? type : MediaType.APPLICATION_OCTET_STREAM;
139+
return MediaTypeFactory.getMediaType(resource).orElse(MediaType.APPLICATION_OCTET_STREAM);
141140
}
142141

143142
private static OptionalLong lengthOf(Resource resource) {

spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ public String getFilename() {
102102

103103
@Override
104104
protected MediaType getDefaultContentType(Resource resource) {
105-
MediaType mediaType = MediaTypeFactory.getMediaType(resource);
106-
return mediaType != null ? mediaType : MediaType.APPLICATION_OCTET_STREAM;
105+
return MediaTypeFactory.getMediaType(resource).orElse(MediaType.APPLICATION_OCTET_STREAM);
107106
}
108107

109108
@Override

spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,7 @@ protected MediaType getDefaultContentType(Object object) {
8787
resource = regions.iterator().next().getResource();
8888
}
8989
}
90-
MediaType result = null;
91-
if (resource != null) {
92-
result = MediaTypeFactory.getMediaType(resource);
93-
}
94-
if (result == null) {
95-
return MediaType.APPLICATION_OCTET_STREAM;
96-
}
97-
return result;
90+
return MediaTypeFactory.getMediaType(resource).orElse(MediaType.APPLICATION_OCTET_STREAM);
9891
}
9992

10093
@Override

spring-web/src/main/java/org/springframework/web/accept/PathExtensionContentNegotiationStrategy.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.Locale;
2020
import java.util.Map;
21+
import java.util.Optional;
2122
import javax.servlet.http.HttpServletRequest;
2223

2324
import org.apache.commons.logging.Log;
@@ -112,9 +113,9 @@ protected String getMediaTypeKey(NativeWebRequest webRequest) {
112113
protected MediaType handleNoMatch(NativeWebRequest webRequest, String extension)
113114
throws HttpMediaTypeNotAcceptableException {
114115

115-
MediaType mediaType = MediaTypeFactory.getMediaType("file." + extension);
116-
if (mediaType != null) {
117-
return mediaType;
116+
Optional<MediaType> mediaType = MediaTypeFactory.getMediaType("file." + extension);
117+
if (mediaType.isPresent()) {
118+
return mediaType.get();
118119
}
119120
if (this.ignoreUnknownExtensions) {
120121
return null;
@@ -140,7 +141,7 @@ public MediaType getMediaTypeForResource(Resource resource) {
140141
mediaType = lookupMediaType(extension);
141142
}
142143
if (mediaType == null) {
143-
mediaType = MediaTypeFactory.getMediaType(filename);
144+
mediaType = MediaTypeFactory.getMediaType(filename).orElse(null);
144145
}
145146
return mediaType;
146147
}

spring-web/src/test/java/org/springframework/http/MediaTypeFactoryTests.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
import org.junit.Test;
2020

21-
import static org.junit.Assert.assertEquals;
21+
import org.springframework.core.io.Resource;
22+
23+
import static org.junit.Assert.*;
2224

2325
/**
2426
* @author Arjen Poutsma
@@ -27,9 +29,17 @@ public class MediaTypeFactoryTests {
2729

2830
@Test
2931
public void getMediaType() {
30-
assertEquals(MediaType.APPLICATION_XML, MediaTypeFactory.getMediaType("file.xml"));
31-
assertEquals(MediaType.parseMediaType("application/javascript"), MediaTypeFactory.getMediaType("file.js"));
32-
assertEquals(MediaType.parseMediaType("text/css"), MediaTypeFactory.getMediaType("file.css"));
32+
assertEquals(MediaType.APPLICATION_XML, MediaTypeFactory.getMediaType("file.xml").get());
33+
assertEquals(MediaType.parseMediaType("application/javascript"), MediaTypeFactory.getMediaType("file.js").get());
34+
assertEquals(MediaType.parseMediaType("text/css"), MediaTypeFactory.getMediaType("file.css").get());
35+
assertFalse(MediaTypeFactory.getMediaType("file.foobar").isPresent());
36+
}
37+
38+
@Test
39+
public void nullParameter() {
40+
assertFalse(MediaTypeFactory.getMediaType((String) null).isPresent());
41+
assertFalse(MediaTypeFactory.getMediaType((Resource) null).isPresent());
42+
assertTrue(MediaTypeFactory.getMediaTypes(null).isEmpty());
3343
}
3444

3545
}

spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,14 +262,12 @@ public int getEffectiveMinorVersion() {
262262
@Override
263263
public String getMimeType(String filePath) {
264264
String extension = StringUtils.getFilenameExtension(filePath);
265-
MediaType result;
266265
if (this.mimeTypes.containsKey(extension)) {
267-
result = this.mimeTypes.get(extension);
266+
return this.mimeTypes.get(extension).toString();
268267
}
269268
else {
270-
result = MediaTypeFactory.getMediaType(filePath);
269+
return MediaTypeFactory.getMediaType(filePath).orElse(MediaType.APPLICATION_OCTET_STREAM).toString();
271270
}
272-
return result != null ? result.toString() : null;
273271
}
274272

275273
/**

spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.Locale;
2020
import java.util.Map;
21+
import java.util.Optional;
2122

2223
import org.springframework.core.io.Resource;
2324
import org.springframework.http.MediaType;
@@ -79,9 +80,9 @@ protected String extractKey(ServerWebExchange exchange) {
7980

8081
@Override
8182
protected MediaType handleNoMatch(String key) throws NotAcceptableStatusException {
82-
MediaType mediaType = MediaTypeFactory.getMediaType("file." + key);
83-
if (mediaType != null) {
84-
return mediaType;
83+
Optional<MediaType> mediaType = MediaTypeFactory.getMediaType("file." + key);
84+
if (mediaType.isPresent()) {
85+
return mediaType.get();
8586
}
8687
if (!this.ignoreUnknownExtensions) {
8788
throw new NotAcceptableStatusException(getAllMediaTypes());
@@ -105,7 +106,7 @@ public MediaType resolveMediaTypeForResource(Resource resource) {
105106
mediaType = getMediaType(extension);
106107
}
107108
if (mediaType == null) {
108-
mediaType = MediaTypeFactory.getMediaType(filename);
109+
mediaType = MediaTypeFactory.getMediaType(filename).orElse(null);
109110
}
110111
return mediaType;
111112
}

0 commit comments

Comments
 (0)