From 80358f7fbf71765764e7a4520e937704cbecdf56 Mon Sep 17 00:00:00 2001 From: Eneias Cordeiro da Silva Date: Sun, 2 Sep 2018 22:57:02 -0300 Subject: [PATCH] Fix WSDL locations condition to work with a list See gh-14285 --- .../condition/AbstractListCondition.java | 57 +++++++++++++ .../couchbase/OnBootstrapHostsCondition.java | 35 ++------ .../webservices/OnWsdlLocationsCondition.java | 38 +++++++++ .../WebServicesAutoConfiguration.java | 5 +- .../OnWsdlLocationsConditionTests.java | 82 +++++++++++++++++++ .../WebServicesAutoConfigurationTests.java | 14 ++++ 6 files changed, 203 insertions(+), 28 deletions(-) create mode 100644 spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractListCondition.java create mode 100644 spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsCondition.java create mode 100644 spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsConditionTests.java diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractListCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractListCondition.java new file mode 100644 index 0000000000..39e429f39a --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractListCondition.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.condition; + +import java.util.List; + +import org.springframework.boot.context.properties.bind.BindResult; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * Abstract base class for list conditions. + * + * @author Eneias Silva + * + */ +public abstract class AbstractListCondition extends SpringBootCondition { + + private static final Bindable> STRING_LIST = Bindable + .listOf(String.class); + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + BindResult property = Binder.get(context.getEnvironment()) + .bind(getPropertyName(), STRING_LIST); + if (property.isBound()) { + return ConditionOutcome.match(ConditionMessage.forCondition(getClassName()) + .found("property").items(getPropertyName())); + } + return ConditionOutcome.noMatch(ConditionMessage.forCondition(getClassName()) + .didNotFind("property").items(getPropertyName())); + } + + + protected abstract String getPropertyName(); + + + protected abstract String getClassName(); + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsCondition.java index 2473ec6aa5..0faf148aee 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsCondition.java @@ -16,42 +16,25 @@ package org.springframework.boot.autoconfigure.couchbase; -import java.util.List; - -import org.springframework.boot.autoconfigure.condition.ConditionMessage; -import org.springframework.boot.autoconfigure.condition.ConditionOutcome; -import org.springframework.boot.autoconfigure.condition.SpringBootCondition; -import org.springframework.boot.context.properties.bind.BindResult; -import org.springframework.boot.context.properties.bind.Bindable; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.boot.autoconfigure.condition.AbstractListCondition; /** * Condition to determine if {@code spring.couchbase.bootstrap-hosts} is specified. * * @author Stephane Nicoll * @author Madhura Bhave + * @author Eneias Silva */ -class OnBootstrapHostsCondition extends SpringBootCondition { +class OnBootstrapHostsCondition extends AbstractListCondition { - private static final Bindable> STRING_LIST = Bindable - .listOf(String.class); + @Override + protected String getPropertyName() { + return "spring.couchbase.bootstrap-hosts"; + } @Override - public ConditionOutcome getMatchOutcome(ConditionContext context, - AnnotatedTypeMetadata metadata) { - String name = "spring.couchbase.bootstrap-hosts"; - BindResult property = Binder.get(context.getEnvironment()).bind(name, - STRING_LIST); - if (property.isBound()) { - return ConditionOutcome.match(ConditionMessage - .forCondition(OnBootstrapHostsCondition.class.getName()) - .found("property").items(name)); - } - return ConditionOutcome.noMatch( - ConditionMessage.forCondition(OnBootstrapHostsCondition.class.getName()) - .didNotFind("property").items(name)); + protected String getClassName() { + return OnBootstrapHostsCondition.class.getName(); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsCondition.java new file mode 100644 index 0000000000..99fe730ddb --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsCondition.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.webservices; + +import org.springframework.boot.autoconfigure.condition.AbstractListCondition; + +/** + * Condition to determine if {@code spring.webservices.wsdl-locations} is specified. + * + * @author Eneias Silva + */ +class OnWsdlLocationsCondition extends AbstractListCondition { + + @Override + protected String getPropertyName() { + return "spring.webservices.wsdl-locations"; + } + + @Override + protected String getClassName() { + return OnWsdlLocationsCondition.class.getName(); + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.java index 5d20b2d097..103e5d78ad 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.java @@ -30,7 +30,6 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type; import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration; @@ -41,6 +40,7 @@ import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; @@ -55,6 +55,7 @@ import org.springframework.xml.xsd.SimpleXsdSchema; * * @author Vedran Pavic * @author Stephane Nicoll + * @author Eneias Silva * @since 1.4.0 */ @Configuration @@ -87,7 +88,7 @@ public class WebServicesAutoConfiguration { } @Bean - @ConditionalOnProperty(prefix = "spring.webservices", name = "wsdl-locations") + @Conditional(OnWsdlLocationsCondition.class) public static WsdlDefinitionBeanFactoryPostProcessor wsdlDefinitionBeanFactoryPostProcessor() { return new WsdlDefinitionBeanFactoryPostProcessor(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsConditionTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsConditionTests.java new file mode 100644 index 0000000000..19fb4b7c5a --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsConditionTests.java @@ -0,0 +1,82 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.webservices; + +import org.junit.After; +import org.junit.Test; + +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link OnWsdlLocationsCondition}. + * + * @author Eneias Silva + */ +public class OnWsdlLocationsConditionTests { + + private AnnotationConfigApplicationContext context; + + @After + public void tearDown() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void wsdlLocationsNotDefined() { + load(TestConfig.class); + assertThat(this.context.containsBean("foo")).isFalse(); + } + + @Test + public void wsdlLocationsDefinedAsCommaSeparated() { + load(TestConfig.class, "spring.webservices.wsdl-locations=value1"); + assertThat(this.context.containsBean("foo")).isTrue(); + } + + @Test + public void wsdlLocationsDefinedAsList() { + load(TestConfig.class, "spring.webservices.wsdl-locations[0]=value1"); + assertThat(this.context.containsBean("foo")).isTrue(); + } + + private void load(Class config, String... environment) { + this.context = new AnnotationConfigApplicationContext(); + TestPropertyValues.of(environment).applyTo(this.context); + this.context.register(config); + this.context.refresh(); + } + + @Configuration + @Conditional(OnWsdlLocationsCondition.class) + protected static class TestConfig { + + @Bean + public String foo() { + return "foo"; + } + + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfigurationTests.java index eb94a156d4..5a87e055c7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfigurationTests.java @@ -37,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Vedran Pavic * @author Stephane Nicoll * @author Andy Wilkinson + * @author Eneias Silva */ public class WebServicesAutoConfigurationTests { @@ -104,6 +105,19 @@ public class WebServicesAutoConfigurationTests { }); } + @Test + public void withWsdlBeansAsList() { + this.contextRunner + .withPropertyValues( + "spring.webservices.wsdl-locations[0]=classpath:/wsdl") + .run((context) -> { + assertThat(context.getBeansOfType(SimpleWsdl11Definition.class)) + .hasSize(1).containsKey("service"); + assertThat(context.getBeansOfType(SimpleXsdSchema.class)).hasSize(1) + .containsKey("types"); + }); + } + private Collection getUrlMappings(ApplicationContext context) { return getServletRegistrationBean(context).getUrlMappings(); }