From 2f2d65b7a3e7dd58a8dc0e295d339e8422f1bf46 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 12 Nov 2024 15:17:33 -0800 Subject: [PATCH] Allow multiple links in libraries DSL Update our libraries DSL to support multiple links with the same name. This will allow us to reference libraries that publish multiple API sites with each of their releases. See gh-41614 --- .../antora/AntoraAsciidocAttributes.java | 8 ++++---- .../boot/build/bom/BomExtension.java | 16 ++++++++++++--- .../boot/build/bom/CheckLinks.java | 4 ++-- .../boot/build/bom/Library.java | 20 ++++++++++++------- .../boot/build/bom/bomr/UpgradeBom.java | 8 +------- 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/antora/AntoraAsciidocAttributes.java b/buildSrc/src/main/java/org/springframework/boot/build/antora/AntoraAsciidocAttributes.java index 3648fe67b0e..93f18e8a022 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/antora/AntoraAsciidocAttributes.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/antora/AntoraAsciidocAttributes.java @@ -185,16 +185,16 @@ public class AntoraAsciidocAttributes { private void addUrlLibraryLinkAttributes(Map attributes) { Map packageAttributes = new LinkedHashMap<>(); this.libraries.forEach((library) -> { - String prefix = "url-" + library.getLinkRootName() + "-"; - library.getLinks().forEach((name, link) -> { - String linkName = prefix + name; + library.getLinks().forEach((name, links) -> links.forEach((link) -> { + String linkRootName = (link.rootName() != null) ? link.rootName() : library.getLinkRootName(); + String linkName = "url-" + linkRootName + "-" + name; attributes.put(linkName, link.url(library)); link.packages() .stream() .map(this::packageAttributeName) .forEach((packageAttributeName) -> packageAttributes.put(packageAttributeName, "{" + linkName + "}")); - }); + })); }); attributes.putAll(packageAttributes); } 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 a5c957430c8..6fed36d9bf8 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 @@ -256,7 +256,7 @@ public class BomExtension { private String linkRootName; - private final Map links = new HashMap<>(); + private final Map> links = new HashMap<>(); @Inject public LibraryHandler(Project project, String version) { @@ -459,7 +459,7 @@ public class BomExtension { public static class LinksHandler { - private final Map links = new HashMap<>(); + private final Map> links = new HashMap<>(); public void site(String linkTemplate) { site(asFactory(linkTemplate)); @@ -501,6 +501,10 @@ public class BomExtension { add("javadoc", linkFactory, packages); } + public void javadoc(String rootName, Function linkFactory, String... packages) { + add(rootName, "javadoc", linkFactory, packages); + } + public void releaseNotes(String linkTemplate) { releaseNotes(asFactory(linkTemplate)); } @@ -518,7 +522,13 @@ public class BomExtension { } public void add(String name, Function linkFactory, String[] packages) { - this.links.put(name, new Link(linkFactory, (packages != null) ? List.of(packages) : null)); + add(null, name, linkFactory, packages); + } + + private void add(String rootName, String name, Function linkFactory, + String[] packages) { + Link link = new Link(rootName, linkFactory, (packages != null) ? List.of(packages) : null); + this.links.computeIfAbsent(name, (key) -> new ArrayList<>()).add(link); } private Function asFactory(String linkTemplate) { diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckLinks.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckLinks.java index 18111fccf31..94c415144d3 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckLinks.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckLinks.java @@ -59,7 +59,7 @@ public abstract class CheckLinks extends DefaultTask { RestTemplate restTemplate = new RestTemplate(requestFactory); restTemplate.setErrorHandler(new IgnoringErrorHandler()); for (Library library : this.bom.getLibraries()) { - library.getLinks().forEach((name, link) -> { + library.getLinks().forEach((name, links) -> links.forEach((link) -> { URI uri; try { uri = new URI(link.url(library)); @@ -70,7 +70,7 @@ public abstract class CheckLinks extends DefaultTask { catch (URISyntaxException ex) { throw new RuntimeException(ex); } - }); + })); } } 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 77bf0c62c38..382c058630a 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 @@ -68,7 +68,7 @@ public class Library { private final String linkRootName; - private final Map links; + private final Map> links; /** * Create a new {@code Library} with the given {@code name}, {@code version}, and @@ -89,7 +89,7 @@ public class Library { */ public Library(String name, String calendarName, LibraryVersion version, List groups, List prohibitedVersions, boolean considerSnapshots, VersionAlignment versionAlignment, - String alignsWithBom, String linkRootName, Map links) { + String alignsWithBom, String linkRootName, Map> links) { this.name = name; this.calendarName = (calendarName != null) ? calendarName : name; this.version = version; @@ -148,16 +148,22 @@ public class Library { return this.alignsWithBom; } - public Map getLinks() { + public Map> getLinks() { return this.links; } public String getLinkUrl(String name) { - Link link = getLink(name); - return (link != null) ? link.url(this) : null; + List links = getLinks(name); + if (links == null || links.isEmpty()) { + return null; + } + if (links.size() > 1) { + throw new IllegalStateException("Expected a single '%s' link for %s".formatted(name, getName())); + } + return links.get(0).url(this); } - public Link getLink(String name) { + public List getLinks(String name) { return this.links.get(name); } @@ -524,7 +530,7 @@ public class Library { } - public record Link(Function factory, List packages) { + public record Link(String rootName, Function factory, List packages) { private static final Pattern PACKAGE_EXPAND = Pattern.compile("^(.*)\\[(.*)\\]$"); diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java index 5d44bed62b2..31db1352684 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java @@ -28,7 +28,6 @@ import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.springframework.boot.build.bom.BomExtension; import org.springframework.boot.build.bom.Library.LibraryVersion; -import org.springframework.boot.build.bom.Library.Link; import org.springframework.boot.build.bom.bomr.github.Issue; import org.springframework.boot.build.properties.BuildProperties; @@ -77,7 +76,7 @@ public abstract class UpgradeBom extends UpgradeDependencies { @Override protected String issueBody(Upgrade upgrade, Issue existingUpgrade) { LibraryVersion upgradeVersion = new LibraryVersion(upgrade.getVersion()); - String releaseNotesLink = getReleaseNotesLink(upgrade, upgradeVersion); + String releaseNotesLink = upgrade.getLibrary().getLinkUrl("releaseNotes"); List lines = new ArrayList<>(); String description = upgrade.getLibrary().getName() + " " + upgradeVersion; if (releaseNotesLink != null) { @@ -92,9 +91,4 @@ public abstract class UpgradeBom extends UpgradeDependencies { return String.join("\\r\\n\\r\\n", lines); } - private String getReleaseNotesLink(Upgrade upgrade, LibraryVersion upgradeVersion) { - Link releaseNotesLink = upgrade.getLibrary().getLink("releaseNotes"); - return (releaseNotesLink != null) ? releaseNotesLink.url(upgradeVersion) : null; - } - }