@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2016 the original author or authors .
* Copyright 2002 - 2017 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 .
@ -28,6 +28,7 @@ import org.w3c.dom.Element;
@@ -28,6 +28,7 @@ import org.w3c.dom.Element;
import org.springframework.beans.MutablePropertyValues ;
import org.springframework.beans.factory.config.BeanDefinition ;
import org.springframework.beans.factory.config.ConfigurableBeanFactory ;
import org.springframework.beans.factory.config.ConstructorArgumentValues ;
import org.springframework.beans.factory.config.RuntimeBeanReference ;
import org.springframework.beans.factory.parsing.BeanComponentDefinition ;
@ -40,10 +41,10 @@ import org.springframework.cache.concurrent.ConcurrentMapCache;
@@ -40,10 +41,10 @@ import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.core.Ordered ;
import org.springframework.core.io.Resource ;
import org.springframework.core.io.ResourceLoader ;
import org.springframework.http.CacheControl ;
import org.springframework.util.ClassUtils ;
import org.springframework.util.StringUtils ;
import org.springframework.util.xml.DomUtils ;
import org.springframework.http.CacheControl ;
import org.springframework.web.servlet.handler.MappedInterceptor ;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping ;
import org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter ;
@ -92,15 +93,15 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -92,15 +93,15 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@Override
public BeanDefinition parse ( Element element , ParserContext parserC ontext) {
Object source = parserC ontext. extractSource ( element ) ;
public BeanDefinition parse ( Element element , ParserContext c ontext) {
Object source = c ontext. extractSource ( element ) ;
registerUrlProvider ( parserC ontext, source ) ;
registerUrlProvider ( c ontext, source ) ;
RuntimeBeanReference pathMatcherRef = MvcNamespaceUtils . registerPathMatcher ( null , parserC ontext, source ) ;
RuntimeBeanReference pathHelperRef = MvcNamespaceUtils . registerUrlPathHelper ( null , parserC ontext, source ) ;
RuntimeBeanReference pathMatcherRef = MvcNamespaceUtils . registerPathMatcher ( null , c ontext, source ) ;
RuntimeBeanReference pathHelperRef = MvcNamespaceUtils . registerUrlPathHelper ( null , c ontext, source ) ;
String resourceHandlerName = registerResourceHandler ( parserC ontext, element , pathHelperRef , source ) ;
String resourceHandlerName = registerResourceHandler ( c ontext, element , pathHelperRef , source ) ;
if ( resourceHandlerName = = null ) {
return null ;
}
@ -108,7 +109,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -108,7 +109,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
Map < String , String > urlMap = new ManagedMap < String , String > ( ) ;
String resourceRequestPath = element . getAttribute ( "mapping" ) ;
if ( ! StringUtils . hasText ( resourceRequestPath ) ) {
parserC ontext. getReaderContext ( ) . error ( "The 'mapping' attribute is required." , parserC ontext. extractSource ( element ) ) ;
c ontext. getReaderContext ( ) . error ( "The 'mapping' attribute is required." , c ontext. extractSource ( element ) ) ;
return null ;
}
urlMap . put ( resourceRequestPath , resourceHandlerName ) ;
@ -119,31 +120,32 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -119,31 +120,32 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
handlerMappingDef . getPropertyValues ( ) . add ( "urlMap" , urlMap ) ;
handlerMappingDef . getPropertyValues ( ) . add ( "pathMatcher" , pathMatcherRef ) . add ( "urlPathHelper" , pathHelperRef ) ;
String order = element . getAttribute ( "order" ) ;
String orderValue = element . getAttribute ( "order" ) ;
// Use a default of near-lowest precedence, still allowing for even lower precedence in other mappings
handlerMappingDef . getPropertyValues ( ) . add ( "order" , StringUtils . hasText ( order ) ? order : Ordered . LOWEST_PRECEDENCE - 1 ) ;
Object order = StringUtils . hasText ( orderValue ) ? orderValue : Ordered . LOWEST_PRECEDENCE - 1 ;
handlerMappingDef . getPropertyValues ( ) . add ( "order" , order ) ;
RuntimeBeanReference corsConfigurations Ref = MvcNamespaceUtils . registerCorsConfigurations ( null , parserC ontext, source ) ;
handlerMappingDef . getPropertyValues ( ) . add ( "corsConfigurations" , corsConfigurations Ref ) ;
RuntimeBeanReference corsRef = MvcNamespaceUtils . registerCorsConfigurations ( null , c ontext, source ) ;
handlerMappingDef . getPropertyValues ( ) . add ( "corsConfigurations" , corsRef ) ;
String beanName = parserC ontext. getReaderContext ( ) . generateBeanName ( handlerMappingDef ) ;
parserC ontext. getRegistry ( ) . registerBeanDefinition ( beanName , handlerMappingDef ) ;
parserC ontext. registerComponent ( new BeanComponentDefinition ( handlerMappingDef , beanName ) ) ;
String beanName = c ontext. getReaderContext ( ) . generateBeanName ( handlerMappingDef ) ;
c ontext. getRegistry ( ) . registerBeanDefinition ( beanName , handlerMappingDef ) ;
c ontext. registerComponent ( new BeanComponentDefinition ( handlerMappingDef , beanName ) ) ;
// Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off"
// Register HttpRequestHandlerAdapter
MvcNamespaceUtils . registerDefaultComponents ( parserC ontext, source ) ;
MvcNamespaceUtils . registerDefaultComponents ( c ontext, source ) ;
return null ;
}
private void registerUrlProvider ( ParserContext parserC ontext, Object source ) {
if ( ! parserC ontext. getRegistry ( ) . containsBeanDefinition ( RESOURCE_URL_PROVIDER ) ) {
private void registerUrlProvider ( ParserContext c ontext, Object source ) {
if ( ! c ontext. getRegistry ( ) . containsBeanDefinition ( RESOURCE_URL_PROVIDER ) ) {
RootBeanDefinition urlProvider = new RootBeanDefinition ( ResourceUrlProvider . class ) ;
urlProvider . setSource ( source ) ;
urlProvider . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
parserC ontext. getRegistry ( ) . registerBeanDefinition ( RESOURCE_URL_PROVIDER , urlProvider ) ;
parserC ontext. registerComponent ( new BeanComponentDefinition ( urlProvider , RESOURCE_URL_PROVIDER ) ) ;
c ontext. getRegistry ( ) . registerBeanDefinition ( RESOURCE_URL_PROVIDER , urlProvider ) ;
c ontext. registerComponent ( new BeanComponentDefinition ( urlProvider , RESOURCE_URL_PROVIDER ) ) ;
RootBeanDefinition interceptor = new RootBeanDefinition ( ResourceUrlProviderExposingInterceptor . class ) ;
interceptor . setSource ( source ) ;
@ -154,24 +156,31 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -154,24 +156,31 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
mappedInterceptor . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
mappedInterceptor . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 0 , ( Object ) null ) ;
mappedInterceptor . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 1 , interceptor ) ;
String mappedInterceptorName = parserC ontext. getReaderContext ( ) . registerWithGeneratedName ( mappedInterceptor ) ;
parserC ontext. registerComponent ( new BeanComponentDefinition ( mappedInterceptor , mappedInterceptorName ) ) ;
String mappedInterceptorName = c ontext. getReaderContext ( ) . registerWithGeneratedName ( mappedInterceptor ) ;
c ontext. registerComponent ( new BeanComponentDefinition ( mappedInterceptor , mappedInterceptorName ) ) ;
}
}
private String registerResourceHandler ( ParserContext parserContext , Element element ,
RuntimeBeanReference pathHelperRef , Object source ) {
private String registerResourceHandler (
ParserContext context , Element element , RuntimeBeanReference pathHelperRef , Object source ) {
String locationAttr = element . getAttribute ( "location" ) ;
if ( ! StringUtils . hasText ( locationAttr ) ) {
parserC ontext. getReaderContext ( ) . error ( "The 'location' attribute is required." , parserC ontext. extractSource ( element ) ) ;
c ontext. getReaderContext ( ) . error ( "The 'location' attribute is required." , c ontext. extractSource ( element ) ) ;
return null ;
}
String [ ] locationValues = StringUtils . commaDelimitedListToStringArray ( locationAttr ) ;
if ( context . getRegistry ( ) instanceof ConfigurableBeanFactory ) {
ConfigurableBeanFactory cbf = ( ( ConfigurableBeanFactory ) context . getRegistry ( ) ) ;
for ( int i = 0 ; i < locationValues . length ; i + + ) {
locationValues [ i ] = cbf . resolveEmbeddedValue ( locationValues [ i ] ) ;
}
}
ManagedList < Object > locations = new ManagedList < Object > ( ) ;
Map < Resource , Charset > locationCharsets = new HashMap < Resource , Charset > ( ) ;
ResourceLoader resourceLoader = parserContext . getReaderContext ( ) . getResourceLoader ( ) ;
ResourceLoader resourceLoader = c ontext. getReaderContext ( ) . getResourceLoader ( ) ;
if ( resourceLoader ! = null ) {
List < Resource > resources = new ArrayList < Resource > ( ) ;
@ -204,44 +213,21 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -204,44 +213,21 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
Element resourceChainElement = DomUtils . getChildElementByTagName ( element , "resource-chain" ) ;
if ( resourceChainElement ! = null ) {
parseResourceChain ( resourceHandlerDef , parserC ontext, resourceChainElement , source ) ;
parseResourceChain ( resourceHandlerDef , c ontext, resourceChainElement , source ) ;
}
Object manager = MvcNamespaceUtils . getContentNegotiationManager ( parserC ontext) ;
Object manager = MvcNamespaceUtils . getContentNegotiationManager ( c ontext) ;
if ( manager ! = null ) {
values . add ( "contentNegotiationManager" , manager ) ;
}
String beanName = parserC ontext. getReaderContext ( ) . generateBeanName ( resourceHandlerDef ) ;
parserC ontext. getRegistry ( ) . registerBeanDefinition ( beanName , resourceHandlerDef ) ;
parserC ontext. registerComponent ( new BeanComponentDefinition ( resourceHandlerDef , beanName ) ) ;
String beanName = c ontext. getReaderContext ( ) . generateBeanName ( resourceHandlerDef ) ;
c ontext. getRegistry ( ) . registerBeanDefinition ( beanName , resourceHandlerDef ) ;
c ontext. registerComponent ( new BeanComponentDefinition ( resourceHandlerDef , beanName ) ) ;
return beanName ;
}
private void parseResourceChain ( RootBeanDefinition resourceHandlerDef , ParserContext parserContext ,
Element element , Object source ) {
String autoRegistration = element . getAttribute ( "auto-registration" ) ;
boolean isAutoRegistration = ! ( StringUtils . hasText ( autoRegistration ) & & "false" . equals ( autoRegistration ) ) ;
ManagedList < ? super Object > resourceResolvers = new ManagedList < Object > ( ) ;
resourceResolvers . setSource ( source ) ;
ManagedList < ? super Object > resourceTransformers = new ManagedList < Object > ( ) ;
resourceTransformers . setSource ( source ) ;
parseResourceCache ( resourceResolvers , resourceTransformers , element , source ) ;
parseResourceResolversTransformers ( isAutoRegistration , resourceResolvers , resourceTransformers ,
parserContext , element , source ) ;
if ( ! resourceResolvers . isEmpty ( ) ) {
resourceHandlerDef . getPropertyValues ( ) . add ( "resourceResolvers" , resourceResolvers ) ;
}
if ( ! resourceTransformers . isEmpty ( ) ) {
resourceHandlerDef . getPropertyValues ( ) . add ( "resourceTransformers" , resourceTransformers ) ;
}
}
private CacheControl parseCacheControl ( Element element ) {
CacheControl cacheControl = CacheControl . empty ( ) ;
if ( "true" . equals ( element . getAttribute ( "no-cache" ) ) ) {
@ -282,29 +268,52 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -282,29 +268,52 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
return cacheControl ;
}
private void parseResourceChain (
RootBeanDefinition resourceHandlerDef , ParserContext context , Element element , Object source ) {
String autoRegistration = element . getAttribute ( "auto-registration" ) ;
boolean isAutoRegistration = ! ( StringUtils . hasText ( autoRegistration ) & & "false" . equals ( autoRegistration ) ) ;
ManagedList < ? super Object > resourceResolvers = new ManagedList < Object > ( ) ;
resourceResolvers . setSource ( source ) ;
ManagedList < ? super Object > resourceTransformers = new ManagedList < Object > ( ) ;
resourceTransformers . setSource ( source ) ;
parseResourceCache ( resourceResolvers , resourceTransformers , element , source ) ;
parseResourceResolversTransformers (
isAutoRegistration , resourceResolvers , resourceTransformers , context , element , source ) ;
if ( ! resourceResolvers . isEmpty ( ) ) {
resourceHandlerDef . getPropertyValues ( ) . add ( "resourceResolvers" , resourceResolvers ) ;
}
if ( ! resourceTransformers . isEmpty ( ) ) {
resourceHandlerDef . getPropertyValues ( ) . add ( "resourceTransformers" , resourceTransformers ) ;
}
}
private void parseResourceCache ( ManagedList < ? super Object > resourceResolvers ,
ManagedList < ? super Object > resourceTransformers , Element element , Object source ) {
String resourceCache = element . getAttribute ( "resource-cache" ) ;
if ( "true" . equals ( resourceCache ) ) {
ConstructorArgumentValues cavs = new ConstructorArgumentValues ( ) ;
ConstructorArgumentValues carg s = new ConstructorArgumentValues ( ) ;
RootBeanDefinition cachingResolverDef = new RootBeanDefinition ( CachingResourceResolver . class ) ;
cachingResolverDef . setSource ( source ) ;
cachingResolverDef . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
cachingResolverDef . setConstructorArgumentValues ( cavs ) ;
cachingResolverDef . setConstructorArgumentValues ( carg s ) ;
RootBeanDefinition cachingTransformerDef = new RootBeanDefinition ( CachingResourceTransformer . class ) ;
cachingTransformerDef . setSource ( source ) ;
cachingTransformerDef . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
cachingTransformerDef . setConstructorArgumentValues ( cavs ) ;
cachingTransformerDef . setConstructorArgumentValues ( carg s ) ;
String cacheManagerName = element . getAttribute ( "cache-manager" ) ;
String cacheName = element . getAttribute ( "cache-name" ) ;
if ( StringUtils . hasText ( cacheManagerName ) & & StringUtils . hasText ( cacheName ) ) {
RuntimeBeanReference cacheManagerRef = new RuntimeBeanReference ( cacheManagerName ) ;
cavs . addIndexedArgumentValue ( 0 , cacheManagerRef ) ;
cavs . addIndexedArgumentValue ( 1 , cacheName ) ;
carg s . addIndexedArgumentValue ( 0 , cacheManagerRef ) ;
carg s . addIndexedArgumentValue ( 1 , cacheName ) ;
}
else {
ConstructorArgumentValues cacheCavs = new ConstructorArgumentValues ( ) ;
@ -313,23 +322,22 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -313,23 +322,22 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
cacheDef . setSource ( source ) ;
cacheDef . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
cacheDef . setConstructorArgumentValues ( cacheCavs ) ;
cav s . addIndexedArgumentValue ( 0 , cacheDef ) ;
carg s . addIndexedArgumentValue ( 0 , cacheDef ) ;
}
resourceResolvers . add ( cachingResolverDef ) ;
resourceTransformers . add ( cachingTransformerDef ) ;
}
}
private void parseResourceResolversTransformers ( boolean isAutoRegistration ,
ManagedList < ? super Object > resourceResolvers , ManagedList < ? super Object > resourceTransformers ,
ParserContext parserC ontext, Element element , Object source ) {
ParserContext c ontext, Element element , Object source ) {
Element resolversElement = DomUtils . getChildElementByTagName ( element , "resolvers" ) ;
if ( resolversElement ! = null ) {
for ( Element beanElement : DomUtils . getChildElements ( resolversElement ) ) {
if ( VERSION_RESOLVER_ELEMENT . equals ( beanElement . getLocalName ( ) ) ) {
RootBeanDefinition versionResolverDef = parseVersionResolver ( parserC ontext, beanElement , source ) ;
RootBeanDefinition versionResolverDef = parseVersionResolver ( c ontext, beanElement , source ) ;
versionResolverDef . setSource ( source ) ;
resourceResolvers . add ( versionResolverDef ) ;
if ( isAutoRegistration ) {
@ -340,7 +348,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -340,7 +348,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
}
}
else {
Object object = parserC ontext. getDelegate ( ) . parsePropertySubElement ( beanElement , null ) ;
Object object = c ontext. getDelegate ( ) . parsePropertySubElement ( beanElement , null ) ;
resourceResolvers . add ( object ) ;
}
}
@ -362,13 +370,13 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -362,13 +370,13 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
Element transformersElement = DomUtils . getChildElementByTagName ( element , "transformers" ) ;
if ( transformersElement ! = null ) {
for ( Element beanElement : DomUtils . getChildElementsByTagName ( transformersElement , "bean" , "ref" ) ) {
Object object = parserC ontext. getDelegate ( ) . parsePropertySubElement ( beanElement , null ) ;
Object object = c ontext. getDelegate ( ) . parsePropertySubElement ( beanElement , null ) ;
resourceTransformers . add ( object ) ;
}
}
}
private RootBeanDefinition parseVersionResolver ( ParserContext parserC ontext, Element element , Object source ) {
private RootBeanDefinition parseVersionResolver ( ParserContext c ontext, Element element , Object source ) {
ManagedMap < String , ? super Object > strategyMap = new ManagedMap < String , Object > ( ) ;
strategyMap . setSource ( source ) ;
RootBeanDefinition versionResolverDef = new RootBeanDefinition ( VersionResourceResolver . class ) ;
@ -380,12 +388,12 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -380,12 +388,12 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
String [ ] patterns = StringUtils . commaDelimitedListToStringArray ( beanElement . getAttribute ( "patterns" ) ) ;
Object strategy = null ;
if ( FIXED_VERSION_STRATEGY_ELEMENT . equals ( beanElement . getLocalName ( ) ) ) {
ConstructorArgumentValues cav s = new ConstructorArgumentValues ( ) ;
cav s . addIndexedArgumentValue ( 0 , beanElement . getAttribute ( "version" ) ) ;
ConstructorArgumentValues carg s = new ConstructorArgumentValues ( ) ;
carg s . addIndexedArgumentValue ( 0 , beanElement . getAttribute ( "version" ) ) ;
RootBeanDefinition strategyDef = new RootBeanDefinition ( FixedVersionStrategy . class ) ;
strategyDef . setSource ( source ) ;
strategyDef . setRole ( BeanDefinition . ROLE_INFRASTRUCTURE ) ;
strategyDef . setConstructorArgumentValues ( cav s ) ;
strategyDef . setConstructorArgumentValues ( carg s ) ;
strategy = strategyDef ;
}
else if ( CONTENT_VERSION_STRATEGY_ELEMENT . equals ( beanElement . getLocalName ( ) ) ) {
@ -396,7 +404,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
@@ -396,7 +404,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
}
else if ( VERSION_STRATEGY_ELEMENT . equals ( beanElement . getLocalName ( ) ) ) {
Element childElement = DomUtils . getChildElementsByTagName ( beanElement , "bean" , "ref" ) . get ( 0 ) ;
strategy = parserC ontext. getDelegate ( ) . parsePropertySubElement ( childElement , null ) ;
strategy = c ontext. getDelegate ( ) . parsePropertySubElement ( childElement , null ) ;
}
for ( String pattern : patterns ) {
strategyMap . put ( pattern , strategy ) ;