Update FileExtensionContentTypeResolver

Rename to MappingContentTypeResolver and replace "fileExtension" with
"key" in methods to be more general (e.g. file extension or query
param). Also switch from List to Set for the return values.
This commit is contained in:
Rossen Stoyanchev 2016-04-18 15:44:04 -04:00
parent 7d60c2767d
commit 9ffc0b5e65
6 changed files with 27 additions and 25 deletions

View File

@ -17,16 +17,17 @@
package org.springframework.web.reactive.accept;
import java.util.List;
import java.util.Set;
import org.springframework.http.MediaType;
/**
* An extension of {@link ContentTypeResolver} for a resolver that uses file
* extensions and can expose file extension mappings.
* An extension of {@link ContentTypeResolver} that maintains a mapping between
* keys (e.g. file extension, query parameter) and media types.
*
* @author Rossen Stoyanchev
*/
public interface FileExtensionContentTypeResolver extends ContentTypeResolver {
public interface MappingContentTypeResolver extends ContentTypeResolver {
/**
* Resolve the given media type to a list of path extensions.
@ -34,12 +35,12 @@ public interface FileExtensionContentTypeResolver extends ContentTypeResolver {
* @param mediaType the media type to resolve
* @return a list of extensions or an empty list, never {@code null}
*/
List<String> getFileExtensions(MediaType mediaType);
Set<String> getKeysFor(MediaType mediaType);
/**
* Return all registered file extensions.
* @return a list of extensions or an empty list, never {@code null}
* Return all registered keys (e.g. "json", "xml").
* @return a list of keys or an empty list, never {@code null}
*/
List<String> getAllFileExtensions();
Set<String> getKeys();
}

View File

@ -21,6 +21,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
@ -50,7 +51,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition<Pat
private final boolean useTrailingSlashMatch;
private final List<String> fileExtensions = new ArrayList<String>();
private final Set<String> fileExtensions = new HashSet<>();
/**
@ -74,7 +75,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition<Pat
*/
public PatternsRequestCondition(String[] patterns, HttpRequestPathHelper pathHelper,
PathMatcher pathMatcher, boolean useSuffixPatternMatch, boolean useTrailingSlashMatch,
List<String> extensions) {
Set<String> extensions) {
this(asList(patterns), pathHelper, pathMatcher, useSuffixPatternMatch, useTrailingSlashMatch, extensions);
}
@ -84,7 +85,7 @@ public final class PatternsRequestCondition extends AbstractRequestCondition<Pat
*/
private PatternsRequestCondition(Collection<String> patterns, HttpRequestPathHelper pathHelper,
PathMatcher pathMatcher, boolean useSuffixPatternMatch, boolean useTrailingSlashMatch,
List<String> fileExtensions) {
Set<String> fileExtensions) {
this.patterns = Collections.unmodifiableSet(prependLeadingSlash(patterns));
this.pathHelper = (pathHelper != null ? pathHelper : new HttpRequestPathHelper());

View File

@ -16,13 +16,13 @@
package org.springframework.web.reactive.result.method;
import java.util.List;
import java.util.Set;
import org.springframework.util.PathMatcher;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.reactive.accept.ContentTypeResolver;
import org.springframework.web.reactive.accept.FileExtensionContentTypeResolver;
import org.springframework.web.reactive.accept.MappingContentTypeResolver;
import org.springframework.web.reactive.result.condition.ConsumesRequestCondition;
import org.springframework.web.reactive.result.condition.HeadersRequestCondition;
import org.springframework.web.reactive.result.condition.ParamsRequestCondition;
@ -576,11 +576,11 @@ public final class RequestMappingInfo implements RequestCondition<RequestMapping
* {@code registeredSuffixPatternMatch=true}, the extensions are obtained
* from the configured {@code contentTypeResolver}.
*/
public List<String> getFileExtensions() {
public Set<String> getFileExtensions() {
ContentTypeResolver resolver = getContentTypeResolver();
if (useRegisteredSuffixPatternMatch() && resolver != null) {
if (resolver instanceof FileExtensionContentTypeResolver) {
return ((FileExtensionContentTypeResolver) resolver).getAllFileExtensions();
if (resolver instanceof MappingContentTypeResolver) {
return ((MappingContentTypeResolver) resolver).getKeys();
}
}
return null;

View File

@ -18,7 +18,7 @@ package org.springframework.web.reactive.result.method.annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Set;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.core.annotation.AnnotatedElementUtils;
@ -149,7 +149,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi
/**
* Return the file extensions to use for suffix pattern matching.
*/
public List<String> getFileExtensions() {
public Set<String> getFileExtensions() {
return this.config.getFileExtensions();
}

View File

@ -19,7 +19,7 @@ package org.springframework.web.reactive.result.condition;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.junit.Test;
@ -131,7 +131,7 @@ public class PatternsRequestConditionTests {
@Test
public void matchSuffixPatternUsingFileExtensions() throws Exception {
String[] patterns = new String[] {"/jobs/{jobName}"};
List<String> extensions = Collections.singletonList("json");
Set<String> extensions = Collections.singleton("json");
PatternsRequestCondition condition = new PatternsRequestCondition(patterns, null, null, true, false, extensions);
ServerWebExchange exchange = createExchange("/jobs/my.job");
@ -150,7 +150,7 @@ public class PatternsRequestConditionTests {
@Test
public void matchSuffixPatternUsingFileExtensions2() throws Exception {
PatternsRequestCondition condition1 = new PatternsRequestCondition(
new String[] {"/prefix"}, null, null, true, false, Collections.singletonList("json"));
new String[] {"/prefix"}, null, null, true, false, Collections.singleton("json"));
PatternsRequestCondition condition2 = new PatternsRequestCondition(
new String[] {"/suffix"}, null, null, true, false, null);

View File

@ -39,7 +39,7 @@ import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.support.StaticWebApplicationContext;
import org.springframework.web.reactive.accept.FileExtensionContentTypeResolver;
import org.springframework.web.reactive.accept.MappingContentTypeResolver;
import org.springframework.web.reactive.result.method.RequestMappingInfo;
import static org.junit.Assert.assertArrayEquals;
@ -73,8 +73,8 @@ public class RequestMappingHandlerMappingTests {
assertTrue(this.handlerMapping.useSuffixPatternMatch());
assertTrue(this.handlerMapping.useRegisteredSuffixPatternMatch());
FileExtensionContentTypeResolver contentTypeResolver = mock(FileExtensionContentTypeResolver.class);
when(contentTypeResolver.getAllFileExtensions()).thenReturn(Collections.singletonList("json"));
MappingContentTypeResolver contentTypeResolver = mock(MappingContentTypeResolver.class);
when(contentTypeResolver.getKeys()).thenReturn(Collections.singleton("json"));
this.handlerMapping.setContentTypeResolver(contentTypeResolver);
this.handlerMapping.afterPropertiesSet();
@ -86,8 +86,8 @@ public class RequestMappingHandlerMappingTests {
@Test
public void useRegisteredSuffixPatternMatchInitialization() {
FileExtensionContentTypeResolver contentTypeResolver = mock(FileExtensionContentTypeResolver.class);
when(contentTypeResolver.getAllFileExtensions()).thenReturn(Collections.singletonList("json"));
MappingContentTypeResolver contentTypeResolver = mock(MappingContentTypeResolver.class);
when(contentTypeResolver.getKeys()).thenReturn(Collections.singleton("json"));
final Set<String> actualExtensions = new HashSet<>();
RequestMappingHandlerMapping localHandlerMapping = new RequestMappingHandlerMapping() {