From fbd2c2e66f6c9ac507a7b40c3e8b6263134888ca Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Sun, 23 Apr 2023 23:24:02 +0200 Subject: [PATCH] GH-182 - Use dedicated SliceAssignment to verify modularity. The previous modularity verification arrangement assumed the default module detection strategy to be used. To properly support alternative implementations during the verification we now use a dedicated SliceAssignment implementation that assigns types to slices identified by the module they are located in. --- .../modulith/core/ApplicationModules.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java index d13a9422..f4aeffd7 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java @@ -48,6 +48,8 @@ import com.tngtech.archunit.core.importer.ClassFileImporter; import com.tngtech.archunit.core.importer.ImportOption; import com.tngtech.archunit.lang.EvaluationResult; import com.tngtech.archunit.lang.FailureReport; +import com.tngtech.archunit.library.dependencies.SliceAssignment; +import com.tngtech.archunit.library.dependencies.SliceIdentifier; import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition; /** @@ -455,7 +457,7 @@ public class ApplicationModules implements Iterable { private FailureReport assertNoCyclesFor(JavaPackage rootPackage) { var result = SlicesRuleDefinition.slices() // - .matching(rootPackage.getName().concat(".(*)..")) // + .assignedFrom(new ApplicationModulesSliceAssignment()) .should().beFreeOfCycles() // .evaluate(allClasses.that(resideInAPackage(rootPackage.getName().concat("..")))); @@ -728,4 +730,29 @@ public class ApplicationModules implements Iterable { } } } + + private class ApplicationModulesSliceAssignment implements SliceAssignment { + + /* + * (non-Javadoc) + * @see com.tngtech.archunit.library.dependencies.SliceAssignment#getIdentifierOf(com.tngtech.archunit.core.domain.JavaClass) + */ + @Override + public SliceIdentifier getIdentifierOf(JavaClass javaClass) { + + return getModuleByType(javaClass) + .map(ApplicationModule::getName) + .map(SliceIdentifier::of) + .orElse(SliceIdentifier.ignore()); + } + + /* + * (non-Javadoc) + * @see com.tngtech.archunit.base.HasDescription#getDescription() + */ + @Override + public String getDescription() { + return "Appliction module slices " + ApplicationModules.this.modules.keySet(); + } + } }