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