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 95beb5550e..cdbd92b8da 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; @@ -87,34 +84,37 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte protected abstract SmartContextLoader getAnnotationConfigLoader(); + // ContextLoader + + /** + * {@code AbstractDelegatingSmartContextLoader} does not support the + * {@link ContextLoader#processLocations(Class, String...)} method. Call + * {@link #processContextConfiguration(ContextConfigurationAttributes)} instead. + * @throws UnsupportedOperationException in this implementation + */ + @Override + public final String[] processLocations(Class clazz, String... locations) { + throw new UnsupportedOperationException( + "DelegatingSmartContextLoaders do not support the ContextLoader SPI. " + + "Call processContextConfiguration(ContextConfigurationAttributes) instead."); + } + + /** + * {@code AbstractDelegatingSmartContextLoader} does not support the + * {@link ContextLoader#loadContext(String...) } method. Call + * {@link #loadContext(MergedContextConfiguration)} instead. + * @throws UnsupportedOperationException in this implementation + */ + @Override + public final ApplicationContext loadContext(String... locations) throws Exception { + throw new UnsupportedOperationException( + "DelegatingSmartContextLoaders do not support the ContextLoader SPI. " + + "Call loadContext(MergedContextConfiguration) instead."); + } + + // SmartContextLoader - private static void delegateProcessing(SmartContextLoader loader, ContextConfigurationAttributes configAttributes) { - if (logger.isDebugEnabled()) { - logger.debug(String.format("Delegating to %s to process context configuration %s.", - name(loader), configAttributes)); - } - loader.processContextConfiguration(configAttributes); - } - - private static ApplicationContext delegateLoading(SmartContextLoader loader, MergedContextConfiguration mergedConfig) - throws Exception { - - if (logger.isDebugEnabled()) { - logger.debug(String.format("Delegating to %s to load context from %s.", name(loader), mergedConfig)); - } - return loader.loadContext(mergedConfig); - } - - private boolean supports(SmartContextLoader loader, MergedContextConfiguration mergedConfig) { - if (loader == getAnnotationConfigLoader()) { - return (mergedConfig.hasClasses() && !mergedConfig.hasLocations()); - } - else { - return (mergedConfig.hasLocations() && !mergedConfig.hasClasses()); - } - } - /** * Delegates to candidate {@code SmartContextLoaders} to process the supplied * {@link ContextConfigurationAttributes}. @@ -232,8 +232,7 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte */ @Override public ApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception { - Assert.notNull(mergedConfig, "mergedConfig must not be null"); - List candidates = Arrays.asList(getXmlLoader(), getAnnotationConfigLoader()); + Assert.notNull(mergedConfig, "MergedContextConfiguration must not be null"); if (mergedConfig.hasLocations() && mergedConfig.hasClasses()) { throw new IllegalStateException(String.format( @@ -242,6 +241,7 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte name(getAnnotationConfigLoader()), mergedConfig)); } + SmartContextLoader[] candidates = {getXmlLoader(), getAnnotationConfigLoader()}; for (SmartContextLoader loader : candidates) { // Determine if each loader can load a context from the mergedConfig. If it // can, let it; otherwise, keep iterating. @@ -259,41 +259,39 @@ public abstract class AbstractDelegatingSmartContextLoader implements SmartConte // else... throw new IllegalStateException(String.format( - "Neither %s nor %s was able to load an ApplicationContext from %s.", name(getXmlLoader()), - name(getAnnotationConfigLoader()), mergedConfig)); + "Neither %s nor %s was able to load an ApplicationContext from %s.", + name(getXmlLoader()), name(getAnnotationConfigLoader()), mergedConfig)); + } + + + private static void delegateProcessing(SmartContextLoader loader, ContextConfigurationAttributes configAttributes) { + if (logger.isDebugEnabled()) { + logger.debug(String.format("Delegating to %s to process context configuration %s.", + name(loader), configAttributes)); + } + loader.processContextConfiguration(configAttributes); + } + + private static ApplicationContext delegateLoading(SmartContextLoader loader, MergedContextConfiguration mergedConfig) + throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(String.format("Delegating to %s to load context from %s.", name(loader), mergedConfig)); + } + return loader.loadContext(mergedConfig); + } + + private boolean supports(SmartContextLoader loader, MergedContextConfiguration mergedConfig) { + if (loader == getAnnotationConfigLoader()) { + return (mergedConfig.hasClasses() && !mergedConfig.hasLocations()); + } + else { + return (mergedConfig.hasLocations() && !mergedConfig.hasClasses()); + } } private static String name(SmartContextLoader loader) { return loader.getClass().getSimpleName(); } - - // ContextLoader - - /** - * {@code AbstractDelegatingSmartContextLoader} does not support the - * {@link ContextLoader#processLocations(Class, String...)} method. Call - * {@link #processContextConfiguration(ContextConfigurationAttributes)} instead. - * @throws UnsupportedOperationException in this implementation - */ - @Override - public final String[] processLocations(Class clazz, String... locations) { - throw new UnsupportedOperationException( - "DelegatingSmartContextLoaders do not support the ContextLoader SPI. " + - "Call processContextConfiguration(ContextConfigurationAttributes) instead."); - } - - /** - * {@code AbstractDelegatingSmartContextLoader} does not support the - * {@link ContextLoader#loadContext(String...) } method. Call - * {@link #loadContext(MergedContextConfiguration)} instead. - * @throws UnsupportedOperationException - */ - @Override - public final ApplicationContext loadContext(String... locations) throws Exception { - throw new UnsupportedOperationException( - "DelegatingSmartContextLoaders do not support the ContextLoader SPI. " + - "Call loadContext(MergedContextConfiguration) instead."); - } - } 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 38d6f8829e..de361c7c18 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,11 +16,10 @@ package org.springframework.web.method.annotation; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.List; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.support.DefaultDataBinderFactory; @@ -53,32 +52,33 @@ public class InitBinderDataBinderFactory extends DefaultDataBinderFactory { /** * Initialize a WebDataBinder with {@code @InitBinder} methods. - * If the {@code @InitBinder} annotation specifies attributes names, it is - * invoked only if the names include the target object name. - * @throws Exception if one of the invoked @{@link InitBinder} methods fail. + *

