diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty.java new file mode 100644 index 0000000000..d62b5e9ed2 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2014 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.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.context.annotation.Conditional; +import org.springframework.core.env.Environment; + +/** + * {@link Conditional} that only matches when the specified properties are defined in + * {@link Environment} + * + * @author Maciej Walkowiak + * @since 1.1.0 + */ +@Conditional(OnPropertyCondition.class) +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.METHOD }) +public @interface ConditionalOnProperty { + + /** + * One or more properties that must be present. + * @return the property names + */ + String[] value(); + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnPropertyCondition.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnPropertyCondition.java new file mode 100644 index 0000000000..29bc5c1a51 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnPropertyCondition.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2014 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.ArrayList; +import java.util.List; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.util.StringUtils; + +/** + * {@link Condition} that checks if properties are defined in environment. + * + * @author Maciej Walkowiak + * @see ConditionalOnProperty + * @since 1.1.0 + */ +class OnPropertyCondition extends SpringBootCondition { + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + + String[] onProperties = (String[]) metadata.getAnnotationAttributes( + ConditionalOnProperty.class.getName()).get("value"); + + List missingProperties = new ArrayList(); + + for (String property : onProperties) { + if (!context.getEnvironment().containsProperty(property)) { + missingProperties.add(property); + } + } + + if (missingProperties.isEmpty()) { + return ConditionOutcome.match(); + } + + return ConditionOutcome + .noMatch("@ConditionalOnProperty missing required properties: " + + StringUtils.arrayToCommaDelimitedString(missingProperties + .toArray()) + " not found"); + } + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnPropertyTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnPropertyTests.java new file mode 100644 index 0000000000..53d77f5aa0 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnPropertyTests.java @@ -0,0 +1,71 @@ +/* + * Copyright 2012-2014 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.EnvironmentTestUtils; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Tests for {@link ConditionalOnProperty}. + * + * @author Maciej Walkowiak + */ +public class ConditionalOnPropertyTests { + + private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + + @Test + public void testBeanIsCreatedWhenAllPropertiesAreDefined() { + EnvironmentTestUtils.addEnvironment(this.context.getEnvironment(), + "property1=value1", "property2=value2"); + setupContext(); + assertTrue(this.context.containsBean("foo")); + assertEquals("foo", this.context.getBean("foo")); + } + + @Test + public void testBeanIsNotCreatedWhenNotAllPropertiesAreDefined() { + EnvironmentTestUtils.addEnvironment(this.context.getEnvironment(), + "property1=value1"); + setupContext(); + assertFalse(this.context.containsBean("foo")); + } + + private void setupContext() { + this.context.register(MultiplePropertiesRequiredConfiguration.class); + this.context.refresh(); + } + + @Configuration + @ConditionalOnProperty({ "property1", "property2" }) + protected static class MultiplePropertiesRequiredConfiguration { + + @Bean + public String foo() { + return "foo"; + } + + } + +}