Restored support for placeholders in mvc namespace resource locations
With the recent charset mechanism in place, we cannot rely on implicit placeholder parsing during String-to-Resource conversion anymore.
(cherry picked from commit 7af9910)
This commit is contained in:
@@ -30,7 +30,6 @@ import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.ResourceLoader;
|
||||
import org.springframework.core.io.UrlResource;
|
||||
import org.springframework.util.AntPathMatcher;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.PathMatcher;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;
|
||||
@@ -129,16 +128,16 @@ public abstract class MvcNamespaceUtils {
|
||||
* Registers an {@link HttpRequestHandlerAdapter} under a well-known
|
||||
* name unless already registered.
|
||||
*/
|
||||
private static void registerBeanNameUrlHandlerMapping(ParserContext parserContext, Object source) {
|
||||
if (!parserContext.getRegistry().containsBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME)){
|
||||
RootBeanDefinition beanNameMappingDef = new RootBeanDefinition(BeanNameUrlHandlerMapping.class);
|
||||
beanNameMappingDef.setSource(source);
|
||||
beanNameMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
beanNameMappingDef.getPropertyValues().add("order", 2); // consistent with WebMvcConfigurationSupport
|
||||
RuntimeBeanReference corsConfigurationsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source);
|
||||
beanNameMappingDef.getPropertyValues().add("corsConfigurations", corsConfigurationsRef);
|
||||
parserContext.getRegistry().registerBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME, beanNameMappingDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(beanNameMappingDef, BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME));
|
||||
private static void registerBeanNameUrlHandlerMapping(ParserContext context, Object source) {
|
||||
if (!context.getRegistry().containsBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME)){
|
||||
RootBeanDefinition mappingDef = new RootBeanDefinition(BeanNameUrlHandlerMapping.class);
|
||||
mappingDef.setSource(source);
|
||||
mappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
mappingDef.getPropertyValues().add("order", 2); // consistent with WebMvcConfigurationSupport
|
||||
RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, context, source);
|
||||
mappingDef.getPropertyValues().add("corsConfigurations", corsRef);
|
||||
context.getRegistry().registerBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME, mappingDef);
|
||||
context.registerComponent(new BeanComponentDefinition(mappingDef, BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,13 +145,13 @@ public abstract class MvcNamespaceUtils {
|
||||
* Registers an {@link HttpRequestHandlerAdapter} under a well-known
|
||||
* name unless already registered.
|
||||
*/
|
||||
private static void registerHttpRequestHandlerAdapter(ParserContext parserContext, Object source) {
|
||||
if (!parserContext.getRegistry().containsBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME)) {
|
||||
RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(HttpRequestHandlerAdapter.class);
|
||||
handlerAdapterDef.setSource(source);
|
||||
handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
parserContext.getRegistry().registerBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME));
|
||||
private static void registerHttpRequestHandlerAdapter(ParserContext context, Object source) {
|
||||
if (!context.getRegistry().containsBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME)) {
|
||||
RootBeanDefinition adapterDef = new RootBeanDefinition(HttpRequestHandlerAdapter.class);
|
||||
adapterDef.setSource(source);
|
||||
adapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
context.getRegistry().registerBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME, adapterDef);
|
||||
context.registerComponent(new BeanComponentDefinition(adapterDef, HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,13 +159,13 @@ public abstract class MvcNamespaceUtils {
|
||||
* Registers a {@link SimpleControllerHandlerAdapter} under a well-known
|
||||
* name unless already registered.
|
||||
*/
|
||||
private static void registerSimpleControllerHandlerAdapter(ParserContext parserContext, Object source) {
|
||||
if (!parserContext.getRegistry().containsBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME)) {
|
||||
RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class);
|
||||
handlerAdapterDef.setSource(source);
|
||||
handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
parserContext.getRegistry().registerBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME));
|
||||
private static void registerSimpleControllerHandlerAdapter(ParserContext context, Object source) {
|
||||
if (!context.getRegistry().containsBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME)) {
|
||||
RootBeanDefinition beanDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class);
|
||||
beanDef.setSource(source);
|
||||
beanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
context.getRegistry().registerBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME, beanDef);
|
||||
context.registerComponent(new BeanComponentDefinition(beanDef, SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,21 +176,21 @@ public abstract class MvcNamespaceUtils {
|
||||
* @return a RuntimeBeanReference to this {@code Map<String, CorsConfiguration>} instance
|
||||
*/
|
||||
public static RuntimeBeanReference registerCorsConfigurations(
|
||||
Map<String, CorsConfiguration> corsConfigurations, ParserContext parserContext, Object source) {
|
||||
Map<String, CorsConfiguration> corsConfigurations, ParserContext context, Object source) {
|
||||
|
||||
if (!parserContext.getRegistry().containsBeanDefinition(CORS_CONFIGURATION_BEAN_NAME)) {
|
||||
RootBeanDefinition corsConfigurationsDef = new RootBeanDefinition(LinkedHashMap.class);
|
||||
corsConfigurationsDef.setSource(source);
|
||||
corsConfigurationsDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
if (!context.getRegistry().containsBeanDefinition(CORS_CONFIGURATION_BEAN_NAME)) {
|
||||
RootBeanDefinition corsDef = new RootBeanDefinition(LinkedHashMap.class);
|
||||
corsDef.setSource(source);
|
||||
corsDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
if (corsConfigurations != null) {
|
||||
corsConfigurationsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations);
|
||||
corsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations);
|
||||
}
|
||||
parserContext.getReaderContext().getRegistry().registerBeanDefinition(CORS_CONFIGURATION_BEAN_NAME, corsConfigurationsDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(corsConfigurationsDef, CORS_CONFIGURATION_BEAN_NAME));
|
||||
context.getReaderContext().getRegistry().registerBeanDefinition(CORS_CONFIGURATION_BEAN_NAME, corsDef);
|
||||
context.registerComponent(new BeanComponentDefinition(corsDef, CORS_CONFIGURATION_BEAN_NAME));
|
||||
}
|
||||
else if (corsConfigurations != null) {
|
||||
BeanDefinition corsConfigurationsDef = parserContext.getRegistry().getBeanDefinition(CORS_CONFIGURATION_BEAN_NAME);
|
||||
corsConfigurationsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations);
|
||||
BeanDefinition corsDef = context.getRegistry().getBeanDefinition(CORS_CONFIGURATION_BEAN_NAME);
|
||||
corsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations);
|
||||
}
|
||||
return new RuntimeBeanReference(CORS_CONFIGURATION_BEAN_NAME);
|
||||
}
|
||||
@@ -214,7 +213,7 @@ public abstract class MvcNamespaceUtils {
|
||||
/**
|
||||
* Find the {@code ContentNegotiationManager} bean created by or registered
|
||||
* with the {@code annotation-driven} element.
|
||||
* @return a bean definition, bean reference, or {@code null}
|
||||
* @return a bean definition, bean reference, or {@code null} if none defined
|
||||
*/
|
||||
public static Object getContentNegotiationManager(ParserContext context) {
|
||||
String name = AnnotationDrivenBeanDefinitionParser.HANDLER_MAPPING_BEAN_NAME;
|
||||
@@ -232,12 +231,11 @@ public abstract class MvcNamespaceUtils {
|
||||
/**
|
||||
* Load the {@link Resource}'s for the given locations with the given
|
||||
* {@link ResourceLoader} and add them to the output list. Also for
|
||||
* {@link org.springframework.core.io.UrlResource URL-based resources} (e.g.
|
||||
* files, HTTP URLs, etc) this method supports a special prefix to indicate
|
||||
* the charset associated with the URL so that relative paths appended to it
|
||||
* can be encoded correctly, e.g.
|
||||
* {@code [charset=Windows-31J]http://example.org/path}. The charsets, if
|
||||
* any, are added to the output map.
|
||||
* {@link org.springframework.core.io.UrlResource URL-based resources} (e.g. files,
|
||||
* HTTP URLs, etc) this method supports a special prefix to indicate the charset
|
||||
* associated with the URL so that relative paths appended to it can be encoded
|
||||
* correctly, e.g. {@code [charset=Windows-31J]http://example.org/path}.
|
||||
* The charsets, if any, are added to the output map.
|
||||
* @since 4.3.13
|
||||
*/
|
||||
public static void loadResourceLocations(String[] locations, ResourceLoader resourceLoader,
|
||||
@@ -248,7 +246,9 @@ public abstract class MvcNamespaceUtils {
|
||||
location = location.trim();
|
||||
if (location.startsWith(URL_RESOURCE_CHARSET_PREFIX)) {
|
||||
int endIndex = location.indexOf("]", URL_RESOURCE_CHARSET_PREFIX.length());
|
||||
Assert.isTrue(endIndex != -1, "Invalid charset syntax in location: " + location);
|
||||
if (endIndex == -1) {
|
||||
throw new IllegalArgumentException("Invalid charset syntax in location: " + location);
|
||||
}
|
||||
String value = location.substring(URL_RESOURCE_CHARSET_PREFIX.length(), endIndex);
|
||||
charset = Charset.forName(value);
|
||||
location = location.substring(endIndex + 1);
|
||||
@@ -256,7 +256,9 @@ public abstract class MvcNamespaceUtils {
|
||||
Resource resource = resourceLoader.getResource(location);
|
||||
outputLocations.add(resource);
|
||||
if (charset != null) {
|
||||
Assert.isInstanceOf(UrlResource.class, resource, "Unexpected charset for: " + resource);
|
||||
if (!(resource instanceof UrlResource)) {
|
||||
throw new IllegalArgumentException("Unexpected charset for non-UrlResource: " + resource);
|
||||
}
|
||||
outputLocationCharsets.put(resource, charset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
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;
|
||||
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 {
|
||||
|
||||
|
||||
@Override
|
||||
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
||||
Object source = parserContext.extractSource(element);
|
||||
public BeanDefinition parse(Element element, ParserContext context) {
|
||||
Object source = context.extractSource(element);
|
||||
|
||||
registerUrlProvider(parserContext, source);
|
||||
registerUrlProvider(context, source);
|
||||
|
||||
RuntimeBeanReference pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(null, parserContext, source);
|
||||
RuntimeBeanReference pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(null, parserContext, source);
|
||||
RuntimeBeanReference pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(null, context, source);
|
||||
RuntimeBeanReference pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(null, context, source);
|
||||
|
||||
String resourceHandlerName = registerResourceHandler(parserContext, element, pathHelperRef, source);
|
||||
String resourceHandlerName = registerResourceHandler(context, element, pathHelperRef, source);
|
||||
if (resourceHandlerName == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -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)) {
|
||||
parserContext.getReaderContext().error("The 'mapping' attribute is required.", parserContext.extractSource(element));
|
||||
context.getReaderContext().error("The 'mapping' attribute is required.", context.extractSource(element));
|
||||
return null;
|
||||
}
|
||||
urlMap.put(resourceRequestPath, resourceHandlerName);
|
||||
@@ -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 corsConfigurationsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source);
|
||||
handlerMappingDef.getPropertyValues().add("corsConfigurations", corsConfigurationsRef);
|
||||
RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, context, source);
|
||||
handlerMappingDef.getPropertyValues().add("corsConfigurations", corsRef);
|
||||
|
||||
String beanName = parserContext.getReaderContext().generateBeanName(handlerMappingDef);
|
||||
parserContext.getRegistry().registerBeanDefinition(beanName, handlerMappingDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, beanName));
|
||||
String beanName = context.getReaderContext().generateBeanName(handlerMappingDef);
|
||||
context.getRegistry().registerBeanDefinition(beanName, handlerMappingDef);
|
||||
context.registerComponent(new BeanComponentDefinition(handlerMappingDef, beanName));
|
||||
|
||||
// Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off"
|
||||
// Register HttpRequestHandlerAdapter
|
||||
MvcNamespaceUtils.registerDefaultComponents(parserContext, source);
|
||||
MvcNamespaceUtils.registerDefaultComponents(context, source);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void registerUrlProvider(ParserContext parserContext, Object source) {
|
||||
if (!parserContext.getRegistry().containsBeanDefinition(RESOURCE_URL_PROVIDER)) {
|
||||
private void registerUrlProvider(ParserContext context, Object source) {
|
||||
if (!context.getRegistry().containsBeanDefinition(RESOURCE_URL_PROVIDER)) {
|
||||
RootBeanDefinition urlProvider = new RootBeanDefinition(ResourceUrlProvider.class);
|
||||
urlProvider.setSource(source);
|
||||
urlProvider.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
parserContext.getRegistry().registerBeanDefinition(RESOURCE_URL_PROVIDER, urlProvider);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(urlProvider, RESOURCE_URL_PROVIDER));
|
||||
context.getRegistry().registerBeanDefinition(RESOURCE_URL_PROVIDER, urlProvider);
|
||||
context.registerComponent(new BeanComponentDefinition(urlProvider, RESOURCE_URL_PROVIDER));
|
||||
|
||||
RootBeanDefinition interceptor = new RootBeanDefinition(ResourceUrlProviderExposingInterceptor.class);
|
||||
interceptor.setSource(source);
|
||||
@@ -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 = parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptor);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptor, mappedInterceptorName));
|
||||
String mappedInterceptorName = context.getReaderContext().registerWithGeneratedName(mappedInterceptor);
|
||||
context.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)) {
|
||||
parserContext.getReaderContext().error("The 'location' attribute is required.", parserContext.extractSource(element));
|
||||
context.getReaderContext().error("The 'location' attribute is required.", context.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 = context.getReaderContext().getResourceLoader();
|
||||
|
||||
if (resourceLoader != null) {
|
||||
List<Resource> resources = new ArrayList<Resource>();
|
||||
@@ -204,44 +213,21 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
|
||||
|
||||
Element resourceChainElement = DomUtils.getChildElementByTagName(element, "resource-chain");
|
||||
if (resourceChainElement != null) {
|
||||
parseResourceChain(resourceHandlerDef, parserContext, resourceChainElement, source);
|
||||
parseResourceChain(resourceHandlerDef, context, resourceChainElement, source);
|
||||
}
|
||||
|
||||
Object manager = MvcNamespaceUtils.getContentNegotiationManager(parserContext);
|
||||
Object manager = MvcNamespaceUtils.getContentNegotiationManager(context);
|
||||
if (manager != null) {
|
||||
values.add("contentNegotiationManager", manager);
|
||||
}
|
||||
|
||||
String beanName = parserContext.getReaderContext().generateBeanName(resourceHandlerDef);
|
||||
parserContext.getRegistry().registerBeanDefinition(beanName, resourceHandlerDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(resourceHandlerDef, beanName));
|
||||
String beanName = context.getReaderContext().generateBeanName(resourceHandlerDef);
|
||||
context.getRegistry().registerBeanDefinition(beanName, resourceHandlerDef);
|
||||
context.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 {
|
||||
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 cargs = new ConstructorArgumentValues();
|
||||
|
||||
RootBeanDefinition cachingResolverDef = new RootBeanDefinition(CachingResourceResolver.class);
|
||||
cachingResolverDef.setSource(source);
|
||||
cachingResolverDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
cachingResolverDef.setConstructorArgumentValues(cavs);
|
||||
cachingResolverDef.setConstructorArgumentValues(cargs);
|
||||
|
||||
RootBeanDefinition cachingTransformerDef = new RootBeanDefinition(CachingResourceTransformer.class);
|
||||
cachingTransformerDef.setSource(source);
|
||||
cachingTransformerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
cachingTransformerDef.setConstructorArgumentValues(cavs);
|
||||
cachingTransformerDef.setConstructorArgumentValues(cargs);
|
||||
|
||||
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);
|
||||
cargs.addIndexedArgumentValue(0, cacheManagerRef);
|
||||
cargs.addIndexedArgumentValue(1, cacheName);
|
||||
}
|
||||
else {
|
||||
ConstructorArgumentValues cacheCavs = new ConstructorArgumentValues();
|
||||
@@ -313,23 +322,22 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
|
||||
cacheDef.setSource(source);
|
||||
cacheDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
cacheDef.setConstructorArgumentValues(cacheCavs);
|
||||
cavs.addIndexedArgumentValue(0, cacheDef);
|
||||
cargs.addIndexedArgumentValue(0, cacheDef);
|
||||
}
|
||||
resourceResolvers.add(cachingResolverDef);
|
||||
resourceTransformers.add(cachingTransformerDef);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void parseResourceResolversTransformers(boolean isAutoRegistration,
|
||||
ManagedList<? super Object> resourceResolvers, ManagedList<? super Object> resourceTransformers,
|
||||
ParserContext parserContext, Element element, Object source) {
|
||||
ParserContext context, 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(parserContext, beanElement, source);
|
||||
RootBeanDefinition versionResolverDef = parseVersionResolver(context, beanElement, source);
|
||||
versionResolverDef.setSource(source);
|
||||
resourceResolvers.add(versionResolverDef);
|
||||
if (isAutoRegistration) {
|
||||
@@ -340,7 +348,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
}
|
||||
else {
|
||||
Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
Object object = context.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
resourceResolvers.add(object);
|
||||
}
|
||||
}
|
||||
@@ -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 = parserContext.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
Object object = context.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
resourceTransformers.add(object);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private RootBeanDefinition parseVersionResolver(ParserContext parserContext, Element element, Object source) {
|
||||
private RootBeanDefinition parseVersionResolver(ParserContext context, 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 {
|
||||
String[] patterns = StringUtils.commaDelimitedListToStringArray(beanElement.getAttribute("patterns"));
|
||||
Object strategy = null;
|
||||
if (FIXED_VERSION_STRATEGY_ELEMENT.equals(beanElement.getLocalName())) {
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, beanElement.getAttribute("version"));
|
||||
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
|
||||
cargs.addIndexedArgumentValue(0, beanElement.getAttribute("version"));
|
||||
RootBeanDefinition strategyDef = new RootBeanDefinition(FixedVersionStrategy.class);
|
||||
strategyDef.setSource(source);
|
||||
strategyDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
strategyDef.setConstructorArgumentValues(cavs);
|
||||
strategyDef.setConstructorArgumentValues(cargs);
|
||||
strategy = strategyDef;
|
||||
}
|
||||
else if (CONTENT_VERSION_STRATEGY_ELEMENT.equals(beanElement.getLocalName())) {
|
||||
@@ -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 = parserContext.getDelegate().parsePropertySubElement(childElement, null);
|
||||
strategy = context.getDelegate().parsePropertySubElement(childElement, null);
|
||||
}
|
||||
for (String pattern : patterns) {
|
||||
strategyMap.put(pattern, strategy);
|
||||
|
||||
Reference in New Issue
Block a user