From a7af9505dee01340ac225814f9f90252bb7d725e Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 30 Oct 2013 12:39:31 -0400 Subject: [PATCH] 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 --- .../RequestMappingInfoHandlerMapping.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java index e86e1eccbdf..36f76fd6efd 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java @@ -16,14 +16,8 @@ package org.springframework.web.servlet.mvc.method; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -97,16 +91,28 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe protected void handleMatch(RequestMappingInfo info, String lookupPath, HttpServletRequest request) { super.handleMatch(info, lookupPath, request); + String bestPattern; + Map uriVariables; + Map decodedUriVariables; + Set patterns = info.getPatternsCondition().getPatterns(); - String bestPattern = patterns.isEmpty() ? lookupPath : patterns.iterator().next(); - request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern); + 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); + } - Map uriVariables = getPathMatcher().extractUriTemplateVariables(bestPattern, lookupPath); - Map decodedUriVariables = getUrlPathHelper().decodePathVariables(request, uriVariables); + request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern); request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, decodedUriVariables); if (isMatrixVariableContentAvailable()) { - request.setAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, extractMatrixVariables(request, uriVariables)); + Map> matrixVars = extractMatrixVariables(request, uriVariables); + request.setAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, matrixVars); } if (!info.getProducesCondition().getProducibleMediaTypes().isEmpty()) {