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/OnListCondition.java similarity index 51% rename from spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractListCondition.java rename to spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnListCondition.java index 39e429f39a..78eae1aa0b 100644 --- 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/OnListCondition.java @@ -17,41 +17,56 @@ 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; /** - * Abstract base class for list conditions. + * {@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 abstract class AbstractListCondition extends SpringBootCondition { +public class OnListCondition extends SpringBootCondition { - private static final Bindable> STRING_LIST = Bindable + 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(getPropertyName(), STRING_LIST); + .bind(this.propertyName, SIMPLE_LIST); + ConditionMessage.Builder messageBuilder = this.messageBuilder.get(); if (property.isBound()) { - return ConditionOutcome.match(ConditionMessage.forCondition(getClassName()) - .found("property").items(getPropertyName())); + return ConditionOutcome + .match(messageBuilder.found("property").items(this.propertyName)); } - return ConditionOutcome.noMatch(ConditionMessage.forCondition(getClassName()) - .didNotFind("property").items(getPropertyName())); + return ConditionOutcome + .noMatch(messageBuilder.didNotFind("property").items(this.propertyName)); } - - 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 0faf148aee..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,7 +16,8 @@ package org.springframework.boot.autoconfigure.couchbase; -import org.springframework.boot.autoconfigure.condition.AbstractListCondition; +import org.springframework.boot.autoconfigure.condition.ConditionMessage; +import org.springframework.boot.autoconfigure.condition.OnListCondition; /** * Condition to determine if {@code spring.couchbase.bootstrap-hosts} is specified. @@ -25,16 +26,11 @@ import org.springframework.boot.autoconfigure.condition.AbstractListCondition; * @author Madhura Bhave * @author Eneias Silva */ -class OnBootstrapHostsCondition extends AbstractListCondition { +class OnBootstrapHostsCondition extends OnListCondition { - @Override - protected String getPropertyName() { - return "spring.couchbase.bootstrap-hosts"; - } - - @Override - protected String getClassName() { - return OnBootstrapHostsCondition.class.getName(); + 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 index 99fe730ddb..8ebcaba16d 100644 --- 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 @@ -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,23 +16,20 @@ package org.springframework.boot.autoconfigure.webservices; -import org.springframework.boot.autoconfigure.condition.AbstractListCondition; +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 AbstractListCondition { +class OnWsdlLocationsCondition extends OnListCondition { - @Override - protected String getPropertyName() { - return "spring.webservices.wsdl-locations"; - } - - @Override - protected String getClassName() { - return OnWsdlLocationsCondition.class.getName(); + 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 103e5d78ad..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 @@ -55,7 +55,6 @@ import org.springframework.xml.xsd.SimpleXsdSchema; * * @author Vedran Pavic * @author Stephane Nicoll - * @author Eneias Silva * @since 1.4.0 */ @Configuration 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 index 19fb4b7c5a..69605a9e03 100644 --- 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 @@ -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,11 +16,9 @@ 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.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @@ -31,41 +29,29 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link OnWsdlLocationsCondition}. * * @author Eneias Silva + * @author Stephane Nicoll */ public class OnWsdlLocationsConditionTests { - 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 wsdlLocationsNotDefined() { - load(TestConfig.class); - assertThat(this.context.containsBean("foo")).isFalse(); + public void bootstrapHostsNotDefined() { + this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean("foo")); } @Test - public void wsdlLocationsDefinedAsCommaSeparated() { - load(TestConfig.class, "spring.webservices.wsdl-locations=value1"); - assertThat(this.context.containsBean("foo")).isTrue(); + public void bootstrapHostsDefinedAsCommaSeparated() { + this.contextRunner.withPropertyValues("spring.webservices.wsdl-locations=value1") + .run((context) -> assertThat(context).hasBean("foo")); } @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(); + public void bootstrapHostsDefinedAsList() { + this.contextRunner + .withPropertyValues("spring.webservices.wsdl-locations[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/WebServicesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfigurationTests.java index 5a87e055c7..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.