diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AutoConfigurationReportEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AutoConfigurationReportEndpoint.java index 579c18688d..967373fc2b 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AutoConfigurationReportEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AutoConfigurationReportEndpoint.java @@ -39,6 +39,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; * * @author Greg Turnquist * @author Phillip Webb + * @author Dave Syer */ @ConfigurationProperties(name = "endpoints.autoconfig", ignoreUnknownFields = false) public class AutoConfigurationReportEndpoint extends AbstractEndpoint { @@ -65,6 +66,8 @@ public class AutoConfigurationReportEndpoint extends AbstractEndpoint { private MultiValueMap negativeMatches; + private Report parent; + public Report(AutoConfigurationReport report) { this.positiveMatches = new LinkedMultiValueMap(); this.negativeMatches = new LinkedMultiValueMap(); @@ -74,7 +77,9 @@ public class AutoConfigurationReportEndpoint extends AbstractEndpoint { : this.negativeMatches, entry.getKey(), entry.getValue()); } - + if (report.getParent() != null) { + this.parent = new Report(report.getParent()); + } } private void dunno(MultiValueMap map, String source, @@ -93,6 +98,10 @@ public class AutoConfigurationReportEndpoint extends AbstractEndpoint { return this.negativeMatches; } + public Report getParent() { + return this.parent; + } + } /** diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationReport.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationReport.java index 6a97af6069..b1ab2e6032 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationReport.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationReport.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.condition.ConditionOutcome; @@ -42,6 +43,8 @@ public class AutoConfigurationReport { private final SortedMap outcomes = new TreeMap(); + private AutoConfigurationReport parent; + /** * Private constructor. * @see #get(ConfigurableListableBeanFactory) @@ -70,6 +73,15 @@ public class AutoConfigurationReport { return Collections.unmodifiableMap(this.outcomes); } + /** + * The parent report (from a parent BeanFactory if there is one). + * + * @return the parent report (or null if there isn't one) + */ + public AutoConfigurationReport getParent() { + return this.parent; + } + /** * Obtain a {@link AutoConfigurationReport} for the specified bean factory. * @param beanFactory the bean factory @@ -77,14 +89,24 @@ public class AutoConfigurationReport { */ public static AutoConfigurationReport get(ConfigurableListableBeanFactory beanFactory) { synchronized (beanFactory) { + AutoConfigurationReport report; try { - return beanFactory.getBean(BEAN_NAME, AutoConfigurationReport.class); + report = beanFactory.getBean(BEAN_NAME, AutoConfigurationReport.class); } catch (NoSuchBeanDefinitionException ex) { - AutoConfigurationReport report = new AutoConfigurationReport(); + report = new AutoConfigurationReport(); beanFactory.registerSingleton(BEAN_NAME, report); - return report; } + locateParent(beanFactory.getParentBeanFactory(), report); + return report; + } + } + + private static void locateParent(BeanFactory beanFactory, + AutoConfigurationReport report) { + if (beanFactory != null && report.parent == null + && beanFactory.containsBean(BEAN_NAME)) { + report.parent = beanFactory.getBean(BEAN_NAME, AutoConfigurationReport.class); } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationReportTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationReportTests.java index e224ad7712..e657358cfb 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationReportTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/AutoConfigurationReportTests.java @@ -24,6 +24,7 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfigurationReport.ConditionAndOutcome; import org.springframework.boot.autoconfigure.AutoConfigurationReport.ConditionAndOutcomes; @@ -84,6 +85,17 @@ public class AutoConfigurationReportTests { sameInstance(AutoConfigurationReport.get(this.beanFactory))); } + @Test + public void parent() throws Exception { + this.beanFactory.setParentBeanFactory(new DefaultListableBeanFactory()); + AutoConfigurationReport.get((ConfigurableListableBeanFactory) this.beanFactory + .getParentBeanFactory()); + assertThat(this.report, + sameInstance(AutoConfigurationReport.get(this.beanFactory))); + assertThat(this.report, not(nullValue())); + assertThat(this.report.getParent(), not(nullValue())); + } + @Test public void recordConditionEvaluations() throws Exception { this.report.recordConditionEvaluation("a", this.condition1, this.outcome1);