Browse Source

Polishing

(cherry picked from commit 2474c48749)
pull/1916/head
Juergen Hoeller 7 years ago
parent
commit
f9307897b6
  1. 106
      spring-test/src/main/java/org/springframework/test/context/support/AbstractDelegatingSmartContextLoader.java
  2. 21
      spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java
  3. 22
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/InitBinderBindingContext.java
  4. 112
      spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java
  5. 12
      spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java
  6. 32
      spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java
  7. 18
      spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java
  8. 22
      spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java

106
spring-test/src/main/java/org/springframework/test/context/support/AbstractDelegatingSmartContextLoader.java

@ -16,9 +16,6 @@
package org.springframework.test.context.support; 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.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -88,33 +85,36 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte
protected abstract SmartContextLoader getAnnotationConfigLoader(); protected abstract SmartContextLoader getAnnotationConfigLoader();
// SmartContextLoader // ContextLoader
private static void delegateProcessing(SmartContextLoader loader, ContextConfigurationAttributes configAttributes) { /**
if (logger.isDebugEnabled()) { * {@code AbstractDelegatingSmartContextLoader} does not support the
logger.debug(String.format("Delegating to %s to process context configuration %s.", * {@link ContextLoader#processLocations(Class, String...)} method. Call
name(loader), configAttributes)); * {@link #processContextConfiguration(ContextConfigurationAttributes)} instead.
} * @throws UnsupportedOperationException in this implementation
loader.processContextConfiguration(configAttributes); */
@Override
public final String[] processLocations(Class<?> clazz, @Nullable String... locations) {
throw new UnsupportedOperationException(
"DelegatingSmartContextLoaders do not support the ContextLoader SPI. " +
"Call processContextConfiguration(ContextConfigurationAttributes) instead.");
} }
private static ApplicationContext delegateLoading(SmartContextLoader loader, MergedContextConfiguration mergedConfig) /**
throws Exception { * {@code AbstractDelegatingSmartContextLoader} does not support the
* {@link ContextLoader#loadContext(String...) } method. Call
if (logger.isDebugEnabled()) { * {@link #loadContext(MergedContextConfiguration)} instead.
logger.debug(String.format("Delegating to %s to load context from %s.", name(loader), mergedConfig)); * @throws UnsupportedOperationException in this implementation
} */
return loader.loadContext(mergedConfig); @Override
public final ApplicationContext loadContext(String... locations) throws Exception {
throw new UnsupportedOperationException(
"DelegatingSmartContextLoaders do not support the ContextLoader SPI. " +
"Call loadContext(MergedContextConfiguration) instead.");
} }
private boolean supports(SmartContextLoader loader, MergedContextConfiguration mergedConfig) {
if (loader == getAnnotationConfigLoader()) { // SmartContextLoader
return (mergedConfig.hasClasses() && !mergedConfig.hasLocations());
}
else {
return (mergedConfig.hasLocations() && !mergedConfig.hasClasses());
}
}
/** /**
* Delegates to candidate {@code SmartContextLoaders} to process the supplied * Delegates to candidate {@code SmartContextLoaders} to process the supplied
@ -228,14 +228,14 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte
*/ */
@Override @Override
public ApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception { public ApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception {
Assert.notNull(mergedConfig, "mergedConfig must not be null"); Assert.notNull(mergedConfig, "MergedContextConfiguration must not be null");
List<SmartContextLoader> candidates = Arrays.asList(getXmlLoader(), getAnnotationConfigLoader());
Assert.state(!(mergedConfig.hasLocations() && mergedConfig.hasClasses()), () -> String.format( Assert.state(!(mergedConfig.hasLocations() && mergedConfig.hasClasses()), () -> String.format(
"Neither %s nor %s supports loading an ApplicationContext from %s: " + "Neither %s nor %s supports loading an ApplicationContext from %s: " +
"declare either 'locations' or 'classes' but not both.", name(getXmlLoader()), "declare either 'locations' or 'classes' but not both.", name(getXmlLoader()),
name(getAnnotationConfigLoader()), mergedConfig)); name(getAnnotationConfigLoader()), mergedConfig));
SmartContextLoader[] candidates = {getXmlLoader(), getAnnotationConfigLoader()};
for (SmartContextLoader loader : candidates) { for (SmartContextLoader loader : candidates) {
// Determine if each loader can load a context from the mergedConfig. If it // Determine if each loader can load a context from the mergedConfig. If it
// can, let it; otherwise, keep iterating. // can, let it; otherwise, keep iterating.
@ -253,41 +253,39 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte
// else... // else...
throw new IllegalStateException(String.format( throw new IllegalStateException(String.format(
"Neither %s nor %s was able to load an ApplicationContext from %s.", name(getXmlLoader()), "Neither %s nor %s was able to load an ApplicationContext from %s.",
name(getAnnotationConfigLoader()), mergedConfig)); name(getXmlLoader()), name(getAnnotationConfigLoader()), mergedConfig));
} }
private static String name(SmartContextLoader loader) {
return loader.getClass().getSimpleName(); 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 {
// ContextLoader 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) {
* {@code AbstractDelegatingSmartContextLoader} does not support the if (loader == getAnnotationConfigLoader()) {
* {@link ContextLoader#processLocations(Class, String...)} method. Call return (mergedConfig.hasClasses() && !mergedConfig.hasLocations());
* {@link #processContextConfiguration(ContextConfigurationAttributes)} instead. }
* @throws UnsupportedOperationException in this implementation else {
*/ return (mergedConfig.hasLocations() && !mergedConfig.hasClasses());
@Override }
public final String[] processLocations(Class<?> clazz, @Nullable String... locations) {
throw new UnsupportedOperationException(
"DelegatingSmartContextLoaders do not support the ContextLoader SPI. " +
"Call processContextConfiguration(ContextConfigurationAttributes) instead.");
} }
/** private static String name(SmartContextLoader loader) {
* {@code AbstractDelegatingSmartContextLoader} does not support the return loader.getClass().getSimpleName();
* {@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.");
} }
} }

21
spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,13 +16,12 @@
package org.springframework.web.method.annotation; package org.springframework.web.method.annotation;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.DefaultDataBinderFactory; import org.springframework.web.bind.support.DefaultDataBinderFactory;
@ -56,15 +55,15 @@ public class InitBinderDataBinderFactory extends DefaultDataBinderFactory {
/** /**
* Initialize a WebDataBinder with {@code @InitBinder} methods. * Initialize a WebDataBinder with {@code @InitBinder} methods.
* If the {@code @InitBinder} annotation specifies attributes names, it is * <p>If the {@code @InitBinder} annotation specifies attributes names,
* invoked only if the names include the target object name. * it is invoked only if the names include the target object name.
* @throws Exception if one of the invoked @{@link InitBinder} methods fail. * @throws Exception if one of the invoked @{@link InitBinder} methods fail.
*/ */
@Override @Override
public void initBinder(WebDataBinder binder, NativeWebRequest request) throws Exception { public void initBinder(WebDataBinder dataBinder, NativeWebRequest request) throws Exception {
for (InvocableHandlerMethod binderMethod : this.binderMethods) { for (InvocableHandlerMethod binderMethod : this.binderMethods) {
if (isBinderMethodApplicable(binderMethod, binder)) { if (isBinderMethodApplicable(binderMethod, dataBinder)) {
Object returnValue = binderMethod.invokeForRequest(request, null, binder); Object returnValue = binderMethod.invokeForRequest(request, null, dataBinder);
if (returnValue != null) { if (returnValue != null) {
throw new IllegalStateException( throw new IllegalStateException(
"@InitBinder methods should return void: " + binderMethod); "@InitBinder methods should return void: " + binderMethod);
@ -78,11 +77,11 @@ public class InitBinderDataBinderFactory extends DefaultDataBinderFactory {
* the given WebDataBinder instance. By default we check the attributes * the given WebDataBinder instance. By default we check the attributes
* names of the annotation, if present. * names of the annotation, if present.
*/ */
protected boolean isBinderMethodApplicable(HandlerMethod binderMethod, WebDataBinder binder) { protected boolean isBinderMethodApplicable(HandlerMethod binderMethod, WebDataBinder dataBinder) {
InitBinder ann = binderMethod.getMethodAnnotation(InitBinder.class); InitBinder ann = binderMethod.getMethodAnnotation(InitBinder.class);
Assert.state(ann != null, "No InitBinder annotation"); Assert.state(ann != null, "No InitBinder annotation");
Collection<String> names = Arrays.asList(ann.value()); String[] names = ann.value();
return (names.isEmpty() || names.contains(binder.getObjectName())); return (ObjectUtils.isEmpty(names) || ObjectUtils.containsElement(names, dataBinder.getObjectName()));
} }
} }

22
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/InitBinderBindingContext.java

@ -16,12 +16,11 @@
package org.springframework.web.reactive.result.method.annotation; package org.springframework.web.reactive.result.method.annotation;
import java.util.Arrays;
import java.util.Collection;
import java.util.List; import java.util.List;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.SessionStatus; import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.bind.support.SimpleSessionStatus; import org.springframework.web.bind.support.SimpleSessionStatus;
@ -43,7 +42,6 @@ class InitBinderBindingContext extends BindingContext {
private final List<SyncInvocableHandlerMethod> binderMethods; private final List<SyncInvocableHandlerMethod> binderMethods;
/* Simple BindingContext to help with the invoking @InitBinder methods */
private final BindingContext binderMethodContext; private final BindingContext binderMethodContext;
private final SessionStatus sessionStatus = new SimpleSessionStatus(); private final SessionStatus sessionStatus = new SimpleSessionStatus();
@ -71,32 +69,28 @@ class InitBinderBindingContext extends BindingContext {
@Override @Override
protected WebExchangeDataBinder initDataBinder(WebExchangeDataBinder dataBinder, protected WebExchangeDataBinder initDataBinder(WebExchangeDataBinder dataBinder, ServerWebExchange exchange) {
ServerWebExchange exchange) {
this.binderMethods.stream() this.binderMethods.stream()
.filter(binderMethod -> { .filter(binderMethod -> {
InitBinder ann = binderMethod.getMethodAnnotation(InitBinder.class); InitBinder ann = binderMethod.getMethodAnnotation(InitBinder.class);
Assert.state(ann != null, "No InitBinder annotation"); Assert.state(ann != null, "No InitBinder annotation");
Collection<String> names = Arrays.asList(ann.value()); String[] names = ann.value();
return (names.isEmpty() || names.contains(dataBinder.getObjectName())); return (ObjectUtils.isEmpty(names) ||
ObjectUtils.containsElement(names, dataBinder.getObjectName()));
}) })
.forEach(method -> invokeBinderMethod(dataBinder, exchange, method)); .forEach(method -> invokeBinderMethod(dataBinder, exchange, method));
return dataBinder; return dataBinder;
} }
private void invokeBinderMethod(WebExchangeDataBinder dataBinder, private void invokeBinderMethod(WebExchangeDataBinder dataBinder, ServerWebExchange exchange,
ServerWebExchange exchange, SyncInvocableHandlerMethod binderMethod) { SyncInvocableHandlerMethod binderMethod) {
HandlerResult result = binderMethod.invokeForHandlerResult(
exchange, this.binderMethodContext, dataBinder);
HandlerResult result = binderMethod.invokeForHandlerResult(exchange, this.binderMethodContext, dataBinder);
if (result != null && result.getReturnValue() != null) { if (result != null && result.getReturnValue() != null) {
throw new IllegalStateException( throw new IllegalStateException(
"@InitBinder methods should return void: " + binderMethod); "@InitBinder methods should return void: " + binderMethod);
} }
// Should not happen (no Model argument resolution) ... // Should not happen (no Model argument resolution) ...
if (!this.binderMethodContext.getModel().asMap().isEmpty()) { if (!this.binderMethodContext.getModel().asMap().isEmpty()) {
throw new IllegalStateException( throw new IllegalStateException(

112
spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java

@ -197,14 +197,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
@Override @Override
@Nullable @Nullable
public BeanDefinition parse(Element element, ParserContext parserContext) { public BeanDefinition parse(Element element, ParserContext context) {
Object source = parserContext.extractSource(element); Object source = context.extractSource(element);
XmlReaderContext readerContext = parserContext.getReaderContext(); XmlReaderContext readerContext = context.getReaderContext();
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); 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); RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class);
handlerMappingDef.setSource(source); handlerMappingDef.setSource(source);
@ -217,14 +217,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
handlerMappingDef.getPropertyValues().add("removeSemicolonContent", !enableMatrixVariables); handlerMappingDef.getPropertyValues().add("removeSemicolonContent", !enableMatrixVariables);
} }
configurePathMatchingProperties(handlerMappingDef, element, parserContext); configurePathMatchingProperties(handlerMappingDef, element, context);
readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME , handlerMappingDef); 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); handlerMappingDef.getPropertyValues().add("corsConfigurations", corsRef);
RuntimeBeanReference conversionService = getConversionService(element, source, parserContext); RuntimeBeanReference conversionService = getConversionService(element, source, context);
RuntimeBeanReference validator = getValidator(element, source, parserContext); RuntimeBeanReference validator = getValidator(element, source, context);
RuntimeBeanReference messageCodesResolver = getMessageCodesResolver(element); RuntimeBeanReference messageCodesResolver = getMessageCodesResolver(element);
RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class); RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class);
@ -234,13 +234,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
bindingDef.getPropertyValues().add("validator", validator); bindingDef.getPropertyValues().add("validator", validator);
bindingDef.getPropertyValues().add("messageCodesResolver", messageCodesResolver); bindingDef.getPropertyValues().add("messageCodesResolver", messageCodesResolver);
ManagedList<?> messageConverters = getMessageConverters(element, source, parserContext); ManagedList<?> messageConverters = getMessageConverters(element, source, context);
ManagedList<?> argumentResolvers = getArgumentResolvers(element, parserContext); ManagedList<?> argumentResolvers = getArgumentResolvers(element, context);
ManagedList<?> returnValueHandlers = getReturnValueHandlers(element, parserContext); ManagedList<?> returnValueHandlers = getReturnValueHandlers(element, context);
String asyncTimeout = getAsyncTimeout(element); String asyncTimeout = getAsyncTimeout(element);
RuntimeBeanReference asyncExecutor = getAsyncExecutor(element); RuntimeBeanReference asyncExecutor = getAsyncExecutor(element);
ManagedList<?> callableInterceptors = getCallableInterceptors(element, source, parserContext); ManagedList<?> callableInterceptors = getCallableInterceptors(element, source, context);
ManagedList<?> deferredResultInterceptors = getDeferredResultInterceptors(element, source, parserContext); ManagedList<?> deferredResultInterceptors = getDeferredResultInterceptors(element, source, context);
RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class); RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
handlerAdapterDef.setSource(source); handlerAdapterDef.setSource(source);
@ -317,18 +317,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
defaultExceptionResolver.getPropertyValues().add("order", 2); defaultExceptionResolver.getPropertyValues().add("order", 2);
String defaultExResolverName = readerContext.registerWithGeneratedName(defaultExceptionResolver); String defaultExResolverName = readerContext.registerWithGeneratedName(defaultExceptionResolver);
parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME)); context.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME));
parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); context.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME));
parserContext.registerComponent(new BeanComponentDefinition(uriContributorDef, uriContributorName)); context.registerComponent(new BeanComponentDefinition(uriContributorDef, uriContributorName));
parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName)); context.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName));
parserContext.registerComponent(new BeanComponentDefinition(methodExceptionResolver, methodExResolverName)); context.registerComponent(new BeanComponentDefinition(methodExceptionResolver, methodExResolverName));
parserContext.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName)); context.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName));
parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName)); context.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName));
// Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off" // 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; return null;
} }
@ -347,9 +347,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
} }
} }
private RuntimeBeanReference getConversionService( private RuntimeBeanReference getConversionService(Element element, @Nullable Object source, ParserContext context) {
Element element, @Nullable Object source, ParserContext parserContext) {
RuntimeBeanReference conversionServiceRef; RuntimeBeanReference conversionServiceRef;
if (element.hasAttribute("conversion-service")) { if (element.hasAttribute("conversion-service")) {
conversionServiceRef = new RuntimeBeanReference(element.getAttribute("conversion-service")); conversionServiceRef = new RuntimeBeanReference(element.getAttribute("conversion-service"));
@ -358,15 +356,15 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
RootBeanDefinition conversionDef = new RootBeanDefinition(FormattingConversionServiceFactoryBean.class); RootBeanDefinition conversionDef = new RootBeanDefinition(FormattingConversionServiceFactoryBean.class);
conversionDef.setSource(source); conversionDef.setSource(source);
conversionDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); conversionDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
String conversionName = parserContext.getReaderContext().registerWithGeneratedName(conversionDef); String conversionName = context.getReaderContext().registerWithGeneratedName(conversionDef);
parserContext.registerComponent(new BeanComponentDefinition(conversionDef, conversionName)); context.registerComponent(new BeanComponentDefinition(conversionDef, conversionName));
conversionServiceRef = new RuntimeBeanReference(conversionName); conversionServiceRef = new RuntimeBeanReference(conversionName);
} }
return conversionServiceRef; return conversionServiceRef;
} }
@Nullable @Nullable
private RuntimeBeanReference getValidator(Element element, @Nullable Object source, ParserContext parserContext) { private RuntimeBeanReference getValidator(Element element, @Nullable Object source, ParserContext context) {
if (element.hasAttribute("validator")) { if (element.hasAttribute("validator")) {
return new RuntimeBeanReference(element.getAttribute("validator")); return new RuntimeBeanReference(element.getAttribute("validator"));
} }
@ -375,8 +373,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
"org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean"); "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean");
validatorDef.setSource(source); validatorDef.setSource(source);
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef); String validatorName = context.getReaderContext().registerWithGeneratedName(validatorDef);
parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName)); context.registerComponent(new BeanComponentDefinition(validatorDef, validatorName));
return new RuntimeBeanReference(validatorName); return new RuntimeBeanReference(validatorName);
} }
else { else {
@ -385,7 +383,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
} }
private RuntimeBeanReference getContentNegotiationManager( private RuntimeBeanReference getContentNegotiationManager(
Element element, @Nullable Object source, ParserContext parserContext) { Element element, @Nullable Object source, ParserContext context) {
RuntimeBeanReference beanRef; RuntimeBeanReference beanRef;
if (element.hasAttribute("content-negotiation-manager")) { if (element.hasAttribute("content-negotiation-manager")) {
@ -398,19 +396,19 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
factoryBeanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); factoryBeanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
factoryBeanDef.getPropertyValues().add("mediaTypes", getDefaultMediaTypes()); factoryBeanDef.getPropertyValues().add("mediaTypes", getDefaultMediaTypes());
String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME; String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
parserContext.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef); context.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef);
parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, name)); context.registerComponent(new BeanComponentDefinition(factoryBeanDef, name));
beanRef = new RuntimeBeanReference(name); beanRef = new RuntimeBeanReference(name);
} }
return beanRef; return beanRef;
} }
private void configurePathMatchingProperties( private void configurePathMatchingProperties(
RootBeanDefinition handlerMappingDef, Element element, ParserContext parserContext) { RootBeanDefinition handlerMappingDef, Element element, ParserContext context) {
Element pathMatchingElement = DomUtils.getChildElementByTagName(element, "path-matching"); Element pathMatchingElement = DomUtils.getChildElementByTagName(element, "path-matching");
if (pathMatchingElement != null) { if (pathMatchingElement != null) {
Object source = parserContext.extractSource(element); Object source = context.extractSource(element);
if (pathMatchingElement.hasAttribute("suffix-pattern")) { if (pathMatchingElement.hasAttribute("suffix-pattern")) {
Boolean useSuffixPatternMatch = Boolean.valueOf(pathMatchingElement.getAttribute("suffix-pattern")); Boolean useSuffixPatternMatch = Boolean.valueOf(pathMatchingElement.getAttribute("suffix-pattern"));
@ -429,14 +427,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
if (pathMatchingElement.hasAttribute("path-helper")) { if (pathMatchingElement.hasAttribute("path-helper")) {
pathHelperRef = new RuntimeBeanReference(pathMatchingElement.getAttribute("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); handlerMappingDef.getPropertyValues().add("urlPathHelper", pathHelperRef);
RuntimeBeanReference pathMatcherRef = null; RuntimeBeanReference pathMatcherRef = null;
if (pathMatchingElement.hasAttribute("path-matcher")) { if (pathMatchingElement.hasAttribute("path-matcher")) {
pathMatcherRef = new RuntimeBeanReference(pathMatchingElement.getAttribute("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); handlerMappingDef.getPropertyValues().add("pathMatcher", pathMatcherRef);
} }
} }
@ -488,18 +486,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
} }
private ManagedList<?> getCallableInterceptors( private ManagedList<?> getCallableInterceptors(
Element element, @Nullable Object source, ParserContext parserContext) { Element element, @Nullable Object source, ParserContext context) {
ManagedList<? super Object> interceptors = new ManagedList<>(); ManagedList<Object> interceptors = new ManagedList<>();
Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support"); Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
if (asyncElement != null) { if (asyncElement != null) {
Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "callable-interceptors"); Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "callable-interceptors");
if (interceptorsElement != null) { if (interceptorsElement != null) {
interceptors.setSource(source); interceptors.setSource(source);
for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) { for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) {
BeanDefinitionHolder beanDef = parserContext.getDelegate().parseBeanDefinitionElement(converter); BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter);
if (beanDef != null) { if (beanDef != null) {
beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
interceptors.add(beanDef); interceptors.add(beanDef);
} }
} }
@ -509,18 +507,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
} }
private ManagedList<?> getDeferredResultInterceptors( private ManagedList<?> getDeferredResultInterceptors(
Element element, @Nullable Object source, ParserContext parserContext) { Element element, @Nullable Object source, ParserContext context) {
ManagedList<? super Object> interceptors = new ManagedList<>(); ManagedList<Object> interceptors = new ManagedList<>();
Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support"); Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
if (asyncElement != null) { if (asyncElement != null) {
Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "deferred-result-interceptors"); Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "deferred-result-interceptors");
if (interceptorsElement != null) { if (interceptorsElement != null) {
interceptors.setSource(source); interceptors.setSource(source);
for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) { for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) {
BeanDefinitionHolder beanDef = parserContext.getDelegate().parseBeanDefinitionElement(converter); BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter);
if (beanDef != null) { if (beanDef != null) {
beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
interceptors.add(beanDef); interceptors.add(beanDef);
} }
} }
@ -530,11 +528,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
} }
@Nullable @Nullable
private ManagedList<?> getArgumentResolvers(Element element, ParserContext parserContext) { private ManagedList<?> getArgumentResolvers(Element element, ParserContext context) {
Element resolversElement = DomUtils.getChildElementByTagName(element, "argument-resolvers"); Element resolversElement = DomUtils.getChildElementByTagName(element, "argument-resolvers");
if (resolversElement != null) { if (resolversElement != null) {
ManagedList<Object> resolvers = extractBeanSubElements(resolversElement, parserContext); ManagedList<Object> resolvers = extractBeanSubElements(resolversElement, context);
return wrapLegacyResolvers(resolvers, parserContext); return wrapLegacyResolvers(resolvers, context);
} }
return null; return null;
} }
@ -560,18 +558,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
} }
@Nullable @Nullable
private ManagedList<?> getReturnValueHandlers(Element element, ParserContext parserContext) { private ManagedList<?> getReturnValueHandlers(Element element, ParserContext context) {
Element handlers = DomUtils.getChildElementByTagName(element, "return-value-handlers"); 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, @Nullable Object source, ParserContext parserContext) { private ManagedList<?> getMessageConverters(Element element, @Nullable Object source, ParserContext context) {
Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");
ManagedList<? super Object> messageConverters = new ManagedList<>(); ManagedList<Object> messageConverters = new ManagedList<>();
if (convertersElement != null) { if (convertersElement != null) {
messageConverters.setSource(source); messageConverters.setSource(source);
for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) { 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); messageConverters.add(object);
} }
} }
@ -652,11 +650,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
return beanDefinition; return beanDefinition;
} }
private ManagedList<Object> extractBeanSubElements(Element parentElement, ParserContext parserContext) { private ManagedList<Object> extractBeanSubElements(Element parentElement, ParserContext context) {
ManagedList<Object> list = new ManagedList<>(); ManagedList<Object> list = new ManagedList<>();
list.setSource(parserContext.extractSource(parentElement)); list.setSource(context.extractSource(parentElement));
for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) { 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); list.add(object);
} }
return list; return list;

12
spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java

@ -250,9 +250,9 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
String autoRegistration = element.getAttribute("auto-registration"); String autoRegistration = element.getAttribute("auto-registration");
boolean isAutoRegistration = !(StringUtils.hasText(autoRegistration) && "false".equals(autoRegistration)); boolean isAutoRegistration = !(StringUtils.hasText(autoRegistration) && "false".equals(autoRegistration));
ManagedList<? super Object> resourceResolvers = new ManagedList<>(); ManagedList<Object> resourceResolvers = new ManagedList<>();
resourceResolvers.setSource(source); resourceResolvers.setSource(source);
ManagedList<? super Object> resourceTransformers = new ManagedList<>(); ManagedList<Object> resourceTransformers = new ManagedList<>();
resourceTransformers.setSource(source); resourceTransformers.setSource(source);
parseResourceCache(resourceResolvers, resourceTransformers, element, source); parseResourceCache(resourceResolvers, resourceTransformers, element, source);
@ -267,8 +267,8 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
} }
} }
private void parseResourceCache(ManagedList<? super Object> resourceResolvers, private void parseResourceCache(ManagedList<Object> resourceResolvers,
ManagedList<? super Object> resourceTransformers, Element element, @Nullable Object source) { ManagedList<Object> resourceTransformers, Element element, @Nullable Object source) {
String resourceCache = element.getAttribute("resource-cache"); String resourceCache = element.getAttribute("resource-cache");
if ("true".equals(resourceCache)) { if ("true".equals(resourceCache)) {
@ -306,7 +306,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
} }
private void parseResourceResolversTransformers(boolean isAutoRegistration, private void parseResourceResolversTransformers(boolean isAutoRegistration,
ManagedList<? super Object> resourceResolvers, ManagedList<? super Object> resourceTransformers, ManagedList<Object> resourceResolvers, ManagedList<Object> resourceTransformers,
ParserContext context, Element element, @Nullable Object source) { ParserContext context, Element element, @Nullable Object source) {
Element resolversElement = DomUtils.getChildElementByTagName(element, "resolvers"); Element resolversElement = DomUtils.getChildElementByTagName(element, "resolvers");
@ -353,7 +353,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
} }
private RootBeanDefinition parseVersionResolver(ParserContext context, Element element, @Nullable Object source) { private RootBeanDefinition parseVersionResolver(ParserContext context, Element element, @Nullable Object source) {
ManagedMap<String, ? super Object> strategyMap = new ManagedMap<>(); ManagedMap<String, Object> strategyMap = new ManagedMap<>();
strategyMap.setSource(source); strategyMap.setSource(source);
RootBeanDefinition versionResolverDef = new RootBeanDefinition(VersionResourceResolver.class); RootBeanDefinition versionResolverDef = new RootBeanDefinition(VersionResourceResolver.class);
versionResolverDef.setSource(source); versionResolverDef.setSource(source);

32
spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -40,9 +40,9 @@ import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler
import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler; import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
/** /**
* Parses the configuration for the {@code <websocket:handlers/>} namespace * Parses the configuration for the {@code <websocket:handlers/>} namespace element.
* element. Registers a Spring MVC {@code SimpleUrlHandlerMapping} to map HTTP * Registers a Spring MVC {@code SimpleUrlHandlerMapping} to map HTTP WebSocket
* WebSocket handshake (or SockJS) requests to * handshake (or SockJS) requests to
* {@link org.springframework.web.socket.WebSocketHandler WebSocketHandler}s. * {@link org.springframework.web.socket.WebSocketHandler WebSocketHandler}s.
* *
* @author Brian Clozel * @author Brian Clozel
@ -58,10 +58,10 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
@Override @Override
@Nullable @Nullable
public BeanDefinition parse(Element element, ParserContext cxt) { public BeanDefinition parse(Element element, ParserContext context) {
Object source = cxt.extractSource(element); Object source = context.extractSource(element);
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source);
cxt.pushContainingComponent(compDefinition); context.pushContainingComponent(compDefinition);
String orderAttribute = element.getAttribute("order"); String orderAttribute = element.getAttribute("order");
int order = orderAttribute.isEmpty() ? DEFAULT_MAPPING_ORDER : Integer.valueOf(orderAttribute); int order = orderAttribute.isEmpty() ? DEFAULT_MAPPING_ORDER : Integer.valueOf(orderAttribute);
@ -70,19 +70,19 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
handlerMappingDef.setSource(source); handlerMappingDef.setSource(source);
handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
handlerMappingDef.getPropertyValues().add("order", order); handlerMappingDef.getPropertyValues().add("order", order);
String handlerMappingName = cxt.getReaderContext().registerWithGeneratedName(handlerMappingDef); String handlerMappingName = context.getReaderContext().registerWithGeneratedName(handlerMappingDef);
RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService( RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService(
element, SOCK_JS_SCHEDULER_NAME, cxt, source); element, SOCK_JS_SCHEDULER_NAME, context, source);
HandlerMappingStrategy strategy; HandlerMappingStrategy strategy;
if (sockJsService != null) { if (sockJsService != null) {
strategy = new SockJsHandlerMappingStrategy(sockJsService); strategy = new SockJsHandlerMappingStrategy(sockJsService);
} }
else { else {
RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, cxt, source); RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source);
Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); ManagedList<Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context);
String allowedOrigins = element.getAttribute("allowed-origins"); String allowedOrigins = element.getAttribute("allowed-origins");
List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ","));
interceptors.add(new OriginHandshakeInterceptor(origins)); interceptors.add(new OriginHandshakeInterceptor(origins));
@ -92,12 +92,12 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
ManagedMap<String, Object> urlMap = new ManagedMap<>(); ManagedMap<String, Object> urlMap = new ManagedMap<>();
urlMap.setSource(source); urlMap.setSource(source);
for (Element mappingElement : DomUtils.getChildElementsByTagName(element, "mapping")) { for (Element mappingElement : DomUtils.getChildElementsByTagName(element, "mapping")) {
strategy.addMapping(mappingElement, urlMap, cxt); strategy.addMapping(mappingElement, urlMap, context);
} }
handlerMappingDef.getPropertyValues().add("urlMap", urlMap); handlerMappingDef.getPropertyValues().add("urlMap", urlMap);
cxt.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName)); context.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName));
cxt.popAndRegisterContainingComponent(); context.popAndRegisterContainingComponent();
return null; return null;
} }
@ -122,7 +122,7 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
@Override @Override
public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) { public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) {
String pathAttribute = element.getAttribute("path"); 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")); RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
ConstructorArgumentValues cargs = new ConstructorArgumentValues(); ConstructorArgumentValues cargs = new ConstructorArgumentValues();
@ -153,7 +153,7 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser {
@Override @Override
public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) { public void addMapping(Element element, ManagedMap<String, Object> urlMap, ParserContext context) {
String pathAttribute = element.getAttribute("path"); 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")); RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler"));
ConstructorArgumentValues cargs = new ConstructorArgumentValues(); ConstructorArgumentValues cargs = new ConstructorArgumentValues();

18
spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java

@ -250,7 +250,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
} }
RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, cargs, null); RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, cargs, null);
ManagedList<? super Object> interceptors = new ManagedList<>(); ManagedList<Object> interceptors = new ManagedList<>();
if (element != null) { if (element != null) {
Element interceptorsElement = DomUtils.getChildElementByTagName(element, "interceptors"); Element interceptorsElement = DomUtils.getChildElementByTagName(element, "interceptors");
interceptors.addAll(WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context)); interceptors.addAll(WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context));
@ -339,7 +339,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
else { else {
RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, ctx, source); RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, ctx, source);
Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, ctx); ManagedList<Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, ctx);
String allowedOrigins = element.getAttribute("allowed-origins"); String allowedOrigins = element.getAttribute("allowed-origins");
List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ","));
interceptors.add(new OriginHandshakeInterceptor(origins)); interceptors.add(new OriginHandshakeInterceptor(origins));
@ -465,7 +465,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
Element element, ParserContext context, @Nullable Object source) { Element element, ParserContext context, @Nullable Object source) {
Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");
ManagedList<? super Object> converters = new ManagedList<>(); ManagedList<Object> converters = new ManagedList<>();
if (convertersElement != null) { if (convertersElement != null) {
converters.setSource(source); converters.setSource(source);
for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) { for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) {
@ -555,7 +555,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@Nullable @Nullable
private RuntimeBeanReference getValidator( private RuntimeBeanReference getValidator(
Element messageBrokerElement, @Nullable Object source, ParserContext parserContext) { Element messageBrokerElement, @Nullable Object source, ParserContext context) {
if (messageBrokerElement.hasAttribute("validator")) { if (messageBrokerElement.hasAttribute("validator")) {
return new RuntimeBeanReference(messageBrokerElement.getAttribute("validator")); return new RuntimeBeanReference(messageBrokerElement.getAttribute("validator"));
@ -565,8 +565,8 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
"org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean"); "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean");
validatorDef.setSource(source); validatorDef.setSource(source);
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef); String validatorName = context.getReaderContext().registerWithGeneratedName(validatorDef);
parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName)); context.registerComponent(new BeanComponentDefinition(validatorDef, validatorName));
return new RuntimeBeanReference(validatorName); return new RuntimeBeanReference(validatorName);
} }
else { else {
@ -574,11 +574,11 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
} }
} }
private ManagedList<Object> extractBeanSubElements(Element parentElement, ParserContext parserContext) { private ManagedList<Object> extractBeanSubElements(Element parentElement, ParserContext context) {
ManagedList<Object> list = new ManagedList<>(); ManagedList<Object> list = new ManagedList<>();
list.setSource(parserContext.extractSource(parentElement)); list.setSource(context.extractSource(parentElement));
for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) { 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); list.add(object);
} }
return list; return list;

22
spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -44,7 +44,7 @@ import org.springframework.web.socket.sockjs.transport.handler.WebSocketTranspor
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @since 4.0 * @since 4.0
*/ */
class WebSocketNamespaceUtils { abstract class WebSocketNamespaceUtils {
public static RuntimeBeanReference registerHandshakeHandler( public static RuntimeBeanReference registerHandshakeHandler(
Element element, ParserContext context, @Nullable Object source) { Element element, ParserContext context, @Nullable Object source) {
@ -65,8 +65,8 @@ class WebSocketNamespaceUtils {
} }
@Nullable @Nullable
public static RuntimeBeanReference registerSockJsService(Element element, String schedulerName, public static RuntimeBeanReference registerSockJsService(
ParserContext cxt, @Nullable Object source) { Element element, String schedulerName, ParserContext context, @Nullable Object source) {
Element sockJsElement = DomUtils.getChildElementByTagName(element, "sockjs"); Element sockJsElement = DomUtils.getChildElementByTagName(element, "sockjs");
@ -82,7 +82,7 @@ class WebSocketNamespaceUtils {
scheduler = new RuntimeBeanReference(customTaskSchedulerName); scheduler = new RuntimeBeanReference(customTaskSchedulerName);
} }
else { else {
scheduler = registerScheduler(schedulerName, cxt, source); scheduler = registerScheduler(schedulerName, context, source);
} }
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(0, scheduler); sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(0, scheduler);
@ -92,7 +92,7 @@ class WebSocketNamespaceUtils {
if (registerDefaults.equals("false")) { if (registerDefaults.equals("false")) {
sockJsServiceDef.setBeanClass(TransportHandlingSockJsService.class); sockJsServiceDef.setBeanClass(TransportHandlingSockJsService.class);
} }
ManagedList<?> transportHandlers = parseBeanSubElements(transportHandlersElement, cxt); ManagedList<?> transportHandlers = parseBeanSubElements(transportHandlersElement, context);
sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandlers); sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandlers);
} }
else if (handshakeHandler != null) { else if (handshakeHandler != null) {
@ -104,7 +104,7 @@ class WebSocketNamespaceUtils {
} }
Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors");
ManagedList<? super Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); ManagedList<Object> interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context);
String allowedOrigins = element.getAttribute("allowed-origins"); String allowedOrigins = element.getAttribute("allowed-origins");
List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); List<String> origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ","));
sockJsServiceDef.getPropertyValues().add("allowedOrigins", origins); sockJsServiceDef.getPropertyValues().add("allowedOrigins", origins);
@ -154,7 +154,7 @@ class WebSocketNamespaceUtils {
sockJsServiceDef.getPropertyValues().add("suppressCors", Boolean.valueOf(attrValue)); sockJsServiceDef.getPropertyValues().add("suppressCors", Boolean.valueOf(attrValue));
} }
sockJsServiceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); sockJsServiceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
String sockJsServiceName = cxt.getReaderContext().registerWithGeneratedName(sockJsServiceDef); String sockJsServiceName = context.getReaderContext().registerWithGeneratedName(sockJsServiceDef);
return new RuntimeBeanReference(sockJsServiceName); return new RuntimeBeanReference(sockJsServiceName);
} }
return null; return null;
@ -176,10 +176,8 @@ class WebSocketNamespaceUtils {
return new RuntimeBeanReference(schedulerName); return new RuntimeBeanReference(schedulerName);
} }
public static ManagedList<? super Object> parseBeanSubElements(@Nullable Element parentElement, public static ManagedList<Object> parseBeanSubElements(@Nullable Element parentElement, ParserContext context) {
ParserContext context) { ManagedList<Object> beans = new ManagedList<>();
ManagedList<? super Object> beans = new ManagedList<>();
if (parentElement != null) { if (parentElement != null) {
beans.setSource(context.extractSource(parentElement)); beans.setSource(context.extractSource(parentElement));
for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) { for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) {

Loading…
Cancel
Save