From aaa2ff54dd09b5df9bb9cb82ccb8c4cbb230b60a Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 2 Jun 2015 11:06:50 -0700 Subject: [PATCH] Extract @ConditionalOnEnabledEndpoint Extract @ConditionalOnEnabledEndpoint to a top level class. See gh-2798 --- .../EndpointWebMvcAutoConfiguration.java | 86 +------------------ .../ConditionalOnEnabledEndpoint.java | 53 ++++++++++++ .../condition/OnEnabledEndpointCondition.java | 70 +++++++++++++++ .../boot/actuate/condition/package-info.java | 20 +++++ 4 files changed, 144 insertions(+), 85 deletions(-) create mode 100644 spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/ConditionalOnEnabledEndpoint.java create mode 100644 spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/OnEnabledEndpointCondition.java create mode 100644 spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/package-info.java diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java index 3859371cbce..1bc0c4edb3c 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java @@ -17,10 +17,6 @@ package org.springframework.boot.actuate.autoconfigure; import java.io.IOException; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; import java.util.List; import javax.servlet.Filter; @@ -38,6 +34,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.autoconfigure.ManagementServerProperties.Security; +import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint; import org.springframework.boot.actuate.endpoint.HealthEndpoint; @@ -53,17 +50,14 @@ import org.springframework.boot.actuate.endpoint.mvc.ShutdownMvcEndpoint; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.boot.autoconfigure.condition.SpringBootCondition; import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration; import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; -import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext; import org.springframework.boot.context.embedded.EmbeddedServletContainerException; import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext; @@ -73,14 +67,10 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextClosedEvent; -import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertySource; -import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.servlet.DispatcherServlet; @@ -343,78 +333,4 @@ public class EndpointWebMvcAutoConfiguration implements ApplicationContextAware, } - /** - * {@link Conditional} that checks whether or not an endpoint is enabled. Matches if - * the value of the {@code endpoints..enabled} property is {@code true}. Does - * not match if the property's value or {@code enabledByDefault} is {@code false}. - * Otherwise, matches if the value of the {@code endpoints.enabled} property is - * {@code true} or if the property is not configured. - * - * @since 1.2.4 - */ - @Conditional(OnEnabledEndpointCondition.class) - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.METHOD) - public static @interface ConditionalOnEnabledEndpoint { - - /** - * The name of the endpoint. - * @return The name of the endpoint - */ - public String value(); - - /** - * Returns whether or not the endpoint is enabled by default. - * @return {@code true} if the endpoint is enabled by default, otherwise - * {@code false} - */ - public boolean enabledByDefault() default true; - - } - - private static class OnEnabledEndpointCondition extends SpringBootCondition { - - @Override - public ConditionOutcome getMatchOutcome(ConditionContext context, - AnnotatedTypeMetadata metadata) { - AnnotationAttributes annotationAttributes = AnnotationAttributes - .fromMap(metadata - .getAnnotationAttributes(ConditionalOnEnabledEndpoint.class - .getName())); - String endpointName = annotationAttributes.getString("value"); - boolean enabledByDefault = annotationAttributes - .getBoolean("enabledByDefault"); - ConditionOutcome specificEndpointOutcome = determineSpecificEndpointOutcome( - endpointName, enabledByDefault, context); - if (specificEndpointOutcome != null) { - return specificEndpointOutcome; - } - return determineAllEndpointsOutcome(context); - - } - - private ConditionOutcome determineSpecificEndpointOutcome(String endpointName, - boolean enabledByDefault, ConditionContext context) { - RelaxedPropertyResolver endpointPropertyResolver = new RelaxedPropertyResolver( - context.getEnvironment(), "endpoints." + endpointName + "."); - if (endpointPropertyResolver.containsProperty("enabled") || !enabledByDefault) { - boolean match = endpointPropertyResolver.getProperty("enabled", - Boolean.class, enabledByDefault); - return new ConditionOutcome(match, "The " + endpointName + " is " - + (match ? "enabled" : "disabled")); - } - return null; - } - - private ConditionOutcome determineAllEndpointsOutcome(ConditionContext context) { - RelaxedPropertyResolver allEndpointsPropertyResolver = new RelaxedPropertyResolver( - context.getEnvironment(), "endpoints."); - boolean match = Boolean.valueOf(allEndpointsPropertyResolver.getProperty( - "enabled", "true")); - return new ConditionOutcome(match, "All endpoints are " - + (match ? "enabled" : "disabled") + " by default"); - } - - } - } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/ConditionalOnEnabledEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/ConditionalOnEnabledEndpoint.java new file mode 100644 index 00000000000..2c2aa1da1af --- /dev/null +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/ConditionalOnEnabledEndpoint.java @@ -0,0 +1,53 @@ +/* + * Copyright 2012-2015 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.actuate.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; + +/** + * {@link Conditional} that checks whether or not an endpoint is enabled. Matches if the + * value of the {@code endpoints..enabled} property is {@code true}. Does not match + * if the property's value or {@code enabledByDefault} is {@code false}. Otherwise, + * matches if the value of the {@code endpoints.enabled} property is {@code true} or if + * the property is not configured. + * + * @author Andy Wilkinson + * @since 1.2.4 + */ +@Conditional(OnEnabledEndpointCondition.class) +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ConditionalOnEnabledEndpoint { + + /** + * The name of the endpoint. + * @return The name of the endpoint + */ + public String value(); + + /** + * Returns whether or not the endpoint is enabled by default. + * @return {@code true} if the endpoint is enabled by default, otherwise {@code false} + */ + public boolean enabledByDefault() default true; + +} diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/OnEnabledEndpointCondition.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/OnEnabledEndpointCondition.java new file mode 100644 index 00000000000..89c1d9fb436 --- /dev/null +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/OnEnabledEndpointCondition.java @@ -0,0 +1,70 @@ +/* + * Copyright 2012-2015 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.actuate.condition; + +import org.springframework.boot.autoconfigure.condition.ConditionOutcome; +import org.springframework.boot.autoconfigure.condition.SpringBootCondition; +import org.springframework.boot.bind.RelaxedPropertyResolver; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * {@link Condition} that checks whether or not an endpoint is enabled. + * + * @author Andy Wilkinson + */ +class OnEnabledEndpointCondition extends SpringBootCondition { + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(metadata + .getAnnotationAttributes(ConditionalOnEnabledEndpoint.class.getName())); + String endpointName = annotationAttributes.getString("value"); + boolean enabledByDefault = annotationAttributes.getBoolean("enabledByDefault"); + ConditionOutcome outcome = determineEndpointOutcome(endpointName, + enabledByDefault, context); + if (outcome != null) { + return outcome; + } + return determineAllEndpointsOutcome(context); + } + + private ConditionOutcome determineEndpointOutcome(String endpointName, + boolean enabledByDefault, ConditionContext context) { + RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( + context.getEnvironment(), "endpoints." + endpointName + "."); + if (resolver.containsProperty("enabled") || !enabledByDefault) { + boolean match = resolver.getProperty("enabled", Boolean.class, + enabledByDefault); + return new ConditionOutcome(match, "The " + endpointName + " is " + + (match ? "enabled" : "disabled")); + } + return null; + } + + private ConditionOutcome determineAllEndpointsOutcome(ConditionContext context) { + RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( + context.getEnvironment(), "endpoints."); + boolean match = Boolean.valueOf(resolver.getProperty("enabled", "true")); + return new ConditionOutcome(match, "All endpoints are " + + (match ? "enabled" : "disabled") + " by default"); + } + +} diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/package-info.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/package-info.java new file mode 100644 index 00000000000..00e6974da43 --- /dev/null +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2015 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. + */ + +/** + * {@code @Condition} annotations and supporting classes. + */ +package org.springframework.boot.actuate.condition; \ No newline at end of file