Shared PathPatternParser instance

See gh-25143
This commit is contained in:
Rossen Stoyanchev
2020-06-03 05:58:10 +01:00
parent 1ced9370cd
commit 1e25556049
9 changed files with 43 additions and 24 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2020 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.
@@ -50,7 +50,7 @@ public class UrlBasedCorsConfigurationSource implements CorsConfigurationSource
* @since 5.0.6
*/
public UrlBasedCorsConfigurationSource() {
this(new PathPatternParser());
this(PathPatternParser.defaultInstance);
}
/**

View File

@@ -122,4 +122,35 @@ public class PathPatternParser {
return new InternalPathPatternParser(this).parse(pathPattern);
}
/**
* Shared, read-only instance of {@code PathPatternParser}. Uses default settings:
* <ul>
* <li>{@code matchOptionalTrailingSeparator=true}
* <li>{@code caseSensitivetrue}
* <li>{@code pathOptions=PathContainer.Options.HTTP_PATH}
* </ul>
*/
public final static PathPatternParser defaultInstance = new PathPatternParser() {
@Override
public void setMatchOptionalTrailingSeparator(boolean matchOptionalTrailingSeparator) {
raiseError();
}
@Override
public void setCaseSensitive(boolean caseSensitive) {
raiseError();
}
@Override
public void setPathOptions(PathContainer.Options pathOptions) {
raiseError();
}
private void raiseError() {
throw new UnsupportedOperationException(
"This is a read-only, shared instance that cannot be modified");
}
};
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2020 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.
@@ -41,8 +41,6 @@ import org.springframework.web.util.pattern.PathPatternParser;
*/
class PathResourceLookupFunction implements Function<ServerRequest, Mono<Resource>> {
private static final PathPatternParser PATTERN_PARSER = new PathPatternParser();
private final PathPattern pattern;
private final Resource location;
@@ -51,7 +49,7 @@ class PathResourceLookupFunction implements Function<ServerRequest, Mono<Resourc
public PathResourceLookupFunction(String pattern, Resource location) {
Assert.hasLength(pattern, "'pattern' must not be empty");
Assert.notNull(location, "'location' must not be null");
this.pattern = PATTERN_PARSER.parse(pattern);
this.pattern = PathPatternParser.defaultInstance.parse(pattern);
this.location = location;
}

View File

@@ -72,9 +72,6 @@ public abstract class RequestPredicates {
private static final Log logger = LogFactory.getLog(RequestPredicates.class);
private static final PathPatternParser DEFAULT_PATTERN_PARSER = new PathPatternParser();
/**
* Return a {@code RequestPredicate} that always matches.
* @return a predicate that always matches
@@ -115,7 +112,7 @@ public abstract class RequestPredicates {
if (!pattern.isEmpty() && !pattern.startsWith("/")) {
pattern = "/" + pattern;
}
return pathPredicates(DEFAULT_PATTERN_PARSER).apply(pattern);
return pathPredicates(PathPatternParser.defaultInstance).apply(pattern);
}
/**

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2020 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.
@@ -54,8 +54,6 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
private static final Log logger = LogFactory.getLog(ResourceUrlProvider.class);
private final PathPatternParser patternParser = new PathPatternParser();
private final Map<PathPattern, ResourceWebHandler> handlerMap = new LinkedHashMap<>();
@@ -78,7 +76,7 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
this.handlerMap.clear();
handlerMap.forEach((rawPattern, resourceWebHandler) -> {
rawPattern = prependLeadingSlash(rawPattern);
PathPattern pattern = this.patternParser.parse(rawPattern);
PathPattern pattern = PathPatternParser.defaultInstance.parse(rawPattern);
this.handlerMap.put(pattern, resourceWebHandler);
});
}

View File

@@ -43,7 +43,7 @@ import org.springframework.web.util.pattern.PathPatternParser;
public final class PatternsRequestCondition extends AbstractRequestCondition<PatternsRequestCondition> {
private static final SortedSet<PathPattern> EMPTY_PATH_PATTERN =
new TreeSet<>(Collections.singleton(new PathPatternParser().parse("")));
new TreeSet<>(Collections.singleton(PathPatternParser.defaultInstance.parse("")));
private final SortedSet<PathPattern> patterns;

View File

@@ -527,7 +527,7 @@ public final class RequestMappingInfo implements RequestCondition<RequestMapping
public RequestMappingInfo build() {
PathPatternParser parser = (this.options.getPatternParser() != null ?
this.options.getPatternParser() : new PathPatternParser());
this.options.getPatternParser() : PathPatternParser.defaultInstance);
RequestedContentTypeResolver contentTypeResolver = this.options.getContentTypeResolver();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2019 the original author or authors.
* Copyright 2002-2020 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.
@@ -40,8 +40,6 @@ import org.springframework.web.util.pattern.PathPatternParser;
*/
class PathResourceLookupFunction implements Function<ServerRequest, Optional<Resource>> {
private static final PathPatternParser PATTERN_PARSER = new PathPatternParser();
private final PathPattern pattern;
private final Resource location;
@@ -50,7 +48,7 @@ class PathResourceLookupFunction implements Function<ServerRequest, Optional<Res
public PathResourceLookupFunction(String pattern, Resource location) {
Assert.hasLength(pattern, "'pattern' must not be empty");
Assert.notNull(location, "'location' must not be null");
this.pattern = PATTERN_PARSER.parse(pattern);
this.pattern = PathPatternParser.defaultInstance.parse(pattern);
this.location = location;
}

View File

@@ -71,9 +71,6 @@ public abstract class RequestPredicates {
private static final Log logger = LogFactory.getLog(RequestPredicates.class);
private static final PathPatternParser DEFAULT_PATTERN_PARSER = new PathPatternParser();
/**
* Return a {@code RequestPredicate} that always matches.
* @return a predicate that always matches
@@ -113,7 +110,7 @@ public abstract class RequestPredicates {
if (!pattern.isEmpty() && !pattern.startsWith("/")) {
pattern = "/" + pattern;
}
return pathPredicates(DEFAULT_PATTERN_PARSER).apply(pattern);
return pathPredicates(PathPatternParser.defaultInstance).apply(pattern);
}
/**