If the {@code @InitBinder} annotation specifies attributes names, + * it is invoked only if the names include the target object name. + * @throws Exception if one of the invoked @{@link InitBinder} methods fails + * @see #isBinderMethodApplicable */ @Override - public void initBinder(WebDataBinder binder, NativeWebRequest request) throws Exception { + public void initBinder(WebDataBinder dataBinder, NativeWebRequest request) throws Exception { for (InvocableHandlerMethod binderMethod : this.binderMethods) { - if (isBinderMethodApplicable(binderMethod, binder)) { - Object returnValue = binderMethod.invokeForRequest(request, null, binder); + if (isBinderMethodApplicable(binderMethod, dataBinder)) { + Object returnValue = binderMethod.invokeForRequest(request, null, dataBinder); if (returnValue != null) { throw new IllegalStateException( - "@InitBinder methods should return void: " + binderMethod); + "@InitBinder methods must not return a value (should be void): " + binderMethod); } } } } /** - * Whether the given {@code @InitBinder} method should be used to initialize - * the given WebDataBinder instance. By default we check the attributes - * names of the annotation, if present. + * Determine whether the given {@code @InitBinder} method should be used + * to initialize the given {@link WebDataBinder} instance. By default we + * check the specified attribute names in the annotation value, if any. */ - protected boolean isBinderMethodApplicable(HandlerMethod initBinderMethod, WebDataBinder binder) { + protected boolean isBinderMethodApplicable(HandlerMethod initBinderMethod, WebDataBinder dataBinder) { InitBinder ann = initBinderMethod.getMethodAnnotation(InitBinder.class); - Collection 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-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 290c2710b6..627994d37a 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 @@ -181,14 +181,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { @Override - public BeanDefinition parse(Element element, ParserContext parserContext) { - Object source = parserContext.extractSource(element); - XmlReaderContext readerContext = parserContext.getReaderContext(); + public BeanDefinition parse(Element element, ParserContext context) { + Object source = context.extractSource(element); + XmlReaderContext readerContext = context.getReaderContext(); CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); - parserContext.pushContainingComponent(compDefinition); + context.pushContainingComponent(compDefinition); - RuntimeBeanReference contentNegotiationManager = getContentNegotiationManager(element, source, parserContext); + RuntimeBeanReference contentNegotiationManager = getContentNegotiationManager(element, source, context); RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class); handlerMappingDef.setSource(source); @@ -205,14 +205,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { handlerMappingDef.getPropertyValues().add("removeSemicolonContent", !enableMatrixVariables); } - configurePathMatchingProperties(handlerMappingDef, element, parserContext); + configurePathMatchingProperties(handlerMappingDef, element, context); readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME , handlerMappingDef); - RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source); + RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, context, source); handlerMappingDef.getPropertyValues().add("corsConfigurations", corsRef); - RuntimeBeanReference conversionService = getConversionService(element, source, parserContext); - RuntimeBeanReference validator = getValidator(element, source, parserContext); + RuntimeBeanReference conversionService = getConversionService(element, source, context); + RuntimeBeanReference validator = getValidator(element, source, context); RuntimeBeanReference messageCodesResolver = getMessageCodesResolver(element); RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class); @@ -222,13 +222,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { bindingDef.getPropertyValues().add("validator", validator); bindingDef.getPropertyValues().add("messageCodesResolver", messageCodesResolver); - ManagedList messageConverters = getMessageConverters(element, source, parserContext); - ManagedList argumentResolvers = getArgumentResolvers(element, parserContext); - ManagedList returnValueHandlers = getReturnValueHandlers(element, parserContext); + ManagedList messageConverters = getMessageConverters(element, source, context); + ManagedList argumentResolvers = getArgumentResolvers(element, context); + ManagedList returnValueHandlers = getReturnValueHandlers(element, context); String asyncTimeout = getAsyncTimeout(element); RuntimeBeanReference asyncExecutor = getAsyncExecutor(element); - ManagedList callableInterceptors = getCallableInterceptors(element, source, parserContext); - ManagedList deferredResultInterceptors = getDeferredResultInterceptors(element, source, parserContext); + ManagedList callableInterceptors = getCallableInterceptors(element, source, context); + ManagedList deferredResultInterceptors = getDeferredResultInterceptors(element, source, context); RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class); handlerAdapterDef.setSource(source); @@ -311,18 +311,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { defaultExceptionResolver.getPropertyValues().add("order", 2); String defaultExResolverName = readerContext.registerWithGeneratedName(defaultExceptionResolver); - parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME)); - parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); - parserContext.registerComponent(new BeanComponentDefinition(uriContributorDef, uriContributorName)); - parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName)); - parserContext.registerComponent(new BeanComponentDefinition(methodExceptionResolver, methodExResolverName)); - parserContext.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName)); - parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName)); + context.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME)); + context.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); + context.registerComponent(new BeanComponentDefinition(uriContributorDef, uriContributorName)); + context.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName)); + context.registerComponent(new BeanComponentDefinition(methodExceptionResolver, methodExResolverName)); + context.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName)); + context.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName)); // Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off" - MvcNamespaceUtils.registerDefaultComponents(parserContext, source); + MvcNamespaceUtils.registerDefaultComponents(context, source); - parserContext.popAndRegisterContainingComponent(); + context.popAndRegisterContainingComponent(); return null; } @@ -341,7 +341,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } } - private RuntimeBeanReference getConversionService(Element element, Object source, ParserContext parserContext) { + private RuntimeBeanReference getConversionService(Element element, Object source, ParserContext context) { RuntimeBeanReference conversionServiceRef; if (element.hasAttribute("conversion-service")) { conversionServiceRef = new RuntimeBeanReference(element.getAttribute("conversion-service")); @@ -350,14 +350,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { RootBeanDefinition conversionDef = new RootBeanDefinition(FormattingConversionServiceFactoryBean.class); conversionDef.setSource(source); conversionDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - String conversionName = parserContext.getReaderContext().registerWithGeneratedName(conversionDef); - parserContext.registerComponent(new BeanComponentDefinition(conversionDef, conversionName)); + String conversionName = context.getReaderContext().registerWithGeneratedName(conversionDef); + context.registerComponent(new BeanComponentDefinition(conversionDef, conversionName)); conversionServiceRef = new RuntimeBeanReference(conversionName); } return conversionServiceRef; } - private RuntimeBeanReference getValidator(Element element, Object source, ParserContext parserContext) { + private RuntimeBeanReference getValidator(Element element, Object source, ParserContext context) { if (element.hasAttribute("validator")) { return new RuntimeBeanReference(element.getAttribute("validator")); } @@ -366,8 +366,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean"); validatorDef.setSource(source); validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef); - parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName)); + String validatorName = context.getReaderContext().registerWithGeneratedName(validatorDef); + context.registerComponent(new BeanComponentDefinition(validatorDef, validatorName)); return new RuntimeBeanReference(validatorName); } else { @@ -375,9 +375,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } } - private RuntimeBeanReference getContentNegotiationManager( - Element element, Object source, ParserContext parserContext) { - + private RuntimeBeanReference getContentNegotiationManager(Element element, Object source, ParserContext context) { RuntimeBeanReference beanRef; if (element.hasAttribute("content-negotiation-manager")) { String name = element.getAttribute("content-negotiation-manager"); @@ -389,19 +387,19 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { factoryBeanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); factoryBeanDef.getPropertyValues().add("mediaTypes", getDefaultMediaTypes()); String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME; - parserContext.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef); - parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, name)); + context.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef); + context.registerComponent(new BeanComponentDefinition(factoryBeanDef, name)); beanRef = new RuntimeBeanReference(name); } return beanRef; } private void configurePathMatchingProperties( - RootBeanDefinition handlerMappingDef, Element element, ParserContext parserContext) { + RootBeanDefinition handlerMappingDef, Element element, ParserContext context) { Element pathMatchingElement = DomUtils.getChildElementByTagName(element, "path-matching"); if (pathMatchingElement != null) { - Object source = parserContext.extractSource(element); + Object source = context.extractSource(element); if (pathMatchingElement.hasAttribute("suffix-pattern")) { Boolean useSuffixPatternMatch = Boolean.valueOf(pathMatchingElement.getAttribute("suffix-pattern")); @@ -420,14 +418,14 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { if (pathMatchingElement.hasAttribute("path-helper")) { pathHelperRef = new RuntimeBeanReference(pathMatchingElement.getAttribute("path-helper")); } - pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(pathHelperRef, parserContext, source); + pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(pathHelperRef, context, source); handlerMappingDef.getPropertyValues().add("urlPathHelper", pathHelperRef); RuntimeBeanReference pathMatcherRef = null; if (pathMatchingElement.hasAttribute("path-matcher")) { pathMatcherRef = new RuntimeBeanReference(pathMatchingElement.getAttribute("path-matcher")); } - pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(pathMatcherRef, parserContext, source); + pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(pathMatcherRef, context, source); handlerMappingDef.getPropertyValues().add("pathMatcher", pathMatcherRef); } } @@ -469,16 +467,16 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return null; } - private ManagedList getCallableInterceptors(Element element, Object source, ParserContext parserContext) { - ManagedList interceptors = new ManagedList(); + private ManagedList getCallableInterceptors(Element element, Object source, ParserContext context) { + 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); - beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); + BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter); + beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); interceptors.add(beanDef); } } @@ -486,16 +484,16 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return interceptors; } - private ManagedList getDeferredResultInterceptors(Element element, Object source, ParserContext parserContext) { - ManagedList interceptors = new ManagedList(); + private ManagedList getDeferredResultInterceptors(Element element, Object source, ParserContext context) { + 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); - beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); + BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter); + beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef); interceptors.add(beanDef); } } @@ -503,11 +501,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return interceptors; } - private ManagedList getArgumentResolvers(Element element, ParserContext parserContext) { + private ManagedList getArgumentResolvers(Element element, ParserContext context) { Element resolversElement = DomUtils.getChildElementByTagName(element, "argument-resolvers"); if (resolversElement != null) { - ManagedList resolvers = extractBeanSubElements(resolversElement, parserContext); - return wrapLegacyResolvers(resolvers, parserContext); + ManagedList resolvers = extractBeanSubElements(resolversElement, context); + return wrapLegacyResolvers(resolvers, context); } return null; } @@ -531,18 +529,18 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return result; } - private ManagedList getReturnValueHandlers(Element element, ParserContext parserContext) { + private ManagedList getReturnValueHandlers(Element element, ParserContext context) { Element handlers = DomUtils.getChildElementByTagName(element, "return-value-handlers"); - return (handlers != null ? extractBeanSubElements(handlers, parserContext) : null); + return (handlers != null ? extractBeanSubElements(handlers, context) : null); } - private ManagedList getMessageConverters(Element element, Object source, ParserContext parserContext) { + private ManagedList getMessageConverters(Element element, Object source, ParserContext context) { Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); - ManagedList 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); } } @@ -605,11 +603,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 33b956d594..7ce26e1b09 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 @@ -248,9 +248,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); @@ -265,8 +265,8 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { } } - private void parseResourceCache(ManagedList resourceResolvers, - ManagedList resourceTransformers, Element element, Object source) { + private void parseResourceCache(ManagedList resourceResolvers, + ManagedList resourceTransformers, Element element, Object source) { String resourceCache = element.getAttribute("resource-cache"); if ("true".equals(resourceCache)) { @@ -304,7 +304,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { } private void parseResourceResolversTransformers(boolean isAutoRegistration, - ManagedList resourceResolvers, ManagedList resourceTransformers, + ManagedList resourceResolvers, ManagedList resourceTransformers, ParserContext context, Element element, Object source) { Element resolversElement = DomUtils.getChildElementByTagName(element, "resolvers"); @@ -351,7 +351,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { } private RootBeanDefinition parseVersionResolver(ParserContext context, Element element, Object source) { - ManagedMap 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 deced0d005..ea1edfa55e 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-2015 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,9 +39,9 @@ import org.springframework.web.socket.server.support.WebSocketHttpRequestHandler import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler; /** - * Parses the configuration for the {@code } 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 @@ -78,13 +78,13 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { strategy = new SockJsHandlerMappingStrategy(sockJsService); } else { - RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source); - Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context); - String allowedOriginsAttribute = element.getAttribute("allowed-origins"); - List allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ",")); - interceptors.add(new OriginHandshakeInterceptor(allowedOrigins)); - strategy = new WebSocketHandlerMappingStrategy(handshakeHandler, interceptors); + RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source); + Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context); + String allowedOrigins = element.getAttribute("allowed-origins"); + List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); + interceptors.add(new OriginHandshakeInterceptor(origins)); + strategy = new WebSocketHandlerMappingStrategy(handler, interceptors); } ManagedMap urlMap = new ManagedMap(); @@ -103,17 +103,16 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { private interface HandlerMappingStrategy { void addMapping(Element mappingElement, ManagedMap map, ParserContext context); - } + private static class WebSocketHandlerMappingStrategy implements HandlerMappingStrategy { private final RuntimeBeanReference handshakeHandlerReference; private final ManagedList interceptorsList; - - private WebSocketHandlerMappingStrategy(RuntimeBeanReference handshakeHandler, ManagedList interceptors) { + public WebSocketHandlerMappingStrategy(RuntimeBeanReference handshakeHandler, ManagedList interceptors) { this.handshakeHandlerReference = handshakeHandler; this.interceptorsList = interceptors; } @@ -121,15 +120,13 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { @Override public void addMapping(Element element, ManagedMap 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 cavs = new ConstructorArgumentValues(); - cavs.addIndexedArgumentValue(0, handlerReference); - if (this.handshakeHandlerReference != null) { - cavs.addIndexedArgumentValue(1, this.handshakeHandlerReference); - } - RootBeanDefinition requestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null); + ConstructorArgumentValues cargs = new ConstructorArgumentValues(); + cargs.addIndexedArgumentValue(0, handlerReference); + cargs.addIndexedArgumentValue(1, this.handshakeHandlerReference); + RootBeanDefinition requestHandlerDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cargs, null); requestHandlerDef.setSource(context.extractSource(element)); requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); requestHandlerDef.getPropertyValues().add("handshakeInterceptors", this.interceptorsList); @@ -142,26 +139,26 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { } } + private static class SockJsHandlerMappingStrategy implements HandlerMappingStrategy { private final RuntimeBeanReference sockJsService; - - private SockJsHandlerMappingStrategy(RuntimeBeanReference sockJsService) { + public SockJsHandlerMappingStrategy(RuntimeBeanReference sockJsService) { this.sockJsService = sockJsService; } @Override public void addMapping(Element element, ManagedMap 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 cavs = new ConstructorArgumentValues(); - cavs.addIndexedArgumentValue(0, this.sockJsService, "SockJsService"); - cavs.addIndexedArgumentValue(1, handlerReference, "WebSocketHandler"); + ConstructorArgumentValues cargs = new ConstructorArgumentValues(); + cargs.addIndexedArgumentValue(0, this.sockJsService, "SockJsService"); + cargs.addIndexedArgumentValue(1, handlerReference, "WebSocketHandler"); - RootBeanDefinition requestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null); + RootBeanDefinition requestHandlerDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cargs, null); requestHandlerDef.setSource(context.extractSource(element)); requestHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); String requestHandlerName = context.getReaderContext().registerWithGeneratedName(requestHandlerDef); 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 aa2dd5bd4e..132e612de8 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 @@ -245,7 +245,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { } RootBeanDefinition channelDef = new RootBeanDefinition(ExecutorSubscribableChannel.class, argValues, null); - ManagedList interceptors = new ManagedList(); + ManagedList interceptors = new ManagedList(); if (element != null) { Element interceptorsElement = DomUtils.getChildElementByTagName(element, "interceptors"); interceptors.addAll(WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context)); @@ -333,7 +333,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { else { RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source); Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context); String allowedOriginsAttribute = element.getAttribute("allowed-origins"); List allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ",")); interceptors.add(new OriginHandshakeInterceptor(allowedOrigins)); @@ -458,7 +458,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { private RuntimeBeanReference registerMessageConverter(Element element, ParserContext context, Object source) { Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); - ManagedList converters = new ManagedList(); + ManagedList converters = new ManagedList(); if (convertersElement != null) { converters.setSource(source); for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) { 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 bd0d27fcf5..c6f430b14e 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-2015 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,7 @@ import org.springframework.web.socket.sockjs.transport.handler.WebSocketTranspor * @author Rossen Stoyanchev * @since 4.0 */ -class WebSocketNamespaceUtils { +abstract class WebSocketNamespaceUtils { public static RuntimeBeanReference registerHandshakeHandler(Element element, ParserContext context, Object source) { RuntimeBeanReference handlerRef; @@ -61,8 +61,8 @@ class WebSocketNamespaceUtils { return handlerRef; } - public static RuntimeBeanReference registerSockJsService(Element element, String schedulerName, - ParserContext context, Object source) { + public static RuntimeBeanReference registerSockJsService( + Element element, String schedulerName, ParserContext context, Object source) { Element sockJsElement = DomUtils.getChildElementByTagName(element, "sockjs"); @@ -99,13 +99,13 @@ class WebSocketNamespaceUtils { sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandler); } - Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context); - String allowedOriginsAttribute = element.getAttribute("allowed-origins"); - List allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ",")); - sockJsServiceDef.getPropertyValues().add("allowedOrigins", allowedOrigins); + Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, context); + String allowedOrigins = element.getAttribute("allowed-origins"); + List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); + sockJsServiceDef.getPropertyValues().add("allowedOrigins", origins); RootBeanDefinition originHandshakeInterceptor = new RootBeanDefinition(OriginHandshakeInterceptor.class); - originHandshakeInterceptor.getPropertyValues().add("allowedOrigins", allowedOrigins); + originHandshakeInterceptor.getPropertyValues().add("allowedOrigins", origins); interceptors.add(originHandshakeInterceptor); sockJsServiceDef.getPropertyValues().add("handshakeInterceptors", interceptors); @@ -170,8 +170,8 @@ class WebSocketNamespaceUtils { return new RuntimeBeanReference(schedulerName); } - public static ManagedList parseBeanSubElements(Element parentElement, ParserContext context) { - ManagedList beans = new ManagedList(); + public static ManagedList parseBeanSubElements(Element parentElement, ParserContext context) { + ManagedList beans = new ManagedList(); if (parentElement != null) { beans.setSource(context.extractSource(parentElement)); for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) {