Skip to content

Commit c7c73be

Browse files
committed
Merge branch '3.3.x'
2 parents c7984c5 + c81913b commit c7c73be

File tree

10 files changed

+418
-87
lines changed

10 files changed

+418
-87
lines changed

buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.springframework.boot.build.bom.Library.VersionAlignment;
6767
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
6868
import org.springframework.boot.build.mavenplugin.MavenExec;
69+
import org.springframework.boot.build.properties.BuildProperties;
6970
import org.springframework.util.FileCopyUtils;
7071
import org.springframework.util.PropertyPlaceholderHelper;
7172
import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
@@ -78,22 +79,19 @@
7879
*/
7980
public class BomExtension {
8081

82+
private final Project project;
83+
84+
private final UpgradeHandler upgradeHandler;
85+
8186
private final Map<String, DependencyVersion> properties = new LinkedHashMap<>();
8287

8388
private final Map<String, String> artifactVersionProperties = new HashMap<>();
8489

8590
private final List<Library> libraries = new ArrayList<>();
8691

87-
private final UpgradeHandler upgradeHandler;
88-
89-
private final DependencyHandler dependencyHandler;
90-
91-
private final Project project;
92-
93-
public BomExtension(DependencyHandler dependencyHandler, Project project) {
94-
this.dependencyHandler = dependencyHandler;
95-
this.upgradeHandler = project.getObjects().newInstance(UpgradeHandler.class);
92+
public BomExtension(Project project) {
9693
this.project = project;
94+
this.upgradeHandler = project.getObjects().newInstance(UpgradeHandler.class, project);
9795
}
9896

9997
public List<Library> getLibraries() {
@@ -105,8 +103,9 @@ public void upgrade(Action<UpgradeHandler> action) {
105103
}
106104

107105
public Upgrade getUpgrade() {
108-
return new Upgrade(this.upgradeHandler.upgradePolicy, new GitHub(this.upgradeHandler.gitHub.organization,
109-
this.upgradeHandler.gitHub.repository, this.upgradeHandler.gitHub.issueLabels));
106+
GitHubHandler gitHub = this.upgradeHandler.gitHub;
107+
return new Upgrade(this.upgradeHandler.upgradePolicy,
108+
new GitHub(gitHub.organization, gitHub.repository, gitHub.issueLabels));
110109
}
111110

112111
public void library(String name, Action<LibraryHandler> action) {
@@ -196,30 +195,38 @@ private void putArtifactVersionProperty(String groupId, String artifactId, Strin
196195
}
197196

198197
private void addLibrary(Library library) {
198+
DependencyHandler dependencies = this.project.getDependencies();
199199
this.libraries.add(library);
200200
String versionProperty = library.getVersionProperty();
201201
if (versionProperty != null) {
202202
this.properties.put(versionProperty, library.getVersion().getVersion());
203203
}
204204
for (Group group : library.getGroups()) {
205205
for (Module module : group.getModules()) {
206-
putArtifactVersionProperty(group.getId(), module.getName(), module.getClassifier(), versionProperty);
207-
this.dependencyHandler.getConstraints()
208-
.add(JavaPlatformPlugin.API_CONFIGURATION_NAME, createDependencyNotation(group.getId(),
209-
module.getName(), library.getVersion().getVersion()));
206+
addModule(library, dependencies, versionProperty, group, module);
210207
}
211208
for (String bomImport : group.getBoms()) {
212-
putArtifactVersionProperty(group.getId(), bomImport, versionProperty);
213-
String bomDependency = createDependencyNotation(group.getId(), bomImport,
214-
library.getVersion().getVersion());
215-
this.dependencyHandler.add(JavaPlatformPlugin.API_CONFIGURATION_NAME,
216-
this.dependencyHandler.platform(bomDependency));
217-
this.dependencyHandler.add(BomPlugin.API_ENFORCED_CONFIGURATION_NAME,
218-
this.dependencyHandler.enforcedPlatform(bomDependency));
209+
addBomImport(library, dependencies, versionProperty, group, bomImport);
219210
}
220211
}
221212
}
222213

214+
private void addModule(Library library, DependencyHandler dependencies, String versionProperty, Group group,
215+
Module module) {
216+
putArtifactVersionProperty(group.getId(), module.getName(), module.getClassifier(), versionProperty);
217+
String constraint = createDependencyNotation(group.getId(), module.getName(),
218+
library.getVersion().getVersion());
219+
dependencies.getConstraints().add(JavaPlatformPlugin.API_CONFIGURATION_NAME, constraint);
220+
}
221+
222+
private void addBomImport(Library library, DependencyHandler dependencies, String versionProperty, Group group,
223+
String bomImport) {
224+
putArtifactVersionProperty(group.getId(), bomImport, versionProperty);
225+
String bomDependency = createDependencyNotation(group.getId(), bomImport, library.getVersion().getVersion());
226+
dependencies.add(JavaPlatformPlugin.API_CONFIGURATION_NAME, dependencies.platform(bomDependency));
227+
dependencies.add(BomPlugin.API_ENFORCED_CONFIGURATION_NAME, dependencies.enforcedPlatform(bomDependency));
228+
}
229+
223230
public static class LibraryHandler {
224231

225232
private final List<Group> groups = new ArrayList<>();
@@ -501,7 +508,12 @@ public static class UpgradeHandler {
501508

502509
private UpgradePolicy upgradePolicy;
503510

504-
private final GitHubHandler gitHub = new GitHubHandler();
511+
private final GitHubHandler gitHub;
512+
513+
@Inject
514+
public UpgradeHandler(Project project) {
515+
this.gitHub = new GitHubHandler(project);
516+
}
505517

506518
public void setPolicy(UpgradePolicy upgradePolicy) {
507519
this.upgradePolicy = upgradePolicy;
@@ -536,12 +548,18 @@ public GitHub getGitHub() {
536548

537549
public static class GitHubHandler {
538550

539-
private String organization = "spring-projects";
551+
private String organization;
540552

541-
private String repository = "spring-boot";
553+
private String repository;
542554

543555
private List<String> issueLabels;
544556

557+
public GitHubHandler(Project project) {
558+
BuildProperties buildProperties = BuildProperties.get(project);
559+
this.organization = buildProperties.gitHub().organization();
560+
this.repository = buildProperties.gitHub().repository();
561+
}
562+
545563
public void setOrganization(String organization) {
546564
this.organization = organization;
547565
}
@@ -558,9 +576,9 @@ public void setIssueLabels(List<String> issueLabels) {
558576

559577
public static final class GitHub {
560578

561-
private String organization = "spring-projects";
579+
private String organization;
562580

563-
private String repository = "spring-boot";
581+
private String repository;
564582

565583
private final List<String> issueLabels;
566584

buildSrc/src/main/java/org/springframework/boot/build/bom/BomPlugin.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ public void apply(Project project) {
6060
JavaPlatformExtension javaPlatform = project.getExtensions().getByType(JavaPlatformExtension.class);
6161
javaPlatform.allowDependencies();
6262
createApiEnforcedConfiguration(project);
63-
BomExtension bom = project.getExtensions()
64-
.create("bom", BomExtension.class, project.getDependencies(), project);
63+
BomExtension bom = project.getExtensions().create("bom", BomExtension.class, project);
6564
CheckBom checkBom = project.getTasks().create("bomrCheck", CheckBom.class, bom);
6665
project.getTasks().named("check").configure((check) -> check.dependsOn(checkBom));
6766
project.getTasks().create("bomrUpgrade", UpgradeBom.class, bom);

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MavenMetadataVersionResolver.java

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -30,11 +30,15 @@
3030
import javax.xml.xpath.XPathConstants;
3131
import javax.xml.xpath.XPathFactory;
3232

33+
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
3334
import org.w3c.dom.Document;
3435
import org.w3c.dom.NodeList;
3536
import org.xml.sax.InputSource;
3637

3738
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
39+
import org.springframework.http.HttpEntity;
40+
import org.springframework.http.HttpHeaders;
41+
import org.springframework.http.HttpMethod;
3842
import org.springframework.http.HttpStatus;
3943
import org.springframework.http.converter.StringHttpMessageConverter;
4044
import org.springframework.web.client.HttpClientErrorException;
@@ -50,42 +54,37 @@ final class MavenMetadataVersionResolver implements VersionResolver {
5054

5155
private final RestTemplate rest;
5256

53-
private final Collection<URI> repositoryUrls;
57+
private final Collection<MavenArtifactRepository> repositories;
5458

55-
MavenMetadataVersionResolver(Collection<URI> repositoryUrls) {
56-
this(new RestTemplate(Collections.singletonList(new StringHttpMessageConverter())), repositoryUrls);
59+
MavenMetadataVersionResolver(Collection<MavenArtifactRepository> repositories) {
60+
this(new RestTemplate(Collections.singletonList(new StringHttpMessageConverter())), repositories);
5761
}
5862

59-
MavenMetadataVersionResolver(RestTemplate restTemplate, Collection<URI> repositoryUrls) {
63+
MavenMetadataVersionResolver(RestTemplate restTemplate, Collection<MavenArtifactRepository> repositories) {
6064
this.rest = restTemplate;
61-
this.repositoryUrls = normalize(repositoryUrls);
62-
}
63-
64-
private Collection<URI> normalize(Collection<URI> uris) {
65-
return uris.stream().map(this::normalize).toList();
66-
}
67-
68-
private URI normalize(URI uri) {
69-
if ("/".equals(uri.getPath())) {
70-
return uri;
71-
}
72-
return URI.create(uri + "/");
65+
this.repositories = repositories;
7366
}
7467

7568
@Override
7669
public SortedSet<DependencyVersion> resolveVersions(String groupId, String artifactId) {
7770
Set<String> versions = new HashSet<>();
78-
for (URI repositoryUrl : this.repositoryUrls) {
79-
versions.addAll(resolveVersions(groupId, artifactId, repositoryUrl));
71+
for (MavenArtifactRepository repository : this.repositories) {
72+
versions.addAll(resolveVersions(groupId, artifactId, repository));
8073
}
8174
return versions.stream().map(DependencyVersion::parse).collect(Collectors.toCollection(TreeSet::new));
8275
}
8376

84-
private Set<String> resolveVersions(String groupId, String artifactId, URI repositoryUrl) {
77+
private Set<String> resolveVersions(String groupId, String artifactId, MavenArtifactRepository repository) {
8578
Set<String> versions = new HashSet<>();
86-
URI url = repositoryUrl.resolve(groupId.replace('.', '/') + "/" + artifactId + "/maven-metadata.xml");
79+
URI url = repository.getUrl().resolve(groupId.replace('.', '/') + "/" + artifactId + "/maven-metadata.xml");
8780
try {
88-
String metadata = this.rest.getForObject(url, String.class);
81+
HttpHeaders headers = new HttpHeaders();
82+
String username = repository.getCredentials().getUsername();
83+
if (username != null) {
84+
headers.setBasicAuth(username, repository.getCredentials().getPassword());
85+
}
86+
HttpEntity<Void> request = new HttpEntity<>(headers);
87+
String metadata = this.rest.exchange(url, HttpMethod.GET, request, String.class).getBody();
8988
Document metadataDocument = DocumentBuilderFactory.newInstance()
9089
.newDocumentBuilder()
9190
.parse(new InputSource(new StringReader(metadata)));
@@ -104,7 +103,7 @@ private Set<String> resolveVersions(String groupId, String artifactId, URI repos
104103
}
105104
catch (Exception ex) {
106105
System.err.println("Failed to resolve versions for module " + groupId + ":" + artifactId + " in repository "
107-
+ repositoryUrl + ": " + ex.getMessage());
106+
+ repository + ": " + ex.getMessage());
108107
}
109108
return versions;
110109
}

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021-2023 the original author or authors.
2+
* Copyright 2021-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,8 +16,8 @@
1616

1717
package org.springframework.boot.build.bom.bomr;
1818

19-
import java.net.URI;
2019
import java.time.OffsetDateTime;
20+
import java.util.Arrays;
2121
import java.util.List;
2222
import java.util.Map;
2323
import java.util.function.BiPredicate;
@@ -34,6 +34,10 @@
3434
import org.springframework.boot.build.bom.bomr.ReleaseSchedule.Release;
3535
import org.springframework.boot.build.bom.bomr.github.Milestone;
3636
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
37+
import org.springframework.boot.build.properties.BuildProperties;
38+
import org.springframework.boot.build.properties.BuildType;
39+
import org.springframework.boot.build.repository.SpringRepository;
40+
import org.springframework.boot.build.repository.SpringRepository.RepositoryType;
3741

3842
/**
3943
* A {@link Task} to move to snapshot dependencies.
@@ -44,12 +48,20 @@ public abstract class MoveToSnapshots extends UpgradeDependencies {
4448

4549
private static final Logger log = LoggerFactory.getLogger(MoveToSnapshots.class);
4650

47-
private final URI REPOSITORY_URI = URI.create("https://repo.spring.io/snapshot/");
48-
4951
@Inject
5052
public MoveToSnapshots(BomExtension bom) {
5153
super(bom, true);
52-
getRepositoryUris().add(this.REPOSITORY_URI);
54+
BuildType buildType = BuildProperties.get(this).buildType();
55+
getRepositoryNames().addAll(getSnapshotRepositoryNames(buildType));
56+
}
57+
58+
public static List<String> getSnapshotRepositoryNames(BuildType buildType) {
59+
return Arrays.stream(SpringRepository.values())
60+
.filter((repository) -> repository.getRepositoryType() == RepositoryType.SNAPSHOT)
61+
.filter((repository) -> repository.getBuildType() == BuildType.OPEN_SOURCE
62+
|| repository.getBuildType() == buildType)
63+
.map(SpringRepository::getName)
64+
.toList();
5365
}
5466

5567
@Override
@@ -83,26 +95,31 @@ protected boolean eligible(Library library) {
8395

8496
@Override
8597
protected List<BiPredicate<Library, DependencyVersion>> determineUpdatePredicates(Milestone milestone) {
86-
ReleaseSchedule releaseSchedule = new ReleaseSchedule();
87-
Map<String, List<Release>> releases = releaseSchedule.releasesBetween(OffsetDateTime.now(),
88-
milestone.getDueOn());
98+
return switch (BuildProperties.get(this).buildType()) {
99+
case OPEN_SOURCE -> determineOpenSourceUpdatePredicates(milestone);
100+
case COMMERCIAL -> super.determineUpdatePredicates(milestone);
101+
};
102+
}
103+
104+
private List<BiPredicate<Library, DependencyVersion>> determineOpenSourceUpdatePredicates(Milestone milestone) {
105+
Map<String, List<Release>> scheduledReleases = getScheduledOpenSourceReleases(milestone);
89106
List<BiPredicate<Library, DependencyVersion>> predicates = super.determineUpdatePredicates(milestone);
90107
predicates.add((library, candidate) -> {
91-
List<Release> releasesForLibrary = releases.get(library.getCalendarName());
92-
if (releasesForLibrary != null) {
93-
for (Release release : releasesForLibrary) {
94-
if (candidate.isSnapshotFor(release.getVersion())) {
95-
return true;
96-
}
97-
}
98-
}
99-
if (log.isInfoEnabled()) {
100-
log.info("Ignoring " + candidate + ". No release of " + library.getName() + " scheduled before "
101-
+ milestone.getDueOn());
108+
List<Release> releases = scheduledReleases.get(library.getCalendarName());
109+
boolean match = (releases != null)
110+
&& releases.stream().anyMatch((release) -> candidate.isSnapshotFor(release.getVersion()));
111+
if (log.isInfoEnabled() && !match) {
112+
log.info("Ignoring {}. No release of {} scheduled before {}", candidate, library.getName(),
113+
milestone.getDueOn());
102114
}
103-
return false;
115+
return match;
104116
});
105117
return predicates;
106118
}
107119

120+
private Map<String, List<Release>> getScheduledOpenSourceReleases(Milestone milestone) {
121+
ReleaseSchedule releaseSchedule = new ReleaseSchedule();
122+
return releaseSchedule.releasesBetween(OffsetDateTime.now(), milestone.getDueOn());
123+
}
124+
108125
}

0 commit comments

Comments
 (0)