diff --git a/eng/code-quality-reports/src/main/resources/revapi/revapi.json b/eng/code-quality-reports/src/main/resources/revapi/revapi.json index 7dba51f8db79..0935864e183f 100644 --- a/eng/code-quality-reports/src/main/resources/revapi/revapi.json +++ b/eng/code-quality-reports/src/main/resources/revapi/revapi.json @@ -303,6 +303,21 @@ "code" : "java.method.removed", "old" : "method void com.mysql.cj.protocol.ServerSession::setOldStatusFlags(int)", "justification" : "Fix method removed." + }, + { + "code" : "java.field.removed", + "old" : "field com.mysql.cj.conf.PropertyKey.ociConfigProfile", + "justification" : "Fix field removed." + }, + { + "code" : "java.method.addedToInterface", + "new" : "method int com.mysql.cj.protocol.ServerSession::getOldStatusFlags()", + "justification" : "Method was added to an interface." + }, + { + "code" : "java.method.addedToInterface", + "new" : "method void com.mysql.cj.protocol.ServerSession::setOldStatusFlags(int)", + "justification" : "Method was added to an interface." } ] } diff --git a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml index d94f3ad1e601..51dbd720393d 100644 --- a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml +++ b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml @@ -2220,6 +2220,18 @@ + + + + + + + + + + + + diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml b/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml index e2b65485732c..5e54a3485af8 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml +++ b/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml @@ -308,14 +308,6 @@ test - - - org.apache.httpcomponents - httpclient - 4.5.14 - test - - com.mysql diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/AzureSpringBootVersionVerifier.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/AzureSpringBootVersionVerifier.java index f0944fd82e0a..d6bf0549a402 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/AzureSpringBootVersionVerifier.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/AzureSpringBootVersionVerifier.java @@ -19,8 +19,9 @@ public class AzureSpringBootVersionVerifier { private static final Logger LOGGER = LoggerFactory.getLogger(AzureSpringBootVersionVerifier.class); static final String SPRINGBOOT_CONDITIONAL_CLASS_NAME_OF_3_0 = "org.springframework.boot.autoconfigure.validation.ValidationConfigurationCustomizer"; + static final String SPRINGBOOT_CONDITIONAL_CLASS_NAME_OF_3_1 = "org.springframework.boot.autoconfigure.validation.ValidationConfigurationCustomizer.ValidationConfigurationCustomizer,setIgnoreRegistrationFailure,"; /** - * Versions supported by Spring Cloud Azure, for present is [2.5, 2.6]. Update this value if needed. + * Versions supported by Spring Cloud Azure, for present is [3.0, 3.1]. Update this value if needed. */ private final Map supportedVersions = new HashMap<>(); @@ -43,6 +44,7 @@ public AzureSpringBootVersionVerifier(List acceptedVersions, ClassNameRe */ private void initDefaultSupportedBootVersionCheckMeta() { supportedVersions.put("3.0", SPRINGBOOT_CONDITIONAL_CLASS_NAME_OF_3_0); + supportedVersions.put("3.1", SPRINGBOOT_CONDITIONAL_CLASS_NAME_OF_3_1); } /** diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/ClassNameResolverPredicate.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/ClassNameResolverPredicate.java index 3ec30e389706..bd588b22f921 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/ClassNameResolverPredicate.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/ClassNameResolverPredicate.java @@ -10,11 +10,33 @@ boolean resolve(String fullyQualifiedClassName) { if (fullyQualifiedClassName == null) { return false; } - - Class.forName(fullyQualifiedClassName); + if (fullyQualifiedClassName.contains(",")) { + String[] stringNames = fullyQualifiedClassName.split(","); + if (stringNames.length > 2) { + Class[] params = new Class[stringNames.length - 2]; + for (int i = 2; i < stringNames.length; i++) { + if (stringNames[i].equals("int")) { + params[i - 2] = int.class; + continue; + } + if (stringNames[i].equals("boolean")) { + params[i - 2] = boolean.class; + continue; + } + params[i - 2] = Class.forName(stringNames[i]); + } + Class.forName(stringNames[0]).getMethod(stringNames[1], params); + } else { + Class.forName(stringNames[0]).getMethod(stringNames[1]); + } + } else { + Class.forName(fullyQualifiedClassName); + } return true; } catch (ClassNotFoundException ex) { return false; + } catch (NoSuchMethodException ex) { + return false; } } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/properties/AzureCompatibilityVerifierProperties.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/properties/AzureCompatibilityVerifierProperties.java index 3e6b19a4e088..0f1ef9b82fd0 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/properties/AzureCompatibilityVerifierProperties.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/properties/AzureCompatibilityVerifierProperties.java @@ -18,7 +18,7 @@ public class AzureCompatibilityVerifierProperties { /** * Comma-delimited list of Spring Boot versions that are compatible with current Spring Cloud Azure's version. */ - private List compatibleBootVersions = Arrays.asList("3.0.x"); + private List compatibleBootVersions = Arrays.asList("3.0.x", "3.1.x"); public boolean isEnabled() { return this.enabled; diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfiguration.java index c5152e0f2bf8..f43140b3a612 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfiguration.java @@ -19,7 +19,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.core.RedisOperations; +import org.springframework.util.ReflectionUtils; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Arrays; /** @@ -39,7 +42,8 @@ public class AzureRedisAutoConfiguration { @Primary @Bean RedisProperties redisProperties(AzureRedisProperties azureRedisProperties, - AzureResourceManager azureResourceManager) { + AzureResourceManager azureResourceManager) throws InvocationTargetException, + IllegalAccessException { String cacheName = azureRedisProperties.getName(); String resourceGroup = azureRedisProperties.getResource().getResourceGroup(); @@ -63,7 +67,22 @@ RedisProperties redisProperties(AzureRedisProperties azureRedisProperties, } redisProperties.setPassword(redisCache.keys().primaryKey()); - redisProperties.setSsl(useSsl); + Method setSsl = ReflectionUtils.findMethod(RedisProperties.class, "setSsl", boolean.class); + if (setSsl == null) { + Object ssl = ReflectionUtils.findMethod(RedisProperties.class, "getSsl").invoke(redisProperties); + Class[] innerClasses = RedisProperties.class.getDeclaredClasses(); + Class targetInnerClass = null; + for (Class innerClass : innerClasses) { + if (innerClass.getSimpleName().equals("Ssl")) { + targetInnerClass = innerClass; + break; + } + } + ReflectionUtils.findMethod(targetInnerClass, "setEnabled", boolean.class) + .invoke(ssl, useSsl); + } else { + setSsl.invoke(redisProperties, useSsl); + } return redisProperties; } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/ClassNameResolverPredicateTest.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/ClassNameResolverPredicateTest.java new file mode 100644 index 000000000000..3301c5f9eb10 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/compatibility/ClassNameResolverPredicateTest.java @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.implementation.compatibility; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ClassNameResolverPredicateTest { + + @Test + void testResolve() { + ClassNameResolverPredicate predicate = new ClassNameResolverPredicate(); + Assertions.assertTrue(predicate.resolve("com.azure.spring.cloud.autoconfigure.implementation.compatibility.ClassNameResolverPredicateTest")); + Assertions.assertTrue(predicate.resolve("com.azure.spring.cloud.autoconfigure.implementation.compatibility.ClassNameResolverPredicateTest,testMethod")); + Assertions.assertTrue(predicate.resolve("com.azure.spring.cloud.autoconfigure.implementation.compatibility.ClassNameResolverPredicateTest,testMethod2,boolean")); + Assertions.assertTrue(predicate.resolve("com.azure.spring.cloud.autoconfigure.implementation.compatibility.ClassNameResolverPredicateTest,testMethod3,boolean,java.lang.String")); + Assertions.assertFalse(predicate.resolve("com.azure.spring.cloud.autoconfigure.implementation.compatibility.ClassNameResolverPredicateTest,testMethod4")); + } + + public void testMethod() {} + public void testMethod2(boolean b) {} + public void testMethod3(boolean b, String a) {} +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfigurationTests.java index 88300b9e14f9..4ee0959d4f53 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/redis/AzureRedisAutoConfigurationTests.java @@ -14,6 +14,9 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.data.redis.core.RedisOperations; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Method; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.anyString; @@ -107,7 +110,22 @@ void shouldConfigureWithNameAndResourceGroupAndResourceManager() { assertThat(redisProperties.getPassword()).isEqualTo(KEY); assertThat(redisProperties.getHost()).isEqualTo(HOST); assertThat(redisProperties.getPort()).isEqualTo(PORT); - assertThat(redisProperties.isSsl()).isEqualTo(IS_SSL); + Method isSsl = ReflectionUtils.findMethod(RedisProperties.class, "isSsl"); + if (isSsl == null) { + Object ssl = ReflectionUtils.findMethod(RedisProperties.class, "getSsl").invoke(redisProperties); + Class[] innerClasses = RedisProperties.class.getDeclaredClasses(); + Class targetInnerClass = null; + for (Class innerClass : innerClasses) { + if (innerClass.getSimpleName().equals("Ssl")) { + targetInnerClass = innerClass; + break; + } + } + assertThat(ReflectionUtils.findMethod(targetInnerClass, "isEnabled") + .invoke(ssl).equals(IS_SSL)); + } else { + assertThat(isSsl.invoke(redisProperties).equals(IS_SSL)); + } }); }