From 2b895289915d6646cad1ade1d594d576f2ef0593 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 18 Oct 2017 14:28:06 +0200 Subject: [PATCH] HV-1494 Adding SupportedValidationTarget to HV composite constraints --- .../validator/constraints/NotEmpty.java | 3 + .../validator/constraints/Range.java | 3 + .../constraints/br/TituloEleitoral.java | 3 + ...CompositeConstraintsOnReturnValueTest.java | 149 ++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/PureCompositeConstraintsOnReturnValueTest.java diff --git a/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java b/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java index a4112b38d6..7115622572 100644 --- a/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java +++ b/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java @@ -14,6 +14,8 @@ import javax.validation.ReportAsSingleViolation; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import javax.validation.constraintvalidation.SupportedValidationTarget; +import javax.validation.constraintvalidation.ValidationTarget; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.CONSTRUCTOR; @@ -30,6 +32,7 @@ */ @Documented @Constraint(validatedBy = { }) +@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @ReportAsSingleViolation diff --git a/engine/src/main/java/org/hibernate/validator/constraints/Range.java b/engine/src/main/java/org/hibernate/validator/constraints/Range.java index 1ec6abab73..676c03fb0c 100644 --- a/engine/src/main/java/org/hibernate/validator/constraints/Range.java +++ b/engine/src/main/java/org/hibernate/validator/constraints/Range.java @@ -15,6 +15,8 @@ import javax.validation.ReportAsSingleViolation; import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraintvalidation.SupportedValidationTarget; +import javax.validation.constraintvalidation.ValidationTarget; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.CONSTRUCTOR; @@ -31,6 +33,7 @@ */ @Documented @Constraint(validatedBy = { }) +@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Min(0) diff --git a/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java b/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java index 435ca54372..2c21049af1 100644 --- a/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java +++ b/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java @@ -13,6 +13,8 @@ import javax.validation.Payload; import javax.validation.ReportAsSingleViolation; import javax.validation.constraints.Pattern; +import javax.validation.constraintvalidation.SupportedValidationTarget; +import javax.validation.constraintvalidation.ValidationTarget; import org.hibernate.validator.constraints.Mod11Check; import org.hibernate.validator.constraints.Mod11Check.List; @@ -42,6 +44,7 @@ @ReportAsSingleViolation @Documented @Constraint(validatedBy = { }) +@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) public @interface TituloEleitoral { diff --git a/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/PureCompositeConstraintsOnReturnValueTest.java b/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/PureCompositeConstraintsOnReturnValueTest.java new file mode 100644 index 0000000000..935c0735d3 --- /dev/null +++ b/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/PureCompositeConstraintsOnReturnValueTest.java @@ -0,0 +1,149 @@ +/* + * Hibernate Validator, declare and validate application constraints + * + * License: Apache License, Version 2.0 + * See the license.txt file in the root directory or . + */ +package org.hibernate.validator.test.internal.engine.methodvalidation; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertCorrectConstraintTypes; +import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertNumberOfViolations; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.util.Set; + +import javax.validation.Constraint; +import javax.validation.ConstraintViolation; +import javax.validation.Payload; +import javax.validation.ReportAsSingleViolation; +import javax.validation.Validator; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import javax.validation.constraintvalidation.SupportedValidationTarget; +import javax.validation.constraintvalidation.ValidationTarget; + +import org.hibernate.validator.constraints.NotEmpty; +import org.hibernate.validator.testutil.TestForIssue; +import org.hibernate.validator.testutils.ValidatorUtil; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +/** + * @author Marko Bekhta + */ +public class PureCompositeConstraintsOnReturnValueTest { + private Validator validator; + private Foo foo; + + @BeforeMethod + public void setUp() throws Exception { + validator = ValidatorUtil.getValidator(); + foo = new Foo( "" ); + } + + @Test + @TestForIssue( jiraKey = "HV-1494") + public void testHVSpecificNotEmpty() throws Exception { + Set> violations = validator.forExecutables() + .validateReturnValue( + foo, + Foo.class.getDeclaredMethod( "createBarString", String.class ), + "" + ); + assertCorrectConstraintTypes( violations, NotEmpty.class ); + + violations = validator.forExecutables() + .validateReturnValue( + foo, + Foo.class.getDeclaredMethod( "createBarString", String.class ), + " " + ); + assertNumberOfViolations( violations, 0 ); + } + + @Test + @TestForIssue( jiraKey = "HV-1494") + public void testCustomComposingConstraintOnReturnValue() throws Exception { + Set> violations = validator.forExecutables() + .validateReturnValue( + foo, + Foo.class.getDeclaredMethod( "createCustomBarString", String.class ), + "a" + ); + assertCorrectConstraintTypes( violations, CustomCompositeConstraint.class ); + + violations = validator.forExecutables() + .validateReturnValue( + foo, + Foo.class.getDeclaredMethod( "createCustomBarString", String.class ), + "1" + ); + assertNumberOfViolations( violations, 0 ); + } + + @Test + @TestForIssue( jiraKey = "HV-1494") + public void testCustomComposingConstraintOnParameters() throws Exception { + Set> violations = validator.forExecutables() + .validateParameters( + foo, + Foo.class.getDeclaredMethod( "createCustomBarString", String.class ), + new String[] { "abc" } + ); + assertCorrectConstraintTypes( violations, CustomCompositeConstraint.class ); + + violations = validator.forExecutables() + .validateParameters( + foo, + Foo.class.getDeclaredMethod( "createCustomBarString", String.class ), + new String[] { "1" } + ); + assertNumberOfViolations( violations, 0 ); + } + + private static class Foo { + + private String bar; + + public Foo(String bar) { + this.bar = bar; + } + + @NotEmpty + public String createBarString(String a) { + return bar; + } + + @CustomCompositeConstraint + public String createCustomBarString(@CustomCompositeConstraint String a) { + return bar; + } + } + + @Documented + @Constraint(validatedBy = { }) + @SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT) + @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) + @Retention(RUNTIME) + @ReportAsSingleViolation + @NotNull + @Size(min = 1) + @Pattern(regexp = "\\d*") + public @interface CustomCompositeConstraint { + String message() default "no message"; + + Class[] groups() default { }; + + Class[] payload() default { }; + } +}