Browse Source

rename some of the things

issue/4185-light
Christoph Strobl 9 months ago
parent
commit
7b53b050c7
No known key found for this signature in database
GPG Key ID: E6054036D0C37A4B
  1. 147
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CollectionOptions.java
  2. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/EntityOperations.java
  3. 1
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
  4. 30
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/CollectionOptionsUnitTests.java
  5. 6
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/RangeEncryptionTests.java

147
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CollectionOptions.java

@ -70,12 +70,12 @@ public class CollectionOptions {
private ValidationOptions validationOptions; private ValidationOptions validationOptions;
private @Nullable TimeSeriesOptions timeSeriesOptions; private @Nullable TimeSeriesOptions timeSeriesOptions;
private @Nullable CollectionChangeStreamOptions changeStreamOptions; private @Nullable CollectionChangeStreamOptions changeStreamOptions;
private @Nullable EncryptedCollectionOptions encryptedCollectionOptions; private @Nullable EncryptedFieldsOptions encryptedFieldsOptions;
private CollectionOptions(@Nullable Long size, @Nullable Long maxDocuments, @Nullable Boolean capped, private CollectionOptions(@Nullable Long size, @Nullable Long maxDocuments, @Nullable Boolean capped,
@Nullable Collation collation, ValidationOptions validationOptions, @Nullable TimeSeriesOptions timeSeriesOptions, @Nullable Collation collation, ValidationOptions validationOptions, @Nullable TimeSeriesOptions timeSeriesOptions,
@Nullable CollectionChangeStreamOptions changeStreamOptions, @Nullable CollectionChangeStreamOptions changeStreamOptions,
@Nullable EncryptedCollectionOptions encryptedCollectionOptions) { @Nullable EncryptedFieldsOptions encryptedFieldsOptions) {
this.maxDocuments = maxDocuments; this.maxDocuments = maxDocuments;
this.size = size; this.size = size;
@ -84,7 +84,7 @@ public class CollectionOptions {
this.validationOptions = validationOptions; this.validationOptions = validationOptions;
this.timeSeriesOptions = timeSeriesOptions; this.timeSeriesOptions = timeSeriesOptions;
this.changeStreamOptions = changeStreamOptions; this.changeStreamOptions = changeStreamOptions;
this.encryptedCollectionOptions = encryptedCollectionOptions; this.encryptedFieldsOptions = encryptedFieldsOptions;
} }
/** /**
@ -149,6 +149,46 @@ public class CollectionOptions {
return empty().changeStream(CollectionChangeStreamOptions.preAndPostImages(true)); return empty().changeStream(CollectionChangeStreamOptions.preAndPostImages(true));
} }
/**
* Create new {@link CollectionOptions} with the given {@code encryptedFields}.
*
* @param encryptedFieldsOptions can be null
* @return new instance of {@link CollectionOptions}.
* @since 4.5.0
*/
@Contract("_ -> new")
@CheckReturnValue
public static CollectionOptions encryptedCollection(@Nullable EncryptedFieldsOptions encryptedFieldsOptions) {
return new CollectionOptions(null, null, null, null, ValidationOptions.NONE, null, null, encryptedFieldsOptions);
}
/**
* Create new {@link CollectionOptions} reading encryption options from the given {@link MongoJsonSchema}.
*
* @param schema must not be {@literal null}.
* @return new instance of {@link CollectionOptions}.
* @since 4.5.0
*/
@Contract("_ -> new")
@CheckReturnValue
public static CollectionOptions encryptedCollection(MongoJsonSchema schema) {
return encryptedCollection(EncryptedFieldsOptions.fromSchema(schema));
}
/**
* Create new {@link CollectionOptions} building encryption options in a fluent style.
*
* @param optionsFunction must not be {@literal null}.
* @return new instance of {@link CollectionOptions}.
* @since 4.5.0
*/
@Contract("_ -> new")
@CheckReturnValue
public static CollectionOptions encryptedCollection(
Function<EncryptedFieldsOptions, EncryptedFieldsOptions> optionsFunction) {
return encryptedCollection(optionsFunction.apply(new EncryptedFieldsOptions()));
}
/** /**
* Create new {@link CollectionOptions} with already given settings and capped set to {@literal true}. <br /> * Create new {@link CollectionOptions} with already given settings and capped set to {@literal true}. <br />
* <strong>NOTE:</strong> Using capped collections requires defining {@link #size(long)}. * <strong>NOTE:</strong> Using capped collections requires defining {@link #size(long)}.
@ -158,7 +198,7 @@ public class CollectionOptions {
*/ */
public CollectionOptions capped() { public CollectionOptions capped() {
return new CollectionOptions(size, maxDocuments, true, collation, validationOptions, timeSeriesOptions, return new CollectionOptions(size, maxDocuments, true, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions); changeStreamOptions, encryptedFieldsOptions);
} }
/** /**
@ -170,7 +210,7 @@ public class CollectionOptions {
*/ */
public CollectionOptions maxDocuments(long maxDocuments) { public CollectionOptions maxDocuments(long maxDocuments) {
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions, return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions); changeStreamOptions, encryptedFieldsOptions);
} }
/** /**
@ -182,7 +222,7 @@ public class CollectionOptions {
*/ */
public CollectionOptions size(long size) { public CollectionOptions size(long size) {
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions, return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions); changeStreamOptions, encryptedFieldsOptions);
} }
/** /**
@ -194,7 +234,7 @@ public class CollectionOptions {
*/ */
public CollectionOptions collation(@Nullable Collation collation) { public CollectionOptions collation(@Nullable Collation collation) {
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions, return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions); changeStreamOptions, encryptedFieldsOptions);
} }
/** /**
@ -315,7 +355,7 @@ public class CollectionOptions {
Assert.notNull(validationOptions, "ValidationOptions must not be null"); Assert.notNull(validationOptions, "ValidationOptions must not be null");
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions, return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions); changeStreamOptions, encryptedFieldsOptions);
} }
/** /**
@ -329,7 +369,7 @@ public class CollectionOptions {
Assert.notNull(timeSeriesOptions, "TimeSeriesOptions must not be null"); Assert.notNull(timeSeriesOptions, "TimeSeriesOptions must not be null");
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions, return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions); changeStreamOptions, encryptedFieldsOptions);
} }
/** /**
@ -343,57 +383,22 @@ public class CollectionOptions {
Assert.notNull(changeStreamOptions, "ChangeStreamOptions must not be null"); Assert.notNull(changeStreamOptions, "ChangeStreamOptions must not be null");
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions, return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions); changeStreamOptions, encryptedFieldsOptions);
}
@Contract("_ -> new")
@CheckReturnValue
public CollectionOptions encrypted(EncryptedCollectionOptions encryptedCollectionOptions) {
Assert.notNull(encryptedCollectionOptions, "EncryptedCollectionOptions must not be null");
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
changeStreamOptions, encryptedCollectionOptions);
} }
/** /**
* Create new {@link CollectionOptions} with the given {@code encryptedFields}. * Set the {@link EncryptedFieldsOptions} for collections using queryable encryption.
* *
* @param encryptedCollectionOptions can be null * @param encryptedFieldsOptions must not be {@literal null}.
* @return new instance of {@link CollectionOptions}. * @return new instance of {@link CollectionOptions}.
* @since 4.5.0
*/ */
@Contract("_ -> new") @Contract("_ -> new")
@CheckReturnValue @CheckReturnValue
public static CollectionOptions encryptedCollection(@Nullable EncryptedCollectionOptions encryptedCollectionOptions) { public CollectionOptions encrypted(EncryptedFieldsOptions encryptedFieldsOptions) {
return new CollectionOptions(null, null, null, null, ValidationOptions.NONE, null, null,
encryptedCollectionOptions);
}
/** Assert.notNull(encryptedFieldsOptions, "EncryptedCollectionOptions must not be null");
* Create new {@link CollectionOptions} reading encryption options from the given {@link MongoJsonSchema}. return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions, timeSeriesOptions,
* changeStreamOptions, encryptedFieldsOptions);
* @param schema must not be {@literal null}.
* @return new instance of {@link CollectionOptions}.
* @since 4.5.0
*/
@Contract("_ -> new")
@CheckReturnValue
public static CollectionOptions encryptedCollection(MongoJsonSchema schema) {
return encryptedCollection(EncryptedCollectionOptions.fromSchema(schema));
}
/**
* Create new {@link CollectionOptions} building encryption options in a fluent style.
*
* @param optionsFunction must not be {@literal null}.
* @return new instance of {@link CollectionOptions}.
* @since 4.5.0
*/
@Contract("_ -> new")
@CheckReturnValue
public static CollectionOptions encryptedCollection(
Function<EncryptedCollectionOptions, EncryptedCollectionOptions> optionsFunction) {
return encryptedCollection(optionsFunction.apply(new EncryptedCollectionOptions()));
} }
/** /**
@ -470,8 +475,8 @@ public class CollectionOptions {
* @return {@link Optional#empty()} if not specified. * @return {@link Optional#empty()} if not specified.
* @since 4.5.0 * @since 4.5.0
*/ */
public Optional<EncryptedCollectionOptions> getEncryptionOptions() { public Optional<EncryptedFieldsOptions> getEncryptedFieldsOptions() {
return Optional.ofNullable(encryptedCollectionOptions); return Optional.ofNullable(encryptedFieldsOptions);
} }
@Override @Override
@ -479,7 +484,7 @@ public class CollectionOptions {
return "CollectionOptions{" + "maxDocuments=" + maxDocuments + ", size=" + size + ", capped=" + capped return "CollectionOptions{" + "maxDocuments=" + maxDocuments + ", size=" + size + ", capped=" + capped
+ ", collation=" + collation + ", validationOptions=" + validationOptions + ", timeSeriesOptions=" + ", collation=" + collation + ", validationOptions=" + validationOptions + ", timeSeriesOptions="
+ timeSeriesOptions + ", changeStreamOptions=" + changeStreamOptions + ", encryptedCollectionOptions=" + timeSeriesOptions + ", changeStreamOptions=" + changeStreamOptions + ", encryptedCollectionOptions="
+ encryptedCollectionOptions + ", disableValidation=" + disableValidation() + ", strictValidation=" + encryptedFieldsOptions + ", disableValidation=" + disableValidation() + ", strictValidation="
+ strictValidation() + ", moderateValidation=" + moderateValidation() + ", warnOnValidationError=" + strictValidation() + ", moderateValidation=" + moderateValidation() + ", warnOnValidationError="
+ warnOnValidationError() + ", failOnValidationError=" + failOnValidationError() + '}'; + warnOnValidationError() + ", failOnValidationError=" + failOnValidationError() + '}';
} }
@ -516,7 +521,7 @@ public class CollectionOptions {
if (!ObjectUtils.nullSafeEquals(changeStreamOptions, that.changeStreamOptions)) { if (!ObjectUtils.nullSafeEquals(changeStreamOptions, that.changeStreamOptions)) {
return false; return false;
} }
return ObjectUtils.nullSafeEquals(encryptedCollectionOptions, that.encryptedCollectionOptions); return ObjectUtils.nullSafeEquals(encryptedFieldsOptions, that.encryptedFieldsOptions);
} }
@Override @Override
@ -528,7 +533,7 @@ public class CollectionOptions {
result = 31 * result + ObjectUtils.nullSafeHashCode(validationOptions); result = 31 * result + ObjectUtils.nullSafeHashCode(validationOptions);
result = 31 * result + ObjectUtils.nullSafeHashCode(timeSeriesOptions); result = 31 * result + ObjectUtils.nullSafeHashCode(timeSeriesOptions);
result = 31 * result + ObjectUtils.nullSafeHashCode(changeStreamOptions); result = 31 * result + ObjectUtils.nullSafeHashCode(changeStreamOptions);
result = 31 * result + ObjectUtils.nullSafeHashCode(encryptedCollectionOptions); result = 31 * result + ObjectUtils.nullSafeHashCode(encryptedFieldsOptions);
return result; return result;
} }
@ -668,39 +673,39 @@ public class CollectionOptions {
* @author Christoph Strobl * @author Christoph Strobl
* @since 4.5 * @since 4.5
*/ */
public static class EncryptedCollectionOptions { public static class EncryptedFieldsOptions {
private static final EncryptedCollectionOptions NONE = new EncryptedCollectionOptions(); private static final EncryptedFieldsOptions NONE = new EncryptedFieldsOptions();
private @Nullable MongoJsonSchema schema; private @Nullable MongoJsonSchema schema;
private List<QueryableJsonSchemaProperty> queryableProperties; private List<QueryableJsonSchemaProperty> queryableProperties;
/** /**
* @return {@link EncryptedCollectionOptions#NONE} * @return {@link EncryptedFieldsOptions#NONE}
*/ */
public static EncryptedCollectionOptions none() { public static EncryptedFieldsOptions none() {
return NONE; return NONE;
} }
/** /**
* @return new instance of {@link EncryptedCollectionOptions}. * @return new instance of {@link EncryptedFieldsOptions}.
*/ */
public static EncryptedCollectionOptions fromSchema(MongoJsonSchema schema) { public static EncryptedFieldsOptions fromSchema(MongoJsonSchema schema) {
return new EncryptedCollectionOptions(schema, List.of()); return new EncryptedFieldsOptions(schema, List.of());
} }
/** /**
* @return new instance of {@link EncryptedCollectionOptions}. * @return new instance of {@link EncryptedFieldsOptions}.
*/ */
public static EncryptedCollectionOptions fromProperties(List<QueryableJsonSchemaProperty> properties) { public static EncryptedFieldsOptions fromProperties(List<QueryableJsonSchemaProperty> properties) {
return new EncryptedCollectionOptions(null, List.copyOf(properties)); return new EncryptedFieldsOptions(null, List.copyOf(properties));
} }
EncryptedCollectionOptions() { EncryptedFieldsOptions() {
this(null, List.of()); this(null, List.of());
} }
private EncryptedCollectionOptions(@Nullable MongoJsonSchema schema, private EncryptedFieldsOptions(@Nullable MongoJsonSchema schema,
List<QueryableJsonSchemaProperty> queryableProperties) { List<QueryableJsonSchemaProperty> queryableProperties) {
this.schema = schema; this.schema = schema;
@ -717,17 +722,17 @@ public class CollectionOptions {
* {@link org.springframework.data.mongodb.core.schema.IdentifiableJsonSchemaProperty.EncryptedJsonSchemaProperty * {@link org.springframework.data.mongodb.core.schema.IdentifiableJsonSchemaProperty.EncryptedJsonSchemaProperty
* encrypted}. * encrypted}.
* @param characteristics the query options to set. * @param characteristics the query options to set.
* @return new instance of {@link EncryptedCollectionOptions}. * @return new instance of {@link EncryptedFieldsOptions}.
*/ */
@Contract("_, _ -> new") @Contract("_, _ -> new")
@CheckReturnValue @CheckReturnValue
public EncryptedCollectionOptions queryable(JsonSchemaProperty property, QueryCharacteristic... characteristics) { public EncryptedFieldsOptions queryable(JsonSchemaProperty property, QueryCharacteristic... characteristics) {
List<QueryableJsonSchemaProperty> targetPropertyList = new ArrayList<>(queryableProperties.size() + 1); List<QueryableJsonSchemaProperty> targetPropertyList = new ArrayList<>(queryableProperties.size() + 1);
targetPropertyList.addAll(queryableProperties); targetPropertyList.addAll(queryableProperties);
targetPropertyList.add(JsonSchemaProperty.queryable(property, List.of(characteristics))); targetPropertyList.add(JsonSchemaProperty.queryable(property, List.of(characteristics)));
return new EncryptedCollectionOptions(schema, targetPropertyList); return new EncryptedFieldsOptions(schema, targetPropertyList);
} }
public Document toDocument() { public Document toDocument() {

4
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/EntityOperations.java

@ -39,7 +39,7 @@ import org.springframework.data.mapping.PersistentPropertyPath;
import org.springframework.data.mapping.PropertyPath; import org.springframework.data.mapping.PropertyPath;
import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mapping.model.ConvertingPropertyAccessor; import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
import org.springframework.data.mongodb.core.CollectionOptions.EncryptedCollectionOptions; import org.springframework.data.mongodb.core.CollectionOptions.EncryptedFieldsOptions;
import org.springframework.data.mongodb.core.CollectionOptions.TimeSeriesOptions; import org.springframework.data.mongodb.core.CollectionOptions.TimeSeriesOptions;
import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper; import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper;
@ -380,7 +380,7 @@ class EntityOperations {
collectionOptions.getChangeStreamOptions().ifPresent(it -> result collectionOptions.getChangeStreamOptions().ifPresent(it -> result
.changeStreamPreAndPostImagesOptions(new ChangeStreamPreAndPostImagesOptions(it.getPreAndPostImages()))); .changeStreamPreAndPostImagesOptions(new ChangeStreamPreAndPostImagesOptions(it.getPreAndPostImages())));
collectionOptions.getEncryptionOptions().map(EncryptedCollectionOptions::toDocument).ifPresent(encryptedFields -> { collectionOptions.getEncryptedFieldsOptions().map(EncryptedFieldsOptions::toDocument).ifPresent(encryptedFields -> {
if (!encryptedFields.isEmpty()) { if (!encryptedFields.isEmpty()) {
result.encryptedFields(encryptedFields); result.encryptedFields(encryptedFields);
} }

1
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java

@ -58,7 +58,6 @@ import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoDatabaseUtils; import org.springframework.data.mongodb.MongoDatabaseUtils;
import org.springframework.data.mongodb.SessionSynchronization; import org.springframework.data.mongodb.SessionSynchronization;
import org.springframework.data.mongodb.core.BulkOperations.BulkMode; import org.springframework.data.mongodb.core.BulkOperations.BulkMode;
import org.springframework.data.mongodb.core.CollectionOptions.EncryptedCollectionOptions;
import org.springframework.data.mongodb.core.CollectionPreparerSupport.CollectionPreparerDelegate; import org.springframework.data.mongodb.core.CollectionPreparerSupport.CollectionPreparerDelegate;
import org.springframework.data.mongodb.core.DefaultBulkOperations.BulkOperationContext; import org.springframework.data.mongodb.core.DefaultBulkOperations.BulkOperationContext;
import org.springframework.data.mongodb.core.EntityOperations.AdaptibleEntity; import org.springframework.data.mongodb.core.EntityOperations.AdaptibleEntity;

30
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/CollectionOptionsUnitTests.java

@ -16,11 +16,12 @@
package org.springframework.data.mongodb.core; package org.springframework.data.mongodb.core;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.data.mongodb.core.CollectionOptions.EncryptedCollectionOptions; import static org.springframework.data.mongodb.core.CollectionOptions.EncryptedFieldsOptions;
import static org.springframework.data.mongodb.core.CollectionOptions.TimeSeriesOptions; import static org.springframework.data.mongodb.core.CollectionOptions.TimeSeriesOptions;
import static org.springframework.data.mongodb.core.CollectionOptions.emitChangedRevisions; import static org.springframework.data.mongodb.core.CollectionOptions.emitChangedRevisions;
import static org.springframework.data.mongodb.core.CollectionOptions.empty; import static org.springframework.data.mongodb.core.CollectionOptions.empty;
import static org.springframework.data.mongodb.core.CollectionOptions.encryptedCollection; import static org.springframework.data.mongodb.core.CollectionOptions.encryptedCollection;
import static org.springframework.data.mongodb.core.schema.JsonSchemaProperty.int32;
import static org.springframework.data.mongodb.core.schema.JsonSchemaProperty.queryable; import static org.springframework.data.mongodb.core.schema.JsonSchemaProperty.queryable;
import java.util.List; import java.util.List;
@ -31,6 +32,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.data.mongodb.core.query.Collation; import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.schema.JsonSchemaProperty; import org.springframework.data.mongodb.core.schema.JsonSchemaProperty;
import org.springframework.data.mongodb.core.schema.MongoJsonSchema; import org.springframework.data.mongodb.core.schema.MongoJsonSchema;
import org.springframework.data.mongodb.core.schema.QueryCharacteristics;
import org.springframework.data.mongodb.core.validation.Validator; import org.springframework.data.mongodb.core.validation.Validator;
/** /**
@ -96,7 +98,7 @@ class CollectionOptionsUnitTests {
.properties(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int32("data")), List.of()))) .properties(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int32("data")), List.of())))
.property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("mongodb")), List.of())).build(); .property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("mongodb")), List.of())).build();
EncryptedCollectionOptions encryptionOptions = EncryptedCollectionOptions.fromSchema(schema); EncryptedFieldsOptions encryptionOptions = EncryptedFieldsOptions.fromSchema(schema);
assertThat(encryptionOptions.toDocument().get("fields", List.class)).hasSize(2) assertThat(encryptionOptions.toDocument().get("fields", List.class)).hasSize(2)
.contains(new Document("path", "mongodb").append("bsonType", "long").append("queries", List.of()) .contains(new Document("path", "mongodb").append("bsonType", "long").append("queries", List.of())
@ -116,7 +118,7 @@ class CollectionOptionsUnitTests {
// override first with data type long // override first with data type long
.queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("spring")))); .queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("spring"))));
assertThat(collectionOptions.getEncryptionOptions()).map(EncryptedCollectionOptions::toDocument) assertThat(collectionOptions.getEncryptedFieldsOptions()).map(EncryptedFieldsOptions::toDocument)
.hasValueSatisfying(it -> { .hasValueSatisfying(it -> {
assertThat(it.get("fields", List.class)).hasSize(2).contains(new Document("path", "spring") assertThat(it.get("fields", List.class)).hasSize(2).contains(new Document("path", "spring")
.append("bsonType", "long").append("queries", List.of()).append("keyId", BsonNull.VALUE)); .append("bsonType", "long").append("queries", List.of()).append("keyId", BsonNull.VALUE));
@ -127,7 +129,7 @@ class CollectionOptionsUnitTests {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
void queryableEncryptionPropertiesOverridesPathFromSchema() { void queryableEncryptionPropertiesOverridesPathFromSchema() {
EncryptedCollectionOptions encryptionOptions = EncryptedCollectionOptions.fromSchema(MongoJsonSchema.builder() EncryptedFieldsOptions encryptionOptions = EncryptedFieldsOptions.fromSchema(MongoJsonSchema.builder()
.property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int32("spring")), List.of())) .property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int32("spring")), List.of()))
.property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("data")), List.of())).build()); .property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("data")), List.of())).build());
@ -135,18 +137,32 @@ class CollectionOptionsUnitTests {
CollectionOptions collectionOptions = CollectionOptions.encryptedCollection( CollectionOptions collectionOptions = CollectionOptions.encryptedCollection(
encryptionOptions.queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("spring")))); encryptionOptions.queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("spring"))));
assertThat(collectionOptions.getEncryptionOptions()).map(EncryptedCollectionOptions::toDocument) assertThat(collectionOptions.getEncryptedFieldsOptions()).map(EncryptedFieldsOptions::toDocument)
.hasValueSatisfying(it -> { .hasValueSatisfying(it -> {
assertThat(it.get("fields", List.class)).hasSize(2).contains(new Document("path", "spring") assertThat(it.get("fields", List.class)).hasSize(2).contains(new Document("path", "spring")
.append("bsonType", "long").append("queries", List.of()).append("keyId", BsonNull.VALUE)); .append("bsonType", "long").append("queries", List.of()).append("keyId", BsonNull.VALUE));
}); });
} }
@Test // GH-4185
void encryptionOptionsAreImmutable() {
EncryptedFieldsOptions source = EncryptedFieldsOptions
.fromProperties(List.of(queryable(int32("spring.data"), List.of(QueryCharacteristics.range().min(1)))));
assertThat(source.queryable(queryable(int32("mongodb"), List.of(QueryCharacteristics.range().min(1)))))
.isNotSameAs(source).satisfies(it -> {
assertThat(it.toDocument().get("fields", List.class)).hasSize(2);
});
assertThat(source.toDocument().get("fields", List.class)).hasSize(1);
}
@Test // GH-4185 @Test // GH-4185
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
void queryableEncryptionPropertiesOverridesNestedPathFromSchema() { void queryableEncryptionPropertiesOverridesNestedPathFromSchema() {
EncryptedCollectionOptions encryptionOptions = EncryptedCollectionOptions.fromSchema(MongoJsonSchema.builder() EncryptedFieldsOptions encryptionOptions = EncryptedFieldsOptions.fromSchema(MongoJsonSchema.builder()
.property(JsonSchemaProperty.object("spring") .property(JsonSchemaProperty.object("spring")
.properties(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int32("data")), List.of()))) .properties(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int32("data")), List.of())))
.property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("mongodb")), List.of())).build()); .property(queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("mongodb")), List.of())).build());
@ -155,7 +171,7 @@ class CollectionOptionsUnitTests {
CollectionOptions collectionOptions = CollectionOptions.encryptedCollection( CollectionOptions collectionOptions = CollectionOptions.encryptedCollection(
encryptionOptions.queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("spring.data")))); encryptionOptions.queryable(JsonSchemaProperty.encrypted(JsonSchemaProperty.int64("spring.data"))));
assertThat(collectionOptions.getEncryptionOptions()).map(EncryptedCollectionOptions::toDocument) assertThat(collectionOptions.getEncryptedFieldsOptions()).map(EncryptedFieldsOptions::toDocument)
.hasValueSatisfying(it -> { .hasValueSatisfying(it -> {
assertThat(it.get("fields", List.class)).hasSize(2).contains(new Document("path", "spring.data") assertThat(it.get("fields", List.class)).hasSize(2).contains(new Document("path", "spring.data")
.append("bsonType", "long").append("queries", List.of()).append("keyId", BsonNull.VALUE)); .append("bsonType", "long").append("queries", List.of()).append("keyId", BsonNull.VALUE));

6
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/encryption/RangeEncryptionTests.java

@ -40,7 +40,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.data.convert.PropertyValueConverterFactory; import org.springframework.data.convert.PropertyValueConverterFactory;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
import org.springframework.data.mongodb.core.CollectionOptions; import org.springframework.data.mongodb.core.CollectionOptions;
import org.springframework.data.mongodb.core.CollectionOptions.EncryptedCollectionOptions; import org.springframework.data.mongodb.core.CollectionOptions.EncryptedFieldsOptions;
import org.springframework.data.mongodb.core.MongoJsonSchemaCreator; import org.springframework.data.mongodb.core.MongoJsonSchemaCreator;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions.MongoConverterConfigurationAdapter; import org.springframework.data.mongodb.core.convert.MongoCustomConversions.MongoConverterConfigurationAdapter;
@ -168,8 +168,8 @@ class RangeEncryptionTests {
.createSchemaFor(Person.class); // .createSchemaFor(Person.class); //
Document encryptedFields = CollectionOptions.encryptedCollection(personSchema) // Document encryptedFields = CollectionOptions.encryptedCollection(personSchema) //
.getEncryptionOptions() // .getEncryptedFieldsOptions() //
.map(EncryptedCollectionOptions::toDocument) // .map(EncryptedFieldsOptions::toDocument) //
.orElseThrow(); .orElseThrow();
CreateCollectionOptions createCollectionOptions = new CreateCollectionOptions() CreateCollectionOptions createCollectionOptions = new CreateCollectionOptions()

Loading…
Cancel
Save