From 4807eb00c5f4589d7ff2fb7b2a1da80e80f4b0cb Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 14 Apr 2025 08:38:02 +0200 Subject: [PATCH] Reinstantiate MongoCompatibilityAdapter for trimFactor --- .../encryption/MongoClientEncryption.java | 4 ++- .../util/MongoCompatibilityAdapter.java | 31 +++++++++++++++++-- .../core/encryption/RangeEncryptionTests.java | 10 ++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/encryption/MongoClientEncryption.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/encryption/MongoClientEncryption.java index aee5dd7f8..f83f98d4a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/encryption/MongoClientEncryption.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/encryption/MongoClientEncryption.java @@ -15,6 +15,8 @@ */ package org.springframework.data.mongodb.core.encryption; +import static org.springframework.data.mongodb.util.MongoCompatibilityAdapter.rangeOptionsAdapter; + import java.util.Map; import java.util.function.Supplier; @@ -122,7 +124,7 @@ public class MongoClientEncryption implements Encryption Assert.isInstanceOf(Integer.class, trimFactor, () -> String .format("Expected to find a %s but it turned out to be %s.", Integer.class, trimFactor.getClass())); - encryptionRangeOptions.trimFactor((Integer) trimFactor); + rangeOptionsAdapter(encryptionRangeOptions).trimFactor((Integer) trimFactor); } if (attributes.containsKey("sparsity")) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoCompatibilityAdapter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoCompatibilityAdapter.java index b17b9f196..a61fe0eca 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoCompatibilityAdapter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/MongoCompatibilityAdapter.java @@ -57,8 +57,18 @@ public class MongoCompatibilityAdapter { private static final @Nullable Method setBucketSize = ReflectionUtils.findMethod(IndexOptions.class, "bucketSize", Double.class); - private static final @Nullable Method setTrimFactor = ReflectionUtils.findMethod(RangeOptions.class, "setTrimFactor", - Integer.class); + private static final @Nullable Method setTrimFactor; + + static { + + // method name changed in between + Method trimFactor = ReflectionUtils.findMethod(RangeOptions.class, "setTrimFactor", Integer.class); + if (trimFactor != null) { + setTrimFactor = trimFactor; + } else { + setTrimFactor = ReflectionUtils.findMethod(RangeOptions.class, "trimFactor", Integer.class); + } + } /** * Return a compatibility adapter for {@link MongoClientSettings.Builder}. @@ -128,6 +138,23 @@ public class MongoCompatibilityAdapter { }; } + /** + * Return a compatibility adapter for {@link RangeOptions}. + * + * @param options + * @return + */ + public static RangeOptionsAdapter rangeOptionsAdapter(RangeOptions options) { + return trimFactor -> { + + if (!MongoClientVersion.isVersion5orNewer() || setTrimFactor == null) { + throw new UnsupportedOperationException(NOT_SUPPORTED_ON_4.formatted("RangeOptions.trimFactor")); + } + + ReflectionUtils.invokeMethod(setTrimFactor, options, trimFactor); + }; + } + /** * Return a compatibility adapter for {@code MapReducePublisher}. * diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/RangeEncryptionTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/RangeEncryptionTests.java index 5d3c6275e..e4e760cc9 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/RangeEncryptionTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/RangeEncryptionTests.java @@ -26,12 +26,16 @@ import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; +import org.assertj.core.api.Assumptions; import org.bson.BsonBinary; import org.bson.BsonDocument; import org.bson.BsonInt32; import org.bson.BsonString; import org.bson.Document; +import org.junit.Before; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -58,6 +62,7 @@ import org.springframework.data.mongodb.core.schema.MongoJsonSchema; import org.springframework.data.mongodb.test.util.EnableIfMongoServerVersion; import org.springframework.data.mongodb.test.util.EnableIfReplicaSetAvailable; import org.springframework.data.mongodb.test.util.MongoClientExtension; +import org.springframework.data.mongodb.util.MongoClientVersion; import org.springframework.data.util.Lazy; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -97,6 +102,11 @@ class RangeEncryptionTests { @Autowired MongoClientEncryption clientEncryption; @Autowired EncryptionKeyHolder keyHolder; + @BeforeEach + void clientVersionCheck() { + Assumptions.assumeThat(MongoClientVersion.isVersion5orNewer()).isTrue(); + } + @AfterEach void tearDown() { template.getDb().getCollection("test").deleteMany(new BsonDocument());