Skip to content

DATAMONGO-1322 - Add support for validator when creating collection. #525

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
<version>2.1.0.DATAMONGO-1322-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Spring Data MongoDB</name>
2 changes: 1 addition & 1 deletion spring-data-mongodb-benchmarks/pom.xml
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
<version>2.1.0.DATAMONGO-1322-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

4 changes: 2 additions & 2 deletions spring-data-mongodb-cross-store/pom.xml
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
<version>2.1.0.DATAMONGO-1322-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

@@ -49,7 +49,7 @@
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
<version>2.1.0.DATAMONGO-1322-SNAPSHOT</version>
</dependency>

<!-- reactive -->
2 changes: 1 addition & 1 deletion spring-data-mongodb-distribution/pom.xml
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
<version>2.1.0.DATAMONGO-1322-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

2 changes: 1 addition & 1 deletion spring-data-mongodb/pom.xml
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb-parent</artifactId>
<version>2.1.0.BUILD-SNAPSHOT</version>
<version>2.1.0.DATAMONGO-1322-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Original file line number Diff line number Diff line change
@@ -21,6 +21,7 @@

import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.schema.MongoJsonSchema;
import org.springframework.data.mongodb.core.validation.Validator;
import org.springframework.data.util.Optionals;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@@ -34,14 +35,15 @@
* @author Thomas Risberg
* @author Christoph Strobl
* @author Mark Paluch
* @author Andreas Zink
*/
public class CollectionOptions {

private @Nullable Long maxDocuments;
private @Nullable Long size;
private @Nullable Boolean capped;
private @Nullable Collation collation;
private Validator validator;
private ValidationOptions validationOptions;

/**
* Constructs a new <code>CollectionOptions</code> instance.
@@ -54,17 +56,17 @@ public class CollectionOptions {
*/
@Deprecated
public CollectionOptions(@Nullable Long size, @Nullable Long maxDocuments, @Nullable Boolean capped) {
this(size, maxDocuments, capped, null, Validator.none());
this(size, maxDocuments, capped, null, ValidationOptions.none());
}

private CollectionOptions(@Nullable Long size, @Nullable Long maxDocuments, @Nullable Boolean capped,
@Nullable Collation collation, Validator validator) {
@Nullable Collation collation, ValidationOptions validationOptions) {

this.maxDocuments = maxDocuments;
this.size = size;
this.capped = capped;
this.collation = collation;
this.validator = validator;
this.validationOptions = validationOptions;
}

/**
@@ -78,7 +80,7 @@ public static CollectionOptions just(Collation collation) {

Assert.notNull(collation, "Collation must not be null!");

return new CollectionOptions(null, null, null, collation, Validator.none());
return new CollectionOptions(null, null, null, collation, ValidationOptions.none());
}

/**
@@ -88,7 +90,7 @@ public static CollectionOptions just(Collation collation) {
* @since 2.0
*/
public static CollectionOptions empty() {
return new CollectionOptions(null, null, null, null, Validator.none());
return new CollectionOptions(null, null, null, null, ValidationOptions.none());
}

/**
@@ -99,7 +101,7 @@ public static CollectionOptions empty() {
* @since 2.0
*/
public CollectionOptions capped() {
return new CollectionOptions(size, maxDocuments, true, collation, validator);
return new CollectionOptions(size, maxDocuments, true, collation, validationOptions);
}

/**
@@ -110,7 +112,7 @@ public CollectionOptions capped() {
* @since 2.0
*/
public CollectionOptions maxDocuments(long maxDocuments) {
return new CollectionOptions(size, maxDocuments, capped, collation, validator);
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions);
}

/**
@@ -121,7 +123,7 @@ public CollectionOptions maxDocuments(long maxDocuments) {
* @since 2.0
*/
public CollectionOptions size(long size) {
return new CollectionOptions(size, maxDocuments, capped, collation, validator);
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions);
}

/**
@@ -132,19 +134,31 @@ public CollectionOptions size(long size) {
* @since 2.0
*/
public CollectionOptions collation(@Nullable Collation collation) {
return new CollectionOptions(size, maxDocuments, capped, collation, validator);
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions);
}

/**
* Create new {@link CollectionOptions} with already given settings and {@code validator} set to given
* Create new {@link CollectionOptions} with already given settings and {@code validationOptions} set to given
* {@link MongoJsonSchema}.
*
* @param schema can be {@literal null}.
* @return new {@link CollectionOptions}.
* @since 2.1
*/
public CollectionOptions schema(@Nullable MongoJsonSchema schema) {
return validation(new Validator(schema, validator.validationLevel, validator.validationAction));
return validator(Validator.schema(schema));
}

