Commit 26df5576 authored by Stephane Nicoll's avatar Stephane Nicoll

Merge enablement and exposure conditions for Actuator endpoints

This commit merges the conditions for determining if an endpoint is
available in a single condition, deprecating
`ConditionalOnEnabledEndpoint` in the process.

Closes gh-16169
parent 275d7945
...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.audit; ...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.audit;
import org.springframework.boot.actuate.audit.AuditEventRepository; import org.springframework.boot.actuate.audit.AuditEventRepository;
import org.springframework.boot.actuate.audit.AuditEventsEndpoint; import org.springframework.boot.actuate.audit.AuditEventsEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
...@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(AuditAutoConfiguration.class) @AutoConfigureAfter(AuditAutoConfiguration.class)
@ConditionalOnEnabledEndpoint(endpoint = AuditEventsEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = AuditEventsEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = AuditEventsEndpoint.class)
public class AuditEventsEndpointAutoConfiguration { public class AuditEventsEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.beans; package org.springframework.boot.actuate.autoconfigure.beans;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.beans.BeansEndpoint; import org.springframework.boot.actuate.beans.BeansEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
...@@ -32,8 +31,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -32,8 +31,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = BeansEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = BeansEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = BeansEndpoint.class)
public class BeansEndpointAutoConfiguration { public class BeansEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.cache; ...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.cache;
import java.util.Map; import java.util.Map;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.cache.CachesEndpoint; import org.springframework.boot.actuate.cache.CachesEndpoint;
import org.springframework.boot.actuate.cache.CachesEndpointWebExtension; import org.springframework.boot.actuate.cache.CachesEndpointWebExtension;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
...@@ -41,8 +40,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -41,8 +40,7 @@ import org.springframework.context.annotation.Configuration;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(CacheManager.class) @ConditionalOnClass(CacheManager.class)
@ConditionalOnEnabledEndpoint(endpoint = CachesEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = CachesEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = CachesEndpoint.class)
@AutoConfigureAfter(CacheAutoConfiguration.class) @AutoConfigureAfter(CacheAutoConfiguration.class)
public class CachesEndpointAutoConfiguration { public class CachesEndpointAutoConfiguration {
......
...@@ -28,8 +28,7 @@ import org.springframework.beans.factory.ObjectProvider; ...@@ -28,8 +28,7 @@ import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer; import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer;
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet.CloudFoundryInfoEndpointWebExtension; import org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet.CloudFoundryInfoEndpointWebExtension;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration;
import org.springframework.boot.actuate.endpoint.ExposableEndpoint; import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
...@@ -86,8 +85,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration { ...@@ -86,8 +85,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint @ConditionalOnAvailableEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnBean({ HealthEndpoint.class, ReactiveHealthEndpointWebExtension.class }) @ConditionalOnBean({ HealthEndpoint.class, ReactiveHealthEndpointWebExtension.class })
public CloudFoundryReactiveHealthEndpointWebExtension cloudFoundryReactiveHealthEndpointWebExtension( public CloudFoundryReactiveHealthEndpointWebExtension cloudFoundryReactiveHealthEndpointWebExtension(
ReactiveHealthEndpointWebExtension reactiveHealthEndpointWebExtension) { ReactiveHealthEndpointWebExtension reactiveHealthEndpointWebExtension) {
...@@ -97,8 +95,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration { ...@@ -97,8 +95,7 @@ public class ReactiveCloudFoundryActuatorAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint @ConditionalOnAvailableEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnBean({ InfoEndpoint.class, GitProperties.class }) @ConditionalOnBean({ InfoEndpoint.class, GitProperties.class })
public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension( public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension(
GitProperties properties, ObjectProvider<InfoContributor> infoContributors) { GitProperties properties, ObjectProvider<InfoContributor> infoContributors) {
......
...@@ -25,8 +25,7 @@ import java.util.stream.Collectors; ...@@ -25,8 +25,7 @@ import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer; import org.springframework.boot.actuate.autoconfigure.cloudfoundry.CloudFoundryWebEndpointDiscoverer;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration;
...@@ -88,8 +87,7 @@ public class CloudFoundryActuatorAutoConfiguration { ...@@ -88,8 +87,7 @@ public class CloudFoundryActuatorAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint @ConditionalOnAvailableEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnBean({ HealthEndpoint.class, HealthEndpointWebExtension.class }) @ConditionalOnBean({ HealthEndpoint.class, HealthEndpointWebExtension.class })
public CloudFoundryHealthEndpointWebExtension cloudFoundryHealthEndpointWebExtension( public CloudFoundryHealthEndpointWebExtension cloudFoundryHealthEndpointWebExtension(
HealthEndpointWebExtension healthEndpointWebExtension) { HealthEndpointWebExtension healthEndpointWebExtension) {
...@@ -98,8 +96,7 @@ public class CloudFoundryActuatorAutoConfiguration { ...@@ -98,8 +96,7 @@ public class CloudFoundryActuatorAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint @ConditionalOnAvailableEndpoint
@ConditionalOnExposedEndpoint
@ConditionalOnBean({ InfoEndpoint.class, GitProperties.class }) @ConditionalOnBean({ InfoEndpoint.class, GitProperties.class })
public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension( public CloudFoundryInfoEndpointWebExtension cloudFoundryInfoEndpointWebExtension(
GitProperties properties, ObjectProvider<InfoContributor> infoContributors) { GitProperties properties, ObjectProvider<InfoContributor> infoContributors) {
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.condition; package org.springframework.boot.actuate.autoconfigure.condition;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.SearchStrategy; import org.springframework.boot.autoconfigure.condition.SearchStrategy;
...@@ -33,8 +32,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -33,8 +32,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ConditionsReportEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = ConditionsReportEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ConditionsReportEndpoint.class)
public class ConditionsReportEndpointAutoConfiguration { public class ConditionsReportEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.context; package org.springframework.boot.actuate.autoconfigure.context;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.context.ShutdownEndpoint; import org.springframework.boot.actuate.context.ShutdownEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
...@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ShutdownEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = ShutdownEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ShutdownEndpoint.class)
public class ShutdownEndpointAutoConfiguration { public class ShutdownEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.context.properties; package org.springframework.boot.actuate.autoconfigure.context.properties;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint; import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
...@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ConfigurationPropertiesReportEndpoint.class)
@EnableConfigurationProperties(ConfigurationPropertiesReportEndpointProperties.class) @EnableConfigurationProperties(ConfigurationPropertiesReportEndpointProperties.class)
public class ConfigurationPropertiesReportEndpointAutoConfiguration { public class ConfigurationPropertiesReportEndpointAutoConfiguration {
......
...@@ -16,10 +16,15 @@ ...@@ -16,10 +16,15 @@
package org.springframework.boot.actuate.autoconfigure.endpoint.condition; package org.springframework.boot.actuate.autoconfigure.endpoint.condition;
import java.lang.annotation.Annotation;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import org.springframework.boot.actuate.endpoint.EndpointId;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.EndpointExtension; import org.springframework.boot.actuate.endpoint.annotation.EndpointExtension;
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.autoconfigure.condition.SpringBootCondition;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.ConditionContext;
...@@ -27,10 +32,12 @@ import org.springframework.core.annotation.AnnotationAttributes; ...@@ -27,10 +32,12 @@ import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations; import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.annotation.MergedAnnotations.SearchStrategy; import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.type.MethodMetadata; import org.springframework.core.type.MethodMetadata;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
import org.springframework.util.ConcurrentReferenceHashMap;
/** /**
* Base class for {@link Endpoint @Endpoint} related {@link SpringBootCondition} * Base class for {@link Endpoint @Endpoint} related {@link SpringBootCondition}
...@@ -42,12 +49,44 @@ import org.springframework.util.ClassUtils; ...@@ -42,12 +49,44 @@ import org.springframework.util.ClassUtils;
*/ */
abstract class AbstractEndpointCondition extends SpringBootCondition { abstract class AbstractEndpointCondition extends SpringBootCondition {
private static final String ENABLED_BY_DEFAULT_KEY = "management.endpoints.enabled-by-default";
private static final ConcurrentReferenceHashMap<Environment, Optional<Boolean>> enabledByDefaultCache = new ConcurrentReferenceHashMap<>();
AnnotationAttributes getEndpointAttributes(Class<?> annotationClass, AnnotationAttributes getEndpointAttributes(Class<?> annotationClass,
ConditionContext context, AnnotatedTypeMetadata metadata) { ConditionContext context, AnnotatedTypeMetadata metadata) {
return getEndpointAttributes(getEndpointType(annotationClass, context, metadata)); return getEndpointAttributes(getEndpointType(annotationClass, context, metadata));
} }
Class<?> getEndpointType(Class<?> annotationClass, ConditionContext context, protected ConditionOutcome getEnablementOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata, Class<? extends Annotation> annotationClass) {
Environment environment = context.getEnvironment();
AnnotationAttributes attributes = getEndpointAttributes(annotationClass, context,
metadata);
EndpointId id = EndpointId.of(attributes.getString("id"));
String key = "management.endpoint." + id.toLowerCaseString() + ".enabled";
Boolean userDefinedEnabled = environment.getProperty(key, Boolean.class);
if (userDefinedEnabled != null) {
return new ConditionOutcome(userDefinedEnabled,
ConditionMessage.forCondition(annotationClass)
.because("found property " + key + " with value "
+ userDefinedEnabled));
}
Boolean userDefinedDefault = isEnabledByDefault(environment);
if (userDefinedDefault != null) {
return new ConditionOutcome(userDefinedDefault,
ConditionMessage.forCondition(annotationClass)
.because("no property " + key
+ " found so using user defined default from "
+ ENABLED_BY_DEFAULT_KEY));
}
boolean endpointDefault = attributes.getBoolean("enableByDefault");
return new ConditionOutcome(endpointDefault,
ConditionMessage.forCondition(annotationClass).because(
"no property " + key + " found so using endpoint default"));
}
protected Class<?> getEndpointType(Class<?> annotationClass, ConditionContext context,
AnnotatedTypeMetadata metadata) { AnnotatedTypeMetadata metadata) {
Map<String, Object> attributes = metadata Map<String, Object> attributes = metadata
.getAnnotationAttributes(annotationClass.getName()); .getAnnotationAttributes(annotationClass.getName());
...@@ -73,7 +112,7 @@ abstract class AbstractEndpointCondition extends SpringBootCondition { ...@@ -73,7 +112,7 @@ abstract class AbstractEndpointCondition extends SpringBootCondition {
} }
} }
AnnotationAttributes getEndpointAttributes(Class<?> type) { protected AnnotationAttributes getEndpointAttributes(Class<?> type) {
MergedAnnotations annotations = MergedAnnotations.from(type, MergedAnnotations annotations = MergedAnnotations.from(type,
SearchStrategy.EXHAUSTIVE); SearchStrategy.EXHAUSTIVE);
MergedAnnotation<Endpoint> endpoint = annotations.get(Endpoint.class); MergedAnnotation<Endpoint> endpoint = annotations.get(Endpoint.class);
...@@ -88,4 +127,14 @@ abstract class AbstractEndpointCondition extends SpringBootCondition { ...@@ -88,4 +127,14 @@ abstract class AbstractEndpointCondition extends SpringBootCondition {
return getEndpointAttributes(extension.getClass("endpoint")); return getEndpointAttributes(extension.getClass("endpoint"));
} }
private Boolean isEnabledByDefault(Environment environment) {
Optional<Boolean> enabledByDefault = enabledByDefaultCache.get(environment);
if (enabledByDefault == null) {
enabledByDefault = Optional.ofNullable(
environment.getProperty(ENABLED_BY_DEFAULT_KEY, Boolean.class));
enabledByDefaultCache.put(environment, enabledByDefault);
}
return enabledByDefault.orElse(null);
}
} }
...@@ -28,20 +28,17 @@ import org.springframework.context.annotation.Conditional; ...@@ -28,20 +28,17 @@ import org.springframework.context.annotation.Conditional;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
/** /**
* {@link Conditional @Conditional} that checks whether an endpoint is exposed or not. * {@link Conditional @Conditional} that checks whether an endpoint is available. An
* Matches according to the endpoint exposure configuration {@link Environment} * endpoint is considered available if it is both enabled and exposed. Matches enablement
* properties. This is designed as a companion annotation to * according to the endpoints specific {@link Environment} property, falling back to
* {@link ConditionalOnEnabledEndpoint @ConditionalOnEnabledEndpoint}. * {@code management.endpoints.enabled-by-default} or failing that
* {@link Endpoint#enableByDefault()}. Matches exposure according to any of the
* {@code management.endpoints.web.exposure.<id>} or
* {@code management.endpoints.jmx.exposure.<id>} specific properties or failing that to
* whether the application runs on
* {@link org.springframework.boot.cloud.CloudPlatform#CLOUD_FOUNDRY}. Both those
* conditions should match for the endpoint to be considered available.
* <p> * <p>
* For a given {@link Endpoint @Endpoint}, the condition will match if:
* <ul>
* <li>{@code "management.endpoints.web.exposure.*"} expose this endpoint</li>
* <li>or if JMX is enabled and {@code "management.endpoints.jmx.exposure.*"} expose this
* endpoint</li>
* <li>or if the application is running on
* {@link org.springframework.boot.cloud.CloudPlatform#CLOUD_FOUNDRY}</li>
* </ul>
*
* When placed on a {@code @Bean} method, the endpoint defaults to the return type of the * When placed on a {@code @Bean} method, the endpoint defaults to the return type of the
* factory method: * factory method:
* *
...@@ -49,7 +46,7 @@ import org.springframework.core.env.Environment; ...@@ -49,7 +46,7 @@ import org.springframework.core.env.Environment;
* &#064;Configuration * &#064;Configuration
* public class MyConfiguration { * public class MyConfiguration {
* *
* &#064;ConditionalOnExposedEndpoint * &#064;ConditionalOnAvailableEndpoint
* &#064;Bean * &#064;Bean
* public MyEndpoint myEndpoint() { * public MyEndpoint myEndpoint() {
* ... * ...
...@@ -63,7 +60,7 @@ import org.springframework.core.env.Environment; ...@@ -63,7 +60,7 @@ import org.springframework.core.env.Environment;
* &#064;Configuration * &#064;Configuration
* public class MyConfiguration { * public class MyConfiguration {
* *
* &#064;ConditionalOnExposedEndpoint * &#064;ConditionalOnAvailableEndpoint
* &#064;Bean * &#064;Bean
* public MyEndpointWebExtension myEndpointWebExtension() { * public MyEndpointWebExtension myEndpointWebExtension() {
* ... * ...
...@@ -72,8 +69,8 @@ import org.springframework.core.env.Environment; ...@@ -72,8 +69,8 @@ import org.springframework.core.env.Environment;
* }</pre> * }</pre>
* <p> * <p>
* In the sample above, {@code MyEndpointWebExtension} will be created if the endpoint is * In the sample above, {@code MyEndpointWebExtension} will be created if the endpoint is
* enabled as defined by the rules above. {@code MyEndpointWebExtension} must be a regular * available as defined by the rules above. {@code MyEndpointWebExtension} must be a
* extension that refers to an endpoint, something like: * regular extension that refers to an endpoint, something like:
* *
* <pre class="code"> * <pre class="code">
* &#064;EndpointWebExtension(endpoint = MyEndpoint.class) * &#064;EndpointWebExtension(endpoint = MyEndpoint.class)
...@@ -82,13 +79,13 @@ import org.springframework.core.env.Environment; ...@@ -82,13 +79,13 @@ import org.springframework.core.env.Environment;
* }</pre> * }</pre>
* <p> * <p>
* Alternatively, the target endpoint can be manually specified for components that should * Alternatively, the target endpoint can be manually specified for components that should
* only be created when a given endpoint is enabled: * only be created when a given endpoint is available:
* *
* <pre class="code"> * <pre class="code">
* &#064;Configuration * &#064;Configuration
* public class MyConfiguration { * public class MyConfiguration {
* *
* &#064;ConditionalOnExposedEndpoint(endpoint = MyEndpoint.class) * &#064;ConditionalOnAvailableEndpoint(endpoint = MyEndpoint.class)
* &#064;Bean * &#064;Bean
* public MyComponent myComponent() { * public MyComponent myComponent() {
* ... * ...
...@@ -97,15 +94,15 @@ import org.springframework.core.env.Environment; ...@@ -97,15 +94,15 @@ import org.springframework.core.env.Environment;
* }</pre> * }</pre>
* *
* @author Brian Clozel * @author Brian Clozel
* @author Stephane Nicoll
* @since 2.2.0 * @since 2.2.0
* @see Endpoint * @see Endpoint
* @see ConditionalOnEnabledEndpoint
*/ */
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE }) @Target({ ElementType.METHOD, ElementType.TYPE })
@Documented @Documented
@Conditional(OnExposedEndpointCondition.class) @Conditional(OnAvailableEndpointCondition.class)
public @interface ConditionalOnExposedEndpoint { public @interface ConditionalOnAvailableEndpoint {
/** /**
* The endpoint type that should be checked. Inferred when the return type of the * The endpoint type that should be checked. Inferred when the return type of the
......
...@@ -90,11 +90,13 @@ import org.springframework.core.env.Environment; ...@@ -90,11 +90,13 @@ import org.springframework.core.env.Environment;
* @author Stephane Nicoll * @author Stephane Nicoll
* @since 2.0.0 * @since 2.0.0
* @see Endpoint * @see Endpoint
* @deprecated as of 2.2.0 in favor of {@link ConditionalOnAvailableEndpoint}
*/ */
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE }) @Target({ ElementType.METHOD, ElementType.TYPE })
@Documented @Documented
@Conditional(OnEnabledEndpointCondition.class) @Conditional(OnEnabledEndpointCondition.class)
@Deprecated
public @interface ConditionalOnEnabledEndpoint { public @interface ConditionalOnEnabledEndpoint {
/** /**
......
...@@ -35,12 +35,13 @@ import org.springframework.core.type.AnnotatedTypeMetadata; ...@@ -35,12 +35,13 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.ConcurrentReferenceHashMap;
/** /**
* A condition that checks if an endpoint is exposed. * A condition that checks if an endpoint is available (i.e. enabled and exposed).
* *
* @author Brian Clozel * @author Brian Clozel
* @see ConditionalOnExposedEndpoint * @author Stephane Nicoll
* @see ConditionalOnAvailableEndpoint
*/ */
class OnExposedEndpointCondition extends AbstractEndpointCondition { class OnAvailableEndpointCondition extends AbstractEndpointCondition {
private static final String JMX_ENABLED_KEY = "spring.jmx.enabled"; private static final String JMX_ENABLED_KEY = "spring.jmx.enabled";
...@@ -49,28 +50,34 @@ class OnExposedEndpointCondition extends AbstractEndpointCondition { ...@@ -49,28 +50,34 @@ class OnExposedEndpointCondition extends AbstractEndpointCondition {
@Override @Override
public ConditionOutcome getMatchOutcome(ConditionContext context, public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) { AnnotatedTypeMetadata metadata) {
ConditionOutcome enablementOutcome = getEnablementOutcome(context, metadata,
ConditionalOnAvailableEndpoint.class);
if (!enablementOutcome.isMatch()) {
return enablementOutcome;
}
ConditionMessage message = enablementOutcome.getConditionMessage();
Environment environment = context.getEnvironment(); Environment environment = context.getEnvironment();
if (CloudPlatform.CLOUD_FOUNDRY.isActive(environment)) { if (CloudPlatform.CLOUD_FOUNDRY.isActive(environment)) {
return new ConditionOutcome(true, return new ConditionOutcome(true,
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class) message.andCondition(ConditionalOnAvailableEndpoint.class)
.because("application is running on Cloud Foundry")); .because("application is running on Cloud Foundry"));
} }
AnnotationAttributes attributes = getEndpointAttributes( AnnotationAttributes attributes = getEndpointAttributes(
ConditionalOnExposedEndpoint.class, context, metadata); ConditionalOnAvailableEndpoint.class, context, metadata);
EndpointId id = EndpointId.of(attributes.getString("id")); EndpointId id = EndpointId.of(attributes.getString("id"));
Set<ExposureInformation> exposureInformations = getExposureInformation( Set<ExposureInformation> exposureInformations = getExposureInformation(
environment); environment);
for (ExposureInformation exposureInformation : exposureInformations) { for (ExposureInformation exposureInformation : exposureInformations) {
if (exposureInformation.isExposed(id)) { if (exposureInformation.isExposed(id)) {
return new ConditionOutcome(true, return new ConditionOutcome(true,
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class) message.andCondition(ConditionalOnAvailableEndpoint.class)
.because("marked as exposed by a 'management.endpoints." .because("marked as exposed by a 'management.endpoints."
+ exposureInformation.getPrefix() + exposureInformation.getPrefix()
+ ".exposure' property")); + ".exposure' property"));
} }
} }
return new ConditionOutcome(false, return new ConditionOutcome(false,
ConditionMessage.forCondition(ConditionalOnExposedEndpoint.class).because( message.andCondition(ConditionalOnAvailableEndpoint.class).because(
"no 'management.endpoints' property marked it as exposed")); "no 'management.endpoints' property marked it as exposed"));
} }
......
...@@ -16,16 +16,9 @@ ...@@ -16,16 +16,9 @@
package org.springframework.boot.actuate.autoconfigure.endpoint.condition; package org.springframework.boot.actuate.autoconfigure.endpoint.condition;
import java.util.Optional;
import org.springframework.boot.actuate.endpoint.EndpointId;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.ConcurrentReferenceHashMap;
/** /**
* A condition that checks if an endpoint is enabled. * A condition that checks if an endpoint is enabled.
...@@ -34,50 +27,16 @@ import org.springframework.util.ConcurrentReferenceHashMap; ...@@ -34,50 +27,16 @@ import org.springframework.util.ConcurrentReferenceHashMap;
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Phillip Webb * @author Phillip Webb
* @see ConditionalOnEnabledEndpoint * @see ConditionalOnEnabledEndpoint
* @deprecated as of 2.2.0 in favor of {@link OnAvailableEndpointCondition}
*/ */
@Deprecated
class OnEnabledEndpointCondition extends AbstractEndpointCondition { class OnEnabledEndpointCondition extends AbstractEndpointCondition {
private static final String ENABLED_BY_DEFAULT_KEY = "management.endpoints.enabled-by-default";
private static final ConcurrentReferenceHashMap<Environment, Optional<Boolean>> enabledByDefaultCache = new ConcurrentReferenceHashMap<>();
@Override @Override
public ConditionOutcome getMatchOutcome(ConditionContext context, public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) { AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment(); return getEnablementOutcome(context, metadata,
AnnotationAttributes attributes = getEndpointAttributes( ConditionalOnEnabledEndpoint.class);
ConditionalOnEnabledEndpoint.class, context, metadata);
EndpointId id = EndpointId.of(attributes.getString("id"));
String key = "management.endpoint." + id.toLowerCaseString() + ".enabled";
Boolean userDefinedEnabled = environment.getProperty(key, Boolean.class);
if (userDefinedEnabled != null) {
return new ConditionOutcome(userDefinedEnabled,
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class)
.because("found property " + key + " with value "
+ userDefinedEnabled));
}
Boolean userDefinedDefault = isEnabledByDefault(environment);
if (userDefinedDefault != null) {
return new ConditionOutcome(userDefinedDefault,
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class)
.because("no property " + key
+ " found so using user defined default from "
+ ENABLED_BY_DEFAULT_KEY));
}
boolean endpointDefault = attributes.getBoolean("enableByDefault");
return new ConditionOutcome(endpointDefault,
ConditionMessage.forCondition(ConditionalOnEnabledEndpoint.class).because(
"no property " + key + " found so using endpoint default"));
}
private Boolean isEnabledByDefault(Environment environment) {
Optional<Boolean> enabledByDefault = enabledByDefaultCache.get(environment);
if (enabledByDefault == null) {
enabledByDefault = Optional.ofNullable(
environment.getProperty(ENABLED_BY_DEFAULT_KEY, Boolean.class));
enabledByDefaultCache.put(environment, enabledByDefault);
}
return enabledByDefault.orElse(null);
} }
} }
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.env; package org.springframework.boot.actuate.autoconfigure.env;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.env.EnvironmentEndpoint; import org.springframework.boot.actuate.env.EnvironmentEndpoint;
import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension; import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
...@@ -36,8 +35,7 @@ import org.springframework.core.env.Environment; ...@@ -36,8 +35,7 @@ import org.springframework.core.env.Environment;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = EnvironmentEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = EnvironmentEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = EnvironmentEndpoint.class)
@EnableConfigurationProperties(EnvironmentEndpointProperties.class) @EnableConfigurationProperties(EnvironmentEndpointProperties.class)
public class EnvironmentEndpointAutoConfiguration { public class EnvironmentEndpointAutoConfiguration {
......
...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.flyway; ...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.flyway;
import org.flywaydb.core.Flyway; import org.flywaydb.core.Flyway;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.flyway.FlywayEndpoint; import org.springframework.boot.actuate.flyway.FlywayEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
...@@ -39,8 +38,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -39,8 +38,7 @@ import org.springframework.context.annotation.Configuration;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Flyway.class) @ConditionalOnClass(Flyway.class)
@ConditionalOnEnabledEndpoint(endpoint = FlywayEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = FlywayEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = FlywayEndpoint.class)
@AutoConfigureAfter(FlywayAutoConfiguration.class) @AutoConfigureAfter(FlywayAutoConfiguration.class)
public class FlywayEndpointAutoConfiguration { public class FlywayEndpointAutoConfiguration {
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.health; package org.springframework.boot.actuate.autoconfigure.health;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.health.CompositeHealthIndicator; import org.springframework.boot.actuate.health.CompositeHealthIndicator;
import org.springframework.boot.actuate.health.HealthAggregator; import org.springframework.boot.actuate.health.HealthAggregator;
import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.actuate.health.HealthEndpoint;
...@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnSingleCandidate(HealthIndicatorRegistry.class) @ConditionalOnSingleCandidate(HealthIndicatorRegistry.class)
@ConditionalOnEnabledEndpoint(endpoint = HealthEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HealthEndpoint.class)
class HealthEndpointConfiguration { class HealthEndpointConfiguration {
@Bean @Bean
......
...@@ -17,8 +17,7 @@ ...@@ -17,8 +17,7 @@
package org.springframework.boot.actuate.autoconfigure.health; package org.springframework.boot.actuate.autoconfigure.health;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.health.CompositeReactiveHealthIndicator; import org.springframework.boot.actuate.health.CompositeReactiveHealthIndicator;
import org.springframework.boot.actuate.health.HealthAggregator; import org.springframework.boot.actuate.health.HealthAggregator;
import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.actuate.health.HealthEndpoint;
...@@ -44,8 +43,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -44,8 +43,7 @@ import org.springframework.context.annotation.Configuration;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(HealthIndicatorProperties.class) @EnableConfigurationProperties(HealthIndicatorProperties.class)
@ConditionalOnEnabledEndpoint(endpoint = HealthEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HealthEndpoint.class)
class HealthEndpointWebExtensionConfiguration { class HealthEndpointWebExtensionConfiguration {
@Bean @Bean
......
...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.info; ...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.info;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.boot.actuate.info.InfoEndpoint; import org.springframework.boot.actuate.info.InfoEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
...@@ -36,8 +35,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -36,8 +35,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = InfoEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = InfoEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = InfoEndpoint.class)
@AutoConfigureAfter(InfoContributorAutoConfiguration.class) @AutoConfigureAfter(InfoContributorAutoConfiguration.class)
public class InfoEndpointAutoConfiguration { public class InfoEndpointAutoConfiguration {
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.integration; package org.springframework.boot.actuate.autoconfigure.integration;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint; import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
...@@ -41,8 +40,7 @@ import org.springframework.integration.graph.IntegrationGraphServer; ...@@ -41,8 +40,7 @@ import org.springframework.integration.graph.IntegrationGraphServer;
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(IntegrationGraphServer.class) @ConditionalOnClass(IntegrationGraphServer.class)
@ConditionalOnBean(IntegrationConfigurationBeanFactoryPostProcessor.class) @ConditionalOnBean(IntegrationConfigurationBeanFactoryPostProcessor.class)
@ConditionalOnEnabledEndpoint(endpoint = IntegrationGraphEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = IntegrationGraphEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = IntegrationGraphEndpoint.class)
@AutoConfigureAfter(IntegrationAutoConfiguration.class) @AutoConfigureAfter(IntegrationAutoConfiguration.class)
public class IntegrationGraphEndpointAutoConfiguration { public class IntegrationGraphEndpointAutoConfiguration {
......
...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.jolokia; ...@@ -18,8 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.jolokia;
import org.jolokia.http.AgentServlet; import org.jolokia.http.AgentServlet;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
...@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -37,8 +36,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(AgentServlet.class) @ConditionalOnClass(AgentServlet.class)
@ConditionalOnEnabledEndpoint(endpoint = JolokiaEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = JolokiaEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = JolokiaEndpoint.class)
@EnableConfigurationProperties(JolokiaProperties.class) @EnableConfigurationProperties(JolokiaProperties.class)
public class JolokiaEndpointAutoConfiguration { public class JolokiaEndpointAutoConfiguration {
......
...@@ -20,8 +20,7 @@ import liquibase.integration.spring.SpringLiquibase; ...@@ -20,8 +20,7 @@ import liquibase.integration.spring.SpringLiquibase;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.liquibase.LiquibaseEndpoint; import org.springframework.boot.actuate.liquibase.LiquibaseEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
...@@ -42,8 +41,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -42,8 +41,7 @@ import org.springframework.context.annotation.Configuration;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(SpringLiquibase.class) @ConditionalOnClass(SpringLiquibase.class)
@ConditionalOnEnabledEndpoint(endpoint = LiquibaseEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = LiquibaseEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = LiquibaseEndpoint.class)
@AutoConfigureAfter(LiquibaseAutoConfiguration.class) @AutoConfigureAfter(LiquibaseAutoConfiguration.class)
public class LiquibaseEndpointAutoConfiguration { public class LiquibaseEndpointAutoConfiguration {
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.logging; package org.springframework.boot.actuate.autoconfigure.logging;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.logging.LogFileWebEndpoint; import org.springframework.boot.actuate.logging.LogFileWebEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionMessage; import org.springframework.boot.autoconfigure.condition.ConditionMessage;
...@@ -42,8 +41,7 @@ import org.springframework.util.StringUtils; ...@@ -42,8 +41,7 @@ import org.springframework.util.StringUtils;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = LogFileWebEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = LogFileWebEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = LogFileWebEndpoint.class)
@EnableConfigurationProperties(LogFileWebEndpointProperties.class) @EnableConfigurationProperties(LogFileWebEndpointProperties.class)
public class LogFileWebEndpointAutoConfiguration { public class LogFileWebEndpointAutoConfiguration {
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.logging; package org.springframework.boot.actuate.autoconfigure.logging;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.logging.LoggersEndpoint; import org.springframework.boot.actuate.logging.LoggersEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionMessage; import org.springframework.boot.autoconfigure.condition.ConditionMessage;
...@@ -39,8 +38,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata; ...@@ -39,8 +38,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = LoggersEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = LoggersEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = LoggersEndpoint.class)
public class LoggersEndpointAutoConfiguration { public class LoggersEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.management; package org.springframework.boot.actuate.autoconfigure.management;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.management.HeapDumpWebEndpoint; import org.springframework.boot.actuate.management.HeapDumpWebEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
...@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = HeapDumpWebEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = HeapDumpWebEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HeapDumpWebEndpoint.class)
public class HeapDumpWebEndpointAutoConfiguration { public class HeapDumpWebEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.management; package org.springframework.boot.actuate.autoconfigure.management;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.management.ThreadDumpEndpoint; import org.springframework.boot.actuate.management.ThreadDumpEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
...@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -31,8 +30,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ThreadDumpEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = ThreadDumpEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ThreadDumpEndpoint.class)
public class ThreadDumpEndpointAutoConfiguration { public class ThreadDumpEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics; ...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics;
import io.micrometer.core.annotation.Timed; import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.metrics.MetricsEndpoint; import org.springframework.boot.actuate.metrics.MetricsEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
...@@ -38,8 +37,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -38,8 +37,7 @@ import org.springframework.context.annotation.Configuration;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Timed.class) @ConditionalOnClass(Timed.class)
@ConditionalOnEnabledEndpoint(endpoint = MetricsEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = MetricsEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = MetricsEndpoint.class)
@AutoConfigureAfter({ MetricsAutoConfiguration.class, @AutoConfigureAfter({ MetricsAutoConfiguration.class,
CompositeMeterRegistryAutoConfiguration.class }) CompositeMeterRegistryAutoConfiguration.class })
public class MetricsEndpointAutoConfiguration { public class MetricsEndpointAutoConfiguration {
......
...@@ -29,8 +29,7 @@ import io.prometheus.client.exporter.PushGateway; ...@@ -29,8 +29,7 @@ import io.prometheus.client.exporter.PushGateway;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
...@@ -89,8 +88,7 @@ public class PrometheusMetricsExportAutoConfiguration { ...@@ -89,8 +88,7 @@ public class PrometheusMetricsExportAutoConfiguration {
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = PrometheusScrapeEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = PrometheusScrapeEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = PrometheusScrapeEndpoint.class)
public static class PrometheusScrapeEndpointConfiguration { public static class PrometheusScrapeEndpointConfiguration {
@Bean @Bean
......
...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.scheduling; ...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.scheduling;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.scheduling.ScheduledTasksEndpoint; import org.springframework.boot.actuate.scheduling.ScheduledTasksEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
...@@ -35,8 +34,7 @@ import org.springframework.scheduling.config.ScheduledTaskHolder; ...@@ -35,8 +34,7 @@ import org.springframework.scheduling.config.ScheduledTaskHolder;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = ScheduledTasksEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = ScheduledTasksEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = ScheduledTasksEndpoint.class)
public class ScheduledTasksEndpointAutoConfiguration { public class ScheduledTasksEndpointAutoConfiguration {
@Bean @Bean
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.session; package org.springframework.boot.actuate.autoconfigure.session;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.session.SessionsEndpoint; import org.springframework.boot.actuate.session.SessionsEndpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
...@@ -38,8 +37,7 @@ import org.springframework.session.Session; ...@@ -38,8 +37,7 @@ import org.springframework.session.Session;
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(FindByIndexNameSessionRepository.class) @ConditionalOnClass(FindByIndexNameSessionRepository.class)
@ConditionalOnEnabledEndpoint(endpoint = SessionsEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = SessionsEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = SessionsEndpoint.class)
@AutoConfigureAfter(SessionAutoConfiguration.class) @AutoConfigureAfter(SessionAutoConfiguration.class)
public class SessionsEndpointAutoConfiguration { public class SessionsEndpointAutoConfiguration {
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.trace.http; package org.springframework.boot.actuate.autoconfigure.trace.http;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.trace.http.HttpTraceEndpoint; import org.springframework.boot.actuate.trace.http.HttpTraceEndpoint;
import org.springframework.boot.actuate.trace.http.HttpTraceRepository; import org.springframework.boot.actuate.trace.http.HttpTraceRepository;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
...@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -34,8 +33,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnEnabledEndpoint(endpoint = HttpTraceEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = HttpTraceEndpoint.class)
@ConditionalOnExposedEndpoint(endpoint = HttpTraceEndpoint.class)
@AutoConfigureAfter(HttpTraceAutoConfiguration.class) @AutoConfigureAfter(HttpTraceAutoConfiguration.class)
public class HttpTraceEndpointAutoConfiguration { public class HttpTraceEndpointAutoConfiguration {
......
...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.web.mappings; ...@@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.web.mappings;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnExposedEndpoint;
import org.springframework.boot.actuate.web.mappings.MappingDescriptionProvider; import org.springframework.boot.actuate.web.mappings.MappingDescriptionProvider;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint; import org.springframework.boot.actuate.web.mappings.MappingsEndpoint;
import org.springframework.boot.actuate.web.mappings.reactive.DispatcherHandlersMappingDescriptionProvider; import org.springframework.boot.actuate.web.mappings.reactive.DispatcherHandlersMappingDescriptionProvider;
...@@ -48,8 +47,7 @@ import org.springframework.web.servlet.DispatcherServlet; ...@@ -48,8 +47,7 @@ import org.springframework.web.servlet.DispatcherServlet;
public class MappingsEndpointAutoConfiguration { public class MappingsEndpointAutoConfiguration {
@Bean @Bean
@ConditionalOnEnabledEndpoint @ConditionalOnAvailableEndpoint
@ConditionalOnExposedEndpoint
public MappingsEndpoint mappingsEndpoint(ApplicationContext applicationContext, public MappingsEndpoint mappingsEndpoint(ApplicationContext applicationContext,
ObjectProvider<MappingDescriptionProvider> descriptionProviders) { ObjectProvider<MappingDescriptionProvider> descriptionProviders) {
return new MappingsEndpoint( return new MappingsEndpoint(
......
...@@ -29,11 +29,11 @@ import org.springframework.context.annotation.Configuration; ...@@ -29,11 +29,11 @@ import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
* Tests for {@link ConditionalOnExposedEndpoint @ConditionalOnExposedEndpoint}. * Tests for {@link ConditionalOnAvailableEndpoint @ConditionalOnAvailableEndpoint}.
* *
* @author Brian Clozel * @author Brian Clozel
*/ */
public class ConditionalOnExposedEndpointTests { public class ConditionalOnAvailableEndpointTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(AllEndpointsConfiguration.class); .withUserConfiguration(AllEndpointsConfiguration.class);
...@@ -41,15 +41,45 @@ public class ConditionalOnExposedEndpointTests { ...@@ -41,15 +41,45 @@ public class ConditionalOnExposedEndpointTests {
@Test @Test
public void outcomeShouldMatchDefaults() { public void outcomeShouldMatchDefaults() {
this.contextRunner.run((context) -> assertThat(context).hasBean("info") this.contextRunner.run((context) -> assertThat(context).hasBean("info")
.hasBean("health").doesNotHaveBean("spring").doesNotHaveBean("test")); .hasBean("health").doesNotHaveBean("spring").doesNotHaveBean("test")
.doesNotHaveBean("shutdown"));
} }
@Test @Test
public void outcomeWhenIncludeAllWebShouldMatch() { public void outcomeWithEnabledByDefaultSetToFalseShouldNotMatchAnything() {
this.contextRunner
.withPropertyValues("management.endpoints.enabled-by-default=false")
.run((context) -> assertThat(context).doesNotHaveBean("info")
.doesNotHaveBean("health").doesNotHaveBean("spring")
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllWebShouldMatchEnabledEndpoints() {
this.contextRunner this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=*") .withPropertyValues("management.endpoints.web.exposure.include=*")
.run((context) -> assertThat(context).hasBean("info").hasBean("health") .run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring")); .hasBean("test").hasBean("spring").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllWebAndDisablingEndpointShouldMatchEnabledEndpoints() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=*",
"management.endpoint.test.enabled=false",
"management.endpoint.health.enabled=false")
.run((context) -> assertThat(context).hasBean("info")
.doesNotHaveBean("health").doesNotHaveBean("test")
.hasBean("spring").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllWebAndEnablingEndpointDisabledByDefaultShouldMatchAll() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=*",
"management.endpoint.shutdown.enabled=true")
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring").hasBean("shutdown"));
} }
@Test @Test
...@@ -57,16 +87,27 @@ public class ConditionalOnExposedEndpointTests { ...@@ -57,16 +87,27 @@ public class ConditionalOnExposedEndpointTests {
this.contextRunner this.contextRunner
.withPropertyValues("management.endpoints.jmx.exposure.include=*") .withPropertyValues("management.endpoints.jmx.exposure.include=*")
.run((context) -> assertThat(context).hasBean("info").hasBean("health") .run((context) -> assertThat(context).hasBean("info").hasBean("health")
.doesNotHaveBean("spring").doesNotHaveBean("test")); .doesNotHaveBean("spring").doesNotHaveBean("test")
.doesNotHaveBean("shutdown"));
} }
@Test @Test
public void outcomeWhenIncludeAllJmxAndJmxEnabledShouldMatch() { public void outcomeWhenIncludeAllJmxAndJmxEnabledShouldMatchEnabledEndpoints() {
this.contextRunner this.contextRunner
.withPropertyValues("management.endpoints.jmx.exposure.include=*", .withPropertyValues("management.endpoints.jmx.exposure.include=*",
"spring.jmx.enabled=true") "spring.jmx.enabled=true")
.run((context) -> assertThat(context).hasBean("info").hasBean("health") .run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring")); .hasBean("test").hasBean("spring").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeAllJmxAndJmxEnabledAndEnablingEndpointDisabledByDefaultShouldMatchAll() {
this.contextRunner
.withPropertyValues("management.endpoints.jmx.exposure.include=*",
"spring.jmx.enabled=true",
"management.endpoint.shutdown.enabled=true")
.run((context) -> assertThat(context).hasBean("info").hasBean("health")
.hasBean("test").hasBean("spring").hasBean("shutdown"));
} }
@Test @Test
...@@ -75,7 +116,8 @@ public class ConditionalOnExposedEndpointTests { ...@@ -75,7 +116,8 @@ public class ConditionalOnExposedEndpointTests {
.withPropertyValues("management.endpoints.web.exposure.include=*", .withPropertyValues("management.endpoints.web.exposure.include=*",
"management.endpoints.web.exposure.exclude=spring,info") "management.endpoints.web.exposure.exclude=spring,info")
.run((context) -> assertThat(context).hasBean("health").hasBean("test") .run((context) -> assertThat(context).hasBean("health").hasBean("test")
.doesNotHaveBean("info").doesNotHaveBean("spring")); .doesNotHaveBean("info").doesNotHaveBean("spring")
.doesNotHaveBean("shutdown"));
} }
@Test @Test
...@@ -84,16 +126,36 @@ public class ConditionalOnExposedEndpointTests { ...@@ -84,16 +126,36 @@ public class ConditionalOnExposedEndpointTests {
"management.endpoints.web.exposure.include=info,health,spring,test", "management.endpoints.web.exposure.include=info,health,spring,test",
"management.endpoints.web.exposure.exclude=spring,info") "management.endpoints.web.exposure.exclude=spring,info")
.run((context) -> assertThat(context).hasBean("health").hasBean("test") .run((context) -> assertThat(context).hasBean("health").hasBean("test")
.doesNotHaveBean("info").doesNotHaveBean("spring")); .doesNotHaveBean("info").doesNotHaveBean("spring")
.doesNotHaveBean("shutdown"));
} }
@Test @Test
public void outcomeWhenIncludeMatchesShouldMatch() { public void outcomeWhenIncludeMatchesShouldMatchEnabledEndpoints() {
this.contextRunner this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=spring") .withPropertyValues("management.endpoints.web.exposure.include=spring")
.run((context) -> assertThat(context).hasBean("spring") .run((context) -> assertThat(context).hasBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info") .doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test")); .doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeMatchOnDisabledEndpointShouldNotMatch() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=shutdown")
.run((context) -> assertThat(context).doesNotHaveBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test").doesNotHaveBean("shutdown"));
}
@Test
public void outcomeWhenIncludeMatchOnEnabledEndpointShouldNotMatch() {
this.contextRunner
.withPropertyValues("management.endpoints.web.exposure.include=shutdown",
"management.endpoint.shutdown.enabled=true")
.run((context) -> assertThat(context).doesNotHaveBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test").hasBean("shutdown"));
} }
@Test @Test
...@@ -102,7 +164,7 @@ public class ConditionalOnExposedEndpointTests { ...@@ -102,7 +164,7 @@ public class ConditionalOnExposedEndpointTests {
.withPropertyValues("management.endpoints.web.exposure.include=sPRing") .withPropertyValues("management.endpoints.web.exposure.include=sPRing")
.run((context) -> assertThat(context).hasBean("spring") .run((context) -> assertThat(context).hasBean("spring")
.doesNotHaveBean("health").doesNotHaveBean("info") .doesNotHaveBean("health").doesNotHaveBean("info")
.doesNotHaveBean("test")); .doesNotHaveBean("test").doesNotHaveBean("shutdown"));
} }
@Test @Test
...@@ -112,11 +174,11 @@ public class ConditionalOnExposedEndpointTests { ...@@ -112,11 +174,11 @@ public class ConditionalOnExposedEndpointTests {
"management.endpoints.web.exposure.exclude=*") "management.endpoints.web.exposure.exclude=*")
.run((context) -> assertThat(context).doesNotHaveBean("health") .run((context) -> assertThat(context).doesNotHaveBean("health")
.doesNotHaveBean("info").doesNotHaveBean("spring") .doesNotHaveBean("info").doesNotHaveBean("spring")
.doesNotHaveBean("test")); .doesNotHaveBean("test").doesNotHaveBean("shutdown"));
} }
@Test @Test
public void outcomeWhenIncludeMatchesShoulMatchWithExtensionsAndComponents() { public void outcomeWhenIncludeMatchesShouldMatchWithExtensionsAndComponents() {
this.contextRunner this.contextRunner
.withUserConfiguration( .withUserConfiguration(
ComponentEnabledIfEndpointIsExposedConfiguration.class) ComponentEnabledIfEndpointIsExposedConfiguration.class)
...@@ -124,7 +186,7 @@ public class ConditionalOnExposedEndpointTests { ...@@ -124,7 +186,7 @@ public class ConditionalOnExposedEndpointTests {
.run((context) -> assertThat(context).hasBean("spring") .run((context) -> assertThat(context).hasBean("spring")
.hasBean("springComponent").hasBean("springExtension") .hasBean("springComponent").hasBean("springExtension")
.doesNotHaveBean("info").doesNotHaveBean("health") .doesNotHaveBean("info").doesNotHaveBean("health")
.doesNotHaveBean("test")); .doesNotHaveBean("test").doesNotHaveBean("shutdown"));
} }
@Test @Test
...@@ -169,6 +231,11 @@ public class ConditionalOnExposedEndpointTests { ...@@ -169,6 +231,11 @@ public class ConditionalOnExposedEndpointTests {
} }
@Endpoint(id = "shutdown", enableByDefault = false)
static class ShutdownEndpoint {
}
@EndpointExtension(endpoint = SpringEndpoint.class, filter = TestFilter.class) @EndpointExtension(endpoint = SpringEndpoint.class, filter = TestFilter.class)
static class SpringEndpointExtension { static class SpringEndpointExtension {
...@@ -187,42 +254,48 @@ public class ConditionalOnExposedEndpointTests { ...@@ -187,42 +254,48 @@ public class ConditionalOnExposedEndpointTests {
static class AllEndpointsConfiguration { static class AllEndpointsConfiguration {
@Bean @Bean
@ConditionalOnExposedEndpoint @ConditionalOnAvailableEndpoint
public HealthEndpoint health() { public HealthEndpoint health() {
return new HealthEndpoint(); return new HealthEndpoint();
} }
@Bean @Bean
@ConditionalOnExposedEndpoint @ConditionalOnAvailableEndpoint
public InfoEndpoint info() { public InfoEndpoint info() {
return new InfoEndpoint(); return new InfoEndpoint();
} }
@Bean @Bean
@ConditionalOnExposedEndpoint @ConditionalOnAvailableEndpoint
public SpringEndpoint spring() { public SpringEndpoint spring() {
return new SpringEndpoint(); return new SpringEndpoint();
} }
@Bean @Bean
@ConditionalOnExposedEndpoint @ConditionalOnAvailableEndpoint
public TestEndpoint test() { public TestEndpoint test() {
return new TestEndpoint(); return new TestEndpoint();
} }
@Bean
@ConditionalOnAvailableEndpoint
public ShutdownEndpoint shutdown() {
return new ShutdownEndpoint();
}
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
static class ComponentEnabledIfEndpointIsExposedConfiguration { static class ComponentEnabledIfEndpointIsExposedConfiguration {
@Bean @Bean
@ConditionalOnExposedEndpoint(endpoint = SpringEndpoint.class) @ConditionalOnAvailableEndpoint(endpoint = SpringEndpoint.class)
public String springComponent() { public String springComponent() {
return "springComponent"; return "springComponent";
} }
@Bean @Bean
@ConditionalOnExposedEndpoint @ConditionalOnAvailableEndpoint
public SpringEndpointExtension springExtension() { public SpringEndpointExtension springExtension() {
return new SpringEndpointExtension(); return new SpringEndpointExtension();
} }
...@@ -233,7 +306,7 @@ public class ConditionalOnExposedEndpointTests { ...@@ -233,7 +306,7 @@ public class ConditionalOnExposedEndpointTests {
static class ComponentWithNoEndpointReferenceConfiguration { static class ComponentWithNoEndpointReferenceConfiguration {
@Bean @Bean
@ConditionalOnExposedEndpoint @ConditionalOnAvailableEndpoint
public String springcomp() { public String springcomp() {
return "springcomp"; return "springcomp";
} }
......
...@@ -34,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -34,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Andy Wilkinson * @author Andy Wilkinson
*/ */
@Deprecated
public class ConditionalOnEnabledEndpointTests { public class ConditionalOnEnabledEndpointTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner(); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment