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
This commit is contained in:
Phillip Webb 2024-11-12 15:17:33 -08:00
parent 0bd1ff7747
commit 2f2d65b7a3
5 changed files with 33 additions and 23 deletions

View File

@ -185,16 +185,16 @@ public class AntoraAsciidocAttributes {
private void addUrlLibraryLinkAttributes(Map<String, String> attributes) {
Map<String, String> 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);
}

View File

@ -256,7 +256,7 @@ public class BomExtension {
private String linkRootName;
private final Map<String, Link> links = new HashMap<>();
private final Map<String, List<Link>> links = new HashMap<>();
@Inject
public LibraryHandler(Project project, String version) {
@ -459,7 +459,7 @@ public class BomExtension {
public static class LinksHandler {
private final Map<String, Link> links = new HashMap<>();
private final Map<String, List<Link>> 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<LibraryVersion, String> 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<LibraryVersion, String> 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<LibraryVersion, String> 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<LibraryVersion, String> asFactory(String linkTemplate) {

View File

@ -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);
}
});
}));
}
}

View File

@ -68,7 +68,7 @@ public class Library {
private final String linkRootName;
private final Map<String, Link> links;
private final Map<String, List<Link>> 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<Group> groups,
List<ProhibitedVersion> prohibitedVersions, boolean considerSnapshots, VersionAlignment versionAlignment,
String alignsWithBom, String linkRootName, Map<String, Link> links) {
String alignsWithBom, String linkRootName, Map<String, List<Link>> 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<String, Link> getLinks() {
public Map<String, List<Link>> getLinks() {
return this.links;
}
public String getLinkUrl(String name) {
Link link = getLink(name);
return (link != null) ? link.url(this) : null;
List<Link> 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<Link> getLinks(String name) {
return this.links.get(name);
}
@ -524,7 +530,7 @@ public class Library {
}
public record Link(Function<LibraryVersion, String> factory, List<String> packages) {
public record Link(String rootName, Function<LibraryVersion, String> factory, List<String> packages) {
private static final Pattern PACKAGE_EXPAND = Pattern.compile("^(.*)\\[(.*)\\]$");

View File

@ -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<String> 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;
}
}