提交 6f11d4f0 编写于 作者: J Juergen Hoeller

Backported fix for lower-case media type lookups

Issue: SPR-13747
上级 f53d01b0
/*
* Copyright 2002-2012 the original author or authors.
* Copyright 2002-2015 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.
......@@ -31,24 +31,28 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
/**
* An implementation of {@link MediaTypeFileExtensionResolver} that maintains a lookup
* from extension to MediaType.
* An implementation of {@code MediaTypeFileExtensionResolver} that maintains
* lookups between file extensions and MediaTypes in both directions.
*
* <p>Initially created with a map of file extensions and media types.
* Subsequently sub-classes can use {@link #addMapping} to add more mappings.
*
* @author Rossen Stoyanchev
* @since 3.2
*/
public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExtensionResolver {
private final ConcurrentMap<String, MediaType> mediaTypes = new ConcurrentHashMap<String, MediaType>(64);
private final ConcurrentMap<String, MediaType> mediaTypes =
new ConcurrentHashMap<String, MediaType>(64);
private final MultiValueMap<MediaType, String> fileExtensions = new LinkedMultiValueMap<MediaType, String>();
private final MultiValueMap<MediaType, String> fileExtensions =
new LinkedMultiValueMap<MediaType, String>();
private final List<String> allFileExtensions = new LinkedList<String>();
/**
* Create an instance with the given mappings between extensions and media types.
* @throws IllegalArgumentException if a media type string cannot be parsed
* Create an instance with the given map of file extensions and media types.
*/
public MappingMediaTypeFileExtensionResolver(Map<String, MediaType> mediaTypes) {
if (mediaTypes != null) {
......@@ -61,10 +65,22 @@ public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExten
}
protected List<MediaType> getAllMediaTypes() {
return new ArrayList<MediaType>(this.mediaTypes.values());
}
/**
* Find the file extensions mapped to the given MediaType.
* @return 0 or more extensions, never {@code null}
* Map an extension to a MediaType. Ignore if extension already mapped.
*/
protected void addMapping(String extension, MediaType mediaType) {
MediaType previous = this.mediaTypes.putIfAbsent(extension, mediaType);
if (previous == null) {
this.fileExtensions.add(mediaType, extension);
this.allFileExtensions.add(extension);
}
}
@Override
public List<String> resolveFileExtensions(MediaType mediaType) {
List<String> fileExtensions = this.fileExtensions.get(mediaType);
......@@ -76,27 +92,12 @@ public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExten
return Collections.unmodifiableList(this.allFileExtensions);
}
protected List<MediaType> getAllMediaTypes() {
return new ArrayList<MediaType>(this.mediaTypes.values());
}
/**
* Return the MediaType mapped to the given extension.
* @return a MediaType for the key or {@code null}
* Use this method for a reverse lookup from extension to MediaType.
* @return a MediaType for the key, or {@code null} if none found
*/
protected MediaType lookupMediaType(String extension) {
return this.mediaTypes.get(extension);
}
/**
* Map a MediaType to an extension or ignore if the extensions is already mapped.
*/
protected void addMapping(String extension, MediaType mediaType) {
MediaType previous = this.mediaTypes.putIfAbsent(extension, mediaType);
if (previous == null) {
this.fileExtensions.add(mediaType, extension);
this.allFileExtensions.add(extension);
}
return this.mediaTypes.get(extension.toLowerCase(Locale.ENGLISH));
}
}
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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 static org.junit.Assert.*;
* Test fixture for {@link MappingMediaTypeFileExtensionResolver}.
*
* @author Rossen Stoyanchev
* @author Melissa Hartsock
*/
public class MappingMediaTypeFileExtensionResolverTests {
......@@ -51,4 +52,17 @@ public class MappingMediaTypeFileExtensionResolverTests {
assertTrue(extensions.isEmpty());
}
/**
* Unit test for SPR-13747 - ensures that reverse lookup of media type from media
* type key is case-insensitive.
*/
@Test
public void lookupMediaTypeCaseInsensitive() {
Map<String, MediaType> mapping = Collections.singletonMap("json", MediaType.APPLICATION_JSON);
MappingMediaTypeFileExtensionResolver resolver = new MappingMediaTypeFileExtensionResolver(mapping);
MediaType mediaType = resolver.lookupMediaType("JSON");
assertEquals(mediaType, MediaType.APPLICATION_JSON);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册