From 22993f43d94de541391069e9e0993c08bb9c1665 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 18 Nov 2022 00:13:05 +0100 Subject: [PATCH] GH-74 - Bean references in Application Module Canvas now get de-duplicated. --- .../model/ApplicationModuleDependencies.java | 19 +++++++++++++++++++ .../modulith/docs/Asciidoctor.java | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/model/ApplicationModuleDependencies.java b/spring-modulith-core/src/main/java/org/springframework/modulith/model/ApplicationModuleDependencies.java index 61c19be5..8090fe59 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/model/ApplicationModuleDependencies.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/model/ApplicationModuleDependencies.java @@ -17,7 +17,9 @@ package org.springframework.modulith.model; import lombok.RequiredArgsConstructor; +import java.util.HashSet; import java.util.List; +import java.util.function.Function; import java.util.stream.Stream; import org.springframework.util.Assert; @@ -73,6 +75,23 @@ public class ApplicationModuleDependencies { return dependencies.stream(); } + /** + * Return all {@link ApplicationModuleDependency} instances unique by the value extracted using the given + * {@link Function}. + * + * @param extractor will never be {@literal null}. + * @return will never be {@literal null}. + */ + public Stream uniqueStream(Function extractor) { + + Assert.notNull(extractor, "Extractor function must not be null!"); + + var seenTargets = new HashSet<>(); + + return dependencies.stream() + .filter(it -> seenTargets.add(extractor.apply(it))); + } + public ApplicationModuleDependencies withType(DependencyType type) { var filtered = dependencies.stream() diff --git a/spring-modulith-docs/src/main/java/org/springframework/modulith/docs/Asciidoctor.java b/spring-modulith-docs/src/main/java/org/springframework/modulith/docs/Asciidoctor.java index 95ee0fda..b22221b8 100644 --- a/spring-modulith-docs/src/main/java/org/springframework/modulith/docs/Asciidoctor.java +++ b/spring-modulith-docs/src/main/java/org/springframework/modulith/docs/Asciidoctor.java @@ -29,6 +29,7 @@ import org.springframework.modulith.docs.ConfigurationProperties.ModuleProperty; import org.springframework.modulith.docs.Documenter.CanvasOptions; import org.springframework.modulith.docs.Documenter.CanvasOptions.Groupings; import org.springframework.modulith.model.ApplicationModule; +import org.springframework.modulith.model.ApplicationModuleDependency; import org.springframework.modulith.model.ApplicationModules; import org.springframework.modulith.model.ArchitecturallyEvidentType; import org.springframework.modulith.model.DependencyType; @@ -363,7 +364,8 @@ class Asciidoctor { */ public String renderBeanReferences(ApplicationModule module) { - var bullets = module.getDependencies(modules, DependencyType.USES_COMPONENT).stream() + var bullets = module.getDependencies(modules, DependencyType.USES_COMPONENT) + .uniqueStream(ApplicationModuleDependency::getTargetType) .map(it -> "%s (in %s)".formatted(toInlineCode(it.getTargetType()), it.getTargetModule().getDisplayName())) .map(this::toBulletPoint) .collect(Collectors.joining("\n"));