From a03550acec7eedc42751f44156a197bf9d06f23a Mon Sep 17 00:00:00 2001 From: Gordon Date: Tue, 4 Feb 2025 10:06:21 +0000 Subject: [PATCH] feat: add logging for configurations in scope for artifact resolution and dependency graph Signed-off-by: Gordon --- .../cyclonedx/gradle/SbomGraphProvider.java | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/cyclonedx/gradle/SbomGraphProvider.java b/src/main/java/org/cyclonedx/gradle/SbomGraphProvider.java index 39d48a5..c11597f 100644 --- a/src/main/java/org/cyclonedx/gradle/SbomGraphProvider.java +++ b/src/main/java/org/cyclonedx/gradle/SbomGraphProvider.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.Callable; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import org.cyclonedx.gradle.model.SbomComponent; @@ -116,7 +117,15 @@ private Stream> traverseProject(final Projec final DependencyGraphTraverser traverser = new DependencyGraphTraverser(project.getLogger(), getArtifacts(), mavenLookup, task); - return Arrays.stream(project.getConfigurations().toArray(CONFIG_TYPE)) + final Configuration[] configs = project.getConfigurations().toArray(CONFIG_TYPE); + this.project + .getLogger() + .info( + "For project {} following configurations are in scope to build the dependency graph: {}", + project.getName(), + summarize(configs, Configuration::getName)); + + return Arrays.stream(configs) .filter(configuration -> shouldIncludeConfiguration(configuration) && !shouldSkipConfiguration(configuration) && configuration.isCanBeResolved()) @@ -127,23 +136,45 @@ private Stream> traverseProject(final Projec private Map getArtifacts() { return Stream.concat(Stream.of(project), project.getSubprojects().stream()) .filter(project -> !shouldSkipProject(project)) - .flatMap(project -> Arrays.stream(project.getConfigurations().toArray(CONFIG_TYPE))) + .flatMap(project -> { + final Configuration[] configs = project.getConfigurations().toArray(CONFIG_TYPE); + this.project + .getLogger() + .info( + "For project {} following configurations are in scope to resolve artifacts: {}", + project.getName(), + summarize(configs, Configuration::getName)); + return Arrays.stream(configs); + }) .filter(configuration -> shouldIncludeConfiguration(configuration) && !shouldSkipConfiguration(configuration) && configuration.isCanBeResolved()) - .flatMap(config -> Arrays.stream(config.getIncoming() - .artifactView(view -> { - view.lenient(true); - }) - .getArtifacts() - .getArtifacts() - .toArray(ARTIFACT_TYPE))) + .flatMap(config -> { + final ResolvedArtifactResult[] resolvedArtifacts = config.getIncoming() + .artifactView(view -> { + view.lenient(true); + }) + .getArtifacts() + .getArtifacts() + .toArray(ARTIFACT_TYPE); + this.project + .getLogger() + .debug( + "For project {} following artifacts have been resolved: {}", + project.getName(), + summarize(resolvedArtifacts, v -> v.getId().getDisplayName())); + return Arrays.stream(resolvedArtifacts); + }) .collect(Collectors.toMap( artifact -> artifact.getId().getComponentIdentifier(), ResolvedArtifactResult::getFile, (v1, v2) -> v1)); } + private String summarize(T[] data, final Function extractor) { + return Arrays.stream(data).map(extractor).collect(Collectors.joining(",")); + } + private boolean shouldSkipConfiguration(final Configuration configuration) { return task.getSkipConfigs().get().stream().anyMatch(configuration.getName()::matches); }