diff --git a/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/PatchNotNullValidator.java b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/PatchNotNullValidator.java new file mode 100644 index 0000000..2cc6d79 --- /dev/null +++ b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/PatchNotNullValidator.java @@ -0,0 +1,25 @@ + +package com.github.jeffnelson.jackson.patch.validator; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import com.github.jeffnelson.jackson.patch.PatchField; +import com.github.jeffnelson.jackson.patch.validator.constraints.PatchNotNull; + +public class PatchNotNullValidator implements ConstraintValidator> { + + @Override + public void initialize(PatchNotNull constraintAnnotation) { + // noop + } + + @Override + public boolean isValid(PatchField value, ConstraintValidatorContext context) { + if (value.shouldPatch()) { + return value.getValue() != null; + } + return true; + } + +} diff --git a/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/PatchStringValidator.java b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/PatchStringValidator.java index 2abd0c8..9fc6acf 100644 --- a/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/PatchStringValidator.java +++ b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/PatchStringValidator.java @@ -7,14 +7,14 @@ import org.apache.commons.lang3.StringUtils; import com.github.jeffnelson.jackson.patch.PatchField; -import com.github.jeffnelson.jackson.patch.validator.constraints.PatchStringValid; +import com.github.jeffnelson.jackson.patch.validator.constraints.PatchStringRequired; -public class PatchStringValidator implements ConstraintValidator> { +public class PatchStringValidator implements ConstraintValidator> { boolean allowNull, allowEmpty, allowBlank; @Override - public void initialize(PatchStringValid anno) { + public void initialize(PatchStringRequired anno) { this.allowNull = anno.allowNull(); this.allowEmpty = anno.allowEmpty(); this.allowBlank = anno.allowBlank(); diff --git a/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchNotNull.java b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchNotNull.java new file mode 100644 index 0000000..95d9b03 --- /dev/null +++ b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchNotNull.java @@ -0,0 +1,34 @@ + +package com.github.jeffnelson.jackson.patch.validator.constraints; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import com.github.jeffnelson.jackson.patch.PatchField; +import com.github.jeffnelson.jackson.patch.validator.PatchNotNullValidator; + +/** + * Annotation to apply validation to {@literal PatchField} + *

+ * Default behavior. If {@link PatchField#shouldPatch()} returns true, value cannot be null + * + * @author jeff.nelson + * + */ +@Constraint(validatedBy = PatchNotNullValidator.class) +@Retention(RUNTIME) +@Target(FIELD) +public @interface PatchNotNull { + + String message() default "Required"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchStringValid.java b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchStringRequired.java similarity index 96% rename from jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchStringValid.java rename to jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchStringRequired.java index bd33a87..aa2d657 100644 --- a/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchStringValid.java +++ b/jackson-merge-patch-validations/src/main/java/com/github/jeffnelson/jackson/patch/validator/constraints/PatchStringRequired.java @@ -29,7 +29,7 @@ @Constraint(validatedBy = PatchStringValidator.class) @Retention(RUNTIME) @Target(FIELD) -public @interface PatchStringValid { +public @interface PatchStringRequired { String message() default "Required"; diff --git a/jackson-merge-patch-validations/src/test/java/com/github/jeffnelson/jackson/patch/validator/PatchNotNullValidatorTest.java b/jackson-merge-patch-validations/src/test/java/com/github/jeffnelson/jackson/patch/validator/PatchNotNullValidatorTest.java new file mode 100644 index 0000000..017c8e0 --- /dev/null +++ b/jackson-merge-patch-validations/src/test/java/com/github/jeffnelson/jackson/patch/validator/PatchNotNullValidatorTest.java @@ -0,0 +1,38 @@ + +package com.github.jeffnelson.jackson.patch.validator; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; + +import com.github.jeffnelson.jackson.patch.PatchField; + +public class PatchNotNullValidatorTest { + + private PatchNotNullValidator validator; + + @Before + public void setup() { + validator = new PatchNotNullValidator(); + } + + @Test + public void testNoPatch() { + PatchField value = PatchField. builder().shouldPatch(false).build(); + assertTrue(validator.isValid(value, null)); + } + + @Test + public void testPatch_helloWorld() { + PatchField value = PatchField. builder().shouldPatch(true).value("hello, world").build(); + assertTrue(validator.isValid(value, null)); + } + + @Test + public void testPatch_null() { + PatchField value = PatchField. builder().shouldPatch(true).value(null).build(); + assertFalse(validator.isValid(value, null)); + } +}