/**
* /** Create new {@link CollectionOptions} with already given settings and {@code validationOptions} set to given
* {@link Validator}.
*
* @param validator can be {@literal null}.
* @return new {@link CollectionOptions}.
* @since 2.1
*/
public CollectionOptions validator(@Nullable Validator validator) {
return validation(validationOptions.validator(validator));
}

/**
@@ -213,7 +227,7 @@ public CollectionOptions failOnValidationError() {
public CollectionOptions schemaValidationLevel(ValidationLevel validationLevel) {

Assert.notNull(validationLevel, "ValidationLevel must not be null!");
return validation(new Validator(validator.schema, validationLevel, validator.validationAction));
return validation(validationOptions.validationLevel(validationLevel));
}

/**
@@ -227,20 +241,20 @@ public CollectionOptions schemaValidationLevel(ValidationLevel validationLevel)
public CollectionOptions schemaValidationAction(ValidationAction validationAction) {

Assert.notNull(validationAction, "ValidationAction must not be null!");
return validation(new Validator(validator.schema, validator.validationLevel, validationAction));
return validation(validationOptions.validationAction(validationAction));
}

/**
* Create new {@link CollectionOptions} with the given {@link Validator}.
* Create new {@link CollectionOptions} with the given {@link ValidationOptions}.
*
* @param validator must not be {@literal null}. Use {@link Validator#none()} to remove validation.
* @param validationOptions must not be {@literal null}. Use {@link ValidationOptions#none()} to remove validation.
* @return new {@link CollectionOptions}.
* @since 2.1
*/
public CollectionOptions validation(Validator validator) {
public CollectionOptions validation(ValidationOptions validationOptions) {

Assert.notNull(validator, "Validator must not be null!");
return new CollectionOptions(size, maxDocuments, capped, collation, validator);
Assert.notNull(validationOptions, "ValidationOptions must not be null!");
return new CollectionOptions(size, maxDocuments, capped, collation, validationOptions);
}

/**
@@ -287,41 +301,72 @@ public Optional<Collation> getCollation() {
* @return {@link Optional#empty()} if not set.
* @since 2.1
*/
public Optional<Validator> getValidator() {
return validator.isEmpty() ? Optional.empty() : Optional.of(validator);
public Optional<ValidationOptions> getValidationOptions() {
return validationOptions.isEmpty() ? Optional.empty() : Optional.of(validationOptions);
}

/**
* Encapsulation of Validator options.
* Encapsulation of ValidationOptions options.
*
* @author Christoph Strobl
* @author Andreas Zink
* @since 2.1
*/
@RequiredArgsConstructor
public static class Validator {
public static class ValidationOptions {

private static final Validator NONE = new Validator(null, null, null);
private static final ValidationOptions NONE = new ValidationOptions(null, null, null);

private final @Nullable MongoJsonSchema schema;
private final @Nullable Validator validator;
private final @Nullable ValidationLevel validationLevel;
private final @Nullable ValidationAction validationAction;

/**
* Create an empty {@link Validator}.
* Create an empty {@link ValidationOptions}.
*
* @return never {@literal null}.
*/
public static Validator none() {
public static ValidationOptions none() {
return NONE;
}

/**
* Get the {@code $jsonSchema} used for validation.
* Define the {@link Validator} to be used for document validation.
*
* @return {@link Optional#empty()} if not set.
* @param validator can be {@literal null}.
* @return new instance of {@link ValidationOptions}.
*/
public ValidationOptions validator(@Nullable Validator validator) {
return new ValidationOptions(validator, validationLevel, validationAction);
}

/**
* Define the validation level to apply.
*
* @param validationLevel can be {@literal null}.
* @return new instance of {@link ValidationOptions}.
*/
public ValidationOptions validationLevel(ValidationLevel validationLevel) {
return new ValidationOptions(validator, validationLevel, validationAction);
}

/**
* Define the validation action to take.
*
* @param validationAction can be {@literal null}.
* @return new instance of {@link ValidationOptions}.
*/
public ValidationOptions validationAction(ValidationAction validationAction) {
return new ValidationOptions(validator, validationLevel, validationAction);
}

/**
* Get the {@link Validator} to use.
*
* @return never {@literal null}.
*/
public Optional<MongoJsonSchema> getSchema() {
return Optional.ofNullable(schema);
public Optional<Validator> getValidator() {
return Optional.ofNullable(validator);
}

/**
@@ -346,7 +391,7 @@ public Optional<ValidationAction> getValidationAction() {
* @return {@literal true} if no arguments set.
*/
boolean isEmpty() {
return !Optionals.isAnyPresent(getSchema(), getValidationAction(), getValidationLevel());
return !Optionals.isAnyPresent(getValidator(), getValidationAction(), getValidationLevel());
}
}
}
Loading