From e9b6b5a9050a2b3aae4e1f62251db38b4e53cb8a Mon Sep 17 00:00:00 2001 From: kaajaln2 Date: Thu, 5 Feb 2026 15:56:45 -0500 Subject: [PATCH] =?UTF-8?q?GEODE-10534:=20Module=201:=20geode-management?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=09RestTemplateCluste?= =?UTF-8?q?rManagementServiceTransport.java=20=E2=97=8B=20Update=20RestTem?= =?UTF-8?q?plateClusterManagementServiceTransport=20to=20remove=20deprecat?= =?UTF-8?q?ed=20API=20usage=20=E2=97=8B=20Replaced=20deprecated=20SSLConne?= =?UTF-8?q?ctionSocketFactory=20with=20DefaultClientTlsStrategy=20and=20se?= =?UTF-8?q?tSSLSocketFactory=20with=20setTlsSocketStrategy=20Issue=201.2:?= =?UTF-8?q?=20Apache=20Commons=20Lang=20StringUtils=20=20=20Index.java=20?= =?UTF-8?q?=20=20=20=20=20Updated=20removeStart=20with=20string=20manipula?= =?UTF-8?q?tion=20code=20Module=202:=20geode-serialization=20=20=20=20DSFI?= =?UTF-8?q?DSerializerImpl.java=20=20=20=20=20=20=20Updated=20deprecated?= =?UTF-8?q?=20getProxyClass=20with=20newProxyInstance=20with=20a=20no-op?= =?UTF-8?q?=20handler=20=20=20=20Module=203:=20geode-deployment-legacy=20?= =?UTF-8?q?=20=20=20=20=20=20LegacyClasspathServiceImpl.java=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20Refactor=20proxy=20class=20creation=20to?= =?UTF-8?q?=20avoid=20deprecated=20Proxy.getProxyClass=20usage=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20Replaced=20usage=20of=20deprecated=20Proxy?= =?UTF-8?q?.getProxyClass=20with=20Proxy.newProxyInstance=20to=20obtain=20?= =?UTF-8?q?proxy=20class=20=20Module=204:=20geode-web-api=20=20=20=20=20?= =?UTF-8?q?=20=20=20SwaggerConfig.java=20=20=20=20=20=20=20=20=20=20No=20c?= =?UTF-8?q?hanges,=20can=20be=20updated=20when=20we=20move=20to=20Spring?= =?UTF-8?q?=20Framework=206.2+=20with=20UrlHandlerFilter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/LegacyClasspathServiceImpl.java | 14 +++++++++++++- ...tTemplateClusterManagementServiceTransport.java | 10 +++++----- .../geode/management/configuration/Index.java | 3 ++- .../internal/DSFIDSerializerImpl.java | 6 ++++-- .../internal/web/swagger/config/SwaggerConfig.java | 4 ++++ 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java b/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java index 8bb116dbc348..993018d0dadd 100644 --- a/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java +++ b/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java @@ -21,6 +21,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.MalformedURLException; import java.net.URL; @@ -232,7 +234,17 @@ public Class getProxyClass(final Class... classObjs) { for (ClassLoader classLoader : getClassLoaders()) { try { - return Proxy.getProxyClass(classLoader, classObjs); + // Proxy.getProxyClass is deprecated, so use the recommended way to create a proxy class. + // Only used to get the proxy class, so the handler can be a no-op. + InvocationHandler invocationHandler = new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] methodArgs) { + return null; + } + }; + // create a new Proxy instance to get the proxy class + Object proxy = Proxy.newProxyInstance(classLoader, classObjs, invocationHandler); + return proxy.getClass(); } catch (SecurityException sex) { // Continue to next classloader } catch (IllegalArgumentException iaex) { diff --git a/geode-management/src/main/java/org/apache/geode/management/api/RestTemplateClusterManagementServiceTransport.java b/geode-management/src/main/java/org/apache/geode/management/api/RestTemplateClusterManagementServiceTransport.java index dcb01f468945..dc14b4994ee1 100644 --- a/geode-management/src/main/java/org/apache/geode/management/api/RestTemplateClusterManagementServiceTransport.java +++ b/geode-management/src/main/java/org/apache/geode/management/api/RestTemplateClusterManagementServiceTransport.java @@ -30,7 +30,7 @@ import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; import org.apache.hc.client5.http.io.HttpClientConnectionManager; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy; import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -164,13 +164,13 @@ public void configureConnection(ConnectionConfig connectionConfig) { // Configure SSL context and hostname verifier (HttpClient 5.x approach) // Only configure SSL if we have a non-null SSL context if (connectionConfig.getSslContext() != null) { - SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory( + DefaultClientTlsStrategy sslSocketFactory = new DefaultClientTlsStrategy( connectionConfig.getSslContext(), connectionConfig.getHostnameVerifier()); HttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() - .setSSLSocketFactory(sslSocketFactory) + .setTlsSocketStrategy(sslSocketFactory) .build(); clientBuilder.setConnectionManager(connectionManager); @@ -178,13 +178,13 @@ public void configureConnection(ConnectionConfig connectionConfig) { // If only hostname verifier is set without SSL context, we need to use the default SSL // context try { - SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory( + DefaultClientTlsStrategy sslSocketFactory = new DefaultClientTlsStrategy( SSLContext.getDefault(), connectionConfig.getHostnameVerifier()); HttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() - .setSSLSocketFactory(sslSocketFactory) + .setTlsSocketStrategy(sslSocketFactory) .build(); clientBuilder.setConnectionManager(connectionManager); diff --git a/geode-management/src/main/java/org/apache/geode/management/configuration/Index.java b/geode-management/src/main/java/org/apache/geode/management/configuration/Index.java index 2e1c684916fd..03372f916863 100644 --- a/geode-management/src/main/java/org/apache/geode/management/configuration/Index.java +++ b/geode-management/src/main/java/org/apache/geode/management/configuration/Index.java @@ -88,7 +88,8 @@ public String getRegionName() { } String regionName = regionPath.trim().split(" ")[0]; - regionName = StringUtils.removeStart(regionName, SEPARATOR); + regionName = + regionName.startsWith(SEPARATOR) ? regionName.substring(SEPARATOR.length()) : regionName; if (regionName.contains(".")) { regionName = regionName.substring(0, regionName.indexOf('.')); } diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/internal/DSFIDSerializerImpl.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/internal/DSFIDSerializerImpl.java index beb9eb002031..4607f2513271 100644 --- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/internal/DSFIDSerializerImpl.java +++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/internal/DSFIDSerializerImpl.java @@ -340,9 +340,11 @@ public void register(int fixedId, Class fixed try { Constructor cons = fixedIdClass.getConstructor((Class[]) null); cons.setAccessible(true); - if (!cons.isAccessible()) { + //Based on canAccess doc - since this is constructor, the obj must be null + if (!cons.canAccess(null)) { throw new IllegalArgumentException( - "default constructor not accessible " + "for DSFID=" + fixedId + ": " + fixedIdClass); + "default constructor failed reflective access check (canAccess) for DSFID=" + + fixedId + ": " + fixedIdClass); } if (fixedId >= Byte.MIN_VALUE && fixedId <= Byte.MAX_VALUE) { int index = fixedId + Byte.MAX_VALUE + 1; diff --git a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/swagger/config/SwaggerConfig.java b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/swagger/config/SwaggerConfig.java index 43b007b5c4d8..b24aa9736850 100644 --- a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/swagger/config/SwaggerConfig.java +++ b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/swagger/config/SwaggerConfig.java @@ -59,6 +59,10 @@ public class SwaggerConfig implements WebApplicationInitializer, WebMvcConfigure @Override public void configurePathMatch(PathMatchConfigurer configurer) { PathPatternParser parser = new PathPatternParser(); + // When Geode requires Spring Framework 6.2+ as a minimum, this explicit PathPatternParser + // configuration for optional trailing slashes can be replaced by configuring UrlHandlerFilter + // (e.g., via a filter registration or equivalent configuration) to handle trailing-slash + // matching instead of customize it here in configurePathMatch. parser.setMatchOptionalTrailingSeparator(true); configurer.setPatternParser(parser); }