diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnListCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnListCondition.java new file mode 100644 index 0000000000..78eae1aa0b --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnListCondition.java @@ -0,0 +1,72 @@ +/* + * 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 java.util.function.Supplier; + +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.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * {@link Condition} that checks if a property whose value is a list is defined in the + * environment. + * + * @author Eneias Silva + * @author Stephane Nicoll + * @since 2.0.5 + */ +public class OnListCondition extends SpringBootCondition { + + private static final Bindable> SIMPLE_LIST = Bindable + .listOf(String.class); + + private final String propertyName; + + private final Supplier messageBuilder; + + /** + * Create a new instance with the property to check and the message builder to use. + * @param propertyName the name of the property + * @param messageBuilder a message builder supplier that should provide a fresh + * instance on each call + */ + protected OnListCondition(String propertyName, + Supplier messageBuilder) { + this.propertyName = propertyName; + this.messageBuilder = messageBuilder; + } + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + BindResult property = Binder.get(context.getEnvironment()) + .bind(this.propertyName, SIMPLE_LIST); + ConditionMessage.Builder messageBuilder = this.messageBuilder.get(); + if (property.isBound()) { + return ConditionOutcome + .match(messageBuilder.found("property").items(this.propertyName)); + } + return ConditionOutcome + .noMatch(messageBuilder.didNotFind("property").items(this.propertyName)); + } + +} 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..b4a9724092 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * 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. @@ -16,42 +16,21 @@ 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.OnListCondition; /** * 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 OnListCondition { - private static final Bindable> STRING_LIST = Bindable - .listOf(String.class); - - @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)); + OnBootstrapHostsCondition() { + super("spring.couchbase.bootstrap-hosts", + () -> ConditionMessage.forCondition("Couchbase Bootstrap Hosts")); } } 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..8ebcaba16d --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsCondition.java @@ -0,0 +1,35 @@ +/* + * 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.webservices; + +import org.springframework.boot.autoconfigure.condition.ConditionMessage; +import org.springframework.boot.autoconfigure.condition.OnListCondition; + +/** + * Condition to determine if {@code spring.webservices.wsdl-locations} is specified. + * + * @author Eneias Silva + * @author Stephane Nicoll + */ +class OnWsdlLocationsCondition extends OnListCondition { + + OnWsdlLocationsCondition() { + super("spring.webservices.wsdl-locations", + () -> ConditionMessage.forCondition("WSDL locations")); + } + +} 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..63fc12670d 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; @@ -87,7 +87,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/condition/OnListConditionTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/OnListConditionTests.java new file mode 100644 index 0000000000..27d4ac66b6 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/OnListConditionTests.java @@ -0,0 +1,86 @@ +/* + * 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 org.junit.Test; + +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +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 OnListCondition}. + * + * @author Stephane Nicoll + */ +public class OnListConditionTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withUserConfiguration(TestConfig.class); + + @Test + public void propertyNotDefined() { + this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean("foo")); + } + + @Test + public void propertyDefinedAsCommaSeparated() { + this.contextRunner.withPropertyValues("spring.test.my-list=value1") + .run((context) -> assertThat(context).hasBean("foo")); + } + + @Test + public void propertyDefinedAsList() { + this.contextRunner.withPropertyValues("spring.test.my-list[0]=value1") + .run((context) -> assertThat(context).hasBean("foo")); + } + + @Test + public void propertyDefinedAsCommaSeparatedRelaxed() { + this.contextRunner.withPropertyValues("spring.test.my-list=value1") + .run((context) -> assertThat(context).hasBean("foo")); + } + + @Test + public void propertyDefinedAsListRelaxed() { + this.contextRunner.withPropertyValues("spring.test.myList[0]=value1") + .run((context) -> assertThat(context).hasBean("foo")); + } + + @Configuration + @Conditional(TestListCondition.class) + protected static class TestConfig { + + @Bean + public String foo() { + return "foo"; + } + + } + + static class TestListCondition extends OnListCondition { + + TestListCondition() { + super("spring.test.my-list", () -> ConditionMessage.forCondition("test")); + } + + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsConditionTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsConditionTests.java index 9ac74bc70a..84682a097c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsConditionTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/OnBootstrapHostsConditionTests.java @@ -16,11 +16,9 @@ package org.springframework.boot.autoconfigure.couchbase; -import org.junit.After; import org.junit.Test; -import org.springframework.boot.test.util.TestPropertyValues; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @@ -34,50 +32,25 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class OnBootstrapHostsConditionTests { - private AnnotationConfigApplicationContext context; - - @After - public void tearDown() { - if (this.context != null) { - this.context.close(); - } - } + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withUserConfiguration(TestConfig.class); @Test public void bootstrapHostsNotDefined() { - load(TestConfig.class); - assertThat(this.context.containsBean("foo")).isFalse(); + this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean("foo")); } @Test public void bootstrapHostsDefinedAsCommaSeparated() { - load(TestConfig.class, "spring.couchbase.bootstrap-hosts=value1"); - assertThat(this.context.containsBean("foo")).isTrue(); + this.contextRunner.withPropertyValues("spring.couchbase.bootstrap-hosts=value1") + .run((context) -> assertThat(context).hasBean("foo")); } @Test public void bootstrapHostsDefinedAsList() { - load(TestConfig.class, "spring.couchbase.bootstrap-hosts[0]=value1"); - assertThat(this.context.containsBean("foo")).isTrue(); - } - - @Test - public void bootstrapHostsDefinedAsCommaSeparatedRelaxed() { - load(TestConfig.class, "spring.couchbase.bootstrapHosts=value1"); - assertThat(this.context.containsBean("foo")).isTrue(); - } - - @Test - public void bootstrapHostsDefinedAsListRelaxed() { - load(TestConfig.class, "spring.couchbase.bootstrapHosts[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(); + this.contextRunner + .withPropertyValues("spring.couchbase.bootstrap-hosts[0]=value1") + .run((context) -> assertThat(context).hasBean("foo")); } @Configuration 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..69605a9e03 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/OnWsdlLocationsConditionTests.java @@ -0,0 +1,68 @@ +/* + * 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.webservices; + +import org.junit.Test; + +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +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 + * @author Stephane Nicoll + */ +public class OnWsdlLocationsConditionTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withUserConfiguration(TestConfig.class); + + @Test + public void bootstrapHostsNotDefined() { + this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean("foo")); + } + + @Test + public void bootstrapHostsDefinedAsCommaSeparated() { + this.contextRunner.withPropertyValues("spring.webservices.wsdl-locations=value1") + .run((context) -> assertThat(context).hasBean("foo")); + } + + @Test + public void bootstrapHostsDefinedAsList() { + this.contextRunner + .withPropertyValues("spring.webservices.wsdl-locations[0]=value1") + .run((context) -> assertThat(context).hasBean("foo")); + } + + @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..1bfc1c7deb 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * 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. @@ -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(); }