Commit 112ec53b authored by Andy Wilkinson's avatar Andy Wilkinson

Merge pull request #7407 from Madhura Bhave

* gh-7407:
  Polish "Validate excluded autoconfiguration classes"
  Validate excluded autoconfiguration classes
parents c7a566fd 65d0c07f
......@@ -57,6 +57,7 @@ import org.springframework.util.ClassUtils;
* @author Phillip Webb
* @author Andy Wilkinson
* @author Stephane Nicoll
* @author Madhura Bhave
* @since 1.3.0
* @see EnableAutoConfiguration
*/
......@@ -85,6 +86,7 @@ public class EnableAutoConfigurationImportSelector
attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(metadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = sort(configurations);
recordWithConditionEvaluationReport(configurations, exclusions);
......@@ -157,6 +159,24 @@ public class EnableAutoConfigurationImportSelector
return EnableAutoConfiguration.class;
}
private void checkExcludedClasses(List<String> configurations,
Set<String> exclusions) {
StringBuilder message = new StringBuilder();
for (String exclusion : exclusions) {
if (ClassUtils.isPresent(exclusion, getClass().getClassLoader())
&& !configurations.contains(exclusion)) {
message.append("\t- ").append(exclusion).append(String.format("%n"));
}
}
if (!message.toString().isEmpty()) {
throw new IllegalStateException(String.format(
"The following classes could not be excluded because they are"
+ " not auto-configuration classes:%n%s",
message.toString()));
}
}
/**
* Return any exclusions that limit the candidate configurations.
* @param metadata the source metadata
......
......@@ -19,7 +19,9 @@ package org.springframework.boot.autoconfigure;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
......@@ -29,6 +31,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionEvaluationRepor
import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration;
import org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration;
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.SpringFactoriesLoader;
......@@ -44,7 +47,7 @@ import static org.mockito.BDDMockito.given;
*
* @author Andy Wilkinson
* @author Stephane Nicoll
*
* @author Madhura Bhave
*/
public class EnableAutoConfigurationImportSelectorTests {
......@@ -60,6 +63,9 @@ public class EnableAutoConfigurationImportSelectorTests {
@Mock
private AnnotationAttributes annotationAttributes;
@Rule
public ExpectedException expected = ExpectedException.none();
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
......@@ -166,6 +172,48 @@ public class EnableAutoConfigurationImportSelectorTests {
assertThat(imports).isEmpty();
}
@Test
public void nonAutoConfigurationClassExclusionsShouldThrowException()
throws Exception {
configureExclusions(new String[] { TestConfiguration.class.getName() },
new String[0], new String[0]);
this.expected.expect(IllegalStateException.class);
this.importSelector.selectImports(this.annotationMetadata);
}
@Test
public void nonAutoConfigurationClassNameExclusionsWhenPresentOnClassPathShouldThrowException()
throws Exception {
configureExclusions(new String[0],
new String[] {
"org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelectorTests.TestConfiguration" },
new String[0]);
this.expected.expect(IllegalStateException.class);
this.importSelector.selectImports(this.annotationMetadata);
}
@Test
public void nonAutoConfigurationPropertyExclusionsWhenPresentOnClassPathShouldThrowException()
throws Exception {
configureExclusions(new String[0], new String[0], new String[] {
"org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelectorTests.TestConfiguration" });
this.expected.expect(IllegalStateException.class);
this.importSelector.selectImports(this.annotationMetadata);
}
@Test
public void nameAndPropertyExclusionsWhenNotPresentOnClasspathShouldNotThrowException()
throws Exception {
configureExclusions(new String[0],
new String[] { "org.springframework.boot.autoconfigure.DoesNotExist1" },
new String[] { "org.springframework.boot.autoconfigure.DoesNotExist2" });
this.importSelector.selectImports(this.annotationMetadata);
assertThat(ConditionEvaluationReport.get(this.beanFactory).getExclusions())
.contains("org.springframework.boot.autoconfigure.DoesNotExist1");
assertThat(ConditionEvaluationReport.get(this.beanFactory).getExclusions())
.contains("org.springframework.boot.autoconfigure.DoesNotExist2");
}
private void configureExclusions(String[] classExclusion, String[] nameExclusion,
String[] propertyExclusion) {
String annotationName = EnableAutoConfiguration.class.getName();
......@@ -187,4 +235,9 @@ public class EnableAutoConfigurationImportSelectorTests {
getClass().getClassLoader());
}
@Configuration
private class TestConfiguration {
}
}
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