|
|
|
|
@ -16,7 +16,6 @@
@@ -16,7 +16,6 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.boot.build.architecture; |
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Method; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
@ -26,8 +25,6 @@ import com.tngtech.archunit.core.domain.JavaClass;
@@ -26,8 +25,6 @@ import com.tngtech.archunit.core.domain.JavaClass;
|
|
|
|
|
import com.tngtech.archunit.core.domain.JavaClasses; |
|
|
|
|
import com.tngtech.archunit.lang.EvaluationResult; |
|
|
|
|
|
|
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Finds all configurations from auto-configurations (either nested configurations or |
|
|
|
|
* imported ones) and checks that these classes don't contain public members. |
|
|
|
|
@ -43,7 +40,7 @@ class AutoConfigurationChecker {
@@ -43,7 +40,7 @@ class AutoConfigurationChecker {
|
|
|
|
|
.and(ArchitectureRules.areNotKotlinClasses()); |
|
|
|
|
|
|
|
|
|
EvaluationResult check(JavaClasses javaClasses) { |
|
|
|
|
AutoConfigurations autoConfigurations = new AutoConfigurations(); |
|
|
|
|
AutoConfigurations autoConfigurations = new AutoConfigurations(javaClasses); |
|
|
|
|
for (JavaClass javaClass : javaClasses) { |
|
|
|
|
if (isAutoConfigurationOrEnclosedInAutoConfiguration(javaClass)) { |
|
|
|
|
autoConfigurations.add(javaClass); |
|
|
|
|
@ -74,23 +71,28 @@ class AutoConfigurationChecker {
@@ -74,23 +71,28 @@ class AutoConfigurationChecker {
|
|
|
|
|
|
|
|
|
|
private static final String CONFIGURATION = "org.springframework.context.annotation.Configuration"; |
|
|
|
|
|
|
|
|
|
private final Map<String, JavaClass> classes = new HashMap<>(); |
|
|
|
|
private final JavaClasses classes; |
|
|
|
|
|
|
|
|
|
private final Map<String, JavaClass> autoConfigurationClasses = new HashMap<>(); |
|
|
|
|
|
|
|
|
|
AutoConfigurations(JavaClasses classes) { |
|
|
|
|
this.classes = classes; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void add(JavaClass autoConfiguration) { |
|
|
|
|
if (!autoConfiguration.isMetaAnnotatedWith(CONFIGURATION)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (this.classes.putIfAbsent(autoConfiguration.getName(), autoConfiguration) != null) { |
|
|
|
|
if (this.autoConfigurationClasses.putIfAbsent(autoConfiguration.getName(), autoConfiguration) != null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
processImports(autoConfiguration, this.classes); |
|
|
|
|
processImports(autoConfiguration, this.autoConfigurationClasses); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
JavaClasses getConfigurations() { |
|
|
|
|
// TODO: Find a way without reflection
|
|
|
|
|
Method method = ReflectionUtils.findMethod(JavaClasses.class, "of", Iterable.class); |
|
|
|
|
ReflectionUtils.makeAccessible(method); |
|
|
|
|
return (JavaClasses) ReflectionUtils.invokeMethod(method, null, this.classes.values()); |
|
|
|
|
DescribedPredicate<JavaClass> isAutoConfiguration = DescribedPredicate.describe("is an auto-configuration", |
|
|
|
|
(c) -> this.autoConfigurationClasses.containsKey(c.getName())); |
|
|
|
|
return this.classes.that(isAutoConfiguration); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void processImports(JavaClass javaClass, Map<String, JavaClass> result) { |
|
|
|
|
|