diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java index bc723493dd..57a16796ca 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java @@ -57,15 +57,11 @@ import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.springframework.boot.build.DeployedPlugin; -import org.springframework.boot.build.bom.Library.DependencyConstraintsDependencyVersions; -import org.springframework.boot.build.bom.Library.DependencyLockDependencyVersions; -import org.springframework.boot.build.bom.Library.DependencyVersions; import org.springframework.boot.build.bom.Library.Exclusion; import org.springframework.boot.build.bom.Library.Group; import org.springframework.boot.build.bom.Library.LibraryVersion; import org.springframework.boot.build.bom.Library.Module; import org.springframework.boot.build.bom.Library.ProhibitedVersion; -import org.springframework.boot.build.bom.Library.VersionAlignment; import org.springframework.boot.build.bom.bomr.version.DependencyVersion; import org.springframework.boot.build.mavenplugin.MavenExec; import org.springframework.util.FileCopyUtils; @@ -114,13 +110,10 @@ public class BomExtension { public void library(String name, String version, Action action) { ObjectFactory objects = this.project.getObjects(); - LibraryHandler libraryHandler = objects.newInstance(LibraryHandler.class, (version != null) ? version : "", - objects); + LibraryHandler libraryHandler = objects.newInstance(LibraryHandler.class, (version != null) ? version : ""); action.execute(libraryHandler); - LibraryVersion libraryVersion = new LibraryVersion(DependencyVersion.parse(libraryHandler.version), - libraryHandler.versionAlignment); - addLibrary(new Library(name, libraryVersion, libraryHandler.groups, libraryHandler.prohibitedVersions, - libraryHandler.dependencyVersions)); + LibraryVersion libraryVersion = new LibraryVersion(DependencyVersion.parse(libraryHandler.version)); + addLibrary(new Library(name, libraryVersion, libraryHandler.groups, libraryHandler.prohibitedVersions)); } public void effectiveBomArtifact() { @@ -220,25 +213,15 @@ public class BomExtension { private final List prohibitedVersions = new ArrayList<>(); - private final ObjectFactory objectFactory; - private String version; - private VersionAlignment versionAlignment; - - private DependencyVersions dependencyVersions; - @Inject - public LibraryHandler(String version, ObjectFactory objectFactory) { + public LibraryHandler(String version) { this.version = version; - this.objectFactory = objectFactory; } - public void version(String version, Action action) { + public void version(String version) { this.version = version; - VersionHandler versionHandler = new VersionHandler(); - action.execute(versionHandler); - this.versionAlignment = new VersionAlignment(versionHandler.libraryName); } public void group(String id, Action action) { @@ -255,23 +238,6 @@ public class BomExtension { handler.endsWith, handler.contains, handler.reason)); } - public void dependencyVersions(Action action) { - DependencyVersionsHandler dependencyVersionsHandler = this.objectFactory - .newInstance(DependencyVersionsHandler.class, this.version); - action.execute(dependencyVersionsHandler); - this.dependencyVersions = dependencyVersionsHandler.dependencyVersions; - } - - public static class VersionHandler { - - private String libraryName; - - public void shouldAlignWithVersionFrom(String libraryName) { - this.libraryName = libraryName; - } - - } - public static class ProhibitedHandler { private String reason; @@ -389,37 +355,6 @@ public class BomExtension { } - public static class DependencyVersionsHandler { - - private final String libraryVersion; - - private DependencyVersions dependencyVersions; - - @Inject - public DependencyVersionsHandler(String libraryVersion) { - this.libraryVersion = libraryVersion; - } - - public void extractFrom(Action action) { - action.execute(new ExtractFromHandler()); - } - - public class ExtractFromHandler { - - public void dependencyLock(String location) { - DependencyVersionsHandler.this.dependencyVersions = new DependencyLockDependencyVersions(location, - DependencyVersionsHandler.this.libraryVersion); - } - - public void dependencyConstraints(String location) { - DependencyVersionsHandler.this.dependencyVersions = new DependencyConstraintsDependencyVersions( - location, DependencyVersionsHandler.this.libraryVersion); - } - - } - - } - } public static class UpgradeHandler { diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java index b7a0bcea3b..b51cd42dd5 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java @@ -16,20 +16,11 @@ package org.springframework.boot.build.bom; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URI; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.maven.artifact.versioning.VersionRange; -import org.gradle.api.GradleException; import org.springframework.boot.build.bom.bomr.version.DependencyVersion; @@ -51,8 +42,6 @@ public class Library { private final List prohibitedVersions; - private final DependencyVersions dependencyVersions; - /** * Create a new {@code Library} with the given {@code name}, {@code version}, and * {@code groups}. @@ -60,17 +49,15 @@ public class Library { * @param version version of the library * @param groups groups in the library * @param prohibitedVersions version of the library that are prohibited - * @param dependencyVersions the library's dependency versions */ - public Library(String name, LibraryVersion version, List groups, List prohibitedVersions, - DependencyVersions dependencyVersions) { + public Library(String name, LibraryVersion version, List groups, + List prohibitedVersions) { this.name = name; this.version = version; this.groups = groups; this.versionProperty = "Spring Boot".equals(name) ? null : name.toLowerCase(Locale.ENGLISH).replace(' ', '-') + ".version"; this.prohibitedVersions = prohibitedVersions; - this.dependencyVersions = dependencyVersions; } public String getName() { @@ -93,10 +80,6 @@ public class Library { return this.prohibitedVersions; } - public DependencyVersions getDependencyVersions() { - return this.dependencyVersions; - } - /** * A version or range of versions that are prohibited from being used in a bom. */ @@ -147,21 +130,14 @@ public class Library { private final DependencyVersion version; - private final VersionAlignment versionAlignment; - - public LibraryVersion(DependencyVersion version, VersionAlignment versionAlignment) { + public LibraryVersion(DependencyVersion version) { this.version = version; - this.versionAlignment = versionAlignment; } public DependencyVersion getVersion() { return this.version; } - public VersionAlignment getVersionAlignment() { - return this.versionAlignment; - } - } /** @@ -276,128 +252,4 @@ public class Library { } - public interface DependencyVersions { - - String getVersion(String groupId, String artifactId); - - default boolean available() { - return true; - } - - } - - public static class DependencyLockDependencyVersions implements DependencyVersions { - - private final Map> dependencyVersions = new HashMap<>(); - - private final String sourceTemplate; - - private final String libraryVersion; - - public DependencyLockDependencyVersions(String sourceTemplate, String libraryVersion) { - this.sourceTemplate = sourceTemplate; - this.libraryVersion = libraryVersion; - } - - @Override - public boolean available() { - return !this.libraryVersion.contains("-SNAPSHOT"); - } - - @Override - public String getVersion(String groupId, String artifactId) { - if (this.dependencyVersions.isEmpty()) { - loadVersions(); - } - return this.dependencyVersions.computeIfAbsent(groupId, (key) -> Collections.emptyMap()).get(artifactId); - } - - private void loadVersions() { - String source = this.sourceTemplate.replace("", this.libraryVersion); - try { - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(URI.create(source).toURL().openStream()))) { - String line; - while ((line = reader.readLine()) != null) { - if (!line.startsWith("#")) { - String[] components = line.split(":"); - Map groupDependencies = this.dependencyVersions - .computeIfAbsent(components[0], (key) -> new HashMap<>()); - groupDependencies.put(components[1], components[2]); - } - } - } - } - catch (IOException ex) { - throw new GradleException("Failed to load versions from dependency lock file '" + source + "'", ex); - } - } - - } - - public static class DependencyConstraintsDependencyVersions implements DependencyVersions { - - private static final Pattern CONSTRAINT_PATTERN = Pattern.compile("api \"(.+):(.+):(.+)\""); - - private final Map> dependencyVersions = new HashMap<>(); - - private final String sourceTemplate; - - private final String libraryVersion; - - public DependencyConstraintsDependencyVersions(String sourceTemplate, String libraryVersion) { - this.sourceTemplate = sourceTemplate; - this.libraryVersion = libraryVersion; - } - - @Override - public String getVersion(String groupId, String artifactId) { - if (this.dependencyVersions.isEmpty()) { - loadVersions(); - } - return this.dependencyVersions.computeIfAbsent(groupId, (key) -> Collections.emptyMap()).get(artifactId); - } - - private void loadVersions() { - String version = this.libraryVersion; - if (version.endsWith("-SNAPSHOT")) { - version = version.substring(0, version.lastIndexOf('.')) + ".x"; - } - String source = this.sourceTemplate.replace("", version); - try { - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(URI.create(source).toURL().openStream()))) { - String line; - while ((line = reader.readLine()) != null) { - Matcher matcher = CONSTRAINT_PATTERN.matcher(line.trim()); - if (matcher.matches()) { - Map groupDependencies = this.dependencyVersions - .computeIfAbsent(matcher.group(1), (key) -> new HashMap<>()); - groupDependencies.put(matcher.group(2), matcher.group(3)); - } - } - } - } - catch (IOException ex) { - throw new GradleException( - "Failed to load versions from dependency constraints declared in '" + source + "'", ex); - } - } - - } - - public static class VersionAlignment { - - private final String libraryName; - - public VersionAlignment(String libraryName) { - this.libraryName = libraryName; - } - - public String getLibraryName() { - return this.libraryName; - } - - } - } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java index 03f6184dc5..31d6da0bc3 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java @@ -20,25 +20,20 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.SortedSet; import java.util.stream.Collectors; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; -import org.gradle.api.InvalidUserDataException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.build.bom.Library; -import org.springframework.boot.build.bom.Library.DependencyVersions; import org.springframework.boot.build.bom.Library.Group; import org.springframework.boot.build.bom.Library.Module; import org.springframework.boot.build.bom.Library.ProhibitedVersion; -import org.springframework.boot.build.bom.Library.VersionAlignment; import org.springframework.boot.build.bom.UpgradePolicy; import org.springframework.boot.build.bom.bomr.version.DependencyVersion; @@ -83,9 +78,6 @@ class StandardLibraryUpdateResolver implements LibraryUpdateResolver { } protected List getVersionOptions(Library library, Map libraries) { - if (library.getVersion().getVersionAlignment() != null) { - return determineAlignedVersionOption(library, libraries); - } return determineResolvedVersionOptions(library); } @@ -121,51 +113,6 @@ class StandardLibraryUpdateResolver implements LibraryUpdateResolver { .collect(Collectors.toList()); } - private List determineAlignedVersionOption(Library library, Map libraries) { - VersionOption alignedVersionOption = alignedVersionOption(library, libraries); - if (alignedVersionOption == null) { - return Collections.emptyList(); - } - if (!isPermitted(alignedVersionOption.getVersion(), library.getProhibitedVersions())) { - throw new InvalidUserDataException("Version alignment failed. Version " + alignedVersionOption.getVersion() - + " from " + library.getName() + " is prohibited"); - } - return Collections.singletonList(alignedVersionOption); - } - - private VersionOption alignedVersionOption(Library library, Map libraries) { - VersionAlignment versionAlignment = library.getVersion().getVersionAlignment(); - Library alignmentLibrary = libraries.get(versionAlignment.getLibraryName()); - DependencyVersions dependencyVersions = alignmentLibrary.getDependencyVersions(); - if (dependencyVersions == null) { - throw new InvalidUserDataException("Cannot align with library '" + versionAlignment.getLibraryName() - + "' as it does not define any dependency versions"); - } - if (!dependencyVersions.available()) { - return null; - } - Set versions = new HashSet<>(); - for (Group group : library.getGroups()) { - for (Module module : group.getModules()) { - String version = dependencyVersions.getVersion(group.getId(), module.getName()); - if (version != null) { - versions.add(version); - } - } - } - if (versions.isEmpty()) { - throw new InvalidUserDataException("Cannot align with library '" + versionAlignment.getLibraryName() - + "' as its dependency versions do not include any of this library's modules"); - } - if (versions.size() > 1) { - throw new InvalidUserDataException("Cannot align with library '" + versionAlignment.getLibraryName() - + "' as it uses multiple different versions of this library's modules"); - } - DependencyVersion version = DependencyVersion.parse(versions.iterator().next()); - return library.getVersion().getVersion().equals(version) ? null - : new VersionOption.AlignedVersionOption(version, alignmentLibrary); - } - private boolean isPermitted(DependencyVersion dependencyVersion, List prohibitedVersions) { for (ProhibitedVersion prohibitedVersion : prohibitedVersions) { String dependencyVersionToString = dependencyVersion.toString(); diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java index 31aa5d61bd..6c96ab74ef 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java @@ -46,31 +46,16 @@ class UpgradeApplicatorTests { @Test void whenUpgradeIsAppliedToLibraryWithVersionThenBomIsUpdated() throws IOException { - File bom = new File(this.temp, "bom.gradle"); - FileCopyUtils.copy(new File("src/test/resources/bom.gradle"), bom); - String originalContents = Files.readString(bom.toPath()); - File gradleProperties = new File(this.temp, "gradle.properties"); - FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties); - new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()).apply(new Upgrade( - new Library("ActiveMQ", new LibraryVersion(DependencyVersion.parse("5.15.11"), null), null, null, null), - DependencyVersion.parse("5.16"))); - String bomContents = Files.readString(bom.toPath()); - assertThat(bomContents).hasSize(originalContents.length() - 3); - } - - @Test - void whenUpgradeIsAppliedToLibraryWithAlignedVersionThenBomIsUpdated() throws IOException { File bom = new File(this.temp, "bom.gradle"); FileCopyUtils.copy(new File("src/test/resources/bom.gradle"), bom); String originalContents = Files.readString(bom.toPath()); File gradleProperties = new File(this.temp, "gradle.properties"); FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties); new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()).apply( - new Upgrade(new Library("OAuth2 OIDC SDK", new LibraryVersion(DependencyVersion.parse("8.36.1"), null), - null, null, null), DependencyVersion.parse("8.36.2"))); + new Upgrade(new Library("ActiveMQ", new LibraryVersion(DependencyVersion.parse("5.15.11")), null, null), + DependencyVersion.parse("5.16"))); String bomContents = Files.readString(bom.toPath()); - assertThat(bomContents).hasSameSizeAs(originalContents); - assertThat(bomContents).contains("version(\"8.36.2\")"); + assertThat(bomContents).hasSize(originalContents.length() - 3); } @Test @@ -79,9 +64,9 @@ class UpgradeApplicatorTests { FileCopyUtils.copy(new File("src/test/resources/bom.gradle"), bom); File gradleProperties = new File(this.temp, "gradle.properties"); FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties); - new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()).apply(new Upgrade( - new Library("Kotlin", new LibraryVersion(DependencyVersion.parse("1.3.70"), null), null, null, null), - DependencyVersion.parse("1.4"))); + new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()) + .apply(new Upgrade(new Library("Kotlin", new LibraryVersion(DependencyVersion.parse("1.3.70")), null, null), + DependencyVersion.parse("1.4"))); Properties properties = new Properties(); try (InputStream in = new FileInputStream(gradleProperties)) { properties.load(in);