From 33b9321071366afb037da609d2043f865a5f3198 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 14 Feb 2019 15:11:18 +0000 Subject: [PATCH] Track condition evaluation per-context when determining delta Closes gh-15766 --- ...nditionEvaluationDeltaLoggingListener.java | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/ConditionEvaluationDeltaLoggingListener.java b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/ConditionEvaluationDeltaLoggingListener.java index 7f22469186a..fcc2a849eb5 100644 --- a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/ConditionEvaluationDeltaLoggingListener.java +++ b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/ConditionEvaluationDeltaLoggingListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2019 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. @@ -16,12 +16,16 @@ package org.springframework.boot.devtools.autoconfigure; +import java.util.concurrent.ConcurrentHashMap; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportMessage; import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; /** @@ -31,32 +35,47 @@ import org.springframework.context.ApplicationListener; * @author Andy Wilkinson */ class ConditionEvaluationDeltaLoggingListener - implements ApplicationListener { + implements ApplicationListener, ApplicationContextAware { - private final Log logger = LogFactory.getLog(getClass()); + private static final ConcurrentHashMap previousReports = new ConcurrentHashMap<>(); - private static ConditionEvaluationReport previousReport; + private static final Log logger = LogFactory + .getLog(ConditionEvaluationDeltaLoggingListener.class); + + private volatile ApplicationContext context; @Override public void onApplicationEvent(ApplicationReadyEvent event) { + if (!event.getApplicationContext().equals(this.context)) { + return; + } ConditionEvaluationReport report = event.getApplicationContext() .getBean(ConditionEvaluationReport.class); + ConditionEvaluationReport previousReport = previousReports + .get(event.getApplicationContext().getId()); if (previousReport != null) { ConditionEvaluationReport delta = report.getDelta(previousReport); if (!delta.getConditionAndOutcomesBySource().isEmpty() || !delta.getExclusions().isEmpty() || !delta.getUnconditionalClasses().isEmpty()) { - if (this.logger.isInfoEnabled()) { - this.logger.info("Condition evaluation delta:" - + new ConditionEvaluationReportMessage(delta, - "CONDITION EVALUATION DELTA")); + if (ConditionEvaluationDeltaLoggingListener.logger.isInfoEnabled()) { + ConditionEvaluationDeltaLoggingListener.logger + .info("Condition evaluation delta:" + + new ConditionEvaluationReportMessage(delta, + "CONDITION EVALUATION DELTA")); } } else { - this.logger.info("Condition evaluation unchanged"); + ConditionEvaluationDeltaLoggingListener.logger + .info("Condition evaluation unchanged"); } } - previousReport = report; + previousReports.put(event.getApplicationContext().getId(), report); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + this.context = applicationContext; } }