diff --git a/spring-test/src/main/java/org/springframework/test/context/support/AbstractDelegatingSmartContextLoader.java b/spring-test/src/main/java/org/springframework/test/context/support/AbstractDelegatingSmartContextLoader.java index 98856256e79..5687313a1e4 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/AbstractDelegatingSmartContextLoader.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/AbstractDelegatingSmartContextLoader.java @@ -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; @@ -88,33 +85,36 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte protected abstract SmartContextLoader getAnnotationConfigLoader(); - // SmartContextLoader + // ContextLoader - 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); + /** + * {@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, @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 { - - if (logger.isDebugEnabled()) { - logger.debug(String.format("Delegating to %s to load context from %s.", name(loader), mergedConfig)); - } - return loader.loadContext(mergedConfig); + /** + * {@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."); } - private boolean supports(SmartContextLoader loader, MergedContextConfiguration mergedConfig) { - if (loader == getAnnotationConfigLoader()) { - return (mergedConfig.hasClasses() && !mergedConfig.hasLocations()); - } - else { - return (mergedConfig.hasLocations() && !mergedConfig.hasClasses()); - } - } + + // SmartContextLoader /** * Delegates to candidate {@code SmartContextLoaders} to process the supplied @@ -228,14 +228,14 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte */ @Override public ApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception { - Assert.notNull(mergedConfig, "mergedConfig must not be null"); - List candidates = Arrays.asList(getXmlLoader(), getAnnotationConfigLoader()); + Assert.notNull(mergedConfig, "MergedContextConfiguration must not be null"); Assert.state(!(mergedConfig.hasLocations() && mergedConfig.hasClasses()), () -> String.format( "Neither %s nor %s supports loading an ApplicationContext from %s: " + "declare either 'locations' or 'classes' but not both.", name(getXmlLoader()), 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. @@ -253,41 +253,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 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); + } - /** - * {@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, @Nullable String... locations) { - throw new UnsupportedOperationException( - "DelegatingSmartContextLoaders do not support the ContextLoader SPI. " + - "Call processContextConfiguration(ContextConfigurationAttributes) instead."); + private boolean supports(SmartContextLoader loader, MergedContextConfiguration mergedConfig) { + if (loader == getAnnotationConfigLoader()) { + return (mergedConfig.hasClasses() && !mergedConfig.hasLocations()); + } + else { + return (mergedConfig.hasLocations() && !mergedConfig.hasClasses()); + } } - /** - * {@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."); + private static String name(SmartContextLoader loader) { + return loader.getClass().getSimpleName(); } } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java b/spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java index 3716c3c3404..f6085d95aa6 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java +++ b/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"); * you may not use this file except in compliance with the License. @@ -16,13 +16,12 @@ 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.lang.Nullable; import org.springframework.util.Assert; +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; @@ -56,15 +55,15 @@ 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. + *

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. */ @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); @@ -78,11 +77,11 @@ public class InitBinderDataBinderFactory extends DefaultDataBinderFactory { * the given WebDataBinder instance. By default we check the attributes * 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); Assert.state(ann != null, "No InitBinder annotation"); - Collection 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())); } } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/InitBinderBindingContext.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/InitBinderBindingContext.java index 1d60564fc90..85e3f20ac87 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/InitBinderBindingContext.java +++ b/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; -import java.util.Arrays; -import java.util.Collection; import java.util.List; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.support.SessionStatus; import org.springframework.web.bind.support.SimpleSessionStatus; @@ -43,7 +42,6 @@ class InitBinderBindingContext extends BindingContext { private final List binderMethods; - /* Simple BindingContext to help with the invoking @InitBinder methods */ private final BindingContext binderMethodContext; private final SessionStatus sessionStatus = new SimpleSessionStatus(); @@ -71,32 +69,28 @@ class InitBinderBindingContext extends BindingContext { @Override - protected WebExchangeDataBinder initDataBinder(WebExchangeDataBinder dataBinder, - ServerWebExchange exchange) { - + protected WebExchangeDataBinder initDataBinder(WebExchangeDataBinder dataBinder, ServerWebExchange exchange) { this.binderMethods.stream() .filter(binderMethod -> { InitBinder ann = binderMethod.getMethodAnnotation(InitBinder.class); Assert.state(ann != null, "No InitBinder annotation"); - Collection names = Arrays.asList(ann.value()); - return (names.isEmpty() || names.contains(dataBinder.getObjectName())); + String[] names = ann.value(); + return (ObjectUtils.isEmpty(names) || + ObjectUtils.containsElement(names, dataBinder.getObjectName())); }) .forEach(method -> invokeBinderMethod(dataBinder, exchange, method)); return dataBinder; } - private void invokeBinderMethod(WebExchangeDataBinder dataBinder, - ServerWebExchange exchange, SyncInvocableHandlerMethod binderMethod) { - - HandlerResult result = binderMethod.invokeForHandlerResult( - exchange, this.binderMethodContext, dataBinder); + private void invokeBinderMethod(WebExchangeDataBinder dataBinder, ServerWebExchange exchange, + SyncInvocableHandlerMethod binderMethod) { + HandlerResult result = binderMethod.invokeForHandlerResult(exchange, this.binderMethodContext, dataBinder); if (result != null && result.getReturnValue() != null) { throw new IllegalStateException( "@InitBinder methods should return void: " + binderMethod); } - // Should not happen (no Model argument resolution) ... if (!this.binderMethodContext.getModel().asMap().isEmpty()) { throw new IllegalStateException( diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index e28d8b478b7..375d7c5ac01 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -197,14 +197,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { @Override @Nullable - 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); @@ -217,14 +217,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); @@ -234,13 +234,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); @@ -317,18 +317,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; } @@ -347,9 +347,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } } - private RuntimeBeanReference getConversionService( - Element element, @Nullable Object source, ParserContext parserContext) { - + private RuntimeBeanReference getConversionService(Element element, @Nullable Object source, ParserContext context) { RuntimeBeanReference conversionServiceRef; if (element.hasAttribute("conversion-service")) { conversionServiceRef = new RuntimeBeanReference(element.getAttribute("conversion-service")); @@ -358,15 +356,15 @@ 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; } @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")) { return new RuntimeBeanReference(element.getAttribute("validator")); } @@ -375,8 +373,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 { @@ -385,7 +383,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } private RuntimeBeanReference getContentNegotiationManager( - Element element, @Nullable Object source, ParserContext parserContext) { + Element element, @Nullable Object source, ParserContext context) { RuntimeBeanReference beanRef; if (element.hasAttribute("content-negotiation-manager")) { @@ -398,19 +396,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")); @@ -429,14 +427,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); } } @@ -488,18 +486,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } private ManagedList getCallableInterceptors( - Element element, @Nullable Object source, ParserContext parserContext) { + Element element, @Nullable Object source, ParserContext context) { - ManagedList interceptors = new ManagedList<>(); + ManagedList interceptors = new ManagedList<>(); 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); + BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter); if (beanDef != null) { - beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); + beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); interceptors.add(beanDef); } } @@ -509,18 +507,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } private ManagedList getDeferredResultInterceptors( - Element element, @Nullable Object source, ParserContext parserContext) { + Element element, @Nullable Object source, ParserContext context) { - ManagedList interceptors = new ManagedList<>(); + ManagedList interceptors = new ManagedList<>(); 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); + BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter); if (beanDef != null) { - beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); + beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); interceptors.add(beanDef); } } @@ -530,11 +528,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } @Nullable - 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 resolvers = extractBeanSubElements(resolversElement, parserContext); - return wrapLegacyResolvers(resolvers, parserContext); + ManagedList resolvers = extractBeanSubElements(resolversElement, context); + return wrapLegacyResolvers(resolvers, context); } return null; } @@ -560,18 +558,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } @Nullable - 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, @Nullable Object source, ParserContext parserContext) { + private ManagedList getMessageConverters(Element element, @Nullable Object source, ParserContext context) { Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); - ManagedList messageConverters = new ManagedList<>(); + ManagedList messageConverters = new ManagedList<>(); 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); } } @@ -652,11 +650,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return beanDefinition; } - private ManagedList extractBeanSubElements(Element parentElement, ParserContext parserContext) { + private ManagedList extractBeanSubElements(Element parentElement, ParserContext context) { ManagedList list = new ManagedList<>(); - 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; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java index 1ec0cc6c6af..b2d5f3a9b33 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java +++ b/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"); boolean isAutoRegistration = !(StringUtils.hasText(autoRegistration) && "false".equals(autoRegistration)); - ManagedList resourceResolvers = new ManagedList<>(); + ManagedList resourceResolvers = new ManagedList<>(); resourceResolvers.setSource(source); - ManagedList resourceTransformers = new ManagedList<>(); + ManagedList resourceTransformers = new ManagedList<>(); resourceTransformers.setSource(source); parseResourceCache(resourceResolvers, resourceTransformers, element, source); @@ -267,8 +267,8 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { } } - private void parseResourceCache(ManagedList resourceResolvers, - ManagedList resourceTransformers, Element element, @Nullable Object source) { + private void parseResourceCache(ManagedList resourceResolvers, + ManagedList resourceTransformers, Element element, @Nullable Object source) { String resourceCache = element.getAttribute("resource-cache"); if ("true".equals(resourceCache)) { @@ -306,7 +306,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { } private void parseResourceResolversTransformers(boolean isAutoRegistration, - ManagedList resourceResolvers, ManagedList resourceTransformers, + ManagedList resourceResolvers, ManagedList resourceTransformers, ParserContext context, Element element, @Nullable Object source) { Element resolversElement = DomUtils.getChildElementByTagName(element, "resolvers"); @@ -353,7 +353,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { } private RootBeanDefinition parseVersionResolver(ParserContext context, Element element, @Nullable Object source) { - ManagedMap strategyMap = new ManagedMap<>(); + ManagedMap strategyMap = new ManagedMap<>(); strategyMap.setSource(source); RootBeanDefinition versionResolverDef = new RootBeanDefinition(VersionResourceResolver.class); versionResolverDef.setSource(source); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java index 5c0ad0b4980..c4ffe4657f4 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java +++ b/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"); * 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; /** - * Parses the configuration for the {@code } namespace - * element. Registers a Spring MVC {@code SimpleUrlHandlerMapping} to map HTTP - * WebSocket handshake (or SockJS) requests to + * Parses the configuration for the {@code } 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 @@ -58,10 +58,10 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { @Override @Nullable - public BeanDefinition parse(Element element, ParserContext cxt) { - Object source = cxt.extractSource(element); + public BeanDefinition parse(Element element, ParserContext context) { + Object source = context.extractSource(element); CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); - cxt.pushContainingComponent(compDefinition); + context.pushContainingComponent(compDefinition); String orderAttribute = element.getAttribute("order"); int order = orderAttribute.isEmpty() ? DEFAULT_MAPPING_ORDER : Integer.valueOf(orderAttribute); @@ -70,19 +70,19 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { handlerMappingDef.setSource(source); handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); handlerMappingDef.getPropertyValues().add("order", order); - String handlerMappingName = cxt.getReaderContext().registerWithGeneratedName(handlerMappingDef); + String handlerMappingName = context.getReaderContext().registerWithGeneratedName(handlerMappingDef); RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService( - element, SOCK_JS_SCHEDULER_NAME, cxt, source); + element, SOCK_JS_SCHEDULER_NAME, context, source); HandlerMappingStrategy strategy; if (sockJsService != null) { strategy = new SockJsHandlerMappingStrategy(sockJsService); } else { - RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, cxt, source); + RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source); Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context); String allowedOrigins = element.getAttribute("allowed-origins"); List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); interceptors.add(new OriginHandshakeInterceptor(origins)); @@ -92,12 +92,12 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { ManagedMap urlMap = new ManagedMap<>(); urlMap.setSource(source); for (Element mappingElement : DomUtils.getChildElementsByTagName(element, "mapping")) { - strategy.addMapping(mappingElement, urlMap, cxt); + strategy.addMapping(mappingElement, urlMap, context); } handlerMappingDef.getPropertyValues().add("urlMap", urlMap); - cxt.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName)); - cxt.popAndRegisterContainingComponent(); + context.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName)); + context.popAndRegisterContainingComponent(); return null; } @@ -122,7 +122,7 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { @Override public void addMapping(Element element, ManagedMap urlMap, ParserContext context) { String pathAttribute = element.getAttribute("path"); - List mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ",")); + String[] mappings = StringUtils.tokenizeToStringArray(pathAttribute, ","); RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler")); ConstructorArgumentValues cargs = new ConstructorArgumentValues(); @@ -153,7 +153,7 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { @Override public void addMapping(Element element, ManagedMap urlMap, ParserContext context) { String pathAttribute = element.getAttribute("path"); - List mappings = Arrays.asList(StringUtils.tokenizeToStringArray(pathAttribute, ",")); + String[] mappings = StringUtils.tokenizeToStringArray(pathAttribute, ","); RuntimeBeanReference handlerReference = new RuntimeBeanReference(element.getAttribute("handler")); ConstructorArgumentValues cargs = new ConstructorArgumentValues(); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java index 64ea0ee0570..4e03aab0487 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java +++ b/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); - ManagedList interceptors = new ManagedList<>(); + ManagedList interceptors = new ManagedList<>(); if (element != null) { Element interceptorsElement = DomUtils.getChildElementByTagName(element, "interceptors"); interceptors.addAll(WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context)); @@ -339,7 +339,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { else { RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, ctx, source); Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, ctx); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, ctx); String allowedOrigins = element.getAttribute("allowed-origins"); List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); interceptors.add(new OriginHandshakeInterceptor(origins)); @@ -465,7 +465,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { Element element, ParserContext context, @Nullable Object source) { Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); - ManagedList converters = new ManagedList<>(); + ManagedList converters = new ManagedList<>(); if (convertersElement != null) { converters.setSource(source); for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) { @@ -555,7 +555,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { @Nullable private RuntimeBeanReference getValidator( - Element messageBrokerElement, @Nullable Object source, ParserContext parserContext) { + Element messageBrokerElement, @Nullable Object source, ParserContext context) { if (messageBrokerElement.hasAttribute("validator")) { return new RuntimeBeanReference(messageBrokerElement.getAttribute("validator")); @@ -565,8 +565,8 @@ class MessageBrokerBeanDefinitionParser 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 { @@ -574,11 +574,11 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { } } - private ManagedList extractBeanSubElements(Element parentElement, ParserContext parserContext) { + private ManagedList extractBeanSubElements(Element parentElement, ParserContext context) { ManagedList list = new ManagedList<>(); - 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; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java index cdf3683cae5..25ccb3c0ba6 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java +++ b/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"); * 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 * @since 4.0 */ -class WebSocketNamespaceUtils { +abstract class WebSocketNamespaceUtils { public static RuntimeBeanReference registerHandshakeHandler( Element element, ParserContext context, @Nullable Object source) { @@ -65,8 +65,8 @@ class WebSocketNamespaceUtils { } @Nullable - public static RuntimeBeanReference registerSockJsService(Element element, String schedulerName, - ParserContext cxt, @Nullable Object source) { + public static RuntimeBeanReference registerSockJsService( + Element element, String schedulerName, ParserContext context, @Nullable Object source) { Element sockJsElement = DomUtils.getChildElementByTagName(element, "sockjs"); @@ -82,7 +82,7 @@ class WebSocketNamespaceUtils { scheduler = new RuntimeBeanReference(customTaskSchedulerName); } else { - scheduler = registerScheduler(schedulerName, cxt, source); + scheduler = registerScheduler(schedulerName, context, source); } sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(0, scheduler); @@ -92,7 +92,7 @@ class WebSocketNamespaceUtils { if (registerDefaults.equals("false")) { sockJsServiceDef.setBeanClass(TransportHandlingSockJsService.class); } - ManagedList transportHandlers = parseBeanSubElements(transportHandlersElement, cxt); + ManagedList transportHandlers = parseBeanSubElements(transportHandlersElement, context); sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandlers); } else if (handshakeHandler != null) { @@ -104,7 +104,7 @@ class WebSocketNamespaceUtils { } Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context); String allowedOrigins = element.getAttribute("allowed-origins"); List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); sockJsServiceDef.getPropertyValues().add("allowedOrigins", origins); @@ -154,7 +154,7 @@ class WebSocketNamespaceUtils { sockJsServiceDef.getPropertyValues().add("suppressCors", Boolean.valueOf(attrValue)); } sockJsServiceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - String sockJsServiceName = cxt.getReaderContext().registerWithGeneratedName(sockJsServiceDef); + String sockJsServiceName = context.getReaderContext().registerWithGeneratedName(sockJsServiceDef); return new RuntimeBeanReference(sockJsServiceName); } return null; @@ -176,10 +176,8 @@ class WebSocketNamespaceUtils { return new RuntimeBeanReference(schedulerName); } - public static ManagedList parseBeanSubElements(@Nullable Element parentElement, - ParserContext context) { - - ManagedList beans = new ManagedList<>(); + public static ManagedList parseBeanSubElements(@Nullable Element parentElement, ParserContext context) { + ManagedList beans = new ManagedList<>(); if (parentElement != null) { beans.setSource(context.extractSource(parentElement)); for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) {