[hibernate-commits] Hibernate SVN: r16711 - beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Jun 5 11:27:11 EDT 2009


Author: hardy.ferentschik
Date: 2009-06-05 11:27:11 -0400 (Fri, 05 Jun 2009)
New Revision: 16711

Added:
   beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcodeWithInvalidOverride.java
Removed:
   beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcodeConstraintValidator.java
Modified:
   beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/ConstraintCompositionTest.java
   beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcode.java
   beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcode.java
Log:
Constraint composition

Modified: beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/ConstraintCompositionTest.java
===================================================================
--- beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/ConstraintCompositionTest.java	2009-06-05 14:18:41 UTC (rev 16710)
+++ beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/ConstraintCompositionTest.java	2009-06-05 15:27:11 UTC (rev 16711)
@@ -17,9 +17,13 @@
 */
 package org.hibernate.jsr303.tck.tests.constraints.constraintcomposition;
 
+import java.lang.annotation.Annotation;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
+import javax.validation.BeanDescriptor;
+import javax.validation.ConstraintDefinitionException;
+import javax.validation.ConstraintDescriptor;
 import javax.validation.ConstraintViolation;
 import javax.validation.Validator;
 import javax.validation.constraints.NotNull;
@@ -35,6 +39,7 @@
 import org.jboss.testharness.impl.packaging.Classes;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
 import org.testng.annotations.Test;
 
 import org.hibernate.jsr303.tck.util.TestUtil;
@@ -53,10 +58,13 @@
 public class ConstraintCompositionTest extends AbstractTest {
 
 	@Test
-	@SpecAssertion(section = "2.3", id = "a")
-	public void testComposedConstraintsAreRecursive() {
+	@SpecAssertions({
+			@SpecAssertion(section = "2.3", id = "a"),
+			@SpecAssertion(section = "2.3", id = "k")
+	})
+	public void testComposedConstraints() {
+
 		Validator validator = TestUtil.getDefaultValidator();
-
 		FrenchAddress address = getFrenchAddressWithoutZipCode();
 		Set<ConstraintViolation<FrenchAddress>> constraintViolations = validator.validate( address );
 		assertCorrectNumberOfViolations( constraintViolations, 1 );
@@ -72,6 +80,28 @@
 	}
 
 	@Test
+	@SpecAssertions({
+			@SpecAssertion(section = "2.3", id = "a"),
+			@SpecAssertion(section = "2.3", id = "k")
+	})
+	public void testComposedConstraintsAreRecursive() {
+		Validator validator = TestUtil.getDefaultValidator();
+
+		GermanAddress address = new GermanAddress();
+		address.setAddressline1( "Rathausstrasse 5" );
+		address.setAddressline2( "3ter Stock" );
+		address.setCity( "Karlsruhe" );
+		Set<ConstraintViolation<GermanAddress>> constraintViolations = validator.validate( address );
+		assertCorrectNumberOfViolations( constraintViolations, 1 );
+		assertConstraintViolation(
+				constraintViolations.iterator().next(),
+				GermanAddress.class,
+				null,
+				"zipCode"
+		);
+	}
+
+	@Test
 	@SpecAssertion(section = "2.3", id = "b")
 	public void testValidationOfMainAnnotationIsAlsoApplied() {
 
@@ -88,13 +118,17 @@
 	}
 
 	@Test
-	@SpecAssertion(section = "2.3", id = "c")
+	@SpecAssertions({
+			@SpecAssertion(section = "2.3", id = "c"),
+			@SpecAssertion(section = "2.3", id = "i"),
+			@SpecAssertion(section = "2.3", id = "l"),
+			@SpecAssertion(section = "2.3", id = "m"),
+			@SpecAssertion(section = "2.3", id = "n")
+	})
 	public void testEachFailingConstraintCreatesConstraintViolation() {
 
 		Validator validator = TestUtil.getDefaultValidator();
-
 		FrenchAddress address = getFrenchAddressWithoutZipCode();
-
 		address.setZipCode( "abc" );
 		Set<ConstraintViolation<FrenchAddress>> constraintViolations = validator.validate( address );
 		assertCorrectNumberOfViolations( constraintViolations, 3 );
@@ -155,41 +189,59 @@
 	}
 
 	@Test
-	public void testNestedComposition() {
+	@SpecAssertion(section = "2.3", id = "g")
+	public void testOnlySingleConstraintViolation() {
 		Validator validator = TestUtil.getDefaultValidator();
 
 		GermanAddress address = new GermanAddress();
 		address.setAddressline1( "Rathausstrasse 5" );
 		address.setAddressline2( "3ter Stock" );
 		address.setCity( "Karlsruhe" );
+		address.setZipCode( "abc" );
+		// actually three composing constraints fail, but due to @ReportAsSingleViolation only one will be reported.
 		Set<ConstraintViolation<GermanAddress>> constraintViolations = validator.validate( address );
 		assertCorrectNumberOfViolations( constraintViolations, 1 );
 		assertConstraintViolation(
 				constraintViolations.iterator().next(),
 				GermanAddress.class,
-				null,
+				"abc",
 				"zipCode"
 		);
 	}
 
 	@Test
-	public void testOnlySingleConstraintViolation() {
+	@SpecAssertion(section = "2.3", id = "h")
+	public void testAttributesDefinedOnComposingConstraints() {
+
 		Validator validator = TestUtil.getDefaultValidator();
+		BeanDescriptor descriptor = validator.getConstraintsForClass( FrenchAddress.class );
+		Set<ConstraintDescriptor<?>> constraintDescriptors = descriptor.getConstraintsForProperty( "zipCode" )
+				.getConstraintDescriptors();
+		for ( ConstraintDescriptor<?> constraintDescriptor : constraintDescriptors ) {
+			Annotation ann = constraintDescriptor.getAnnotation();
+			if ( Pattern.class.getName().equals( ann.annotationType().getName() ) ) {
+				String regexp = ( ( Pattern ) ann ).regexp();
+				if ( regexp.equals( "\\d*" ) || regexp.equals( "....." ) ) {
+					fail( "The regular expression should attributes are defined in the composing constraint." );
+				}
+			}
+		}
+	}
 
-		GermanAddress address = new GermanAddress();
-		address.setAddressline1( "Rathausstrasse 5" );
-		address.setAddressline2( "3ter Stock" );
-		address.setCity( "Karlsruhe" );
-		address.setZipCode( "abc" );
-		// actually three composing constraints fail, but due to @ReportAsSingleViolation only one will be reported.
-		Set<ConstraintViolation<GermanAddress>> constraintViolations = validator.validate( address );
-		assertCorrectNumberOfViolations( constraintViolations, 1 );
-		assertConstraintViolation(
-				constraintViolations.iterator().next(),
-				GermanAddress.class,
-				"abc",
-				"zipCode"
-		);
+	@Test
+	@SpecAssertions({
+			@SpecAssertion(section = "2.3", id = "j"),
+			@SpecAssertion(section = "2.3", id = "o")
+	})
+	public void testOverridenAttributesMustMatchInType() {
+		Validator validator = TestUtil.getDefaultValidator();
+		try {
+			validator.validate( new DummyEntityWithZipCode( "foobar" ) );
+			fail( "Wrong atttibute override in composite constraint. An Exception should have been thrown." );
+		}
+		catch ( ConstraintDefinitionException e ) {
+			// success
+		}
 	}
 
 	private FrenchAddress getFrenchAddressWithoutZipCode() {
@@ -199,4 +251,13 @@
 		address.setCity( "Bordeaux" );
 		return address;
 	}
+
+	class DummyEntityWithZipCode {
+		@FrenchZipcodeWithInvalidOverride
+		String zip;
+
+		DummyEntityWithZipCode(String zip) {
+			this.zip = zip;
+		}
+	}
 }
\ No newline at end of file

Modified: beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcode.java
===================================================================
--- beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcode.java	2009-06-05 14:18:41 UTC (rev 16710)
+++ beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcode.java	2009-06-05 15:27:11 UTC (rev 16711)
@@ -26,7 +26,6 @@
 import java.lang.annotation.Target;
 import javax.validation.Constraint;
 import javax.validation.OverridesAttribute;
-import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 
@@ -50,11 +49,12 @@
 	@OverridesAttribute.List({
 			@OverridesAttribute(constraint = Size.class, name = "min"),
 			@OverridesAttribute(constraint = Size.class, name = "max")
-	}) int size() default 5;
+	})
+	int size() default 5;
 
-	@OverridesAttribute(constraint = Size.class,
-			name = "message") String sizeMessage() default "A french zip code has a length of 5";
+	@OverridesAttribute(constraint = Size.class, name = "message")
+	String sizeMessage() default "A french zip code has a length of 5";
 
-
-	@OverridesAttribute(constraint = Pattern.class, name = "regexp", constraintIndex = 2) String regex() default "\\d*";
+	@OverridesAttribute(constraint = Pattern.class, name = "regexp", constraintIndex = 2)
+	String regex() default "\\d*";
 }

Added: beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcodeWithInvalidOverride.java
===================================================================
--- beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcodeWithInvalidOverride.java	                        (rev 0)
+++ beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcodeWithInvalidOverride.java	2009-06-05 15:27:11 UTC (rev 16711)
@@ -0,0 +1,57 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jsr303.tck.tests.constraints.constraintcomposition;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.validation.Constraint;
+import javax.validation.OverridesAttribute;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+
+/**
+ * @author Hardy Ferentschik
+ */
+ at NotEmpty
+ at Size
+// first pattern just duplicates the length of 5 characters, the second pattern is just to proof that parameters can be overridden.
+ at Pattern.List({ @Pattern(regexp = "....."), @Pattern(regexp = "bar") })
+ at Constraint(validatedBy = FrenchZipcodeConstraintValidator.class)
+ at Documented
+ at Target({ METHOD, FIELD, TYPE })
+ at Retention(RUNTIME)
+public @interface FrenchZipcodeWithInvalidOverride {
+	public abstract String message() default "Wrong zipcode";
+
+	public abstract Class<?>[] groups() default { };
+
+	@OverridesAttribute.List({
+			@OverridesAttribute(constraint = Size.class, name = "min"),
+			@OverridesAttribute(constraint = Size.class, name = "max")
+	}) public abstract String size() default "5";
+
+	@OverridesAttribute(constraint = Size.class, name = "message") public abstract String sizeMessage() default "A french zip code has a length of 5";
+
+	@OverridesAttribute(constraint = Pattern.class, name = "regexp", constraintIndex = 2) public abstract String regex() default "\\d*";
+}
\ No newline at end of file


Property changes on: beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/FrenchZipcodeWithInvalidOverride.java
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcode.java
===================================================================
--- beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcode.java	2009-06-05 14:18:41 UTC (rev 16710)
+++ beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcode.java	2009-06-05 15:27:11 UTC (rev 16711)
@@ -26,6 +26,8 @@
 import java.lang.annotation.Target;
 import javax.validation.Constraint;
 import javax.validation.ReportAsSingleViolation;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
 
 /**
  * Constraint used to test nested composing constraints.
@@ -33,7 +35,7 @@
  * @author Hardy Ferentschik
  */
 @FrenchZipcode
- at Constraint(validatedBy = GermanZipcodeConstraintValidator.class)
+ at Constraint(validatedBy = GermanZipcode.GermanZipcodeConstraintValidator.class)
 @Documented
 @Target({ METHOD, FIELD, TYPE })
 @Retention(RUNTIME)
@@ -42,4 +44,14 @@
 	public abstract String message() default "Falsche Postnummer.";
 
 	public abstract Class<?>[] groups() default { };
+
+	public class GermanZipcodeConstraintValidator implements ConstraintValidator<GermanZipcode, String> {
+
+	public void initialize(GermanZipcode parameters) {
+	}
+
+	public boolean isValid(String object, ConstraintValidatorContext constraintValidatorContext) {
+		return true;
+	}
+}
 }
\ No newline at end of file

Deleted: beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcodeConstraintValidator.java
===================================================================
--- beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcodeConstraintValidator.java	2009-06-05 14:18:41 UTC (rev 16710)
+++ beanvalidation/trunk/validation-tck/src/main/java/org/hibernate/jsr303/tck/tests/constraints/constraintcomposition/GermanZipcodeConstraintValidator.java	2009-06-05 15:27:11 UTC (rev 16711)
@@ -1,34 +0,0 @@
-// $Id: GermanZipcodeConstraintValidator.java 15829 2009-01-29 05:20:27Z epbernard $
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, and individual contributors
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.hibernate.jsr303.tck.tests.constraints.constraintcomposition;
-
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-
-/**
- * @author Hardy Ferentschik
- */
-public class GermanZipcodeConstraintValidator implements ConstraintValidator<GermanZipcode, String> {
-
-	public void initialize(GermanZipcode parameters) {
-	}
-
-	public boolean isValid(String object, ConstraintValidatorContext constraintValidatorContext) {
-		return true;
-	}
-}
\ No newline at end of file




More information about the hibernate-commits mailing list