From 5f420213d084068a3500bbdd538cbfac4742d2e9 Mon Sep 17 00:00:00 2001 From: Alexey Loubyansky Date: Wed, 23 Nov 2022 10:28:43 +0100 Subject: [PATCH] Make ProjectDependencyConfig serializable, make commands export and consume dependency configs --- deps-to-build/api/pom.xml | 8 + .../maven/JsonArtifactCoordsDeserializer.java | 19 + .../maven/JsonArtifactCoordsMixin.java | 17 + .../maven/JsonArtifactCoordsSerializer.java | 17 + .../maven/ProjectDependencyConfig.java | 266 +++++++++++ .../maven/ProjectDependencyConfigImpl.java | 452 ++++++++++++++++++ .../maven/ProjectDependencyConfigMapper.java | 96 ++++ .../maven/ProjectDependencyResolver.java | 376 ++++----------- .../quarkus/dependency/ParallelExecution.java | 32 +- .../depstobuild/BaseDepsToBuildCommand.java | 37 +- .../platform/depstobuild/EntryCommand.java | 2 +- .../platform/depstobuild/FromConfig.java | 35 ++ .../depstobuild/gradle/FromGradle.java | 3 +- .../maven/DependenciesToBuildMojo.java | 53 +- .../maven/NonQuarkusDepsToBuildMojo.java | 47 +- .../GeneratePlatformProjectMojo.java | 6 +- .../maven/platformgen/PncBuildConfigMojo.java | 6 +- .../bom/platform/PlatformMemberConfig.java | 6 +- ...ava => ProjectDependencyFilterConfig.java} | 4 +- 19 files changed, 1111 insertions(+), 371 deletions(-) create mode 100644 deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsDeserializer.java create mode 100644 deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsMixin.java create mode 100644 deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsSerializer.java create mode 100644 deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfig.java create mode 100644 deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigImpl.java create mode 100644 deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigMapper.java create mode 100644 deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/FromConfig.java rename platform-bom/src/main/java/io/quarkus/bom/platform/{ProjectDependencyConfig.java => ProjectDependencyFilterConfig.java} (96%) diff --git a/deps-to-build/api/pom.xml b/deps-to-build/api/pom.xml index 661673bd..f2e4316e 100644 --- a/deps-to-build/api/pom.xml +++ b/deps-to-build/api/pom.xml @@ -14,6 +14,14 @@ io.quarkus quarkus-platform-bom-decomposer + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + org.junit.jupiter junit-jupiter diff --git a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsDeserializer.java b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsDeserializer.java new file mode 100644 index 00000000..32554204 --- /dev/null +++ b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsDeserializer.java @@ -0,0 +1,19 @@ +package io.quarkus.bom.decomposer.maven; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import io.quarkus.maven.dependency.ArtifactCoords; +import java.io.IOException; + +/** + * Serialization detail. Not part of the Catalog or Config API. + */ +public class JsonArtifactCoordsDeserializer extends JsonDeserializer { + + @Override + public ArtifactCoords deserialize(JsonParser p, DeserializationContext ctxt) + throws IOException { + return ArtifactCoords.fromString(p.getText()); + } +} diff --git a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsMixin.java b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsMixin.java new file mode 100644 index 00000000..9e7c96a9 --- /dev/null +++ b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsMixin.java @@ -0,0 +1,17 @@ +package io.quarkus.bom.decomposer.maven; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.quarkus.maven.dependency.ArtifactKey; + +/** + * Serialization detail. Not part of the Catalog or Config API. + */ +@JsonSerialize(using = JsonArtifactCoordsSerializer.class) +@JsonDeserialize(using = JsonArtifactCoordsDeserializer.class) +public interface JsonArtifactCoordsMixin { + + @JsonIgnore + ArtifactKey getKey(); +} diff --git a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsSerializer.java b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsSerializer.java new file mode 100644 index 00000000..2ed34c3e --- /dev/null +++ b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/JsonArtifactCoordsSerializer.java @@ -0,0 +1,17 @@ +package io.quarkus.bom.decomposer.maven; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import io.quarkus.maven.dependency.ArtifactCoords; +import java.io.IOException; + +/** + * Serialization detail. Not part of the Catalog or Config API. + */ +public class JsonArtifactCoordsSerializer extends JsonSerializer { + @Override + public void serialize(ArtifactCoords value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(value.toString()); + } +} diff --git a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfig.java b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfig.java new file mode 100644 index 00000000..ac1f6410 --- /dev/null +++ b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfig.java @@ -0,0 +1,266 @@ +package io.quarkus.bom.decomposer.maven; + +import io.quarkus.maven.dependency.ArtifactCoords; +import io.quarkus.maven.dependency.ArtifactKey; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Set; + +public interface ProjectDependencyConfig { + + /** + * Project BOM + * + * @return project BOM + */ + ArtifactCoords getProjectBom(); + + Collection getProjectArtifacts(); + + Collection getIncludeArtifacts(); + + Collection getIncludePatterns(); + + Collection getExcludePatterns(); + + /** + * Whether to exclude dependencies (and their transitive dependencies) that aren't managed in the BOM. The default is true. + * + * @return whether non-managed dependencies should be included + */ + boolean isIncludeNonManaged(); + + /** + * Whether to exclude parent POMs from the list of artifacts to be built from source + * + * @return whether to exclude parent POMs + */ + boolean isExcludeParentPoms(); + + /** + * Whether to exclude BOMs imported in the POMs of artifacts to be built from the list of artifacts to be built from source + * + * @return whether to exclude BOM imports + */ + boolean isExcludeBomImports(); + + /** + * The depth level of a dependency tree of each supported Quarkus extension to capture. + * Setting the level to 0 will target the supported extension artifacts themselves. + * Setting the level to 1, will target the supported extension artifacts plus their direct dependencies. + * If the level is not specified, the default will be -1, which means all the levels. + * + * @return dependency level + */ + int getLevel(); + + /** + * Whether to log the coordinates of the artifacts captured down to the depth specified. The default is true. + * + * @return whether to log complete artifacts coordinates + */ + boolean isLogArtifactsToBuild(); + + /** + * Whether to log the module GAVs the artifacts to be built belongs to instead of all + * the complete artifact coordinates to be built. + * If this option is enabled, it overrides {@link #logArtifactsToBuild} + * + * @return whether to log module coords as GAVs instead of complete artifact coordinates + */ + boolean isLogModulesToBuild(); + + /** + * Whether to log the dependency trees walked down to the depth specified. The default is false. + * + * @return whether to log dependency trees + */ + boolean isLogTrees(); + + /** + * Whether to log the coordinates of the artifacts below the depth specified. The default is false. + * + * @return whether to log remaining artifacts + */ + boolean isLogRemaining(); + + /** + * Whether to log the summary at the end. The default is true. + * + * @return whether to log summary + */ + boolean isLogSummary(); + + /** + * Whether to log visited non-managed dependencies. + * + * @return whether to log visited non-managed dependencies + */ + boolean isLogNonManagedVisitied(); + + /** + * Whether to log code repository info for the artifacts to be built from source + * + * @return whether to log code repositories + */ + boolean isLogCodeRepos(); + + /** + * Whether to log code repository dependency tree. + * + * @return whetehr to log code repository dependency tree + */ + boolean isLogCodeRepoTree(); + + /** + * Whether to validate the discovered code repo and tags that are included in the report + * + * @return whether to validate core repos and tags + */ + boolean isValidateCodeRepoTags(); + + /** + * Whether to warn about errors not being able to resolve top level artifacts or fail the process + * + * @return whether to warn on artifact resolution errors + */ + boolean isWarnOnResolutionErrors(); + + boolean isIncludeAlreadyBuilt(); + + default Mutable mutable() { + return new ProjectDependencyConfigImpl.Builder(this); + } + + /** + * Persist this configuration to the specified file. + * + * @param p Target path + * @throws IOException if the specified file can not be written to. + */ + default void persist(Path p) throws IOException { + ProjectDependencyConfigMapper.serialize(this, p); + } + + interface Mutable extends ProjectDependencyConfig { + + Mutable setProjectBom(ArtifactCoords bom); + + Mutable setProjectArtifacts(Collection projectArtifacts); + + Mutable setIncludeArtifacts(Set artifacts); + + default Mutable setIncludeGroupIds(Set groupIds) { + groupIds.forEach(g -> addIncludePattern( + ArtifactCoords.of(g, ProjectDependencyConfigImpl.WILDCARD, ProjectDependencyConfigImpl.WILDCARD, + ProjectDependencyConfigImpl.WILDCARD, ProjectDependencyConfigImpl.WILDCARD))); + return this; + } + + default Mutable setIncludeKeys(Set artifactKeys) { + artifactKeys.forEach(k -> addIncludePattern(ArtifactCoords.of(k.getGroupId(), k.getArtifactId(), k.getClassifier(), + k.getType(), ProjectDependencyConfigImpl.WILDCARD))); + return this; + } + + Mutable setIncludePatterns(Set artifacts); + + Mutable addIncludePattern(ArtifactCoords patter); + + default Mutable setExcludeGroupIds(Set groupIds) { + groupIds.forEach(g -> addExcludePattern( + ArtifactCoords.of(g, ProjectDependencyConfigImpl.WILDCARD, ProjectDependencyConfigImpl.WILDCARD, + ProjectDependencyConfigImpl.WILDCARD, ProjectDependencyConfigImpl.WILDCARD))); + return this; + } + + default Mutable setExcludeKeys(Set artifactKeys) { + artifactKeys.forEach(k -> addExcludePattern(ArtifactCoords.of(k.getGroupId(), k.getArtifactId(), k.getClassifier(), + k.getType(), ProjectDependencyConfigImpl.WILDCARD))); + return this; + } + + Mutable setExcludePatterns(Set artifacts); + + Mutable addExcludePattern(ArtifactCoords pattern); + + Mutable setIncludeNonManaged(boolean includeNonManaged); + + Mutable setExcludeParentPoms(boolean excludeParentPoms); + + Mutable setExcludeBomImports(boolean excludeBomImports); + + Mutable setLevel(int level); + + Mutable setLogArtifactsToBuild(boolean logArtifactsToBuild); + + Mutable setLogModulesToBuild(boolean logModulesToBuild); + + Mutable setLogTrees(boolean logTrees); + + Mutable setLogRemaining(boolean logRemaining); + + Mutable setLogSummary(boolean logSummary); + + Mutable setLogNonManagedVisited(boolean logNonManagedVisited); + + Mutable setLogCodeRepos(boolean logCodeRepos); + + Mutable setLogCodeRepoTree(boolean logCodeRepoGraph); + + Mutable setValidateCodeRepoTags(boolean validateTags); + + Mutable setWarnOnResolutionErrors(boolean warn); + + Mutable setIncludeAlreadyBuilt(boolean includeAlreadyBuilt); + + ProjectDependencyConfig build(); + + default void persist(Path p) throws IOException { + ProjectDependencyConfigMapper.serialize(build(), p); + } + } + + /** + * @return a new mutable instance + */ + static Mutable builder() { + return new ProjectDependencyConfigImpl.Builder(); + } + + /** + * Read config from the specified file + * + * @param path File to read from (yaml or json) + * @return read-only ExtensionCatalog object + */ + static ProjectDependencyConfig fromFile(Path path) throws IOException { + return mutableFromFile(path).build(); + } + + /** + * Read config from the specified file + * + * @param path File to read from (yaml or json) + * @return read-only ExtensionCatalog object (empty/default for an empty file) + */ + static ProjectDependencyConfig.Mutable mutableFromFile(Path path) throws IOException { + final ProjectDependencyConfig.Mutable mutable = ProjectDependencyConfigMapper.deserialize(path, + ProjectDependencyConfigImpl.Builder.class); + return mutable == null ? ProjectDependencyConfig.builder() : mutable; + } + + /** + * Read config from an input stream + * + * @param inputStream input stream to read from + * @return read-only ExtensionCatalog object (empty/default for an empty file) + */ + static ProjectDependencyConfig fromStream(InputStream inputStream) throws IOException { + final ProjectDependencyConfig.Mutable mutable = ProjectDependencyConfigMapper.deserialize(inputStream, + ProjectDependencyConfigImpl.Builder.class); + return mutable == null ? ProjectDependencyConfig.builder().build() : mutable.build(); + } +} diff --git a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigImpl.java b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigImpl.java new file mode 100644 index 00000000..fb7fb43b --- /dev/null +++ b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigImpl.java @@ -0,0 +1,452 @@ +package io.quarkus.bom.decomposer.maven; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.quarkus.maven.dependency.ArtifactCoords; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +@JsonInclude(JsonInclude.Include.NON_DEFAULT) +public class ProjectDependencyConfigImpl implements ProjectDependencyConfig { + + static final String WILDCARD = "*"; + + private final ArtifactCoords projectBom; + private final Collection projectArtifacts; + private final Collection includeArtifacts; + private final Collection includePatterns; + private final Collection excludePatterns; + private final boolean includeNonManaged; + private final boolean excludeParentPoms; + private final boolean excludeBomImports; + private final int level; + private final boolean logArtifactsToBuild; + private final boolean logModulesToBuild; + private final boolean logTrees; + private final boolean logRemaining; + private final boolean logSummary; + private final boolean logNonManagedVisited; + private final boolean logCodeRepos; + private final boolean logCodeRepoTree; + private final boolean validateCodeRepoTags; + private final boolean warnOnResolutionErrors; + private boolean includeAlreadyBuilt; + + private ProjectDependencyConfigImpl(ProjectDependencyConfig other) { + projectBom = other.getProjectBom(); + projectArtifacts = toUnmodifiableList(other.getProjectArtifacts()); + includeArtifacts = toUnmodifiableList(other.getIncludeArtifacts()); + includePatterns = toUnmodifiableList(other.getIncludePatterns()); + excludePatterns = toUnmodifiableList(other.getExcludePatterns()); + includeNonManaged = other.isIncludeNonManaged(); + excludeParentPoms = other.isExcludeParentPoms(); + excludeBomImports = other.isExcludeBomImports(); + level = other.getLevel(); + logArtifactsToBuild = other.isLogArtifactsToBuild(); + logModulesToBuild = other.isLogModulesToBuild(); + logTrees = other.isLogTrees(); + logRemaining = other.isLogRemaining(); + logSummary = other.isLogSummary(); + logNonManagedVisited = other.isLogNonManagedVisitied(); + logCodeRepos = other.isLogCodeRepos(); + logCodeRepoTree = other.isLogCodeRepoTree(); + includeAlreadyBuilt = other.isIncludeAlreadyBuilt(); + validateCodeRepoTags = other.isValidateCodeRepoTags(); + warnOnResolutionErrors = other.isWarnOnResolutionErrors(); + } + + @Override + public ArtifactCoords getProjectBom() { + return projectBom; + } + + @Override + public Collection getProjectArtifacts() { + return projectArtifacts; + } + + @Override + public Collection getIncludeArtifacts() { + return includeArtifacts; + } + + @Override + public Collection getIncludePatterns() { + return includePatterns; + } + + @Override + public Collection getExcludePatterns() { + return excludePatterns; + } + + @Override + public boolean isIncludeNonManaged() { + return includeNonManaged; + } + + @Override + public boolean isExcludeParentPoms() { + return excludeParentPoms; + } + + @Override + public boolean isExcludeBomImports() { + return excludeBomImports; + } + + @Override + public int getLevel() { + return level; + } + + @Override + public boolean isLogArtifactsToBuild() { + return logArtifactsToBuild; + } + + @Override + public boolean isLogModulesToBuild() { + return logModulesToBuild; + } + + @Override + public boolean isLogTrees() { + return logTrees; + } + + @Override + public boolean isLogRemaining() { + return logRemaining; + } + + @Override + public boolean isLogSummary() { + return logSummary; + } + + @Override + public boolean isLogNonManagedVisitied() { + return logNonManagedVisited; + } + + @Override + public boolean isLogCodeRepos() { + return logCodeRepos; + } + + @Override + public boolean isLogCodeRepoTree() { + return logCodeRepoTree; + } + + @Override + public boolean isValidateCodeRepoTags() { + return validateCodeRepoTags; + } + + @Override + public boolean isWarnOnResolutionErrors() { + return warnOnResolutionErrors; + } + + @Override + public boolean isIncludeAlreadyBuilt() { + return includeAlreadyBuilt; + } + + static class Builder implements ProjectDependencyConfig.Mutable { + + private ArtifactCoords projectBom; + private Collection projectArtifacts = new ArrayList<>(); + private Collection includeArtifacts = new ArrayList<>(); + private Collection includePatterns = new ArrayList<>(); + private Collection excludePatterns = new ArrayList<>(); + private boolean includeNonManaged; + private boolean excludeParentPoms; + private boolean excludeBomImports; + private int level; + private boolean logArtifactsToBuild; + private boolean logModulesToBuild; + private boolean logTrees; + private boolean logRemaining; + private boolean logSummary; + private boolean logNonManagedVisited; + private boolean logCodeRepos; + private boolean logCodeRepoTree; + private boolean validateCodeRepoTags; + private boolean warnOnResolutionErrors; + private boolean includeAlreadyBuilt; + + Builder() { + } + + Builder(ProjectDependencyConfig other) { + projectBom = other.getProjectBom(); + projectArtifacts.addAll(other.getProjectArtifacts()); + includeArtifacts.addAll(other.getIncludeArtifacts()); + includePatterns.addAll(other.getIncludePatterns()); + excludePatterns.addAll(other.getExcludePatterns()); + includeNonManaged = other.isIncludeNonManaged(); + excludeParentPoms = other.isExcludeParentPoms(); + excludeBomImports = other.isExcludeBomImports(); + level = other.getLevel(); + logArtifactsToBuild = other.isLogArtifactsToBuild(); + logModulesToBuild = other.isLogModulesToBuild(); + logTrees = other.isLogTrees(); + logRemaining = other.isLogRemaining(); + logSummary = other.isLogSummary(); + logNonManagedVisited = other.isLogNonManagedVisitied(); + logCodeRepos = other.isLogCodeRepos(); + logCodeRepoTree = other.isLogCodeRepoTree(); + validateCodeRepoTags = other.isValidateCodeRepoTags(); + warnOnResolutionErrors = other.isWarnOnResolutionErrors(); + includeAlreadyBuilt = other.isIncludeAlreadyBuilt(); + } + + @Override + public ArtifactCoords getProjectBom() { + return projectBom; + } + + @Override + public Collection getProjectArtifacts() { + return projectArtifacts; + } + + @Override + public Collection getIncludeArtifacts() { + return includeArtifacts; + } + + @Override + public Collection getIncludePatterns() { + return includePatterns; + } + + @Override + public Collection getExcludePatterns() { + return excludePatterns; + } + + @Override + public boolean isIncludeNonManaged() { + return includeNonManaged; + } + + @Override + public boolean isExcludeParentPoms() { + return excludeParentPoms; + } + + @Override + public boolean isExcludeBomImports() { + return excludeBomImports; + } + + @Override + public int getLevel() { + return level; + } + + @Override + public boolean isLogArtifactsToBuild() { + return logArtifactsToBuild; + } + + @Override + public boolean isLogModulesToBuild() { + return logModulesToBuild; + } + + @Override + public boolean isLogTrees() { + return logTrees; + } + + @Override + public boolean isLogRemaining() { + return logRemaining; + } + + @Override + public boolean isLogSummary() { + return logSummary; + } + + @Override + public boolean isLogNonManagedVisitied() { + return logNonManagedVisited; + } + + @Override + public boolean isLogCodeRepos() { + return logCodeRepos; + } + + @Override + public boolean isLogCodeRepoTree() { + return logCodeRepoTree; + } + + @Override + public boolean isValidateCodeRepoTags() { + return validateCodeRepoTags; + } + + @Override + public boolean isWarnOnResolutionErrors() { + return warnOnResolutionErrors; + } + + @Override + public boolean isIncludeAlreadyBuilt() { + return includeAlreadyBuilt; + } + + @Override + public Mutable setProjectBom(ArtifactCoords bom) { + this.projectBom = bom; + return this; + } + + @Override + public Mutable setProjectArtifacts(Collection projectArtifacts) { + this.projectArtifacts = projectArtifacts; + return this; + } + + @Override + public Mutable setIncludeArtifacts(Set artifacts) { + this.includeArtifacts = artifacts; + return this; + } + + @Override + public Mutable setIncludePatterns(Set artifacts) { + this.includePatterns = artifacts; + return this; + } + + @Override + public Mutable addIncludePattern(ArtifactCoords artifact) { + this.includePatterns.add(artifact); + return this; + } + + @Override + public Mutable setExcludePatterns(Set artifacts) { + this.excludePatterns = artifacts; + return this; + } + + @Override + public Mutable addExcludePattern(ArtifactCoords artifact) { + this.excludePatterns.add(artifact); + return this; + } + + @Override + public Mutable setIncludeNonManaged(boolean includeNonManaged) { + this.includeNonManaged = includeNonManaged; + return this; + } + + @Override + public Mutable setExcludeParentPoms(boolean excludeParentPoms) { + this.excludeParentPoms = excludeParentPoms; + return this; + } + + @Override + public Mutable setExcludeBomImports(boolean excludeBomImports) { + this.excludeBomImports = excludeBomImports; + return this; + } + + @Override + public Mutable setLevel(int level) { + this.level = level; + return this; + } + + @Override + public Mutable setLogArtifactsToBuild(boolean logArtifactsToBuild) { + this.logArtifactsToBuild = logArtifactsToBuild; + return this; + } + + @Override + public Mutable setLogModulesToBuild(boolean logModulesToBuild) { + this.logModulesToBuild = logModulesToBuild; + return this; + } + + @Override + public Mutable setLogTrees(boolean logTrees) { + this.logTrees = logTrees; + return this; + } + + @Override + public Mutable setLogRemaining(boolean logRemaining) { + this.logRemaining = logRemaining; + return this; + } + + @Override + public Mutable setLogSummary(boolean logSummary) { + this.logSummary = logSummary; + return this; + } + + @Override + public Mutable setLogNonManagedVisited(boolean logNonManagedVisited) { + this.logNonManagedVisited = logNonManagedVisited; + return this; + } + + @Override + public Mutable setLogCodeRepos(boolean logCodeRepos) { + this.logCodeRepos = logCodeRepos; + return this; + } + + @Override + public Mutable setLogCodeRepoTree(boolean logCodeRepoTree) { + this.logCodeRepoTree = logCodeRepoTree; + return this; + } + + @Override + public Mutable setValidateCodeRepoTags(boolean validateTags) { + this.validateCodeRepoTags = validateTags; + return this; + } + + @Override + public Mutable setWarnOnResolutionErrors(boolean warn) { + this.warnOnResolutionErrors = warn; + return this; + } + + @Override + public Mutable setIncludeAlreadyBuilt(boolean includeAlreadyBuilt) { + this.includeAlreadyBuilt = includeAlreadyBuilt; + return this; + } + + @Override + public ProjectDependencyConfig build() { + return new ProjectDependencyConfigImpl(this); + } + } + + static List toUnmodifiableList(Collection o) { + if (o == null || o.isEmpty()) { + return List.of(); + } + return List.copyOf(o); + } +} diff --git a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigMapper.java b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigMapper.java new file mode 100644 index 00000000..2fd75b8e --- /dev/null +++ b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyConfigMapper.java @@ -0,0 +1,96 @@ +package io.quarkus.bom.decomposer.maven; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import io.quarkus.maven.dependency.ArtifactCoords; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; + +public class ProjectDependencyConfigMapper { + + private static ObjectMapper mapper; + private static ObjectMapper yamlMapper; + + public static ObjectMapper mapper() { + return mapper == null ? mapper = initMapper(new ObjectMapper()) : mapper; + } + + private static ObjectMapper yamlMapper() { + return yamlMapper == null ? yamlMapper = initMapper(new ObjectMapper(new YAMLFactory())) : yamlMapper; + } + + private static ObjectMapper mapperForPath(Path p) { + return p.getFileName().toString().endsWith("json") ? mapper() : yamlMapper(); + } + + public static ObjectMapper initMapper(ObjectMapper mapper) { + mapper.addMixIn(ArtifactCoords.class, JsonArtifactCoordsMixin.class); + mapper.enable(SerializationFeature.INDENT_OUTPUT); + mapper.enable(JsonParser.Feature.ALLOW_COMMENTS); + mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + mapper.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper; + } + + public static void serialize(Object catalog, Path p) throws IOException { + serialize(mapperForPath(p), catalog, p); + } + + public static void serialize(ObjectMapper mapper, Object catalog, Path p) throws IOException { + final Path parent = p.getParent(); + if (parent != null && !Files.exists(parent)) { + Files.createDirectories(parent); + } + try (BufferedWriter writer = Files.newBufferedWriter(p)) { + serialize(mapper, catalog, writer); + } + } + + public static void serialize(Object catalog, Writer writer) throws IOException { + serialize(mapper(), catalog, writer); + } + + public static void serialize(ObjectMapper mapper, Object catalog, Writer writer) throws IOException { + mapper.writeValue(writer, catalog); + } + + public static T deserialize(Path p, Class t) throws IOException { + return deserialize(mapperForPath(p), p, t); + } + + public static T deserialize(ObjectMapper mapper, Path p, Class t) throws IOException { + if (!Files.exists(p)) { + throw new IllegalArgumentException("File " + p + " does not exist"); + } + try (BufferedReader reader = Files.newBufferedReader(p)) { + return mapper.readValue(reader, t); + } + } + + public static T deserialize(InputStream is, Class t) throws IOException { + return deserialize(mapper(), is, t); + } + + public static T deserialize(ObjectMapper mapper, InputStream is, Class t) throws IOException { + return mapper.readValue(is, t); + } + + public static T deserialize(Reader reader, Class t) throws IOException { + return deserialize(mapper(), reader, t); + } + + public static T deserialize(ObjectMapper mapper, Reader reader, Class t) throws IOException { + return mapper.readValue(reader, t); + } +} diff --git a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyResolver.java b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyResolver.java index afed37a1..9960aebc 100644 --- a/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyResolver.java +++ b/deps-to-build/api/src/main/java/io/quarkus/bom/decomposer/maven/ProjectDependencyResolver.java @@ -12,12 +12,12 @@ import io.quarkus.devtools.messagewriter.MessageWriter; import io.quarkus.maven.dependency.ArtifactCoords; import io.quarkus.maven.dependency.ArtifactKey; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; +import java.nio.file.Files; +import java.nio.file.OpenOption; import java.nio.file.Path; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -49,93 +49,24 @@ public class ProjectDependencyResolver { private static final String NOT_MANAGED = " [not managed]"; - public class Builder { + public static class Builder { - private Builder() { - } - - public Builder setArtifactResolver(MavenArtifactResolver artifactResolver) { - resolver = artifactResolver; - return this; - } - - public Builder setProjectBom(ArtifactCoords bom) { - targetBomCoords = bom; - return this; - } - - public Builder setProjectArtifacts(Collection topArtifactsToBuild) { - projectArtifacts = topArtifactsToBuild; - return this; - } - - public Builder setLevel(int level) { - ProjectDependencyResolver.this.level = level; - return this; - } + private MavenArtifactResolver resolver; + private Function> artifactConstraintsProvider; + private MessageWriter log; + private ProjectDependencyConfig depConfig; + private Path logOutputFile; + private boolean appendOutput; - public Builder setIncludeNonManaged(boolean includeNonManaged) { - ProjectDependencyResolver.this.includeNonManaged = includeNonManaged; - return this; - } - - public Builder setLogArtifactsToBuild(boolean logArtifactsToBuild) { - ProjectDependencyResolver.this.logArtifactsToBuild = logArtifactsToBuild; - return this; - } - - public Builder setLogModulesToBuild(boolean logModulesToBuild) { - ProjectDependencyResolver.this.logModulesToBuild = logModulesToBuild; - return this; - } - - public Builder setLogTrees(boolean logTrees) { - ProjectDependencyResolver.this.logTrees = logTrees; - return this; - } - - public Builder setLogRemaining(boolean logRemaining) { - ProjectDependencyResolver.this.logRemaining = logRemaining; - return this; - } - - public Builder setLogSummary(boolean logSummary) { - ProjectDependencyResolver.this.logSummary = logSummary; - return this; - } - - public Builder setLogNonManagedVisited(boolean logNonManagedVisited) { - ProjectDependencyResolver.this.logNonManagedVisited = logNonManagedVisited; - return this; - } - - public Builder setOutputFile(File outputFile) { - ProjectDependencyResolver.this.outputFile = outputFile; - return this; - } - - public Builder setAppendOutput(boolean appendOutput) { - ProjectDependencyResolver.this.appendOutput = appendOutput; - return this; - } - - public Builder setLogCodeRepos(boolean logCodeRepos) { - ProjectDependencyResolver.this.logCodeRepos = logCodeRepos; - return this; - } - - public Builder setLogCodeRepoGraph(boolean logCodeRepoGraph) { - ProjectDependencyResolver.this.logCodeRepoGraph = logCodeRepoGraph; - return this; + private Builder() { } - public Builder setExcludeParentPoms(boolean excludeParentPoms) { - ProjectDependencyResolver.this.excludeParentPoms = excludeParentPoms; - return this; + private Builder(ProjectDependencyConfig config) { + this.depConfig = config; } - public Builder setExcludeBomImports(boolean excludeBomImports) { - ProjectDependencyResolver.this.excludeBomImports = excludeBomImports; + public Builder setArtifactResolver(MavenArtifactResolver artifactResolver) { + resolver = artifactResolver; return this; } @@ -149,94 +80,39 @@ public Builder setMessageWriter(MessageWriter msgWriter) { return this; } - public Builder setExcludeGroupIds(Set groupIds) { - for (String s : groupIds) { - excludeSet.add(ArtifactCoordsPattern.builder().groupIdPattern(s).build()); - } + public Builder setLogOutputFile(Path file) { + this.logOutputFile = file; return this; } - public Builder setExcludeKeys(Set artifactKeys) { - for (ArtifactKey key : artifactKeys) { - excludeSet.add(toPattern(key)); - } - return this; - } - - public Builder setExcludeArtifacts(Set artifacts) { - for (ArtifactCoords c : artifacts) { - excludeSet.add(toPattern(c)); - } - return this; - } - - public Builder setIncludeGroupIds(Set groupIds) { - for (String s : groupIds) { - includeSet.add(ArtifactCoordsPattern.builder().groupIdPattern(s).build()); - } - return this; - } - - public Builder setIncludeKeys(Set artifactKeys) { - for (ArtifactKey key : artifactKeys) { - includeSet.add(toPattern(key)); - } - return this; - } - - public Builder setIncludeArtifacts(Set artifacts) { - for (ArtifactCoords c : artifacts) { - includeSet.add(toPattern(c)); - } - return this; - } - - public Builder setValidateCodeRepoTags(boolean validateTags) { - validateCodeRepoTags = validateTags; + public Builder setAppendOutput(boolean appendOutput) { + this.appendOutput = appendOutput; return this; } - public Builder setWarnOnResolutionErrors(boolean warn) { - warnOnResolutionErrors = warn; + public Builder setDependencyConfig(ProjectDependencyConfig depConfig) { + this.depConfig = depConfig; return this; } - public Builder setIncludeAlreadyBuilt(boolean include) { - includeAlreadyBuilt = include; - return this; + public ProjectDependencyResolver build() { + return new ProjectDependencyResolver(this); } - public ProjectDependencyResolver build() { + private MavenArtifactResolver getInitializedResolver() { if (resolver == null) { try { - resolver = MavenArtifactResolver.builder().setWorkspaceDiscovery(false).build(); + return MavenArtifactResolver.builder().setWorkspaceDiscovery(false).build(); } catch (BootstrapMavenException e) { throw new IllegalStateException("Failed to initialize the Maven artifact resolver", e); } } - if (log == null) { - log = MessageWriter.info(); - } - return ProjectDependencyResolver.this; + return resolver; } - protected ProjectDependencyResolver doBuild() { - return ProjectDependencyResolver.this; + private MessageWriter getInitializedLog() { + return log == null ? MessageWriter.info() : log; } - - } - - private static ArtifactCoordsPattern toPattern(ArtifactKey key) { - final ArtifactCoordsPattern.Builder pattern = ArtifactCoordsPattern.builder(); - pattern.groupIdPattern(key.getGroupId()); - pattern.artifactIdPattern(key.getArtifactId()); - if (key.getClassifier() != null && !key.getClassifier().isEmpty()) { - pattern.classifierPattern(key.getClassifier()); - } - if (key.getType() != null && !key.getType().isEmpty()) { - pattern.typePattern(key.getType()); - } - return pattern.build(); } private static ArtifactCoordsPattern toPattern(ArtifactCoords c) { @@ -254,112 +130,35 @@ private static ArtifactCoordsPattern toPattern(ArtifactCoords c) { } public static Builder builder() { - return new ProjectDependencyResolver().new Builder(); + return new ProjectDependencyResolver.Builder(); } - private ProjectDependencyResolver() { + private ProjectDependencyResolver(Builder builder) { + this.resolver = builder.getInitializedResolver(); + this.log = builder.getInitializedLog(); + this.artifactConstraintsProvider = builder.artifactConstraintsProvider; + this.logOutputFile = builder.logOutputFile; + this.appendOutput = builder.appendOutput; + this.config = Objects.requireNonNull(builder.depConfig); + config.getExcludePatterns().forEach(p -> excludeSet.add(toPattern(p))); + config.getIncludePatterns().forEach(p -> includeSet.add(toPattern(p))); } - private MavenArtifactResolver resolver; - private ArtifactCoords targetBomCoords; + private final MavenArtifactResolver resolver; + private final ProjectDependencyConfig config; private MessageWriter log; private List excludeSet = new ArrayList<>(); private List includeSet = new ArrayList<>(); - private Collection projectArtifacts = List.of(); - - /** - * The depth level of a dependency tree of each supported Quarkus extension to capture. - * Setting the level to 0 will target the supported extension artifacts themselves. - * Setting the level to 1, will target the supported extension artifacts plus their direct dependencies. - * If the level is not specified, the default will be -1, which means all the levels. - */ - private int level = -1; - - /** - * Whether to exclude dependencies (and their transitive dependencies) that aren't managed in the BOM. The default is true. - */ - private boolean includeNonManaged; - - /** - * Whether to log the coordinates of the artifacts captured down to the depth specified. The default is true. - */ - private boolean logArtifactsToBuild = true; - - /** - * Whether to log the module GAVs the artifacts to be built belongs to instead of all - * the complete artifact coordinates to be built. - * If this option is enabled, it overrides {@link #logArtifactsToBuild} - */ - private boolean logModulesToBuild; - - /** - * Whether to log the dependency trees walked down to the depth specified. The default is false. - */ - private boolean logTrees; - - /** - * Whether to log the coordinates of the artifacts below the depth specified. The default is false. - */ - private boolean logRemaining; - - /** - * Whether to log the summary at the end. The default is true. - */ - private boolean logSummary = true; - - /** - * Whether to log the summary at the end. The default is true. - */ - private boolean logNonManagedVisited; - - /** - * If specified, this parameter will cause the output to be written to the path specified, instead of writing to - * the console. - */ - private File outputFile; private PrintStream fileOutput; - - /** - * Whether to append outputs into the output file or overwrite it. - */ - private boolean appendOutput; - - /* - * Whether to log code repository info for the artifacts to be built from source - */ - private boolean logCodeRepos; - - /* - * Whether to log code repository dependency graph. - */ - private boolean logCodeRepoGraph; - - /* - * Whether to exclude parent POMs from the list of artifacts to be built from source - */ - private boolean excludeParentPoms; - - /* - * Whether to exclude BOMs imported in the POMs of artifacts to be built from the list of artifacts to be built from source - */ - private boolean excludeBomImports; - - /* - * Whether to validate the discovered code repo and tags that are included in the report - */ - private boolean validateCodeRepoTags; + private final Path logOutputFile; + private final boolean appendOutput; /* * Whether to include test JARs */ private boolean includeTestJars; - /* - * Whether to warn about errors not being able to resolve top level artifacts or fail the process - */ - private boolean warnOnResolutionErrors; - /* * Whether to include dependencies that have already been built */ @@ -392,17 +191,15 @@ public Collection getSortedReleaseRepos() { public void log() { - if (logCodeRepoGraph) { - logCodeRepos = true; - } + final boolean logCodeRepos = config.isLogCodeRepos() || config.isLogCodeRepoTree(); buildModel(); try { int codeReposTotal = 0; - if (logArtifactsToBuild && !allDepsToBuild.isEmpty()) { + if (config.isLogArtifactsToBuild() && !allDepsToBuild.isEmpty()) { logComment("Artifacts to be built from source from " - + (targetBomCoords == null ? "" : targetBomCoords.toCompactCoords()) + ":"); + + (config.getProjectBom() == null ? "" : config.getProjectBom().toCompactCoords()) + ":"); if (logCodeRepos) { initReleaseRepos(); detectCircularRepoDeps(); @@ -412,7 +209,7 @@ public void log() { for (ReleaseRepo e : sorted) { logComment("repo-url " + e.id().origin()); logComment("tag " + e.id().version().asString()); - for (String s : toSortedStrings(e.artifacts, logModulesToBuild)) { + for (String s : toSortedStrings(e.artifacts, config.isLogModulesToBuild())) { log(s); } } @@ -427,7 +224,7 @@ public void log() { logComment(""); } } - if (logCodeRepoGraph) { + if (config.isLogCodeRepoTree()) { logComment(""); logComment("Code repository dependency graph"); for (ReleaseRepo r : releaseRepos.values()) { @@ -439,43 +236,43 @@ public void log() { } } else { - for (String s : toSortedStrings(allDepsToBuild, logModulesToBuild)) { + for (String s : toSortedStrings(allDepsToBuild, config.isLogModulesToBuild())) { log(s); } } } - if (logNonManagedVisited && !nonManagedVisited.isEmpty()) { + if (config.isLogNonManagedVisitied() && !nonManagedVisited.isEmpty()) { logComment("Non-managed dependencies visited walking dependency trees:"); - final List sorted = toSortedStrings(nonManagedVisited, logModulesToBuild); + final List sorted = toSortedStrings(nonManagedVisited, config.isLogModulesToBuild()); for (int i = 0; i < sorted.size(); ++i) { logComment((i + 1) + ") " + sorted.get(i)); } } - if (logRemaining) { + if (config.isLogRemaining()) { logComment("Remaining artifacts include:"); - final List sorted = toSortedStrings(remainingDeps, logModulesToBuild); + final List sorted = toSortedStrings(remainingDeps, config.isLogModulesToBuild()); for (int i = 0; i < sorted.size(); ++i) { logComment((i + 1) + ") " + sorted.get(i)); } } - if (logSummary) { + if (config.isLogSummary()) { final StringBuilder sb = new StringBuilder().append("Selecting "); - if (this.level < 0) { + if (config.getLevel() < 0) { sb.append("all the"); } else { - sb.append(this.level).append(" level(s) of"); + sb.append(config.getLevel()).append(" level(s) of"); } - if (this.includeNonManaged) { + if (config.isIncludeNonManaged()) { sb.append(" managed and non-managed"); } else { sb.append(" managed (stopping at the first non-managed one)"); } sb.append(" dependencies of supported extensions"); - if (targetBomCoords != null) { - sb.append(" from ").append(targetBomCoords.toCompactCoords()); + if (config.getProjectBom() != null) { + sb.append(" from ").append(config.getProjectBom().toCompactCoords()); } sb.append(" will result in:"); logComment(sb.toString()); @@ -487,7 +284,7 @@ public void log() { } sb.append(" to build from source"); logComment(sb.toString()); - if (includeNonManaged && !nonManagedVisited.isEmpty()) { + if (config.isIncludeNonManaged() && !nonManagedVisited.isEmpty()) { logComment(" * " + nonManagedVisited.size() + " of which is/are not managed by the BOM"); } if (!skippedDeps.isEmpty()) { @@ -497,14 +294,14 @@ public void log() { } } finally { if (fileOutput != null) { - log.info("Saving the report in " + outputFile.getAbsolutePath()); + log.info("Saving the report in " + logOutputFile.toAbsolutePath()); fileOutput.close(); } } } private void buildModel() { - targetBomManagedDeps = getBomConstraints(targetBomCoords); + targetBomManagedDeps = getBomConstraints(config.getProjectBom()); targetBomConstraints = new HashSet<>(targetBomManagedDeps.size()); for (Dependency d : targetBomManagedDeps) { targetBomConstraints.add(toCoords(d.getArtifact())); @@ -566,17 +363,17 @@ private void removeProductizedDeps() { } protected Iterable getProjectArtifacts() { - if (projectArtifacts == null || projectArtifacts.isEmpty()) { + if (config.getProjectArtifacts().isEmpty()) { final List result = new ArrayList<>(); for (ArtifactCoords d : targetBomConstraints) { - if (targetBomCoords.getGroupId().equals(d.getGroupId()) && d.isJar() && !isExcluded(d)) { + if (config.getProjectBom().getGroupId().equals(d.getGroupId()) && d.isJar() && !isExcluded(d)) { result.add(d); log.debug(d.toCompactCoords() + " selected as a top level artifact to build"); } } return result; } - return projectArtifacts; + return config.getProjectArtifacts(); } private void processRootArtifact(List managedDeps, ArtifactCoords rootArtifact) { @@ -594,7 +391,7 @@ private void processRootArtifact(List managedDeps, ArtifactCoords ro resolver.resolve(a); } } catch (Exception e) { - if (warnOnResolutionErrors) { + if (config.isWarnOnResolutionErrors()) { log.warn(e.getCause() == null ? e.getLocalizedMessage() : e.getCause().getLocalizedMessage()); allDepsToBuild.remove(rootArtifact); return; @@ -602,7 +399,7 @@ private void processRootArtifact(List managedDeps, ArtifactCoords ro throw new RuntimeException("Failed to collect dependencies of " + rootArtifact.toCompactCoords(), e); } - if (logTrees) { + if (config.isLogTrees()) { if (targetBomConstraints.contains(rootArtifact)) { logComment(rootArtifact.toCompactCoords()); } else { @@ -618,7 +415,7 @@ private void processRootArtifact(List managedDeps, ArtifactCoords ro } if (addDependency) { final ArtifactDependency extDep = getOrCreateArtifactDep(rootArtifact); - if (!excludeParentPoms && logTrees) { + if (!config.isExcludeParentPoms() && config.isLogTrees()) { extDep.logBomImportsAndParents(); } for (DependencyNode d : root.getChildren()) { @@ -627,13 +424,13 @@ private void processRootArtifact(List managedDeps, ArtifactCoords ro } processNodes(extDep, d, 1, false); } - } else if (logRemaining) { + } else if (config.isLogRemaining()) { for (DependencyNode d : root.getChildren()) { processNodes(null, d, 1, true); } } - if (logTrees) { + if (config.isLogTrees()) { logComment(""); } } @@ -646,7 +443,7 @@ private static DefaultArtifact toAetherArtifact(ArtifactCoords a) { private void initReleaseRepos() { - final ReleaseIdResolver idResolver = newReleaseIdResolver(resolver, log, validateCodeRepoTags, + final ReleaseIdResolver idResolver = newReleaseIdResolver(resolver, log, config.isValidateCodeRepoTags(), getRhCoordsUpstreamVersions()); final Map artifactReleases = new HashMap<>(); @@ -858,15 +655,18 @@ private static List toSortedStrings(Collection coords, b } private PrintStream getOutput() { - if (outputFile == null) { + if (logOutputFile == null) { return System.out; } if (fileOutput == null) { - outputFile.getAbsoluteFile().getParentFile().mkdirs(); try { - fileOutput = new PrintStream(new FileOutputStream(outputFile, appendOutput), false); - } catch (FileNotFoundException e) { - throw new RuntimeException("Failed to open " + outputFile + " for writing", e); + Files.createDirectories(logOutputFile.getParent()); + final OpenOption[] oo = appendOutput + ? new OpenOption[] { StandardOpenOption.CREATE, StandardOpenOption.APPEND } + : new OpenOption[] { StandardOpenOption.CREATE }; + fileOutput = new PrintStream(Files.newOutputStream(logOutputFile, oo), false); + } catch (Exception e) { + throw new RuntimeException("Failed to open " + logOutputFile + " for writing", e); } } return fileOutput; @@ -888,9 +688,9 @@ private void processNodes(ArtifactDependency parent, DependencyNode node, int le ArtifactDependency artDep = null; if (remaining) { addToRemaining(coords); - } else if (this.level < 0 || level <= this.level) { + } else if (config.getLevel() < 0 || level <= config.getLevel()) { if (addDependencyToBuild(coords)) { - if (logTrees) { + if (config.isLogTrees()) { final StringBuilder buf = new StringBuilder(); for (int i = 0; i < level; ++i) { buf.append(" "); @@ -904,18 +704,18 @@ private void processNodes(ArtifactDependency parent, DependencyNode node, int le if (parent != null) { artDep = getOrCreateArtifactDep(coords); parent.addDependency(artDep); - if (logTrees) { + if (config.isLogTrees()) { artDep.logBomImportsAndParents(level + 1); } } - } else if (logRemaining) { + } else if (config.isLogRemaining()) { remaining = true; } else { return; } } else { addToSkipped(coords); - if (logRemaining) { + if (config.isLogRemaining()) { remaining = true; addToRemaining(coords); } else { @@ -931,7 +731,7 @@ private boolean addDependencyToBuild(ArtifactCoords coords) { if (!addArtifactToBuild(coords)) { return false; } - if (!excludeParentPoms) { + if (!config.isExcludeParentPoms()) { addImportedBomsAndParentPomToBuild(coords); } return true; @@ -943,8 +743,8 @@ private boolean addArtifactToBuild(ArtifactCoords coords) { nonManagedVisited.add(coords); } - if (managed || includeNonManaged || isIncluded(coords) - || !excludeParentPoms && coords.getType().equals(ArtifactCoords.TYPE_POM)) { + if (managed || config.isIncludeNonManaged() || isIncluded(coords) + || !config.isExcludeParentPoms() && coords.getType().equals(ArtifactCoords.TYPE_POM)) { allDepsToBuild.add(coords); skippedDeps.remove(coords); remainingDeps.remove(coords); @@ -952,7 +752,7 @@ private boolean addArtifactToBuild(ArtifactCoords coords) { } addToSkipped(coords); - if (logRemaining) { + if (config.isLogRemaining()) { addToRemaining(coords); } return false; @@ -1001,7 +801,7 @@ private Map addImportedBomsAndParentPomToBuild(ArtifactCoords co } } - if (excludeBomImports) { + if (config.isExcludeBomImports()) { return Map.of(); } Map pomProps = toMap(model.getProperties()); diff --git a/deps-to-build/api/src/main/java/io/quarkus/dependency/ParallelExecution.java b/deps-to-build/api/src/main/java/io/quarkus/dependency/ParallelExecution.java index a553b6cc..b333ff40 100644 --- a/deps-to-build/api/src/main/java/io/quarkus/dependency/ParallelExecution.java +++ b/deps-to-build/api/src/main/java/io/quarkus/dependency/ParallelExecution.java @@ -2,6 +2,7 @@ import io.quarkus.bom.decomposer.ReleaseId; import io.quarkus.bom.decomposer.ReleaseOrigin; +import io.quarkus.bom.decomposer.maven.ProjectDependencyConfig; import io.quarkus.bom.decomposer.maven.ProjectDependencyResolver; import io.quarkus.bom.decomposer.maven.ReleaseRepo; import io.quarkus.bootstrap.resolver.maven.BootstrapMavenException; @@ -40,11 +41,26 @@ public static void main(String[] args) throws Exception { final Path workDir = Path.of("target").resolve("parallel-build").normalize().toAbsolutePath(); IoUtils.recursiveDelete(workDir); + final Path configFile = generateConfig(workDir.resolve("dependency-config.yaml")); ParallelExecution pe = new ParallelExecution(workDir); - pe.run(); + pe.run(configFile); + } + + private static Path generateConfig(Path configFile) throws Exception { + ProjectDependencyConfig.builder() + .setProjectBom(ArtifactCoords.pom("io.vertx", "vertx-dependencies", "4.3.4")) + .setExcludeGroupIds(Set.of( + "org.junit.platform", + "org.junit.jupiter")) + .setWarnOnResolutionErrors(true) + .setLogCodeRepos(true) + .setLogArtifactsToBuild(true) + .setLogModulesToBuild(true) + .setLogSummary(true) + .persist(configFile); + return configFile; } - private final Path workDir; private final Path localMavenRepo; private final Path projects; private MavenArtifactResolver resolver; @@ -56,20 +72,20 @@ public static void main(String[] args) throws Exception { private final AtomicInteger projectsRemaining = new AtomicInteger(); ParallelExecution(Path workDir) throws Exception { - this.workDir = IoUtils.mkdirs(workDir); this.localMavenRepo = IoUtils.mkdirs(workDir.resolve("maven-repo")); this.projects = IoUtils.mkdirs(workDir.resolve("projects")); } - void run() throws Exception { + void run(Path configFile) throws Exception { + run(ProjectDependencyConfig.fromFile(configFile)); + } + + void run(ProjectDependencyConfig config) throws Exception { resolver = MavenArtifactResolver.builder().build(); final Collection allRepos = ProjectDependencyResolver.builder() - .setProjectBom(ArtifactCoords.pom("io.vertx", "vertx-dependencies", "4.3.4")) - //.setProjectBom(ArtifactCoords.pom("io.quarkus", "quarkus-bom", "2.13.4.Final")) - .setWarnOnResolutionErrors(true) - .setLogCodeRepos(true) + .setDependencyConfig(config) .setArtifactResolver(resolver) .build() .getSortedReleaseRepos(); diff --git a/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/BaseDepsToBuildCommand.java b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/BaseDepsToBuildCommand.java index f33a1572..4d2855a8 100644 --- a/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/BaseDepsToBuildCommand.java +++ b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/BaseDepsToBuildCommand.java @@ -1,5 +1,6 @@ package io.quarkus.platform.depstobuild; +import io.quarkus.bom.decomposer.maven.ProjectDependencyConfig; import io.quarkus.bom.decomposer.maven.ProjectDependencyResolver; import io.quarkus.maven.dependency.ArtifactCoords; import java.io.File; @@ -87,51 +88,61 @@ public class BaseDepsToBuildCommand implements Callable { "--include-already-built" }, description = "Whether to include dependencies that have already been built") public boolean includeAlreadyBuilt; + @CommandLine.Option(names = { + "--export-config-to" }, description = "Export config to a file") + public File exportTo; + @Override public Integer call() throws Exception { - ProjectDependencyResolver.Builder builder = ProjectDependencyResolver.builder(); + final ProjectDependencyConfig.Mutable config = ProjectDependencyConfig.builder(); if (bom != null) { - builder.setProjectBom(ArtifactCoords.fromString(bom)); + config.setProjectBom(ArtifactCoords.fromString(bom)); } if (warnOnResolutionErrors != null) { - builder.setWarnOnResolutionErrors(warnOnResolutionErrors); + config.setWarnOnResolutionErrors(warnOnResolutionErrors); } else if (bom != null) { - builder.setWarnOnResolutionErrors(true); + config.setWarnOnResolutionErrors(true); } if (includeNonManaged != null) { - builder.setIncludeNonManaged(includeNonManaged); + config.setIncludeNonManaged(includeNonManaged); } else if (bom == null) { - builder.setIncludeNonManaged(true); + config.setIncludeNonManaged(true); } - builder.setAppendOutput(appendOutput) - .setExcludeArtifacts(Set.of()) // TODO + config.setExcludePatterns(Set.of()) // TODO .setExcludeBomImports(excludeBomImports) .setExcludeGroupIds(Set.of()) // TODO .setExcludeKeys(Set.of()) // TODO .setExcludeParentPoms(excludeParentPoms) - .setIncludeAlreadyBuilt(includeAlreadyBuilt) .setIncludeArtifacts(Set.of()) // TODO .setIncludeGroupIds(Set.of()) // TODO .setIncludeKeys(Set.of()) // TODO .setLevel(level) .setLogArtifactsToBuild(logArtifactsToBuild) - .setLogCodeRepoGraph(logCodeRepoGraph) + .setLogCodeRepoTree(logCodeRepoGraph) .setLogCodeRepos(logCodeRepos) .setLogModulesToBuild(logModulesToBuild) .setLogNonManagedVisited(logNonManagedVisited) .setLogRemaining(logRemaining) .setLogSummary(logSummary) .setLogTrees(logTrees) - .setOutputFile(outputFile) .setProjectArtifacts( rootArtifacts.stream().map(ArtifactCoords::fromString).collect(Collectors.toList())) .setValidateCodeRepoTags(validateCodeRepoTags) - .build().log(); - + .setIncludeAlreadyBuilt(includeAlreadyBuilt); + + if (exportTo != null) { + config.persist(exportTo.toPath()); + } else { + ProjectDependencyResolver.builder() + .setLogOutputFile(outputFile == null ? null : outputFile.toPath()) + .setAppendOutput(appendOutput) + .setDependencyConfig(config) + .build().log(); + } return CommandLine.ExitCode.OK; } } diff --git a/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/EntryCommand.java b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/EntryCommand.java index 74ed9a90..983cd1f8 100644 --- a/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/EntryCommand.java +++ b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/EntryCommand.java @@ -6,7 +6,7 @@ @TopCommand @CommandLine.Command(mixinStandardHelpOptions = true, subcommands = { FromMaven.class, FromGradle.class, - Project.class }) + FromConfig.class, Project.class }) public class EntryCommand { } diff --git a/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/FromConfig.java b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/FromConfig.java new file mode 100644 index 00000000..ef68f9ca --- /dev/null +++ b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/FromConfig.java @@ -0,0 +1,35 @@ +package io.quarkus.platform.depstobuild; + +import io.quarkus.bom.decomposer.maven.ProjectDependencyConfig; +import io.quarkus.bom.decomposer.maven.ProjectDependencyResolver; +import java.io.File; +import java.util.concurrent.Callable; +import picocli.CommandLine; + +@CommandLine.Command(name = "from-config") +public class FromConfig implements Callable { + + @CommandLine.Option(paramLabel = "CONFIG", names = { + "--config" }, description = "Project dependency configuration.", required = true) + public File configFile; + + @CommandLine.Option(order = 1, names = { + "--output-file" }, description = "If specified, this parameter will cause the output to be written to the path specified, instead of writing to the console.") + public File outputFile; + + @CommandLine.Option(order = 2, names = { + "--append-output" }, description = "Whether to append outputs into the output file or overwrite it.") + public boolean appendOutput; + + @Override + public Integer call() throws Exception { + + ProjectDependencyResolver.builder() + .setLogOutputFile(outputFile == null ? null : outputFile.toPath()) + .setAppendOutput(appendOutput) + .setDependencyConfig(ProjectDependencyConfig.fromFile(configFile.toPath())) + .build().log(); + + return CommandLine.ExitCode.OK; + } +} diff --git a/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/gradle/FromGradle.java b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/gradle/FromGradle.java index 22e921ef..87692aa2 100644 --- a/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/gradle/FromGradle.java +++ b/deps-to-build/app/src/main/java/io/quarkus/platform/depstobuild/gradle/FromGradle.java @@ -62,7 +62,7 @@ public Integer call() throws Exception { //final PublishedProject project = getPublishedProject("grpc-java", "1.50.2"); //final PublishedProject project = getPublishedProject("graphql-java", "19.2.0"); final PublishedProject project = getPublishedProject(projectDir, tag); - + /* @formatter:off System.out.println("Published artifacts:"); if (project.getBoms().isEmpty()) { log(" BOMs: none"); @@ -80,6 +80,7 @@ public Integer call() throws Exception { log(" " + c.toCompactCoords()); } } +@formatter:on */ if (this.rootArtifacts.isEmpty()) { this.rootArtifacts = project.getLibraries().stream().map(ArtifactCoords::toString).collect(Collectors.toList()); diff --git a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/DependenciesToBuildMojo.java b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/DependenciesToBuildMojo.java index 2ccf9711..bb016ef2 100644 --- a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/DependenciesToBuildMojo.java +++ b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/DependenciesToBuildMojo.java @@ -1,7 +1,7 @@ package io.quarkus.bom.decomposer.maven; import io.quarkus.bom.decomposer.maven.platformgen.PlatformConfig; -import io.quarkus.bom.platform.ProjectDependencyConfig; +import io.quarkus.bom.platform.ProjectDependencyFilterConfig; import io.quarkus.bootstrap.BootstrapConstants; import io.quarkus.bootstrap.resolver.maven.BootstrapMavenException; import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver; @@ -156,7 +156,7 @@ public class DependenciesToBuildMojo extends AbstractMojo { PlatformConfig platformConfig; @Parameter(required = false) - ProjectDependencyConfig dependenciesToBuild; + ProjectDependencyFilterConfig dependenciesToBuild; @Parameter(required = false, property = "validateCodeRepoTags") boolean validateCodeRepoTags; @@ -311,32 +311,33 @@ public void execute() throws MojoExecutionException, MojoFailureException { final Extension ext = supported.get(coords); return ext == null ? targetBomManagedDeps : getConstraintsForExtension(ext); }) - .setProjectArtifacts(topArtifacts) - .setProjectBom(targetBomCoords) - .setIncludeAlreadyBuilt(includeAlreadyBuilt) - .setIncludeGroupIds(dependenciesToBuild.getIncludeGroupIds()) - .setIncludeKeys(dependenciesToBuild.getIncludeKeys()) - .setIncludeArtifacts(dependenciesToBuild.getIncludeArtifacts()) - .setExcludeArtifacts(dependenciesToBuild.getExcludeArtifacts()) - .setExcludeGroupIds(dependenciesToBuild.getExcludeGroupIds()) - .setExcludeKeys(dependenciesToBuild.getExcludeKeys()) - .setExcludeBomImports(excludeBomImports) - .setExcludeParentPoms(excludeParentPoms) - .setIncludeNonManaged(includeNonManaged) - .setLevel(level) - .setLogArtifactsToBuild(logArtifactsToBuild) - .setLogCodeRepoGraph(logCodeRepoGraph) - .setLogCodeRepos(logCodeRepos) - .setLogModulesToBuild(logModulesToBuild) - .setLogNonManagedVisited(logNonManagedVisited) - .setLogRemaining(logRemaining) - .setLogSummary(logSummary) - .setLogTrees(logTrees) + .setArtifactResolver(resolver) .setMessageWriter(new MojoMessageWriter(getLog())) - .setOutputFile(outputFile) + .setLogOutputFile(outputFile == null ? null : outputFile.toPath()) .setAppendOutput(appendOutput) - .setArtifactResolver(resolver) - .setValidateCodeRepoTags(validateCodeRepoTags) + .setDependencyConfig(ProjectDependencyConfig.builder() + .setProjectArtifacts(topArtifacts) + .setProjectBom(targetBomCoords) + .setIncludeGroupIds(dependenciesToBuild.getIncludeGroupIds()) + .setIncludeKeys(dependenciesToBuild.getIncludeKeys()) + .setIncludeArtifacts(dependenciesToBuild.getIncludeArtifacts()) + .setExcludePatterns(dependenciesToBuild.getExcludeArtifacts()) + .setExcludeGroupIds(dependenciesToBuild.getExcludeGroupIds()) + .setExcludeKeys(dependenciesToBuild.getExcludeKeys()) + .setExcludeBomImports(excludeBomImports) + .setExcludeParentPoms(excludeParentPoms) + .setIncludeNonManaged(includeNonManaged) + .setLevel(level) + .setLogArtifactsToBuild(logArtifactsToBuild) + .setLogCodeRepoTree(logCodeRepoGraph) + .setLogCodeRepos(logCodeRepos) + .setLogModulesToBuild(logModulesToBuild) + .setLogNonManagedVisited(logNonManagedVisited) + .setLogRemaining(logRemaining) + .setLogSummary(logSummary) + .setLogTrees(logTrees) + .setIncludeAlreadyBuilt(includeAlreadyBuilt) + .setValidateCodeRepoTags(validateCodeRepoTags)) .build().log(); } diff --git a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/NonQuarkusDepsToBuildMojo.java b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/NonQuarkusDepsToBuildMojo.java index b1fa6d08..2a0f3025 100644 --- a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/NonQuarkusDepsToBuildMojo.java +++ b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/NonQuarkusDepsToBuildMojo.java @@ -197,31 +197,32 @@ public void execute() throws MojoExecutionException, MojoFailureException { } ProjectDependencyResolver.builder() - .setProjectBom(targetBomCoords) - .setProjectArtifacts( - topLevelArtifactsToBuild.stream().map(ArtifactCoords::fromString).collect(Collectors.toList())) - .setIncludeGroupIds(includeGroupIds) - .setIncludeKeys(toKeySet(includeKeys)) - .setExcludeArtifacts(toCoordsSet(excludeArtifacts)) - .setExcludeGroupIds(excludeGroupIds) - .setExcludeKeys(toKeySet(excludeKeys)) - .setExcludeBomImports(excludeBomImports) - .setExcludeParentPoms(excludeParentPoms) - .setIncludeNonManaged(includeNonManaged) - .setLevel(level) - .setLogArtifactsToBuild(logArtifactsToBuild) - .setLogCodeRepoGraph(logCodeRepoGraph) - .setLogCodeRepos(logCodeRepos) - .setLogModulesToBuild(logModulesToBuild) - .setLogNonManagedVisited(logNonManagedVisited) - .setLogRemaining(logRemaining) - .setLogSummary(logSummary) - .setLogTrees(logTrees) + .setArtifactResolver(resolver) .setMessageWriter(new MojoMessageWriter(getLog())) - .setOutputFile(outputFile) + .setLogOutputFile(outputFile == null ? null : outputFile.toPath()) .setAppendOutput(appendOutput) - .setValidateCodeRepoTags(validateCodeRepoTags) - .setArtifactResolver(resolver) + .setDependencyConfig(ProjectDependencyConfig.builder() + .setProjectBom(targetBomCoords) + .setProjectArtifacts( + topLevelArtifactsToBuild.stream().map(ArtifactCoords::fromString).collect(Collectors.toList())) + .setIncludeGroupIds(includeGroupIds) + .setIncludeKeys(toKeySet(includeKeys)) + .setExcludePatterns(toCoordsSet(excludeArtifacts)) + .setExcludeGroupIds(excludeGroupIds) + .setExcludeKeys(toKeySet(excludeKeys)) + .setExcludeBomImports(excludeBomImports) + .setExcludeParentPoms(excludeParentPoms) + .setIncludeNonManaged(includeNonManaged) + .setLevel(level) + .setLogArtifactsToBuild(logArtifactsToBuild) + .setLogCodeRepoTree(logCodeRepoGraph) + .setLogCodeRepos(logCodeRepos) + .setLogModulesToBuild(logModulesToBuild) + .setLogNonManagedVisited(logNonManagedVisited) + .setLogRemaining(logRemaining) + .setLogSummary(logSummary) + .setLogTrees(logTrees) + .setValidateCodeRepoTags(validateCodeRepoTags)) .build().log(); } diff --git a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/GeneratePlatformProjectMojo.java b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/GeneratePlatformProjectMojo.java index ccf6dfc4..861067a8 100644 --- a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/GeneratePlatformProjectMojo.java +++ b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/GeneratePlatformProjectMojo.java @@ -24,7 +24,7 @@ import io.quarkus.bom.platform.PlatformMemberConfig; import io.quarkus.bom.platform.PlatformMemberTestConfig; import io.quarkus.bom.platform.PlatformMemberTestConfig.Copy; -import io.quarkus.bom.platform.ProjectDependencyConfig; +import io.quarkus.bom.platform.ProjectDependencyFilterConfig; import io.quarkus.bom.platform.RedHatExtensionDependencyCheck; import io.quarkus.bom.platform.ReportIndexPageGenerator; import io.quarkus.bom.resolver.ArtifactResolver; @@ -153,7 +153,7 @@ public class GeneratePlatformProjectMojo extends AbstractMojo { private PlatformReleaseConfig platformReleaseConfig; @Parameter(required = false) - ProjectDependencyConfig dependenciesToBuild; + ProjectDependencyFilterConfig dependenciesToBuild; @Parameter(required = true, defaultValue = "${project.build.directory}/updated-pom.xml") File updatedPom; @@ -392,7 +392,7 @@ private void generateDepsToBuildModule(Model parentPom) throws MojoExecutionExce config.addChild( textDomElement("outputFile", prefix + "/" + m.generatedBomCoords().getArtifactId() + "-deps-to-build.txt")); - final ProjectDependencyConfig depsToBuildConfig = m.config().getDependenciesToBuild(); + final ProjectDependencyFilterConfig depsToBuildConfig = m.config().getDependenciesToBuild(); if (depsToBuildConfig != null) { final Xpp3Dom depsToBuildDom = newDomSelfAppend("dependenciesToBuild"); config.addChild(depsToBuildDom); diff --git a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/PncBuildConfigMojo.java b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/PncBuildConfigMojo.java index 1cb333e0..599b7e3a 100644 --- a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/PncBuildConfigMojo.java +++ b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/PncBuildConfigMojo.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import io.quarkus.bom.platform.PlatformMemberConfig; -import io.quarkus.bom.platform.ProjectDependencyConfig; +import io.quarkus.bom.platform.ProjectDependencyFilterConfig; import io.quarkus.maven.dependency.ArtifactCoords; import io.quarkus.registry.catalog.CatalogMapperHelper; import java.io.BufferedReader; @@ -65,7 +65,7 @@ private void configureDefaultRepoParams(final JsonNode repositoryGeneration) thr }); setIfNotConfigured(defaultParameters, "resolveIncludes", "*:*:*redhat-*"); - final ProjectDependencyConfig coreDepsToBuild = platformConfig.getCore().getDependenciesToBuild(); + final ProjectDependencyFilterConfig coreDepsToBuild = platformConfig.getCore().getDependenciesToBuild(); if (coreDepsToBuild != null && !coreDepsToBuild.getIncludeArtifacts().isEmpty()) { final ArrayNode steps = getOrCreateArray(repositoryGeneration, STEPS); JsonNode coreStep = null; @@ -89,7 +89,7 @@ private void configureDefaultRepoParams(final JsonNode repositoryGeneration) thr } } - private void addResolveArtifacts(final JsonNode parameters, final ProjectDependencyConfig depsToBuild) { + private void addResolveArtifacts(final JsonNode parameters, final ProjectDependencyFilterConfig depsToBuild) { setIfNotConfigured(parameters, "resolveArtifacts", () -> { final Iterator i = depsToBuild.getIncludeArtifacts().iterator(); final StringBuilder sb = new StringBuilder().append(toGATCV(i.next())); diff --git a/platform-bom/src/main/java/io/quarkus/bom/platform/PlatformMemberConfig.java b/platform-bom/src/main/java/io/quarkus/bom/platform/PlatformMemberConfig.java index c62c5dbd..c9091a12 100644 --- a/platform-bom/src/main/java/io/quarkus/bom/platform/PlatformMemberConfig.java +++ b/platform-bom/src/main/java/io/quarkus/bom/platform/PlatformMemberConfig.java @@ -31,7 +31,7 @@ public class PlatformMemberConfig { private RedHatExtensionDependencyCheck dependencyCheck; - private ProjectDependencyConfig depsToBuild; + private ProjectDependencyFilterConfig depsToBuild; public void applyOverrides(PlatformMemberConfig overrides) { if (overrides.bom != null) { @@ -275,11 +275,11 @@ public ArtifactCoords getGeneratedBom(String defaultGroupId) { : ArtifactCoords.pom(coords.getGroupId(), coords.getArtifactId(), coords.getVersion()); } - public ProjectDependencyConfig getDependenciesToBuild() { + public ProjectDependencyFilterConfig getDependenciesToBuild() { return depsToBuild; } - public void setDependenciesToBuild(ProjectDependencyConfig depsToBuild) { + public void setDependenciesToBuild(ProjectDependencyFilterConfig depsToBuild) { this.depsToBuild = depsToBuild; } } diff --git a/platform-bom/src/main/java/io/quarkus/bom/platform/ProjectDependencyConfig.java b/platform-bom/src/main/java/io/quarkus/bom/platform/ProjectDependencyFilterConfig.java similarity index 96% rename from platform-bom/src/main/java/io/quarkus/bom/platform/ProjectDependencyConfig.java rename to platform-bom/src/main/java/io/quarkus/bom/platform/ProjectDependencyFilterConfig.java index c00a651e..acde4858 100644 --- a/platform-bom/src/main/java/io/quarkus/bom/platform/ProjectDependencyConfig.java +++ b/platform-bom/src/main/java/io/quarkus/bom/platform/ProjectDependencyFilterConfig.java @@ -5,7 +5,7 @@ import java.util.HashSet; import java.util.Set; -public class ProjectDependencyConfig { +public class ProjectDependencyFilterConfig { private Set excludeGroupIds = Set.of(); private Set excludeKeys = Set.of(); @@ -27,7 +27,7 @@ private static Set mergeIn(Set s1, Set s2) { return s1; } - public void merge(ProjectDependencyConfig other) { + public void merge(ProjectDependencyFilterConfig other) { excludeGroupIds = mergeIn(excludeGroupIds, other.excludeGroupIds); excludeKeys = mergeIn(excludeKeys, other.excludeKeys); excludeArtifacts = mergeIn(excludeArtifacts, other.excludeArtifacts);