From 9472418743c01de4a1aa4e4cade00452569a6a8f Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 13 Jun 2025 13:57:26 +0200 Subject: [PATCH] Upgrade to Spring Boot 3. Closes #66 --- pom.xml | 24 +++++------ .../data/release/build/BuildExecutor.java | 13 ++---- .../documentation/DocumentationCommands.java | 5 ++- .../DocumentationOperations.java | 13 +++--- .../data/release/git/GitProperties.java | 4 +- .../data/release/io/Workspace.java | 4 +- .../issues/github/GitHubProperties.java | 3 +- .../data/release/model/Password.java | 4 ++ ...onentsClientHttpRequestFactoryBuilder.java | 41 +++++++++++-------- 9 files changed, 57 insertions(+), 54 deletions(-) diff --git a/pom.xml b/pom.xml index f3fc53a..26ceb76 100644 --- a/pom.xml +++ b/pom.xml @@ -9,12 +9,12 @@ org.springframework.boot spring-boot-starter-parent - 2.7.6 + 3.5.0 2.0.0.RELEASE - 1.18.26 + 1.18.38 @@ -105,20 +105,20 @@ - org.apache.httpcomponents - httpclient + org.apache.httpcomponents.client5 + httpclient5 org.jsoup jsoup - 1.15.3 + 1.20.1 com.google.guava guava - 32.0.1-jre + 33.4.8-jre @@ -159,25 +159,25 @@ org.apache.maven.shared maven-invoker - 3.2.0 + 3.3.0 org.jgrapht jgrapht-core - 0.9.1 + 1.5.2 - com.github.tomakehurst + org.wiremock wiremock - 2.27.2 + 3.13.1 test - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api test diff --git a/src/main/java/org/springframework/data/release/build/BuildExecutor.java b/src/main/java/org/springframework/data/release/build/BuildExecutor.java index b82f43d..c6fe869 100644 --- a/src/main/java/org/springframework/data/release/build/BuildExecutor.java +++ b/src/main/java/org/springframework/data/release/build/BuildExecutor.java @@ -36,15 +36,14 @@ import java.util.function.Supplier; import java.util.stream.Collector; import java.util.stream.Collectors; -import javax.annotation.PreDestroy; - import org.apache.commons.io.IOUtils; + import org.springframework.data.release.infra.InfrastructureOperations; import org.springframework.data.release.io.Workspace; import org.springframework.data.release.model.JavaVersion; import org.springframework.data.release.model.Project; -import org.springframework.data.release.model.SupportedProject; import org.springframework.data.release.model.ProjectAware; +import org.springframework.data.release.model.SupportedProject; import org.springframework.data.release.utils.ListWrapperCollector; import org.springframework.data.util.Streamable; import org.springframework.plugin.core.PluginRegistry; @@ -64,11 +63,6 @@ class BuildExecutor { private final ExecutorService executor; private final Workspace workspace; - @PreDestroy - public void shutdown() { - executor.shutdown(); - } - /** * Selects the build system for each module contained in the given iteration and executes the given function for it * considering pre-requites, honoring the order. @@ -155,8 +149,7 @@ class BuildExecutor { .collect(toSummaryCollector()); } - private CompletableFuture run(M module, - BiFunction function) { + private CompletableFuture run(M module, BiFunction function) { Assert.notNull(module, "Module must not be null!"); diff --git a/src/main/java/org/springframework/data/release/documentation/DocumentationCommands.java b/src/main/java/org/springframework/data/release/documentation/DocumentationCommands.java index 8930c68..3e15b09 100644 --- a/src/main/java/org/springframework/data/release/documentation/DocumentationCommands.java +++ b/src/main/java/org/springframework/data/release/documentation/DocumentationCommands.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; + import org.springframework.data.release.CliComponent; import org.springframework.data.release.TimedCommand; import org.springframework.data.release.build.BuildOperations; @@ -44,7 +45,7 @@ import org.springframework.data.release.model.TrainIteration; import org.springframework.data.release.utils.ExecutionUtils; import org.springframework.data.release.utils.Logger; import org.springframework.data.util.Streamable; -import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; import org.springframework.shell.support.table.Table; @@ -168,7 +169,7 @@ public class DocumentationCommands extends TimedCommand { .thenComparing(CheckedLink::getUrl)).forEach(checkedLink -> { Ansi ansi = Ansi.ansi(); - HttpStatus status = checkedLink.getResult(); + HttpStatusCode status = checkedLink.getResult(); if (status.is2xxSuccessful()) { ansi.fg(Color.GREEN); } else if (status.is4xxClientError()) { diff --git a/src/main/java/org/springframework/data/release/documentation/DocumentationOperations.java b/src/main/java/org/springframework/data/release/documentation/DocumentationOperations.java index a3649cd..42b756d 100644 --- a/src/main/java/org/springframework/data/release/documentation/DocumentationOperations.java +++ b/src/main/java/org/springframework/data/release/documentation/DocumentationOperations.java @@ -40,6 +40,7 @@ import org.jsoup.select.Elements; import org.springframework.data.release.model.Project; import org.springframework.data.release.utils.Logger; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; @@ -86,7 +87,7 @@ class DocumentationOperations { return new ReportFlags(set); } - public boolean isIncluded(HttpStatus status) { + public boolean isIncluded(HttpStatusCode status) { if (flags.contains(ReportFlag.ALL)) { return true; @@ -125,7 +126,7 @@ class DocumentationOperations { return new PageStats(project, linkStats.filter(reportFlags)); } - public PageStats sort(Comparator comparator){ + public PageStats sort(Comparator comparator) { return new PageStats(project, linkStats.sort(comparator)); } @@ -150,7 +151,7 @@ class DocumentationOperations { public LinkStats filter(ReportFlags reportFlags) { List filtered = checkedLinks.stream().filter(entry -> { - HttpStatus status = entry.getResult(); + HttpStatusCode status = entry.getResult(); return reportFlags.isIncluded(status); }).collect(Collectors.toList()); @@ -168,7 +169,7 @@ class DocumentationOperations { @Value static class CheckedLink { String url; - HttpStatus result; + HttpStatusCode result; } @RequiredArgsConstructor @@ -198,7 +199,7 @@ class DocumentationOperations { logger.log(project, "Found %s links.", links.size()); - Map> resultMap = new LinkedHashMap<>(200); + Map> resultMap = new LinkedHashMap<>(200); links.forEach(link -> { String href = link.attr("href"); @@ -224,7 +225,7 @@ class DocumentationOperations { return stats; } - private void checkUrl(Map> resultMap, String url) { + private void checkUrl(Map> resultMap, String url) { resultMap.computeIfAbsent(url, key -> webClient.get().uri(url) .exchangeToMono(clientResponse -> clientResponse.toBodilessEntity().thenReturn(clientResponse.statusCode())) diff --git a/src/main/java/org/springframework/data/release/git/GitProperties.java b/src/main/java/org/springframework/data/release/git/GitProperties.java index aa33c73..85608b1 100644 --- a/src/main/java/org/springframework/data/release/git/GitProperties.java +++ b/src/main/java/org/springframework/data/release/git/GitProperties.java @@ -15,14 +15,14 @@ */ package org.springframework.data.release.git; +import jakarta.annotation.PostConstruct; import lombok.AccessLevel; import lombok.Data; import lombok.Getter; -import javax.annotation.PostConstruct; - import org.eclipse.jgit.transport.CredentialsProvider; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.data.release.model.Gpg; import org.springframework.data.release.model.Password; diff --git a/src/main/java/org/springframework/data/release/io/Workspace.java b/src/main/java/org/springframework/data/release/io/Workspace.java index 3b635da..f898d67 100644 --- a/src/main/java/org/springframework/data/release/io/Workspace.java +++ b/src/main/java/org/springframework/data/release/io/Workspace.java @@ -17,6 +17,7 @@ package org.springframework.data.release.io; import static org.springframework.data.release.utils.StreamUtils.*; +import jakarta.annotation.PostConstruct; import lombok.AccessLevel; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -38,10 +39,9 @@ import java.util.Scanner; import java.util.function.Predicate; import java.util.stream.Stream; -import javax.annotation.PostConstruct; - import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.data.release.model.Project; import org.springframework.data.release.model.Projects; import org.springframework.data.release.model.SupportedProject; import org.springframework.data.release.utils.Logger; diff --git a/src/main/java/org/springframework/data/release/issues/github/GitHubProperties.java b/src/main/java/org/springframework/data/release/issues/github/GitHubProperties.java index 6924b44..b5ed447 100644 --- a/src/main/java/org/springframework/data/release/issues/github/GitHubProperties.java +++ b/src/main/java/org/springframework/data/release/issues/github/GitHubProperties.java @@ -15,6 +15,7 @@ */ package org.springframework.data.release.issues.github; +import jakarta.annotation.PostConstruct; import lombok.AccessLevel; import lombok.Data; import lombok.Getter; @@ -22,8 +23,6 @@ import lombok.RequiredArgsConstructor; import java.util.List; -import javax.annotation.PostConstruct; - import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.data.release.git.GitProperties; import org.springframework.data.release.utils.HttpBasicCredentials; diff --git a/src/main/java/org/springframework/data/release/model/Password.java b/src/main/java/org/springframework/data/release/model/Password.java index 29698ed..275ea75 100644 --- a/src/main/java/org/springframework/data/release/model/Password.java +++ b/src/main/java/org/springframework/data/release/model/Password.java @@ -47,6 +47,10 @@ public class Password implements Masked { return new Password(password); } + public char[] toCharArray() { + return value.toCharArray(); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() diff --git a/src/main/java/org/springframework/data/release/utils/HttpComponentsClientHttpRequestFactoryBuilder.java b/src/main/java/org/springframework/data/release/utils/HttpComponentsClientHttpRequestFactoryBuilder.java index 70099c3..7155e7b 100644 --- a/src/main/java/org/springframework/data/release/utils/HttpComponentsClientHttpRequestFactoryBuilder.java +++ b/src/main/java/org/springframework/data/release/utils/HttpComponentsClientHttpRequestFactoryBuilder.java @@ -17,18 +17,19 @@ package org.springframework.data.release.utils; import java.io.IOException; import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.hc.client5.http.auth.AuthCache; +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.impl.auth.BasicAuthCache; +import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; +import org.apache.hc.client5.http.impl.auth.BasicScheme; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.protocol.HttpClientContext; +import org.apache.hc.core5.http.HttpHost; -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.AuthCache; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.BasicAuthCache; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; import org.springframework.data.util.Lazy; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; @@ -41,8 +42,8 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; */ public class HttpComponentsClientHttpRequestFactoryBuilder { - private final CredentialsProvider credsProvider = new BasicCredentialsProvider(); - private final AuthCache authCache = new BasicAuthCache(); + private final BasicCredentialsProvider credsProvider = new BasicCredentialsProvider(); + private final BasicAuthCache authCache = new BasicAuthCache(); private HttpComponentsClientHttpRequestFactoryBuilder() { @@ -93,15 +94,19 @@ public class HttpComponentsClientHttpRequestFactoryBuilder { return factory; } - private static void addPreemptiveAuth(CredentialsProvider credsProvider, AuthCache authCache, String requestUrl, + private static void addPreemptiveAuth(BasicCredentialsProvider credsProvider, AuthCache authCache, String requestUrl, HttpBasicCredentials credentials) { - HttpHost host = HttpHost.create(requestUrl); + try { + HttpHost host = HttpHost.create(requestUrl); - credsProvider.setCredentials(new AuthScope(host), - new UsernamePasswordCredentials(credentials.getUsername(), credentials.getPassword().toString())); + credsProvider.setCredentials(new AuthScope(host), + new UsernamePasswordCredentials(credentials.getUsername(), credentials.getPassword().toCharArray())); - authCache.put(host, new BasicScheme()); + authCache.put(host, new BasicScheme()); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e); + } } }