From 53997c2fa3ac52244c1012288a220fd897036def Mon Sep 17 00:00:00 2001 From: "Andrey Rusakov (andrey.rusakov@camptocamp.com)" Date: Thu, 4 Dec 2025 15:54:16 +0100 Subject: [PATCH 01/61] OpenRewrite config --- build.gradle | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/build.gradle b/build.gradle index 0ea89a6ab..c18e27f76 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { plugins { id("com.github.spotbugs") version "6.4.7" + id("org.openrewrite.rewrite") version("latest.release") } defaultTasks 'build' @@ -89,3 +90,16 @@ tasks.register('docs') { enabled = false } + +rewrite { + activeRecipe("org.openrewrite.java.spring.framework.UpgradeSpringFramework_7_0") + setExportDatatables(true) +} + +repositories { + mavenCentral() +} + +dependencies { + rewrite("org.openrewrite.recipe:rewrite-spring:6.19.0") +} From a11b240e5a3d8abcc6796a519d9a181d68be9372 Mon Sep 17 00:00:00 2001 From: "Andrey Rusakov (andrey.rusakov@camptocamp.com)" Date: Thu, 4 Dec 2025 16:04:57 +0100 Subject: [PATCH 02/61] OpenRewrite automated upgrade --- core/build.gradle | 17 ++--- .../http/ConfigFileResolvingRequest.java | 2 +- .../print/http/ConfigurableRequest.java | 4 +- .../mapfish/print/http/HttpCredential.java | 8 +-- .../org/mapfish/print/http/HttpProxy.java | 4 +- .../print/http/HttpRequestFetcher.java | 2 +- .../http/MfClientHttpRequestFactoryImpl.java | 64 +++++++++---------- .../print/http/MfCredentialsProvider.java | 10 +-- .../mapfish/print/http/MfRoutePlanner.java | 12 ++-- .../print/http/MfSSLSocketFactory.java | 8 +-- .../mapfish/print/http/UserAgentCreator.java | 2 +- .../print/map/geotools/FeaturesParser.java | 2 +- .../map/image/AbstractSingleImageLayer.java | 4 +- .../print/map/image/wms/WmsUtilities.java | 4 +- .../print/map/style/ParserPluginUtils.java | 2 +- .../mapfish/print/map/tiled/CoverageTask.java | 4 +- .../print/processor/ExecutionStats.java | 6 +- .../processor/http/matcher/MatchInfo.java | 2 +- .../processor/jasper/HttpImageResolver.java | 4 +- .../processor/jasper/LegendProcessor.java | 4 +- .../servlet/job/HibernateAccountingEntry.java | 2 +- .../print/url/data/DataUrlConnection.java | 2 +- .../mapfish/print/TestHttpClientFactory.java | 4 +- .../http/ConfigFileResolvingRequestTest.java | 6 +- .../print/http/HttpCredentialTest.java | 6 +- .../map/style/ParserPluginUtilsTest.java | 2 +- .../map/tiled/SingleTileLoaderTaskTest.java | 2 +- .../http/matcher/AddressHostMatcherTest.java | 2 +- .../http/matcher/DnsHostMatcherTest.java | 2 +- .../http/matcher/HostnameMatcherTest.java | 2 +- .../http/matcher/LocalHostMatcherTest.java | 2 +- docs/build.gradle | 8 +-- examples/build.gradle | 4 +- 33 files changed, 105 insertions(+), 104 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 1f82b982e..1bc83ff46 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -125,14 +125,14 @@ configurations { dependencies { implementation( - 'org.springframework:spring-context:5.3.39', - 'org.springframework:spring-web:5.3.39', - 'org.springframework:spring-webmvc:5.3.39', - 'org.springframework:spring-aspects:5.3.39', - 'org.springframework:spring-orm:5.3.39', - 'org.springframework:spring-jdbc:5.3.39', - 'org.springframework:spring-tx:5.3.39', - 'org.springframework:spring-test:5.3.39', + 'org.springframework:spring-context:7.0.1', + 'org.springframework:spring-web:7.0.1', + 'org.springframework:spring-webmvc:7.0.1', + 'org.springframework:spring-aspects:7.0.1', + 'org.springframework:spring-orm:7.0.1', + 'org.springframework:spring-jdbc:7.0.1', + 'org.springframework:spring-tx:7.0.1', + 'org.springframework:spring-test:7.0.1', 'org.springframework.security:spring-security-config:5.8.16', 'org.springframework.security:spring-security-web:5.8.16', 'com.thetransactioncompany:cors-filter:2.10', @@ -161,6 +161,7 @@ dependencies { 'org.geotools:gt-svg:34.1', 'org.geotools:gt-cql:34.1', ) + implementation "org.apache.httpcomponents.client5:httpclient5:5.4.4" jasper( 'ar.com.fdvs:DynamicJasper:5.3.9', 'com.itextpdf:itextpdf:5.5.13.4', diff --git a/core/src/main/java/org/mapfish/print/http/ConfigFileResolvingRequest.java b/core/src/main/java/org/mapfish/print/http/ConfigFileResolvingRequest.java index 304f1590e..9e308dec8 100644 --- a/core/src/main/java/org/mapfish/print/http/ConfigFileResolvingRequest.java +++ b/core/src/main/java/org/mapfish/print/http/ConfigFileResolvingRequest.java @@ -184,7 +184,7 @@ private ClientHttpResponse attemptToFetchResponse(final HttpHeaders headers) thr final int minStatusCodeError = HttpStatus.INTERNAL_SERVER_ERROR.value(); int rawStatusCode = minStatusCodeError; try { - rawStatusCode = response.getRawStatusCode(); + rawStatusCode = response.getStatusCode().value(); if (rawStatusCode < minStatusCodeError) { LOGGER.debug("Successfully fetched {}, with status code {}", getURI(), rawStatusCode); return response; diff --git a/core/src/main/java/org/mapfish/print/http/ConfigurableRequest.java b/core/src/main/java/org/mapfish/print/http/ConfigurableRequest.java index b30361916..e3e026910 100644 --- a/core/src/main/java/org/mapfish/print/http/ConfigurableRequest.java +++ b/core/src/main/java/org/mapfish/print/http/ConfigurableRequest.java @@ -1,6 +1,6 @@ package org.mapfish.print.http; -import org.apache.http.client.methods.HttpRequestBase; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; import org.mapfish.print.config.Configuration; import org.springframework.http.client.ClientHttpRequest; @@ -10,7 +10,7 @@ */ public interface ConfigurableRequest extends ClientHttpRequest { /** Obtain the request object. */ - HttpRequestBase getUnderlyingRequest(); + HttpUriRequestBase getUnderlyingRequest(); /** * Set the current configuration object. This should only be called by {@link diff --git a/core/src/main/java/org/mapfish/print/http/HttpCredential.java b/core/src/main/java/org/mapfish/print/http/HttpCredential.java index 63f8fe1e1..cda3bbf32 100644 --- a/core/src/main/java/org/mapfish/print/http/HttpCredential.java +++ b/core/src/main/java/org/mapfish/print/http/HttpCredential.java @@ -5,9 +5,9 @@ import java.net.UnknownHostException; import java.util.List; import javax.annotation.Nullable; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.Credentials; -import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.Credentials; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; import org.mapfish.print.config.Configuration; import org.mapfish.print.config.ConfigurationObject; import org.mapfish.print.processor.http.matcher.MatchInfo; @@ -113,6 +113,6 @@ public final Credentials toCredentials(final AuthScope authscope) { } else { passwordString = null; } - return new UsernamePasswordCredentials(this.username, passwordString); + return new UsernamePasswordCredentials(this.username, passwordString.toCharArray()); } } diff --git a/core/src/main/java/org/mapfish/print/http/HttpProxy.java b/core/src/main/java/org/mapfish/print/http/HttpProxy.java index eb0e1eb90..b95ce4dac 100644 --- a/core/src/main/java/org/mapfish/print/http/HttpProxy.java +++ b/core/src/main/java/org/mapfish/print/http/HttpProxy.java @@ -1,7 +1,7 @@ package org.mapfish.print.http; import java.util.List; -import org.apache.http.HttpHost; +import org.apache.hc.core5.http.HttpHost; import org.mapfish.print.config.Configuration; import org.mapfish.print.processor.http.matcher.URIMatcher; @@ -34,7 +34,7 @@ public final class HttpProxy extends HttpCredential { private String scheme; public HttpHost getHttpHost() { - return new HttpHost(this.host, this.port, getScheme()); + return new HttpHost(getScheme(), this.host, this.port); } private String getScheme() { diff --git a/core/src/main/java/org/mapfish/print/http/HttpRequestFetcher.java b/core/src/main/java/org/mapfish/print/http/HttpRequestFetcher.java index 51a81325f..18eb0e6ae 100644 --- a/core/src/main/java/org/mapfish/print/http/HttpRequestFetcher.java +++ b/core/src/main/java/org/mapfish/print/http/HttpRequestFetcher.java @@ -85,7 +85,7 @@ private final class CachedClientHttpResponse extends AbstractClientHttpResponse private CachedClientHttpResponse(final ClientHttpResponse originalResponse) throws IOException { this.headers = originalResponse.getHeaders(); - this.status = originalResponse.getRawStatusCode(); + this.status = originalResponse.getStatusCode().value(); this.statusText = originalResponse.getStatusText(); this.cachedFile = createCachedFile(originalResponse.getBody()); } diff --git a/core/src/main/java/org/mapfish/print/http/MfClientHttpRequestFactoryImpl.java b/core/src/main/java/org/mapfish/print/http/MfClientHttpRequestFactoryImpl.java index 50c04b769..6ba9d1db6 100644 --- a/core/src/main/java/org/mapfish/print/http/MfClientHttpRequestFactoryImpl.java +++ b/core/src/main/java/org/mapfish/print/http/MfClientHttpRequestFactoryImpl.java @@ -12,24 +12,24 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.apache.http.Header; -import org.apache.http.HeaderElement; -import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.HttpRequestBase; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.SystemDefaultDnsResolver; -import org.apache.http.protocol.HTTP; -import org.apache.http.protocol.HttpContext; +import org.apache.hc.client5.http.SystemDefaultDnsResolver; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HeaderElement; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpEntityContainer; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.io.entity.ByteArrayEntity; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.protocol.HttpContext; import org.mapfish.print.config.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,9 +85,9 @@ private static CloseableHttpClient createHttpClient( final int socketTimeout) { final RequestConfig requestConfig = RequestConfig.custom() - .setConnectionRequestTimeout(connectionRequestTimeout) - .setConnectTimeout(connectTimeout) - .setSocketTimeout(socketTimeout) + .setConnectionRequestTimeout(connectionRequestTimeout, TimeUnit.MILLISECONDS) + .setConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS) + .setResponseTimeout(socketTimeout, TimeUnit.MILLISECONDS) .build(); final HttpClientBuilder httpClientBuilder = @@ -116,7 +116,7 @@ private static CloseableHttpClient createHttpClient( @Nonnull public ConfigurableRequest createRequest( @Nonnull final URI uri, @Nonnull final HttpMethod httpMethod) { - HttpRequestBase httpRequest = (HttpRequestBase) createHttpUriRequest(httpMethod, uri); + HttpUriRequestBase httpRequest = (HttpUriRequestBase) createHttpUriRequest(httpMethod, uri); return new Request(getHttpClient(), httpRequest, createHttpContext(httpMethod, uri)); } @@ -146,14 +146,14 @@ public static final class Request extends AbstractClientHttpRequest implements ConfigurableRequest { private final HttpClient client; - private final HttpRequestBase request; + private final HttpUriRequestBase request; private final HttpContext context; private final ByteArrayOutputStream outputStream; private Configuration configuration; Request( @Nonnull final HttpClient client, - @Nonnull final HttpRequestBase request, + @Nonnull final HttpUriRequestBase request, @Nullable final HttpContext context) { this.client = client; this.request = request; @@ -173,7 +173,7 @@ public HttpContext getContext() { return this.context; } - public HttpRequestBase getUnderlyingRequest() { + public HttpUriRequestBase getUnderlyingRequest() { return this.request; } @@ -189,7 +189,7 @@ public String getMethodValue() { @Nonnull public URI getURI() { - return this.request.getURI(); + return this.request.getUri(); } @Nonnull @@ -211,19 +211,19 @@ protected Response executeInternal(@Nonnull final HttpHeaders headers) throws IO for (Map.Entry> entry : headers.entrySet()) { String headerName = entry.getKey(); - if (!headerName.equalsIgnoreCase(HTTP.CONTENT_LEN) - && !headerName.equalsIgnoreCase(HTTP.TRANSFER_ENCODING)) { + if (!headerName.equalsIgnoreCase(org.apache.hc.core5.http.HttpHeaders.CONTENT_LENGTH) + && !headerName.equalsIgnoreCase(org.apache.hc.core5.http.HttpHeaders.TRANSFER_ENCODING)) { for (String headerValue : entry.getValue()) { this.request.addHeader(headerName, headerValue); } } } - if (this.request instanceof HttpEntityEnclosingRequest entityEnclosingRequest) { + if (this.request instanceof HttpEntityContainer entityEnclosingRequest) { final HttpEntity requestEntity = new ByteArrayEntity(this.outputStream.toByteArray()); entityEnclosingRequest.setEntity(requestEntity); } - HttpResponse response = this.client.execute(this.request, this.context); - LOGGER.debug("Response: {} -- {}", response.getStatusLine().getStatusCode(), this.getURI()); + ClassicHttpResponse response = this.client.execute(this.request, this.context); + LOGGER.debug("Response: {} -- {}", response.getCode(), this.getURI()); return new Response(response); } @@ -232,24 +232,24 @@ protected Response executeInternal(@Nonnull final HttpHeaders headers) throws IO public static class Response extends AbstractClientHttpResponse { private static final Logger LOGGER = LoggerFactory.getLogger(Response.class); private static final AtomicInteger ID_COUNTER = new AtomicInteger(); - private final HttpResponse response; + private final ClassicHttpResponse response; private final int id = ID_COUNTER.incrementAndGet(); private InputStream inputStream; - Response(@Nonnull final HttpResponse response) { + Response(@Nonnull final ClassicHttpResponse response) { this.response = response; LOGGER.trace("Creating Http Response object: {}", this.id); } @Override public int getRawStatusCode() { - return this.response.getStatusLine().getStatusCode(); + return this.response.getCode(); } @Nonnull @Override public String getStatusText() { - return this.response.getStatusLine().getReasonPhrase(); + return this.response.getReasonPhrase(); } @Override diff --git a/core/src/main/java/org/mapfish/print/http/MfCredentialsProvider.java b/core/src/main/java/org/mapfish/print/http/MfCredentialsProvider.java index 2bf7719b8..98ee84a40 100644 --- a/core/src/main/java/org/mapfish/print/http/MfCredentialsProvider.java +++ b/core/src/main/java/org/mapfish/print/http/MfCredentialsProvider.java @@ -2,10 +2,10 @@ import java.util.ArrayList; import java.util.List; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.Credentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.impl.client.SystemDefaultCredentialsProvider; +import org.apache.hc.client5.http.auth.CredentialsProvider; +import org.apache.hc.client5.http.impl.auth.SystemDefaultCredentialsProvider; +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.Credentials; import org.mapfish.print.config.Configuration; /** @@ -13,7 +13,7 @@ * org.mapfish.print.http.MfClientHttpRequestFactoryImpl#CURRENT_CONFIGURATION}. * *

If authentication is not found in configuration then it will fall back to {@link - * org.apache.http.impl.client.SystemDefaultCredentialsProvider} + * org.apache.hc.client5.http.impl.auth.SystemDefaultCredentialsProvider} * *

{@link MfClientHttpRequestFactoryImpl.Request} will set the correct configuration before the * request is executed so that correct proxies will be set. diff --git a/core/src/main/java/org/mapfish/print/http/MfRoutePlanner.java b/core/src/main/java/org/mapfish/print/http/MfRoutePlanner.java index 68a571a35..dcd469867 100644 --- a/core/src/main/java/org/mapfish/print/http/MfRoutePlanner.java +++ b/core/src/main/java/org/mapfish/print/http/MfRoutePlanner.java @@ -6,11 +6,11 @@ import java.net.URISyntaxException; import java.net.UnknownHostException; import java.util.List; -import org.apache.http.HttpException; -import org.apache.http.HttpHost; -import org.apache.http.HttpRequest; -import org.apache.http.impl.conn.DefaultRoutePlanner; -import org.apache.http.protocol.HttpContext; +import org.apache.hc.client5.http.impl.routing.DefaultRoutePlanner; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.HttpException; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.protocol.HttpContext; import org.mapfish.print.config.Configuration; import org.mapfish.print.processor.http.matcher.MatchInfo; import org.springframework.http.HttpMethod; @@ -30,7 +30,7 @@ public MfRoutePlanner() { @Override protected HttpHost determineProxy( - final HttpHost target, final HttpRequest request, final HttpContext context) + final HttpHost target, final ClassicHttpRequest request, final HttpContext context) throws HttpException { Configuration config = MfClientHttpRequestFactoryImpl.getCurrentConfiguration(); if (config == null) { diff --git a/core/src/main/java/org/mapfish/print/http/MfSSLSocketFactory.java b/core/src/main/java/org/mapfish/print/http/MfSSLSocketFactory.java index ff52cda70..d761bb6fd 100644 --- a/core/src/main/java/org/mapfish/print/http/MfSSLSocketFactory.java +++ b/core/src/main/java/org/mapfish/print/http/MfSSLSocketFactory.java @@ -4,10 +4,10 @@ import java.net.InetSocketAddress; import java.net.Socket; import javax.net.ssl.SSLContext; -import org.apache.http.HttpHost; -import org.apache.http.conn.socket.LayeredConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.protocol.HttpContext; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.core5.http.protocol.HttpContext; import org.mapfish.print.config.Configuration; /** A ssl socket factory that obtains the keystore from the current configuration. */ diff --git a/core/src/main/java/org/mapfish/print/http/UserAgentCreator.java b/core/src/main/java/org/mapfish/print/http/UserAgentCreator.java index 6d1ca88a2..a6bc9af55 100644 --- a/core/src/main/java/org/mapfish/print/http/UserAgentCreator.java +++ b/core/src/main/java/org/mapfish/print/http/UserAgentCreator.java @@ -1,6 +1,6 @@ package org.mapfish.print.http; -import org.apache.http.util.VersionInfo; +import org.apache.hc.core5.util.VersionInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/org/mapfish/print/map/geotools/FeaturesParser.java b/core/src/main/java/org/mapfish/print/map/geotools/FeaturesParser.java index 65f9d9375..5ce2466d1 100644 --- a/core/src/main/java/org/mapfish/print/map/geotools/FeaturesParser.java +++ b/core/src/main/java/org/mapfish/print/map/geotools/FeaturesParser.java @@ -93,7 +93,7 @@ static CoordinateReferenceSystem parseCoordinateReferenceSystem( requestFactory.createRequest(new URI(uri), HttpMethod.GET); try (ClientHttpResponse response = request.execute()) { - if (response.getRawStatusCode() == HttpStatus.OK.value()) { + if (response.getStatusCode().value() == HttpStatus.OK.value()) { final String wkt = IOUtils.toString(response.getBody(), Constants.DEFAULT_ENCODING); try { diff --git a/core/src/main/java/org/mapfish/print/map/image/AbstractSingleImageLayer.java b/core/src/main/java/org/mapfish/print/map/image/AbstractSingleImageLayer.java index f7a7c43fb..69489e24c 100644 --- a/core/src/main/java/org/mapfish/print/map/image/AbstractSingleImageLayer.java +++ b/core/src/main/java/org/mapfish/print/map/image/AbstractSingleImageLayer.java @@ -198,7 +198,7 @@ private boolean isResponseStatusCodeValid( final String stringBody, final String baseMetricName) throws IOException { - if (httpResponse.getRawStatusCode() != HttpStatus.OK.value()) { + if (httpResponse.getStatusCode().value() != HttpStatus.OK.value()) { String message = String.format( """ @@ -209,7 +209,7 @@ private boolean isResponseStatusCodeValid( %s\ """, request.getURI(), - httpResponse.getRawStatusCode(), + httpResponse.getStatusCode().value(), HttpStatus.OK.value(), httpResponse.getStatusText(), String.join("\n", Utils.getPrintableHeadersList(request.getHeaders())), diff --git a/core/src/main/java/org/mapfish/print/map/image/wms/WmsUtilities.java b/core/src/main/java/org/mapfish/print/map/image/wms/WmsUtilities.java index ed3acf986..00c003ec6 100644 --- a/core/src/main/java/org/mapfish/print/map/image/wms/WmsUtilities.java +++ b/core/src/main/java/org/mapfish/print/map/image/wms/WmsUtilities.java @@ -14,8 +14,8 @@ import java.util.Collections; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.http.NameValuePair; -import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.hc.core5.net.URLEncodedUtils; +import org.apache.hc.core5.http.NameValuePair; import org.geotools.api.referencing.FactoryException; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.ows.wms.request.GetMapRequest; diff --git a/core/src/main/java/org/mapfish/print/map/style/ParserPluginUtils.java b/core/src/main/java/org/mapfish/print/map/style/ParserPluginUtils.java index 4fc4635c5..4b6b7c7a5 100644 --- a/core/src/main/java/org/mapfish/print/map/style/ParserPluginUtils.java +++ b/core/src/main/java/org/mapfish/print/map/style/ParserPluginUtils.java @@ -47,7 +47,7 @@ public static Optional