Avoid filling up AntPathMatcher cache

This change avoid use of AntPathMatcher to extract URI template
variables when the lookup path is used as the best matching pattern.

Issue: SPR-10803
This commit is contained in:
Rossen Stoyanchev
2013-10-30 12:39:31 -04:00
parent 48b9e9a203
commit a7af9505de

View File

@@ -16,14 +16,8 @@
package org.springframework.web.servlet.mvc.method; package org.springframework.web.servlet.mvc.method;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -97,16 +91,28 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
protected void handleMatch(RequestMappingInfo info, String lookupPath, HttpServletRequest request) { protected void handleMatch(RequestMappingInfo info, String lookupPath, HttpServletRequest request) {
super.handleMatch(info, lookupPath, request); super.handleMatch(info, lookupPath, request);
Set<String> patterns = info.getPatternsCondition().getPatterns(); String bestPattern;
String bestPattern = patterns.isEmpty() ? lookupPath : patterns.iterator().next(); Map<String, String> uriVariables;
request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern); Map<String, String> decodedUriVariables;
Map<String, String> uriVariables = getPathMatcher().extractUriTemplateVariables(bestPattern, lookupPath); Set<String> patterns = info.getPatternsCondition().getPatterns();
Map<String, String> decodedUriVariables = getUrlPathHelper().decodePathVariables(request, uriVariables); if (patterns.isEmpty()) {
bestPattern = lookupPath;
uriVariables = Collections.emptyMap();
decodedUriVariables = Collections.emptyMap();
}
else {
bestPattern = patterns.iterator().next();
uriVariables = getPathMatcher().extractUriTemplateVariables(bestPattern, lookupPath);
decodedUriVariables = getUrlPathHelper().decodePathVariables(request, uriVariables);
}
request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern);
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, decodedUriVariables); request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, decodedUriVariables);
if (isMatrixVariableContentAvailable()) { if (isMatrixVariableContentAvailable()) {
request.setAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, extractMatrixVariables(request, uriVariables)); Map<String, MultiValueMap<String, String>> matrixVars = extractMatrixVariables(request, uriVariables);
request.setAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, matrixVars);
} }
if (!info.getProducesCondition().getProducibleMediaTypes().isEmpty()) { if (!info.getProducesCondition().getProducibleMediaTypes().isEmpty()) {