package de.otto.edison.loggers; import org.slf4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.MutablePropertySources; import static java.util.Collections.singletonMap; import static org.slf4j.LoggerFactory.getLogger; /** * A BeanFactoryPostProcessor that is removing Spring Boot Actuator endpoints from the application context, so the * endpoint can be replaced by some controller or other endpoint. * * @since 1.1.0 */ class DisableEndpointPostProcessor implements BeanFactoryPostProcessor, ApplicationContextAware { private static final Logger LOG = getLogger(DisableEndpointPostProcessor.class); private final String endpoint; private ConfigurableApplicationContext applicationContext; DisableEndpointPostProcessor(final String endpoint) { this.endpoint = endpoint; } @Override public void postProcessBeanFactory(final ConfigurableListableBeanFactory beanFactory) throws BeansException { LOG.info("Disabling '{}' Endpoint", endpoint); disableEndpoint(beanFactory); removeBeanDefinition(); } private void disableEndpoint(final ConfigurableListableBeanFactory beanFactory) { final ConfigurableEnvironment env = beanFactory.getBean(ConfigurableEnvironment.class); final MutablePropertySources propertySources = env.getPropertySources(); propertySources.addFirst( new MapPropertySource(endpoint + "PropertySource", singletonMap("endpoints." + endpoint + ".enabled", false)) ); } private void removeBeanDefinition() { final BeanDefinitionRegistry registry = (BeanDefinitionRegistry) applicationContext.getAutowireCapableBeanFactory(); final String beanName = endpoint + "MvcEndpoint"; if (registry.containsBeanDefinition(beanName)) { registry.removeBeanDefinition(beanName); } } @Override @SuppressWarnings("unchecked") public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { this.applicationContext = (ConfigurableApplicationContext) applicationContext; } }