Merge pull request #151 from philwebb/SPR-9814
Delete CopyOfRequestMappingHandlerMapping classmaster
commit
d1d9e118b7
1 changed files with 0 additions and 199 deletions
@ -1,199 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2002-2012 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. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.springframework.web.servlet.mvc.method.annotation; |
|
||||||
|
|
||||||
import java.lang.reflect.Method; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.springframework.core.annotation.AnnotationUtils; |
|
||||||
import org.springframework.stereotype.Controller; |
|
||||||
import org.springframework.util.Assert; |
|
||||||
import org.springframework.web.accept.ContentNegotiationManager; |
|
||||||
import org.springframework.web.bind.annotation.RequestMapping; |
|
||||||
import org.springframework.web.servlet.mvc.condition.AbstractRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.CompositeRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.HeadersRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.ParamsRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.ProducesRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.RequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition; |
|
||||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfo; |
|
||||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; |
|
||||||
|
|
||||||
/** |
|
||||||
* Creates {@link RequestMappingInfo} instances from type and method-level |
|
||||||
* {@link RequestMapping @RequestMapping} annotations in |
|
||||||
* {@link Controller @Controller} classes. |
|
||||||
* |
|
||||||
* @author Arjen Poutsma |
|
||||||
* @author Rossen Stoyanchev |
|
||||||
* @since 3.1 |
|
||||||
*/ |
|
||||||
public class CopyOfRequestMappingHandlerMapping extends RequestMappingInfoHandlerMapping { |
|
||||||
|
|
||||||
private boolean useSuffixPatternMatch = true; |
|
||||||
|
|
||||||
private boolean useTrailingSlashMatch = true; |
|
||||||
|
|
||||||
private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager(); |
|
||||||
|
|
||||||
private final List<String> contentNegotiationFileExtensions = new ArrayList<String>(); |
|
||||||
|
|
||||||
/** |
|
||||||
* Whether to use suffix pattern match (".*") when matching patterns to |
|
||||||
* requests. If enabled a method mapped to "/users" also matches to "/users.*". |
|
||||||
* <p>The default value is {@code true}. |
|
||||||
*/ |
|
||||||
public void setUseSuffixPatternMatch(boolean useSuffixPatternMatch) { |
|
||||||
this.useSuffixPatternMatch = useSuffixPatternMatch; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Whether to match to URLs irrespective of the presence of a trailing slash. |
|
||||||
* If enabled a method mapped to "/users" also matches to "/users/". |
|
||||||
* <p>The default value is {@code true}. |
|
||||||
*/ |
|
||||||
public void setUseTrailingSlashMatch(boolean useTrailingSlashMatch) { |
|
||||||
this.useTrailingSlashMatch = useTrailingSlashMatch; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Set the {@link ContentNegotiationManager} to use to determine requested media types. |
|
||||||
* If not set, the default constructor is used. |
|
||||||
*/ |
|
||||||
public void setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager) { |
|
||||||
Assert.notNull(contentNegotiationManager); |
|
||||||
this.contentNegotiationManager = contentNegotiationManager; |
|
||||||
this.contentNegotiationFileExtensions.addAll(contentNegotiationManager.getAllFileExtensions()); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Whether to use suffix pattern matching. |
|
||||||
*/ |
|
||||||
public boolean useSuffixPatternMatch() { |
|
||||||
return this.useSuffixPatternMatch; |
|
||||||
} |
|
||||||
/** |
|
||||||
* Whether to match to URLs irrespective of the presence of a trailing slash. |
|
||||||
*/ |
|
||||||
public boolean useTrailingSlashMatch() { |
|
||||||
return this.useTrailingSlashMatch; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Return the configured {@link ContentNegotiationManager}. |
|
||||||
*/ |
|
||||||
public ContentNegotiationManager getContentNegotiationManager() { |
|
||||||
return this.contentNegotiationManager; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Return the known file extensions for content negotiation. |
|
||||||
*/ |
|
||||||
public List<String> getContentNegotiationFileExtensions() { |
|
||||||
return this.contentNegotiationFileExtensions; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* {@inheritDoc} |
|
||||||
* Expects a handler to have a type-level @{@link Controller} annotation. |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
protected boolean isHandler(Class<?> beanType) { |
|
||||||
return ((AnnotationUtils.findAnnotation(beanType, Controller.class) != null) || |
|
||||||
(AnnotationUtils.findAnnotation(beanType, RequestMapping.class) != null)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Uses method and type-level @{@link RequestMapping} annotations to create |
|
||||||
* the RequestMappingInfo. |
|
||||||
* |
|
||||||
* @return the created RequestMappingInfo, or {@code null} if the method |
|
||||||
* does not have a {@code @RequestMapping} annotation. |
|
||||||
* |
|
||||||
* @see #getCustomMethodCondition(Method) |
|
||||||
* @see #getCustomTypeCondition(Class) |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) { |
|
||||||
RequestMappingInfo info = null; |
|
||||||
RequestMapping methodAnnotation = AnnotationUtils.findAnnotation(method, RequestMapping.class); |
|
||||||
if (methodAnnotation != null) { |
|
||||||
RequestCondition<?> methodCondition = getCustomMethodCondition(method); |
|
||||||
info = createRequestMappingInfo(methodAnnotation, methodCondition); |
|
||||||
RequestMapping typeAnnotation = AnnotationUtils.findAnnotation(handlerType, RequestMapping.class); |
|
||||||
if (typeAnnotation != null) { |
|
||||||
RequestCondition<?> typeCondition = getCustomTypeCondition(handlerType); |
|
||||||
info = createRequestMappingInfo(typeAnnotation, typeCondition).combine(info); |
|
||||||
} |
|
||||||
} |
|
||||||
return info; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Provide a custom type-level request condition. |
|
||||||
* The custom {@link RequestCondition} can be of any type so long as the |
|
||||||
* same condition type is returned from all calls to this method in order |
|
||||||
* to ensure custom request conditions can be combined and compared. |
|
||||||
* |
|
||||||
* <p>Consider extending {@link AbstractRequestCondition} for custom |
|
||||||
* condition types and using {@link CompositeRequestCondition} to provide |
|
||||||
* multiple custom conditions. |
|
||||||
* |
|
||||||
* @param handlerType the handler type for which to create the condition |
|
||||||
* @return the condition, or {@code null} |
|
||||||
*/ |
|
||||||
protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Provide a custom method-level request condition. |
|
||||||
* The custom {@link RequestCondition} can be of any type so long as the |
|
||||||
* same condition type is returned from all calls to this method in order |
|
||||||
* to ensure custom request conditions can be combined and compared. |
|
||||||
* |
|
||||||
* <p>Consider extending {@link AbstractRequestCondition} for custom |
|
||||||
* condition types and using {@link CompositeRequestCondition} to provide |
|
||||||
* multiple custom conditions. |
|
||||||
* |
|
||||||
* @param method the handler method for which to create the condition |
|
||||||
* @return the condition, or {@code null} |
|
||||||
*/ |
|
||||||
protected RequestCondition<?> getCustomMethodCondition(Method method) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Created a RequestMappingInfo from a RequestMapping annotation. |
|
||||||
*/ |
|
||||||
private RequestMappingInfo createRequestMappingInfo(RequestMapping annotation, RequestCondition<?> customCondition) { |
|
||||||
return new RequestMappingInfo( |
|
||||||
new PatternsRequestCondition(annotation.value(), getUrlPathHelper(), getPathMatcher(), |
|
||||||
this.useSuffixPatternMatch, this.useTrailingSlashMatch, this.contentNegotiationFileExtensions), |
|
||||||
new RequestMethodsRequestCondition(annotation.method()), |
|
||||||
new ParamsRequestCondition(annotation.params()), |
|
||||||
new HeadersRequestCondition(annotation.headers()), |
|
||||||
new ConsumesRequestCondition(annotation.consumes(), annotation.headers()), |
|
||||||
new ProducesRequestCondition(annotation.produces(), annotation.headers(), getContentNegotiationManager()), |
|
||||||
customCondition); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue