Polishing
This commit is contained in:
@@ -16,9 +16,6 @@
|
||||
|
||||
package org.springframework.test.context.support;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
@@ -87,34 +84,37 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte
|
||||
protected abstract SmartContextLoader getAnnotationConfigLoader();
|
||||
|
||||
|
||||
// ContextLoader
|
||||
|
||||
/**
|
||||
* {@code AbstractDelegatingSmartContextLoader} does not support the
|
||||
* {@link ContextLoader#processLocations(Class, String...)} method. Call
|
||||
* {@link #processContextConfiguration(ContextConfigurationAttributes)} instead.
|
||||
* @throws UnsupportedOperationException in this implementation
|
||||
*/
|
||||
@Override
|
||||
public final String[] processLocations(Class<?> clazz, String... locations) {
|
||||
throw new UnsupportedOperationException(
|
||||
"DelegatingSmartContextLoaders do not support the ContextLoader SPI. " +
|
||||
"Call processContextConfiguration(ContextConfigurationAttributes) instead.");
|
||||
}
|
||||
|
||||
/**
|
||||
* {@code AbstractDelegatingSmartContextLoader} does not support the
|
||||
* {@link ContextLoader#loadContext(String...) } method. Call
|
||||
* {@link #loadContext(MergedContextConfiguration)} instead.
|
||||
* @throws UnsupportedOperationException in this implementation
|
||||
*/
|
||||
@Override
|
||||
public final ApplicationContext loadContext(String... locations) throws Exception {
|
||||
throw new UnsupportedOperationException(
|
||||
"DelegatingSmartContextLoaders do not support the ContextLoader SPI. " +
|
||||
"Call loadContext(MergedContextConfiguration) instead.");
|
||||
}
|
||||
|
||||
|
||||
// SmartContextLoader
|
||||
|
||||
private static void delegateProcessing(SmartContextLoader loader, ContextConfigurationAttributes configAttributes) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(String.format("Delegating to %s to process context configuration %s.",
|
||||
name(loader), configAttributes));
|
||||
}
|
||||
loader.processContextConfiguration(configAttributes);
|
||||
}
|
||||
|
||||
private static ApplicationContext delegateLoading(SmartContextLoader loader, MergedContextConfiguration mergedConfig)
|
||||
throws Exception {
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(String.format("Delegating to %s to load context from %s.", name(loader), mergedConfig));
|
||||
}
|
||||
return loader.loadContext(mergedConfig);
|
||||
}
|
||||
|
||||
private boolean supports(SmartContextLoader loader, MergedContextConfiguration mergedConfig) {
|
||||
if (loader == getAnnotationConfigLoader()) {
|
||||
return (mergedConfig.hasClasses() && !mergedConfig.hasLocations());
|
||||
}
|
||||
else {
|
||||
return (mergedConfig.hasLocations() && !mergedConfig.hasClasses());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delegates to candidate {@code SmartContextLoaders} to process the supplied
|
||||
* {@link ContextConfigurationAttributes}.
|
||||
@@ -232,8 +232,7 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte
|
||||
*/
|
||||
@Override
|
||||
public ApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception {
|
||||
Assert.notNull(mergedConfig, "mergedConfig must not be null");
|
||||
List<SmartContextLoader> candidates = Arrays.asList(getXmlLoader(), getAnnotationConfigLoader());
|
||||
Assert.notNull(mergedConfig, "MergedContextConfiguration must not be null");
|
||||
|
||||
if (mergedConfig.hasLocations() && mergedConfig.hasClasses()) {
|
||||
throw new IllegalStateException(String.format(
|
||||
@@ -242,6 +241,7 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte
|
||||
name(getAnnotationConfigLoader()), mergedConfig));
|
||||
}
|
||||
|
||||
SmartContextLoader[] candidates = {getXmlLoader(), getAnnotationConfigLoader()};
|
||||
for (SmartContextLoader loader : candidates) {
|
||||
// Determine if each loader can load a context from the mergedConfig. If it
|
||||
// can, let it; otherwise, keep iterating.
|
||||
@@ -259,41 +259,39 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte
|
||||
|
||||
// else...
|
||||
throw new IllegalStateException(String.format(
|
||||
"Neither %s nor %s was able to load an ApplicationContext from %s.", name(getXmlLoader()),
|
||||
name(getAnnotationConfigLoader()), mergedConfig));
|
||||
"Neither %s nor %s was able to load an ApplicationContext from %s.",
|
||||
name(getXmlLoader()), name(getAnnotationConfigLoader()), mergedConfig));
|
||||
}
|
||||
|
||||
|
||||
private static void delegateProcessing(SmartContextLoader loader, ContextConfigurationAttributes configAttributes) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(String.format("Delegating to %s to process context configuration %s.",
|
||||
name(loader), configAttributes));
|
||||
}
|
||||
loader.processContextConfiguration(configAttributes);
|
||||
}
|
||||
|
||||
private static ApplicationContext delegateLoading(SmartContextLoader loader, MergedContextConfiguration mergedConfig)
|
||||
throws Exception {
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(String.format("Delegating to %s to load context from %s.", name(loader), mergedConfig));
|
||||
}
|
||||
return loader.loadContext(mergedConfig);
|
||||
}
|
||||
|
||||
private boolean supports(SmartContextLoader loader, MergedContextConfiguration mergedConfig) {
|
||||
if (loader == getAnnotationConfigLoader()) {
|
||||
return (mergedConfig.hasClasses() && !mergedConfig.hasLocations());
|
||||
}
|
||||
else {
|
||||
return (mergedConfig.hasLocations() && !mergedConfig.hasClasses());
|
||||
}
|
||||
}
|
||||
|
||||
private static String name(SmartContextLoader loader) {
|
||||
return loader.getClass().getSimpleName();
|
||||
}
|
||||
|
||||
|
||||
// ContextLoader
|
||||
|
||||
/**
|
||||
* {@code AbstractDelegatingSmartContextLoader} does not support the
|
||||
* {@link ContextLoader#processLocations(Class, String...)} method. Call
|
||||
* {@link #processContextConfiguration(ContextConfigurationAttributes)} instead.
|
||||
* @throws UnsupportedOperationException in this implementation
|
||||
*/
|
||||
@Override
|
||||
public final String[] processLocations(Class<?> clazz, String... locations) {
|
||||
throw new UnsupportedOperationException(
|
||||
"DelegatingSmartContextLoaders do not support the ContextLoader SPI. " +
|
||||
"Call processContextConfiguration(ContextConfigurationAttributes) instead.");
|
||||
}
|
||||
|
||||
/**
|
||||
* {@code AbstractDelegatingSmartContextLoader} does not support the
|
||||
* {@link ContextLoader#loadContext(String...) } method. Call
|
||||
* {@link #loadContext(MergedContextConfiguration)} instead.
|
||||
* @throws UnsupportedOperationException
|
||||
*/
|
||||
@Override
|
||||
public final ApplicationContext loadContext(String... locations) throws Exception {
|
||||
throw new UnsupportedOperationException(
|
||||
"DelegatingSmartContextLoaders do not support the ContextLoader SPI. " +
|
||||
"Call loadContext(MergedContextConfiguration) instead.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
* Copyright 2002-2018 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.
|
||||
@@ -16,11 +16,10 @@
|
||||
|
||||
package org.springframework.web.method.annotation;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.web.bind.WebDataBinder;
|
||||
import org.springframework.web.bind.annotation.InitBinder;
|
||||
import org.springframework.web.bind.support.DefaultDataBinderFactory;
|
||||
@@ -53,32 +52,33 @@ public class InitBinderDataBinderFactory extends DefaultDataBinderFactory {
|
||||
|
||||
/**
|
||||
* Initialize a WebDataBinder with {@code @InitBinder} methods.
|
||||
* If the {@code @InitBinder} annotation specifies attributes names, it is
|
||||
* invoked only if the names include the target object name.
|
||||
* @throws Exception if one of the invoked @{@link InitBinder} methods fail.
|
||||
* <p>If the {@code @InitBinder} annotation specifies attributes names,
|
||||
* it is invoked only if the names include the target object name.
|
||||
* @throws Exception if one of the invoked @{@link InitBinder} methods fails
|
||||
* @see #isBinderMethodApplicable
|
||||
*/
|
||||
@Override
|
||||
public void initBinder(WebDataBinder binder, NativeWebRequest request) throws Exception {
|
||||
public void initBinder(WebDataBinder dataBinder, NativeWebRequest request) throws Exception {
|
||||
for (InvocableHandlerMethod binderMethod : this.binderMethods) {
|
||||
if (isBinderMethodApplicable(binderMethod, binder)) {
|
||||
Object returnValue = binderMethod.invokeForRequest(request, null, binder);
|
||||
if (isBinderMethodApplicable(binderMethod, dataBinder)) {
|
||||
Object returnValue = binderMethod.invokeForRequest(request, null, dataBinder);
|
||||
if (returnValue != null) {
|
||||
throw new IllegalStateException(
|
||||
"@InitBinder methods should return void: " + binderMethod);
|
||||
"@InitBinder methods must not return a value (should be void): " + binderMethod);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the given {@code @InitBinder} method should be used to initialize
|
||||
* the given WebDataBinder instance. By default we check the attributes
|
||||
* names of the annotation, if present.
|
||||
* Determine whether the given {@code @InitBinder} method should be used
|
||||
* to initialize the given {@link WebDataBinder} instance. By default we
|
||||
* check the specified attribute names in the annotation value, if any.
|
||||
*/
|
||||
protected boolean isBinderMethodApplicable(HandlerMethod initBinderMethod, WebDataBinder binder) {
|
||||
protected boolean isBinderMethodApplicable(HandlerMethod initBinderMethod, WebDataBinder dataBinder) {
|
||||
InitBinder ann = initBinderMethod.getMethodAnnotation(InitBinder.class);
|
||||
Collection<String> names = Arrays.asList(ann.value());
|
||||
return (names.isEmpty() || names.contains(binder.getObjectName()));
|
||||
String[] names = ann.value();
|
||||
return (ObjectUtils.isEmpty(names) || ObjectUtils.containsElement(names, dataBinder.getObjectName()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -181,14 +181,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
|
||||
|
||||
@Override
|
||||
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
||||
Object source = parserContext.extractSource(element);
|
||||
XmlReaderContext readerContext = parserContext.getReaderContext();
|
||||
public BeanDefinition parse(Element element, ParserContext context) {
|
||||
Object source = context.extractSource(element);
|
||||
XmlReaderContext readerContext = context.getReaderContext();
|
||||
|
||||
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source);
|
||||
parserContext.pushContainingComponent(compDefinition);
|
||||
context.pushContainingComponent(compDefinition);
|
||||
|
||||
RuntimeBeanReference contentNegotiationManager = getContentNegotiationManager(element, source, parserContext);
|
||||
RuntimeBeanReference contentNegotiationManager = getContentNegotiationManager(element, source, context);
|
||||
|
||||
RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class);
|
||||
handlerMappingDef.setSource(source);
|
||||
@@ -205,14 +205,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
handlerMappingDef.getPropertyValues().add("removeSemicolonContent", !enableMatrixVariables);
|
||||
}
|
||||
|
||||
configurePathMatchingProperties(handlerMappingDef, element, parserContext);
|
||||
configurePathMatchingProperties(handlerMappingDef, element, context);
|
||||
readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME , handlerMappingDef);
|
||||
|
||||
RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source);
|
||||
RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, context, source);
|
||||
handlerMappingDef.getPropertyValues().add("corsConfigurations", corsRef);
|
||||
|
||||
RuntimeBeanReference conversionService = getConversionService(element, source, parserContext);
|
||||
RuntimeBeanReference validator = getValidator(element, source, parserContext);
|
||||
RuntimeBeanReference conversionService = getConversionService(element, source, context);
|
||||
RuntimeBeanReference validator = getValidator(element, source, context);
|
||||
RuntimeBeanReference messageCodesResolver = getMessageCodesResolver(element);
|
||||
|
||||
RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class);
|
||||
@@ -222,13 +222,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
bindingDef.getPropertyValues().add("validator", validator);
|
||||
bindingDef.getPropertyValues().add("messageCodesResolver", messageCodesResolver);
|
||||
|
||||
ManagedList<?> messageConverters = getMessageConverters(element, source, parserContext);
|
||||
ManagedList<?> argumentResolvers = getArgumentResolvers(element, parserContext);
|
||||
ManagedList<?> returnValueHandlers = getReturnValueHandlers(element, parserContext);
|
||||
ManagedList<?> messageConverters = getMessageConverters(element, source, context);
|
||||
ManagedList<?> argumentResolvers = getArgumentResolvers(element, context);
|
||||
ManagedList<?> returnValueHandlers = getReturnValueHandlers(element, context);
|
||||
String asyncTimeout = getAsyncTimeout(element);
|
||||
RuntimeBeanReference asyncExecutor = getAsyncExecutor(element);
|
||||
ManagedList<?> callableInterceptors = getCallableInterceptors(element, source, parserContext);
|
||||
ManagedList<?> deferredResultInterceptors = getDeferredResultInterceptors(element, source, parserContext);
|
||||
ManagedList<?> callableInterceptors = getCallableInterceptors(element, source, context);
|
||||
ManagedList<?> deferredResultInterceptors = getDeferredResultInterceptors(element, source, context);
|
||||
|
||||
RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
|
||||
handlerAdapterDef.setSource(source);
|
||||
@@ -311,18 +311,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
defaultExceptionResolver.getPropertyValues().add("order", 2);
|
||||
String defaultExResolverName = readerContext.registerWithGeneratedName(defaultExceptionResolver);
|
||||
|
||||
parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME));
|
||||
parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME));
|
||||
parserContext.registerComponent(new BeanComponentDefinition(uriContributorDef, uriContributorName));
|
||||
parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName));
|
||||
parserContext.registerComponent(new BeanComponentDefinition(methodExceptionResolver, methodExResolverName));
|
||||
parserContext.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName));
|
||||
parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName));
|
||||
context.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME));
|
||||
context.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME));
|
||||
context.registerComponent(new BeanComponentDefinition(uriContributorDef, uriContributorName));
|
||||
context.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName));
|
||||
context.registerComponent(new BeanComponentDefinition(methodExceptionResolver, methodExResolverName));
|
||||
context.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName));
|
||||
context.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName));
|
||||
|
||||
// Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off"
|
||||
MvcNamespaceUtils.registerDefaultComponents(parserContext, source);
|
||||
MvcNamespaceUtils.registerDefaultComponents(context, source);
|
||||
|
||||
parserContext.popAndRegisterContainingComponent();
|
||||
context.popAndRegisterContainingComponent();
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -341,7 +341,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
}
|
||||
|
||||
private RuntimeBeanReference getConversionService(Element element, Object source, ParserContext parserContext) {
|
||||
private RuntimeBeanReference getConversionService(Element element, Object source, ParserContext context) {
|
||||
RuntimeBeanReference conversionServiceRef;
|
||||
if (element.hasAttribute("conversion-service")) {
|
||||
conversionServiceRef = new RuntimeBeanReference(element.getAttribute("conversion-service"));
|
||||
@@ -350,14 +350,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
RootBeanDefinition conversionDef = new RootBeanDefinition(FormattingConversionServiceFactoryBean.class);
|
||||
conversionDef.setSource(source);
|
||||
conversionDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
String conversionName = parserContext.getReaderContext().registerWithGeneratedName(conversionDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(conversionDef, conversionName));
|
||||
String conversionName = context.getReaderContext().registerWithGeneratedName(conversionDef);
|
||||
context.registerComponent(new BeanComponentDefinition(conversionDef, conversionName));
|
||||
conversionServiceRef = new RuntimeBeanReference(conversionName);
|
||||
}
|
||||
return conversionServiceRef;
|
||||
}
|
||||
|
||||
private RuntimeBeanReference getValidator(Element element, Object source, ParserContext parserContext) {
|
||||
private RuntimeBeanReference getValidator(Element element, Object source, ParserContext context) {
|
||||
if (element.hasAttribute("validator")) {
|
||||
return new RuntimeBeanReference(element.getAttribute("validator"));
|
||||
}
|
||||
@@ -366,8 +366,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
"org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean");
|
||||
validatorDef.setSource(source);
|
||||
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName));
|
||||
String validatorName = context.getReaderContext().registerWithGeneratedName(validatorDef);
|
||||
context.registerComponent(new BeanComponentDefinition(validatorDef, validatorName));
|
||||
return new RuntimeBeanReference(validatorName);
|
||||
}
|
||||
else {
|
||||
@@ -375,9 +375,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
}
|
||||
|
||||
private RuntimeBeanReference getContentNegotiationManager(
|
||||
Element element, Object source, ParserContext parserContext) {
|
||||
|
||||
private RuntimeBeanReference getContentNegotiationManager(Element element, Object source, ParserContext context) {
|
||||
RuntimeBeanReference beanRef;
|
||||
if (element.hasAttribute("content-negotiation-manager")) {
|
||||
String name = element.getAttribute("content-negotiation-manager");
|
||||
@@ -389,19 +387,19 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
factoryBeanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
factoryBeanDef.getPropertyValues().add("mediaTypes", getDefaultMediaTypes());
|
||||
String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
|
||||
parserContext.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef);
|
||||
parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, name));
|
||||
context.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef);
|
||||
context.registerComponent(new BeanComponentDefinition(factoryBeanDef, name));
|
||||
beanRef = new RuntimeBeanReference(name);
|
||||
}
|
||||
return beanRef;
|
||||
}
|
||||
|
||||
private void configurePathMatchingProperties(
|
||||
RootBeanDefinition handlerMappingDef, Element element, ParserContext parserContext) {
|
||||
RootBeanDefinition handlerMappingDef, Element element, ParserContext context) {
|
||||
|
||||
Element pathMatchingElement = DomUtils.getChildElementByTagName(element, "path-matching");
|
||||
if (pathMatchingElement != null) {
|
||||
Object source = parserContext.extractSource(element);
|
||||
Object source = context.extractSource(element);
|
||||
|
||||
if (pathMatchingElement.hasAttribute("suffix-pattern")) {
|
||||
Boolean useSuffixPatternMatch = Boolean.valueOf(pathMatchingElement.getAttribute("suffix-pattern"));
|
||||
@@ -420,14 +418,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
if (pathMatchingElement.hasAttribute("path-helper")) {
|
||||
pathHelperRef = new RuntimeBeanReference(pathMatchingElement.getAttribute("path-helper"));
|
||||
}
|
||||
pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(pathHelperRef, parserContext, source);
|
||||
pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(pathHelperRef, context, source);
|
||||
handlerMappingDef.getPropertyValues().add("urlPathHelper", pathHelperRef);
|
||||
|
||||
RuntimeBeanReference pathMatcherRef = null;
|
||||
if (pathMatchingElement.hasAttribute("path-matcher")) {
|
||||
pathMatcherRef = new RuntimeBeanReference(pathMatchingElement.getAttribute("path-matcher"));
|
||||
}
|
||||
pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(pathMatcherRef, parserContext, source);
|
||||
pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(pathMatcherRef, context, source);
|
||||
handlerMappingDef.getPropertyValues().add("pathMatcher", pathMatcherRef);
|
||||
}
|
||||
}
|
||||
@@ -469,16 +467,16 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
return null;
|
||||
}
|
||||
|
||||
private ManagedList<?> getCallableInterceptors(Element element, Object source, ParserContext parserContext) {
|
||||
ManagedList<? super Object> interceptors = new ManagedList<Object>();
|
||||
private ManagedList<?> getCallableInterceptors(Element element, Object source, ParserContext context) {
|
||||
ManagedList<Object> interceptors = new ManagedList<Object>();
|
||||
Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
|
||||
if (asyncElement != null) {
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "callable-interceptors");
|
||||
if (interceptorsElement != null) {
|
||||
interceptors.setSource(source);
|
||||
for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) {
|
||||
BeanDefinitionHolder beanDef = parserContext.getDelegate().parseBeanDefinitionElement(converter);
|
||||
beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
|
||||
BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter);
|
||||
beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
|
||||
interceptors.add(beanDef);
|
||||
}
|
||||
}
|
||||
@@ -486,16 +484,16 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
return interceptors;
|
||||
}
|
||||
|
||||
private ManagedList<?> getDeferredResultInterceptors(Element element, Object source, ParserContext parserContext) {
|
||||
ManagedList<? super Object> interceptors = new ManagedList<Object>();
|
||||
private ManagedList<?> getDeferredResultInterceptors(Element element, Object source, ParserContext context) {
|
||||
ManagedList<Object> interceptors = new ManagedList<Object>();
|
||||
Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
|
||||
if (asyncElement != null) {
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "deferred-result-interceptors");
|
||||
if (interceptorsElement != null) {
|
||||
interceptors.setSource(source);
|
||||
for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) {
|
||||
BeanDefinitionHolder beanDef = parserContext.getDelegate().parseBeanDefinitionElement(converter);
|
||||
beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
|
||||
BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter);
|
||||
beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
|
||||
interceptors.add(beanDef);
|
||||
}
|
||||
}
|
||||
@@ -503,11 +501,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
return interceptors;
|
||||
}
|
||||
|
||||
private ManagedList<?> getArgumentResolvers(Element element, ParserContext parserContext) {
|
||||
private ManagedList<?> getArgumentResolvers(Element element, ParserContext context) {
|
||||
Element resolversElement = DomUtils.getChildElementByTagName(element, "argument-resolvers");
|
||||
if (resolversElement != null) {
|
||||
ManagedList<Object> resolvers = extractBeanSubElements(resolversElement, parserContext);
|
||||
return wrapLegacyResolvers(resolvers, parserContext);
|
||||
ManagedList<Object> resolvers = extractBeanSubElements(resolversElement, context);
|
||||
return wrapLegacyResolvers(resolvers, context);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -531,18 +529,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
return result;
|
||||
}
|
||||
|
||||
private ManagedList<?> getReturnValueHandlers(Element element, ParserContext parserContext) {
|
||||
private ManagedList<?> getReturnValueHandlers(Element element, ParserContext context) {
|
||||
Element handlers = DomUtils.getChildElementByTagName(element, "return-value-handlers");
|
||||
return (handlers != null ? extractBeanSubElements(handlers, parserContext) : null);
|
||||
return (handlers != null ? extractBeanSubElements(handlers, context) : null);
|
||||
}
|
||||
|
||||
private ManagedList<?> getMessageConverters(Element element, Object source, ParserContext parserContext) {
|
||||
private ManagedList<?> getMessageConverters(Element element, Object source, ParserContext context) {
|
||||
Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");
|
||||
ManagedList<? super Object> messageConverters = new ManagedList<Object>();
|
||||
ManagedList<Object> messageConverters = new ManagedList<Object>();
|
||||
if (convertersElement != null) {
|
||||
messageConverters.setSource(source);
|
||||
for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) {
|
||||
Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
Object object = context.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
messageConverters.add(object);
|
||||
}
|
||||
}
|
||||
@@ -605,11 +603,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
|
||||
return beanDefinition;
|
||||
}
|
||||
|
||||
private ManagedList<Object> extractBeanSubElements(Element parentElement, ParserContext parserContext) {
|
||||
private ManagedList<Object> extractBeanSubElements(Element parentElement, ParserContext context) {
|
||||
ManagedList<Object> list = new ManagedList<Object>();
|
||||
list.setSource(parserContext.extractSource(parentElement));
|
||||
list.setSource(context.extractSource(parentElement));
|
||||
for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) {
|
||||
Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
Object object = context.getDelegate().parsePropertySubElement(beanElement, null);
|
||||
list.add(object);
|
||||
}
|
||||
return list;
|
||||
|
||||
@@ -248,9 +248,9 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
|
||||
String autoRegistration = element.getAttribute("auto-registration");
|
||||
boolean isAutoRegistration = !(StringUtils.hasText(autoRegistration) && "false".equals(autoRegistration));
|
||||
|
||||
ManagedList<? super Object> resourceResolvers = new ManagedList<Object>();
|
||||
ManagedList<Object> resourceResolvers = new ManagedList<Object>();
|
||||
resourceResolvers.setSource(source);
|
||||
ManagedList<? super Object> resourceTransformers = new ManagedList<Object>();
|
||||
ManagedList<Object> resourceTransformers = new ManagedList<Object>();
|
||||
resourceTransformers.setSource(source);
|
||||
|
||||
parseResourceCache(resourceResolvers, resourceTransformers, element, source);
|
||||
@@ -265,8 +265,8 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
}
|
||||
|
||||
private void parseResourceCache(ManagedList<? super Object> resourceResolvers,
|
||||
ManagedList<? super Object> resourceTransformers, Element element, Object source) {
|
||||
private void parseResourceCache(ManagedList<Object> resourceResolvers,
|
||||
ManagedList<Object> resourceTransformers, Element element, Object source) {
|
||||
|
||||
String resourceCache = element.getAttribute("resource-cache");
|
||||
if ("true".equals(resourceCache)) {
|
||||
@@ -304,7 +304,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
|
||||
private void parseResourceResolversTransformers(boolean isAutoRegistration,
|
||||
ManagedList<? super Object> resourceResolvers, ManagedList<? super Object> resourceTransformers,
|
||||
ManagedList<Object> resourceResolvers, ManagedList<Object> resourceTransformers,
|
||||
ParserContext context, Element element, Object source) {
|
||||
|
||||
Element resolversElement = DomUtils.getChildElementByTagName(element, "resolvers");
|
||||
@@ -351,7 +351,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
|
||||
private RootBeanDefinition parseVersionResolver(ParserContext context, Element element, Object source) {
|
||||
ManagedMap<String, ? super Object> strategyMap = new ManagedMap<String, Object>();
|
||||
ManagedMap<String, Object> strategyMap = new ManagedMap<String, Object>();
|
||||
strategyMap.setSource(source);
|
||||
RootBeanDefinition versionResolverDef = new RootBeanDefinition(VersionResourceResolver.class);
|
||||
versionResolverDef.setSource(source);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
* Copyright 2002-2018 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.
|
||||
@@ -39,9 +39,9 @@ import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler
|
||||
import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
|
||||
|
||||
/**
|
||||
* Parses the configuration for the {@code <websocket:handlers/>} namespace
|
||||
* element. Registers a Spring MVC {@code SimpleUrlHandlerMapping} to map HTTP
|
||||
* WebSocket handshake (or SockJS) requests to
|
||||
* Parses the configuration for the {@code <websocket:handlers/>} namespace element.
|
||||
* Registers a Spring MVC {@code SimpleUrlHandlerMapping} to map HTTP WebSocket
|
||||
* handshake (or SockJS) requests to
|
||||
* {@link org.springframework.web.socket.WebSocketHandler WebSocketHandler}s.
|
||||
*
|
||||
* @author Brian Clozel
|
||||
@@ -78,13 +78,13 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
|
||||
strategy = new SockJsHandlerMappingStrategy(sockJsService);
|
||||
}
|
||||
else {
|
||||
RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source);
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
|
||||
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
|
||||
String allowedOriginsAttribute = element.getAttribute("allowed-origins");
|
||||
List<String> allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ","));
|
||||
interceptors.add(new OriginHandshakeInterceptor(allowedOrigins));
|
||||
strategy = new WebSocketHandlerMappingStrategy(handshakeHandler, interceptors);
|
||||
RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source);
|
||||
Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
|
||||
ManagedList<Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context);
|
||||
String allowedOrigins = element.getAttribute("allowed-origins");
|
||||
List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ","));
|
||||
interceptors.add(new OriginHandshakeInterceptor(origins));
|
||||
strategy = new WebSocketHandlerMappingStrategy(handler, interceptors);
|
||||
}
|
||||
|
||||
ManagedMap<String, Object> urlMap = new ManagedMap<String, Object>();
|
||||
@@ -103,17 +103,16 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
|
||||
private interface HandlerMappingStrategy {
|
||||
|
||||
void addMapping(Element mappingElement, ManagedMap<String, Object> map, ParserContext context);
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static class WebSocketHandlerMappingStrategy implements HandlerMappingStrategy {
|
||||
|
||||
private final RuntimeBeanReference handshakeHandlerReference;
|
||||
|
||||
private final ManagedList<?> interceptorsList;
|
||||
|
||||
|
||||
private WebSocketHandlerMappingStrategy(RuntimeBeanReference handshakeHandler, ManagedList<?> interceptors) {
|
||||
public WebSocketHandlerMappingStrategy(RuntimeBeanReference handshakeHandler, ManagedList<?> interceptors) {
|
||||
this.handshakeHandlerReference = handshakeHandler;
|
||||
this.interceptorsList = interceptors;
|
||||
}
|
||||
@@ -121,15 +120,13 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
|
||||
@Override
|
||||
public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) {
|
||||
String pathAttribute = element.getAttribute("path");
|
||||
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ","));
|
||||
String[] mappings = StringUtils.tokenizeToStringArray(pathAttribute, ",");
|
||||
RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, handlerReference);
|
||||
if (this.handshakeHandlerReference != null) {
|
||||
cavs.addIndexedArgumentValue(1, this.handshakeHandlerReference);
|
||||
}
|
||||
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null);
|
||||
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
|
||||
cargs.addIndexedArgumentValue(0, handlerReference);
|
||||
cargs.addIndexedArgumentValue(1, this.handshakeHandlerReference);
|
||||
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cargs, null);
|
||||
requestHandlerDef.setSource(context.extractSource(element));
|
||||
requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
requestHandlerDef.getPropertyValues().add("handshakeInterceptors", this.interceptorsList);
|
||||
@@ -142,26 +139,26 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static class SockJsHandlerMappingStrategy implements HandlerMappingStrategy {
|
||||
|
||||
private final RuntimeBeanReference sockJsService;
|
||||
|
||||
|
||||
private SockJsHandlerMappingStrategy(RuntimeBeanReference sockJsService) {
|
||||
public SockJsHandlerMappingStrategy(RuntimeBeanReference sockJsService) {
|
||||
this.sockJsService = sockJsService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) {
|
||||
String pathAttribute = element.getAttribute("path");
|
||||
List<String> mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ","));
|
||||
String[] mappings = StringUtils.tokenizeToStringArray(pathAttribute, ",");
|
||||
RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
|
||||
|
||||
ConstructorArgumentValues cavs = new ConstructorArgumentValues();
|
||||
cavs.addIndexedArgumentValue(0, this.sockJsService, "SockJsService");
|
||||
cavs.addIndexedArgumentValue(1, handlerReference, "WebSocketHandler");
|
||||
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
|
||||
cargs.addIndexedArgumentValue(0, this.sockJsService, "SockJsService");
|
||||
cargs.addIndexedArgumentValue(1, handlerReference, "WebSocketHandler");
|
||||
|
||||
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null);
|
||||
RootBeanDefinition requestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cargs, null);
|
||||
requestHandlerDef.setSource(context.extractSource(element));
|
||||
requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
String requestHandlerName = context.getReaderContext().registerWithGeneratedName(requestHandlerDef);
|
||||
|
||||
@@ -245,7 +245,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
}
|
||||
|
||||
RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, argValues, null);
|
||||
ManagedList<? super Object> interceptors = new ManagedList<Object>();
|
||||
ManagedList<Object> interceptors = new ManagedList<Object>();
|
||||
if (element != null) {
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "interceptors");
|
||||
interceptors.addAll(WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context));
|
||||
@@ -333,7 +333,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
else {
|
||||
RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source);
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
|
||||
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
|
||||
ManagedList<Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
|
||||
String allowedOriginsAttribute = element.getAttribute("allowed-origins");
|
||||
List<String> allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ","));
|
||||
interceptors.add(new OriginHandshakeInterceptor(allowedOrigins));
|
||||
@@ -458,7 +458,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||
|
||||
private RuntimeBeanReference registerMessageConverter(Element element, ParserContext context, Object source) {
|
||||
Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");
|
||||
ManagedList<? super Object> converters = new ManagedList<Object>();
|
||||
ManagedList<Object> converters = new ManagedList<Object>();
|
||||
if (convertersElement != null) {
|
||||
converters.setSource(source);
|
||||
for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
* Copyright 2002-2018 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.
|
||||
@@ -43,7 +43,7 @@ import org.springframework.web.socket.sockjs.transport.handler.WebSocketTranspor
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 4.0
|
||||
*/
|
||||
class WebSocketNamespaceUtils {
|
||||
abstract class WebSocketNamespaceUtils {
|
||||
|
||||
public static RuntimeBeanReference registerHandshakeHandler(Element element, ParserContext context, Object source) {
|
||||
RuntimeBeanReference handlerRef;
|
||||
@@ -61,8 +61,8 @@ class WebSocketNamespaceUtils {
|
||||
return handlerRef;
|
||||
}
|
||||
|
||||
public static RuntimeBeanReference registerSockJsService(Element element, String schedulerName,
|
||||
ParserContext context, Object source) {
|
||||
public static RuntimeBeanReference registerSockJsService(
|
||||
Element element, String schedulerName, ParserContext context, Object source) {
|
||||
|
||||
Element sockJsElement = DomUtils.getChildElementByTagName(element, "sockjs");
|
||||
|
||||
@@ -99,13 +99,13 @@ class WebSocketNamespaceUtils {
|
||||
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandler);
|
||||
}
|
||||
|
||||
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
|
||||
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context);
|
||||
String allowedOriginsAttribute = element.getAttribute("allowed-origins");
|
||||
List<String> allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ","));
|
||||
sockJsServiceDef.getPropertyValues().add("allowedOrigins", allowedOrigins);
|
||||
Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
|
||||
ManagedList<Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context);
|
||||
String allowedOrigins = element.getAttribute("allowed-origins");
|
||||
List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ","));
|
||||
sockJsServiceDef.getPropertyValues().add("allowedOrigins", origins);
|
||||
RootBeanDefinition originHandshakeInterceptor = new RootBeanDefinition(OriginHandshakeInterceptor.class);
|
||||
originHandshakeInterceptor.getPropertyValues().add("allowedOrigins", allowedOrigins);
|
||||
originHandshakeInterceptor.getPropertyValues().add("allowedOrigins", origins);
|
||||
interceptors.add(originHandshakeInterceptor);
|
||||
sockJsServiceDef.getPropertyValues().add("handshakeInterceptors", interceptors);
|
||||
|
||||
@@ -170,8 +170,8 @@ class WebSocketNamespaceUtils {
|
||||
return new RuntimeBeanReference(schedulerName);
|
||||
}
|
||||
|
||||
public static ManagedList<? super Object> parseBeanSubElements(Element parentElement, ParserContext context) {
|
||||
ManagedList<? super Object> beans = new ManagedList<Object>();
|
||||
public static ManagedList<Object> parseBeanSubElements(Element parentElement, ParserContext context) {
|
||||
ManagedList<Object> beans = new ManagedList<Object>();
|
||||
if (parentElement != null) {
|
||||
beans.setSource(context.extractSource(parentElement));
|
||||
for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) {
|
||||
|
||||
Reference in New Issue
Block a user