[hibernate-commits] Hibernate SVN: r16031 - in validator/trunk/hibernate-validator/src: main/java/org/hibernate/validation/engine and 11 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Feb 25 08:09:51 EST 2009


Author: hardy.ferentschik
Date: 2009-02-25 08:09:51 -0500 (Wed, 25 Feb 2009)
New Revision: 16031

Added:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java
Removed:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java
Modified:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java
   validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties
   validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
   validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java
Log:
HV-113 Implemented redefining of default group for validate, validateValue and validateProperty
HV-121 Added support for javax.validation.Pattern and removed obsolete classes

Deleted: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -1,50 +0,0 @@
-// $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.validation.constraints;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-import javax.validation.Constraint;
-
-/**
- * @author Hardy Ferentschik
- */
- at Documented
- at Constraint(validatedBy = PatternValidator.class)
- at Target({ METHOD, FIELD })
- at Retention(RUNTIME)
-public @interface Pattern {
-	String message() default "{validator.pattern}";
-
-	Class<?>[] groups() default { };
-
-	/**
-	 * @return the regular expression the annotated string must match.
-	 */
-	String regex();
-
-	/**
-	 * @return Additioanl regular expression processing flags. Default is 0.
-	 */
-	int flags() default 0;
-}
-

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/PatternValidator.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -20,6 +20,7 @@
 import java.util.regex.Matcher;
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
+import javax.validation.constraints.Pattern;
 
 /**
  * @author Hardy Ferentschik
@@ -29,10 +30,17 @@
 	private java.util.regex.Pattern pattern;
 
 	public void initialize(Pattern parameters) {
-		pattern = java.util.regex.Pattern.compile(
-				parameters.regex(),
-				parameters.flags()
-		);
+		Pattern.Flag flags[] = parameters.flags();
+		if ( flags.length == 0 ) {
+			pattern = java.util.regex.Pattern.compile( parameters.regexp() );
+		}
+		else {
+			int intFlag = 0;
+			for ( Pattern.Flag flag : flags ) {
+				intFlag = intFlag | mapFlagToInt( flag );
+			}
+			pattern = java.util.regex.Pattern.compile( parameters.regexp(), intFlag );
+		}
 	}
 
 	public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
@@ -42,4 +50,39 @@
 		Matcher m = pattern.matcher( value );
 		return m.matches();
 	}
+
+	private int mapFlagToInt(Pattern.Flag flag) {
+		int intFlag = 0;
+		switch ( flag ) {
+			case UNIX_LINES: {
+				intFlag = java.util.regex.Pattern.UNIX_LINES;
+				break;
+			}
+			case CASE_INSENSITIVE: {
+				intFlag = java.util.regex.Pattern.CASE_INSENSITIVE;
+				break;
+			}
+			case COMMENTS: {
+				intFlag = java.util.regex.Pattern.COMMENTS;
+				break;
+			}
+			case MULTILINE: {
+				intFlag = java.util.regex.Pattern.MULTILINE;
+				break;
+			}
+			case DOTALL: {
+				intFlag = java.util.regex.Pattern.DOTALL;
+				break;
+			}
+			case UNICODE_CASE: {
+				intFlag = java.util.regex.Pattern.UNICODE_CASE;
+				break;
+			}
+			case CANON_EQ: {
+				intFlag = java.util.regex.Pattern.CANON_EQ;
+				break;
+			}
+		}
+		return intFlag;
+	}
 }

Deleted: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Patterns.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -1,36 +0,0 @@
-// $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.validation.constraints;
-
-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;
-
-/**
- * @author Hardy Ferentschik
- */
- at Documented
- at Target({ METHOD, FIELD, TYPE })
- at Retention(RUNTIME)
-public @interface Patterns {
-	Pattern[] value();
-}
\ No newline at end of file

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaData.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -67,7 +67,7 @@
 	 * @return A list of <code>MetaConstraint</code> instances encapsulating the information of all the constraints
 	 *         defined on the bean.
 	 */
-	List<MetaConstraint> geMetaConstraintList();
+	List<MetaConstraint<T>> geMetaConstraintList();
 
 	/**
 	 * @return A map keying the property name of a constraint to its <code>ElementDescriptor</code>.

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BeanMetaDataImpl.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -63,7 +63,7 @@
 	/**
 	 * List of constraints.
 	 */
-	private List<MetaConstraint> metaConstraintList = new ArrayList<MetaConstraint>();
+	private List<MetaConstraint<T>> metaConstraintList = new ArrayList<MetaConstraint<T>>();
 
 	/**
 	 * List of cascaded fields.
@@ -85,11 +85,14 @@
 	 */
 	private List<Class<?>> defaultGroupSequence = new ArrayList<Class<?>>();
 
-	private final BuiltinConstraints builtinConstraints;
+	/**
+	 * Object keeping track of all builtin constraints.
+	 */
+	private final ConstraintHelper constraintHelper;
 
-	public BeanMetaDataImpl(Class<T> beanClass, BuiltinConstraints builtinConstraints) {
+	public BeanMetaDataImpl(Class<T> beanClass, ConstraintHelper constraintHelper) {
 		this.beanClass = beanClass;
-		this.builtinConstraints = builtinConstraints;
+		this.constraintHelper = constraintHelper;
 		createMetaData();
 	}
 
@@ -173,7 +176,7 @@
 			List<ConstraintDescriptorImpl> fieldMetadata = findFieldLevelConstraints( field );
 			for ( ConstraintDescriptorImpl constraintDescription : fieldMetadata ) {
 				ReflectionHelper.setAccessibility( field );
-				MetaConstraint metaConstraint = new MetaConstraint( field, constraintDescription );
+				MetaConstraint<T> metaConstraint = new MetaConstraint<T>( field, beanClass, constraintDescription );
 				metaConstraintList.add( metaConstraint );
 			}
 			if ( field.isAnnotationPresent( Valid.class ) ) {
@@ -188,7 +191,7 @@
 			List<ConstraintDescriptorImpl> methodMetadata = findMethodLevelConstraints( method );
 			for ( ConstraintDescriptorImpl constraintDescription : methodMetadata ) {
 				ReflectionHelper.setAccessibility( method );
-				MetaConstraint metaConstraint = new MetaConstraint( method, constraintDescription );
+				MetaConstraint<T> metaConstraint = new MetaConstraint<T>( method, beanClass, constraintDescription );
 				metaConstraintList.add( metaConstraint );
 			}
 			if ( method.isAnnotationPresent( Valid.class ) ) {
@@ -201,7 +204,7 @@
 	private void initClassConstraints(Class clazz) {
 		List<ConstraintDescriptorImpl> classMetadata = findClassLevelConstraints( clazz );
 		for ( ConstraintDescriptorImpl constraintDescription : classMetadata ) {
-			MetaConstraint metaConstraint = new MetaConstraint( clazz, constraintDescription );
+			MetaConstraint<T> metaConstraint = new MetaConstraint<T>( clazz, constraintDescription );
 			metaConstraintList.add( metaConstraint );
 		}
 	}
@@ -218,13 +221,13 @@
 		List<ConstraintDescriptorImpl> constraintDescriptors = new ArrayList<ConstraintDescriptorImpl>();
 
 		List<Annotation> constraints = new ArrayList<Annotation>();
-		if ( ReflectionHelper.isConstraintAnnotation( annotation ) ||
-				ReflectionHelper.isBuiltInConstraintAnnotation( annotation ) ) {
+		if ( constraintHelper.isConstraintAnnotation( annotation ) ||
+				constraintHelper.isBuiltinConstraint( annotation ) ) {
 			constraints.add( annotation );
 		}
 
 		// check if we have a multi value constraint
-		constraints.addAll( ReflectionHelper.getMultiValueConstraints( annotation ) );
+		constraints.addAll( constraintHelper.getMultiValueConstraints( annotation ) );
 
 		for ( Annotation constraint : constraints ) {
 			final ConstraintDescriptorImpl constraintDescriptor = buildConstraintDescriptor( constraint );
@@ -236,7 +239,7 @@
 	@SuppressWarnings("unchecked")
 	private <A extends Annotation> ConstraintDescriptorImpl buildConstraintDescriptor(A annotation) {
 		Class<?>[] groups = ReflectionHelper.getAnnotationParameter( annotation, "groups", Class[].class );
-		return new ConstraintDescriptorImpl( annotation, groups, builtinConstraints );
+		return new ConstraintDescriptorImpl( annotation, groups, constraintHelper );
 	}
 
 	/**
@@ -346,7 +349,7 @@
 		return cascadedMembers;
 	}
 
-	public List<MetaConstraint> geMetaConstraintList() {
+	public List<MetaConstraint<T>> geMetaConstraintList() {
 		return metaConstraintList;
 	}
 

Deleted: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -1,129 +0,0 @@
-// $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.validation.engine;
-
-import java.lang.annotation.Annotation;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.validation.ConstraintValidator;
-import javax.validation.ValidationException;
-import javax.validation.constraints.AssertFalse;
-import javax.validation.constraints.AssertTrue;
-import javax.validation.constraints.Digits;
-import javax.validation.constraints.Future;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Null;
-import javax.validation.constraints.Size;
-import javax.validation.constraints.Past;
-
-import org.hibernate.validation.constraints.AssertFalseValidator;
-import org.hibernate.validation.constraints.AssertTrueValidator;
-import org.hibernate.validation.constraints.DigitsValidatorForNumber;
-import org.hibernate.validation.constraints.DigitsValidatorForString;
-import org.hibernate.validation.constraints.FutureValidatorForCalendar;
-import org.hibernate.validation.constraints.FutureValidatorForDate;
-import org.hibernate.validation.constraints.MaxValidatorForNumber;
-import org.hibernate.validation.constraints.MaxValidatorForString;
-import org.hibernate.validation.constraints.MinValidatorForNumber;
-import org.hibernate.validation.constraints.MinValidatorForString;
-import org.hibernate.validation.constraints.NotNullValidator;
-import org.hibernate.validation.constraints.NullValidator;
-import org.hibernate.validation.constraints.PastValidatorForCalendar;
-import org.hibernate.validation.constraints.PastValidatorForDate;
-import org.hibernate.validation.constraints.SizeValidatorForString;
-import org.hibernate.validation.constraints.SizeValidatorForCollection;
-import org.hibernate.validation.constraints.SizeValidatorForArray;
-import org.hibernate.validation.constraints.SizeValidatorForMap;
-
-/**
- * @author Hardy Ferentschik
- * @author Alaa Nassef
- */
-public class BuiltinConstraints {
-
-	private final Map<Class<? extends Annotation>, List<Class<? extends ConstraintValidator<?, ?>>>> builtinConstraints =
-			new HashMap<Class<? extends Annotation>, List<Class<? extends ConstraintValidator<?, ?>>>>();
-
-	public BuiltinConstraints() {
-
-		List<Class<? extends ConstraintValidator<?, ?>>> constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( AssertFalseValidator.class );
-		builtinConstraints.put( AssertFalse.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( AssertTrueValidator.class );
-		builtinConstraints.put( AssertTrue.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( FutureValidatorForCalendar.class );
-		constraintList.add( FutureValidatorForDate.class );
-		builtinConstraints.put( Future.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( MaxValidatorForNumber.class );
-		constraintList.add( MaxValidatorForString.class );
-		builtinConstraints.put( Max.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( MinValidatorForNumber.class );
-		constraintList.add( MinValidatorForString.class );
-		builtinConstraints.put( Min.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( NotNullValidator.class );
-		builtinConstraints.put( NotNull.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( NullValidator.class );
-		builtinConstraints.put( Null.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( PastValidatorForCalendar.class );
-		constraintList.add( PastValidatorForDate.class );
-		builtinConstraints.put( Past.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( DigitsValidatorForString.class );
-		constraintList.add( DigitsValidatorForNumber.class );
-		builtinConstraints.put( Digits.class, constraintList );
-
-		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
-		constraintList.add( SizeValidatorForString.class );
-		constraintList.add( SizeValidatorForCollection.class );
-		constraintList.add( SizeValidatorForArray.class );
-		constraintList.add( SizeValidatorForMap.class );
-		builtinConstraints.put( Size.class, constraintList );
-
-
-	}
-
-	public List<Class<? extends ConstraintValidator<?, ?>>> getBuiltInConstraints(Annotation annotation) {
-		List<Class<? extends ConstraintValidator<?, ?>>> constraints = builtinConstraints.get( annotation.annotationType() );
-
-		if ( constraints == null ) {
-			throw new ValidationException( "Unable to find constraints for  " + annotation.annotationType() );
-		}
-
-		return constraints;
-	}
-
-}

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintDescriptorImpl.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -40,7 +40,6 @@
 import org.slf4j.Logger;
 
 import org.hibernate.validation.util.LoggerFactory;
-import org.hibernate.validation.util.ReflectionHelper;
 import org.hibernate.validation.util.annotationfactory.AnnotationDescriptor;
 import org.hibernate.validation.util.annotationfactory.AnnotationFactory;
 
@@ -95,21 +94,21 @@
 	/**
 	 * Handle to the builtin constraint implementations.
 	 */
-	private final BuiltinConstraints builtinConstraints;
+	private final ConstraintHelper constraintHelper;
 
-	public ConstraintDescriptorImpl(U annotation, Class<?>[] groups, BuiltinConstraints builtinConstraints) {
-		this( annotation, new HashSet<Class<?>>(), builtinConstraints );
+	public ConstraintDescriptorImpl(U annotation, Class<?>[] groups, ConstraintHelper constraintHelper) {
+		this( annotation, new HashSet<Class<?>>(), constraintHelper );
 		if ( groups.length == 0 ) {
 			groups = DEFAULT_GROUP;
 		}
 		this.groups.addAll( Arrays.asList( groups ) );
 	}
 
-	public ConstraintDescriptorImpl(U annotation, Set<Class<?>> groups, BuiltinConstraints builtinConstraints) {
+	public ConstraintDescriptorImpl(U annotation, Set<Class<?>> groups, ConstraintHelper constraintHelper) {
 		this.annotation = annotation;
 		this.groups = groups;
 		this.parameters = getAnnotationParameters( annotation );
-		this.builtinConstraints = builtinConstraints;
+		this.constraintHelper = constraintHelper;
 
 		this.isReportAsSingleInvalidConstraint = annotation.annotationType().isAnnotationPresent(
 				ReportAsSingleViolation.class
@@ -122,8 +121,8 @@
 	}
 
 	private void findConstraintClasses() {
-		if ( ReflectionHelper.isBuiltInConstraintAnnotation( annotation ) ) {
-			constraintClasses.addAll( builtinConstraints.getBuiltInConstraints( annotation ) );
+		if ( constraintHelper.isBuiltinConstraint( annotation ) ) {
+			constraintClasses.addAll( constraintHelper.getBuiltInConstraints( annotation ) );
 		}
 		else {
 			Constraint constraint = annotation.annotationType().getAnnotation( Constraint.class );
@@ -248,9 +247,8 @@
 
 	private void parseComposingConstraints() {
 		for ( Annotation declaredAnnotation : annotation.annotationType().getDeclaredAnnotations() ) {
-			if ( ReflectionHelper.isConstraintAnnotation( declaredAnnotation ) || ReflectionHelper.isBuiltInConstraintAnnotation(
-					declaredAnnotation
-			) ) {
+			if ( constraintHelper.isConstraintAnnotation( declaredAnnotation )
+					|| constraintHelper.isBuiltinConstraint( declaredAnnotation ) ) {
 				ConstraintDescriptorImpl descriptor = createComposingConstraintDescriptor(
 						OVERRIDES_PARAMETER_DEFAULT_INDEX,
 						declaredAnnotation
@@ -258,8 +256,8 @@
 				composingConstraints.add( descriptor );
 				log.debug( "Adding composing constraint: " + descriptor );
 			}
-			else if ( ReflectionHelper.isMultiValueConstraint( declaredAnnotation ) ) {
-				List<Annotation> multiValueConstraints = ReflectionHelper.getMultiValueConstraints( declaredAnnotation );
+			else if ( constraintHelper.isMultiValueConstraint( declaredAnnotation ) ) {
+				List<Annotation> multiValueConstraints = constraintHelper.getMultiValueConstraints( declaredAnnotation );
 				int index = 1;
 				for ( Annotation constraintAnnotation : multiValueConstraints ) {
 					ConstraintDescriptorImpl descriptor = createComposingConstraintDescriptor(
@@ -288,7 +286,7 @@
 			}
 		}
 		Annotation annotationProxy = AnnotationFactory.create( annotationDescriptor );
-		return new ConstraintDescriptorImpl( annotationProxy, groups, builtinConstraints );
+		return new ConstraintDescriptorImpl( annotationProxy, groups, constraintHelper );
 	}
 
 	private class ClassIndexWrapper {

Copied: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java (from rev 16028, validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/BuiltinConstraints.java)
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -0,0 +1,272 @@
+// $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.validation.engine;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.validation.Constraint;
+import javax.validation.ConstraintValidator;
+import javax.validation.ValidationException;
+import javax.validation.constraints.AssertFalse;
+import javax.validation.constraints.AssertTrue;
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.Future;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import javax.validation.constraints.Past;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+import org.slf4j.Logger;
+
+import org.hibernate.validation.constraints.AssertFalseValidator;
+import org.hibernate.validation.constraints.AssertTrueValidator;
+import org.hibernate.validation.constraints.DigitsValidatorForNumber;
+import org.hibernate.validation.constraints.DigitsValidatorForString;
+import org.hibernate.validation.constraints.FutureValidatorForCalendar;
+import org.hibernate.validation.constraints.FutureValidatorForDate;
+import org.hibernate.validation.constraints.MaxValidatorForNumber;
+import org.hibernate.validation.constraints.MaxValidatorForString;
+import org.hibernate.validation.constraints.MinValidatorForNumber;
+import org.hibernate.validation.constraints.MinValidatorForString;
+import org.hibernate.validation.constraints.NotNullValidator;
+import org.hibernate.validation.constraints.NullValidator;
+import org.hibernate.validation.constraints.PastValidatorForCalendar;
+import org.hibernate.validation.constraints.PastValidatorForDate;
+import org.hibernate.validation.constraints.PatternValidator;
+import org.hibernate.validation.constraints.SizeValidatorForArray;
+import org.hibernate.validation.constraints.SizeValidatorForCollection;
+import org.hibernate.validation.constraints.SizeValidatorForMap;
+import org.hibernate.validation.constraints.SizeValidatorForString;
+import org.hibernate.validation.util.LoggerFactory;
+import org.hibernate.validation.util.ReflectionHelper;
+
+/**
+ * Keeps track of builtin constraints and their validator implementations.
+ *
+ * @author Hardy Ferentschik
+ * @author Alaa Nassef
+ */
+public class ConstraintHelper {
+
+	private static final Logger log = LoggerFactory.make();
+
+	private final Map<Class<? extends Annotation>, List<Class<? extends ConstraintValidator<?, ?>>>> builtinConstraints =
+			new HashMap<Class<? extends Annotation>, List<Class<? extends ConstraintValidator<?, ?>>>>();
+
+	public ConstraintHelper() {
+
+		List<Class<? extends ConstraintValidator<?, ?>>> constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( AssertFalseValidator.class );
+		builtinConstraints.put( AssertFalse.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( AssertTrueValidator.class );
+		builtinConstraints.put( AssertTrue.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( FutureValidatorForCalendar.class );
+		constraintList.add( FutureValidatorForDate.class );
+		builtinConstraints.put( Future.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( MaxValidatorForNumber.class );
+		constraintList.add( MaxValidatorForString.class );
+		builtinConstraints.put( Max.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( MinValidatorForNumber.class );
+		constraintList.add( MinValidatorForString.class );
+		builtinConstraints.put( Min.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( NotNullValidator.class );
+		builtinConstraints.put( NotNull.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( NullValidator.class );
+		builtinConstraints.put( Null.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( PastValidatorForCalendar.class );
+		constraintList.add( PastValidatorForDate.class );
+		builtinConstraints.put( Past.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( DigitsValidatorForString.class );
+		constraintList.add( DigitsValidatorForNumber.class );
+		builtinConstraints.put( Digits.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( SizeValidatorForString.class );
+		constraintList.add( SizeValidatorForCollection.class );
+		constraintList.add( SizeValidatorForArray.class );
+		constraintList.add( SizeValidatorForMap.class );
+		builtinConstraints.put( Size.class, constraintList );
+
+		constraintList = new ArrayList<Class<? extends ConstraintValidator<?, ?>>>();
+		constraintList.add( PatternValidator.class );
+		builtinConstraints.put( Pattern.class, constraintList );
+	}
+
+	public List<Class<? extends ConstraintValidator<?, ?>>> getBuiltInConstraints(Annotation annotation) {
+		List<Class<? extends ConstraintValidator<?, ?>>> constraints = builtinConstraints.get( annotation.annotationType() );
+
+		if ( constraints == null ) {
+			throw new ValidationException( "Unable to find constraints for  " + annotation.annotationType() );
+		}
+
+		return constraints;
+	}
+
+	public boolean isBuiltinConstraint(Annotation annotation) {
+		return builtinConstraints.containsKey( annotation.annotationType() );
+	}
+
+	/**
+	 * Checks whether a given annotation is a multi value constraint or not.
+	 *
+	 * @param annotation the annotation to check.
+	 *
+	 * @return <code>true</code> if the specified annotation is a multi value constraints, <code>false</code>
+	 *         otherwise.
+	 */
+	public boolean isMultiValueConstraint(Annotation annotation) {
+		boolean isMultiValueConstraint = false;
+		try {
+			Method m = annotation.getClass().getMethod( "value" );
+			Class returnType = m.getReturnType();
+			if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
+				Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
+				for ( Annotation a : annotations ) {
+					if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a ) ) {
+						isMultiValueConstraint = true;
+					}
+					else {
+						isMultiValueConstraint = false;
+						break;
+					}
+				}
+			}
+		}
+		catch ( NoSuchMethodException nsme ) {
+			// ignore
+		}
+		catch ( IllegalAccessException iae ) {
+			// ignore
+		}
+		catch ( InvocationTargetException ite ) {
+			// ignore
+		}
+		return isMultiValueConstraint;
+	}
+
+
+	/**
+	 * Checks whether a given annotation is a multi value constraint and returns the contained constraints if so.
+	 *
+	 * @param annotation the annotation to check.
+	 *
+	 * @return A list of constraint annotations or the empty list if <code>annotation</code> is not a multi constraint
+	 *         annotation.
+	 */
+	public <A extends Annotation> List<Annotation> getMultiValueConstraints(A annotation) {
+		List<Annotation> annotationList = new ArrayList<Annotation>();
+		try {
+			Method m = annotation.getClass().getMethod( "value" );
+			Class returnType = m.getReturnType();
+			if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
+				Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
+				for ( Annotation a : annotations ) {
+					if ( isConstraintAnnotation( a ) || isBuiltinConstraint( a ) ) {
+						annotationList.add( a );
+					}
+				}
+			}
+		}
+		catch ( NoSuchMethodException nsme ) {
+			// ignore
+		}
+		catch ( IllegalAccessException iae ) {
+			// ignore
+		}
+		catch ( InvocationTargetException ite ) {
+			// ignore
+		}
+		return annotationList;
+	}
+
+	/**
+	 * Checks whehter the specified annotation is a valid constraint annotation. A constraint annotations has to
+	 * fulfill the following conditions:
+	 * <ul>
+	 * <li>Has to contain a <code>ConstraintValidator</code> implementation.</li>
+	 * <li>Defines a message parameter.</li>
+	 * <li>Defines a group parameter.</li>
+	 * </ul>
+	 *
+	 * @param annotation The annotation to test.
+	 *
+	 * @return <code>true</code> if the annotation fulfills the above condtions, <code>false</code> otherwise.
+	 */
+	public boolean isConstraintAnnotation(Annotation annotation) {
+
+		Constraint constraint = annotation.annotationType()
+				.getAnnotation( Constraint.class );
+		if ( constraint == null ) {
+			return false;
+		}
+
+		try {
+			ReflectionHelper.getAnnotationParameter( annotation, "message", String.class );
+		}
+		catch ( Exception e ) {
+			String msg = annotation.annotationType().getName() + " contains Constraint annotation, but does " +
+					"not contain a message parameter. Annotation is getting ignored.";
+			log.warn( msg );
+			return false;
+		}
+
+		try {
+			ReflectionHelper.getAnnotationParameter( annotation, "groups", Class[].class );
+		}
+		catch ( Exception e ) {
+			String msg = annotation.annotationType().getName() + " contains Constraint annotation, but does " +
+					"not contain a groups parameter. Annotation is getting ignored.";
+			log.warn( msg );
+			return false;
+		}
+
+		Method[] methods = annotation.getClass().getMethods();
+		for ( Method m : methods ) {
+			if ( m.getName().startsWith( "valid" ) ) {
+				String msg = "Parameters starting with 'valid' are not allowed in a constraint.";
+				log.warn( msg );
+				return false;
+			}
+		}
+		return true;
+	}
+}


Property changes on: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ConstraintHelper.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaConstraint.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -35,7 +35,7 @@
  *
  * @author Hardy Ferentschik
  */
-public class MetaConstraint {
+public class MetaConstraint<T> {
 
 	/**
 	 * The constraint tree created from the constraint annotation.
@@ -71,31 +71,38 @@
 	 */
 	private final ElementType elementType;
 
+	/**
+	 * The class of the bean hosting this constraint.
+	 */
+	private final Class<T> beanClass;
+
 	public MetaConstraint(Type t, ConstraintDescriptor constraintDescriptor) {
-		this( t, null, null, ElementType.TYPE, constraintDescriptor, "" );
+		this( t, null, null, ElementType.TYPE, (Class<T>) t.getClass(), constraintDescriptor, "" );
 	}
 
-	public MetaConstraint(Method m, ConstraintDescriptor constraintDescriptor) {
+	public MetaConstraint(Method m, Class<T> beanClass, ConstraintDescriptor constraintDescriptor) {
 		this(
 				null,
 				m,
 				null,
 				ElementType.METHOD,
+				beanClass,
 				constraintDescriptor,
 				ReflectionHelper.getPropertyName( m )
 		);
 	}
 
-	public MetaConstraint(Field f, ConstraintDescriptor constraintDescriptor) {
-		this( null, null, f, ElementType.FIELD, constraintDescriptor, f.getName());
+	public MetaConstraint(Field f, Class<T> beanClass, ConstraintDescriptor constraintDescriptor) {
+		this( null, null, f, ElementType.FIELD, beanClass, constraintDescriptor, f.getName());
 	}
 
-	private MetaConstraint(Type t, Method m, Field f, ElementType elementType, ConstraintDescriptor constraintDescriptor, String property) {
+	private MetaConstraint(Type t, Method m, Field f, ElementType elementType, Class<T> beanClass, ConstraintDescriptor constraintDescriptor, String property) {
 		this.type = t;
 		this.method = m;
 		this.field = f;
 		this.elementType = elementType;
 		this.propertyName = property;
+		this.beanClass = beanClass;
 		constraintTree = new ConstraintTree( constraintDescriptor );
 	}
 
@@ -167,6 +174,10 @@
 		return type;
 	}
 
+	public Class<T> getBeanClass() {
+		return beanClass;
+	}
+
 	public String getPropertyName() {
 		return propertyName;
 	}

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorContextImpl.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -15,16 +15,16 @@
 	private final MessageInterpolator factoryMessageInterpolator;
 	private final TraversableResolver factoryTraversableResolver;
 	private final ConstraintValidatorFactory constraintValidatorFactory;
-	private final BuiltinConstraints builtinConstraints;
+	private final ConstraintHelper constraintHelper;
 
 	public ValidatorContextImpl(ConstraintValidatorFactory constraintValidatorFactory,
 								MessageInterpolator factoryMessageInterpolator,
 								TraversableResolver factoryTraversableResolver,
-								BuiltinConstraints builtinConstraints) {
+								ConstraintHelper constraintHelper) {
 		this.constraintValidatorFactory = constraintValidatorFactory;
 		this.factoryMessageInterpolator = factoryMessageInterpolator;
 		this.factoryTraversableResolver = factoryTraversableResolver;
-		this.builtinConstraints = builtinConstraints;
+		this.constraintHelper = constraintHelper;
 		messageInterpolator( factoryMessageInterpolator );
 		traversableResolver( factoryTraversableResolver );
 	}
@@ -50,6 +50,6 @@
 	}
 
 	public Validator getValidator() {
-		return new ValidatorImpl( constraintValidatorFactory, messageInterpolator, builtinConstraints );
+		return new ValidatorImpl( constraintValidatorFactory, messageInterpolator, constraintHelper );
 	}
 }

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorFactoryImpl.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -34,7 +34,7 @@
 	private final MessageInterpolator messageInterpolator;
 	private final TraversableResolver traversableResolver;
 	private final ConstraintValidatorFactory constraintValidatorFactory;
-	private final BuiltinConstraints builtinConstraints = new BuiltinConstraints();
+	private final ConstraintHelper constraintHelper = new ConstraintHelper();
 
 	public ValidatorFactoryImpl(ConfigurationState configurationState) {
 		this.messageInterpolator = configurationState.getMessageInterpolator();
@@ -61,6 +61,8 @@
 	 * {@inheritDoc}
 	 */
 	public ValidatorContext usingContext() {
-		return new ValidatorContextImpl( constraintValidatorFactory, messageInterpolator, traversableResolver, builtinConstraints );
+		return new ValidatorContextImpl( constraintValidatorFactory, messageInterpolator, traversableResolver,
+				constraintHelper
+		);
 	}
 }

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -86,12 +86,12 @@
 
 	private final MessageInterpolator messageInterpolator;
 
-	private final BuiltinConstraints builtinConstraints;
+	private final ConstraintHelper constraintHelper;
 
-	public ValidatorImpl(ConstraintValidatorFactory constraintValidatorFactory, MessageInterpolator messageInterpolator, BuiltinConstraints builtinConstraints) {
+	public ValidatorImpl(ConstraintValidatorFactory constraintValidatorFactory, MessageInterpolator messageInterpolator, ConstraintHelper constraintHelper) {
 		this.constraintValidatorFactory = constraintValidatorFactory;
 		this.messageInterpolator = messageInterpolator;
-		this.builtinConstraints = builtinConstraints;
+		this.constraintHelper = constraintHelper;
 
 		groupChainGenerator = new GroupChainGenerator();
 	}
@@ -103,15 +103,13 @@
 		if ( object == null ) {
 			throw new IllegalArgumentException( "Validation of a null object" );
 		}
+		GroupChain groupChain = determineGroupExecutionOrder( groups );
 
 		ExecutionContext<T> context = new ExecutionContext<T>(
 				object, messageInterpolator, constraintValidatorFactory
 		);
 
-
-		groups = validateGroupVararg( groups );
-
-		List<ConstraintViolationImpl<T>> list = validateInContext( context, Arrays.asList( groups ) );
+		List<ConstraintViolationImpl<T>> list = validateInContext( context, groupChain );
 		return new HashSet<ConstraintViolation<T>>( list );
 	}
 
@@ -119,15 +117,14 @@
 	 * {@inheritDoc}
 	 */
 	public <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups) {
-
-		sanityCheckPropertyPath( propertyName );
-
 		if ( object == null ) {
 			throw new IllegalArgumentException( "Validated object cannot be null." );
 		}
+		sanityCheckPropertyPath( propertyName );
+		GroupChain groupChain = determineGroupExecutionOrder( groups );
 
 		List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
-		validateProperty( object, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
+		validateProperty( object, new PropertyIterator( propertyName ), failingConstraintViolations, groupChain );
 		return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
 	}
 
@@ -135,15 +132,14 @@
 	 * {@inheritDoc}
 	 */
 	public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
-
-		sanityCheckPropertyPath( propertyName );
-
 		if ( beanType == null ) {
 			throw new IllegalArgumentException( "The bean type cannot be null." );
 		}
+		sanityCheckPropertyPath( propertyName );
+		GroupChain groupChain = determineGroupExecutionOrder( groups );
 
 		List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
-		validateValue( beanType, value, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
+		validateValue( beanType, value, new PropertyIterator( propertyName ), failingConstraintViolations, groupChain );
 		return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
 	}
 
@@ -160,7 +156,7 @@
 		}
 	}
 
-	private Class<?>[] validateGroupVararg(Class<?>[] groups) {
+	private GroupChain determineGroupExecutionOrder(Class<?>[] groups) {
 		if ( groups == null ) {
 			throw new IllegalArgumentException( "null passed as group name" );
 		}
@@ -169,7 +165,8 @@
 		if ( groups.length == 0 ) {
 			groups = DEFAULT_GROUP_ARRAY;
 		}
-		return groups;
+
+		return groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
 	}
 
 	/**
@@ -177,16 +174,15 @@
 	 *
 	 * @param context A context object containing the object to validate together with other state information needed
 	 * for validation.
-	 * @param groups A list of groups to validate.
+	 * @param groupChain A <code>GroupChain</code> instance containing the resolved group sequence to execute
 	 *
 	 * @return List of invalid constraints.
 	 */
-	private <T> List<ConstraintViolationImpl<T>> validateInContext(ExecutionContext<T> context, List<Class<?>> groups) {
+	private <T> List<ConstraintViolationImpl<T>> validateInContext(ExecutionContext<T> context, GroupChain groupChain) {
 		if ( context.peekValidatedObject() == null ) {
 			return Collections.emptyList();
 		}
 
-		GroupChain groupChain = groupChainGenerator.getGroupChainFor( groups );
 		while ( groupChain.hasNext() ) {
 			int numberOfViolations = context.getFailingConstraints().size();
 			Group group = groupChain.next();
@@ -209,9 +205,8 @@
 	 */
 	private <T> void validateConstraints(ExecutionContext<T> executionContext) {
 		//casting rely on the fact that root object is at the top of the stack
-		@SuppressWarnings("unchecked")
-		BeanMetaData<T> beanMetaData =
-				( BeanMetaData<T> ) getBeanMetaData( executionContext.peekValidatedObjectType() );
+		@SuppressWarnings(" unchecked")
+		BeanMetaData<T> beanMetaData = getBeanMetaData( ( Class<T> ) executionContext.peekValidatedObjectType() );
 		if ( executionContext.getCurrentGroup().getName().equals( Default.class.getName() ) ) {
 			List<Class<?>> defaultGroupSequence = beanMetaData.getDefaultGroupSequence();
 			if ( log.isDebugEnabled() && defaultGroupSequence.size() > 0 ) {
@@ -251,7 +246,7 @@
 	 */
 	private <T> boolean validateConstraintsForCurrentGroup(ExecutionContext<T> executionContext, BeanMetaData<T> beanMetaData) {
 		boolean validationSuccessful = true;
-		for ( MetaConstraint metaConstraint : beanMetaData.geMetaConstraintList() ) {
+		for ( MetaConstraint<T> metaConstraint : beanMetaData.geMetaConstraintList() ) {
 			executionContext.pushProperty( metaConstraint.getPropertyName() );
 			if ( executionContext.checkValidationRequired( metaConstraint.getGroupList() ) ) {
 				boolean tmp = metaConstraint.validateConstraint( beanMetaData.getBeanClass(), executionContext );
@@ -313,6 +308,7 @@
 		return iter;
 	}
 
+	@SuppressWarnings("RedundantArrayCreation")
 	private <T> void validateCascadedConstraint(ExecutionContext<T> context, Iterator<?> iter) {
 		Object actualValue;
 		String propertyIndex;
@@ -336,21 +332,24 @@
 			context.replacePropertyIndex( propertyIndex );
 
 			context.pushValidatedObject( actualValue );
-			validateInContext( context, Arrays.asList( new Class<?>[] { context.getCurrentGroup() } ) );
+			validateInContext(
+					context,
+					groupChainGenerator.getGroupChainFor( Arrays.asList( new Class<?>[] { context.getCurrentGroup() } ) )
+			);
 			context.popValidatedObject();
 			i++;
 		}
 	}
 
-	private <T> void validateProperty(T object, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
+	private <T> void validateProperty(T object, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, GroupChain groupChain) {
 
 		@SuppressWarnings("unchecked")
 		final Class<T> beanType = ( Class<T> ) object.getClass();
 
-		Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
-		Object hostingBean = collectMetaConstraintsForPath( beanType, object, propertyIter, metaConstraints );
+		Set<MetaConstraint<T>> metaConstraints = new HashSet<MetaConstraint<T>>();
+		Object hostingBeanInstance = collectMetaConstraintsForPath( beanType, object, propertyIter, metaConstraints );
 
-		if ( hostingBean == null ) {
+		if ( hostingBeanInstance == null ) {
 			throw new IllegalArgumentException( "Invalid property path." );
 		}
 
@@ -358,57 +357,82 @@
 			return;
 		}
 
-		groups = validateGroupVararg( groups );
-
-		GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
 		while ( groupChain.hasNext() ) {
 			Group group = groupChain.next();
-			for ( MetaConstraint metaConstraint : metaConstraints ) {
-				if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
-					continue;
+			int numberOfConstraintViolations = failingConstraintViolations.size();
+			BeanMetaData<T> beanMetaData = getBeanMetaData( metaConstraints.iterator().next().getBeanClass() );
+
+			List<Class<?>> groupList;
+			if ( group.isDefaultGroup() ) {
+				groupList = beanMetaData.getDefaultGroupSequence();
+			}
+			else {
+				groupList = new ArrayList<Class<?>>();
+				groupList.add( group.getGroup() );
+			}
+
+			for ( Class<?> groupClass : groupList ) {
+				for ( MetaConstraint<T> metaConstraint : metaConstraints ) {
+					if ( metaConstraint.getGroupList().contains( groupClass ) ) {
+						ExecutionContext<T> context = new ExecutionContext<T>(
+								object, hostingBeanInstance, messageInterpolator, constraintValidatorFactory
+						);
+						context.pushProperty( propertyIter.getOriginalProperty() );
+						metaConstraint.validateConstraint( object.getClass(), context );
+						failingConstraintViolations.addAll( context.getFailingConstraints() );
+					}
 				}
-				ExecutionContext<T> context = new ExecutionContext<T>(
-						object, hostingBean, messageInterpolator, constraintValidatorFactory
-				);
-				context.pushProperty( propertyIter.getOriginalProperty() );
-				metaConstraint.validateConstraint( object.getClass(), context );
-				failingConstraintViolations.addAll( context.getFailingConstraints() );
+				if ( failingConstraintViolations.size() > numberOfConstraintViolations) {
+					break;
+				}
 			}
 
-			if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+			if ( groupChain.inSequence() && failingConstraintViolations.size() > numberOfConstraintViolations ) {
 				groupChain.moveToLastInCurrentSequence();
 			}
 		}
 	}
 
-	private <T> void validateValue(Class<T> beanType, Object value, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
-		Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
+	@SuppressWarnings("unchecked")
+	private <T> void validateValue(Class<T> beanType, Object value, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, GroupChain groupChain) {
+		Set<MetaConstraint<T>> metaConstraints = new HashSet<MetaConstraint<T>>();
 		collectMetaConstraintsForPath( beanType, null, propertyIter, metaConstraints );
 
 		if ( metaConstraints.size() == 0 ) {
 			return;
 		}
 
-		groups = validateGroupVararg( groups );
-
-		GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
 		while ( groupChain.hasNext() ) {
 			Group group = groupChain.next();
+			int numberOfConstraintViolations = failingConstraintViolations.size();
+			BeanMetaData<T> beanMetaData = getBeanMetaData( metaConstraints.iterator().next().getBeanClass() );
 
-			for ( MetaConstraint metaConstraint : metaConstraints ) {
-				if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
-					continue;
+			List<Class<?>> groupList;
+			if ( group.isDefaultGroup() ) {
+				groupList = beanMetaData.getDefaultGroupSequence();
+			}
+			else {
+				groupList = new ArrayList<Class<?>>();
+				groupList.add( group.getGroup() );
+			}
+
+			for ( Class<?> groupClass : groupList ) {
+				for ( MetaConstraint<T> metaConstraint : metaConstraints ) {
+					if ( metaConstraint.getGroupList().contains( groupClass ) ) {
+						ExecutionContext<T> context = new ExecutionContext<T>(
+								( T ) value, messageInterpolator, constraintValidatorFactory
+						);
+						context.pushProperty( propertyIter.getOriginalProperty() );
+						metaConstraint.validateConstraint( beanType.getClass(), value, context );
+						failingConstraintViolations.addAll( context.getFailingConstraints() );
+					}
 				}
-
-				ExecutionContext<T> context = new ExecutionContext<T>(
-						( T ) value, messageInterpolator, constraintValidatorFactory
-				);
-				context.pushProperty( propertyIter.getOriginalProperty() );
-				metaConstraint.validateConstraint( beanType, value, context );
-				failingConstraintViolations.addAll( context.getFailingConstraints() );
+				if ( failingConstraintViolations.size() > numberOfConstraintViolations) {
+					break;
+				}
 			}
 
-			if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+			if ( groupChain.inSequence() && failingConstraintViolations.size() > numberOfConstraintViolations ) {
 				groupChain.moveToLastInCurrentSequence();
 			}
 		}
@@ -427,7 +451,8 @@
 	 *
 	 * @return Returns the bean hosting the constraints which match the specified property path.
 	 */
-	private Object collectMetaConstraintsForPath(Class<?> clazz, Object value, PropertyIterator propertyIter, Set<MetaConstraint> metaConstraints) {
+	@SuppressWarnings("unchecked")
+	private <T> Object collectMetaConstraintsForPath(Class<T> clazz, Object value, PropertyIterator propertyIter, Set<MetaConstraint<T>> metaConstraints) {
 		propertyIter.split();
 
 		if ( !propertyIter.hasNext() ) {
@@ -435,8 +460,8 @@
 				throw new IllegalArgumentException( "Invalid property path." );
 			}
 
-			List<MetaConstraint> metaConstraintList = getBeanMetaData( clazz ).geMetaConstraintList();
-			for ( MetaConstraint metaConstraint : metaConstraintList ) {
+			List<MetaConstraint<T>> metaConstraintList = getBeanMetaData( clazz ).geMetaConstraintList();
+			for ( MetaConstraint<T> metaConstraint : metaConstraintList ) {
 				if ( metaConstraint.getPropertyName().equals( propertyIter.getHead() ) ) {
 					metaConstraints.add( metaConstraint );
 				}
@@ -458,7 +483,7 @@
 						}
 					}
 					collectMetaConstraintsForPath(
-							( Class<?> ) type, value, propertyIter, metaConstraints
+							( Class<T> ) type, value, propertyIter, metaConstraints
 					);
 				}
 			}
@@ -469,14 +494,14 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	private <T> BeanMetaDataImpl<T> getBeanMetaData(Class<T> beanClass) {
+	private <T> BeanMetaData<T> getBeanMetaData(Class<T> beanClass) {
 		if ( beanClass == null ) {
 			throw new IllegalArgumentException( "Class cannot be null" );
 		}
 		@SuppressWarnings("unchecked")
 		BeanMetaDataImpl<T> metadata = ( BeanMetaDataImpl<T> ) metadataProviders.get( beanClass );
 		if ( metadata == null ) {
-			metadata = new BeanMetaDataImpl<T>( beanClass, builtinConstraints );
+			metadata = new BeanMetaDataImpl<T>( beanClass, constraintHelper );
 			metadataProviders.put( beanClass, metadata );
 		}
 		return metadata;

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -17,6 +17,8 @@
 */
 package org.hibernate.validation.engine.groups;
 
+import javax.validation.groups.Default;
+
 /**
  * Encapsulates a single group.
  *
@@ -68,6 +70,10 @@
 		return true;
 	}
 
+	public boolean isDefaultGroup() {
+		return getGroup().getName().equals( Default.class.getName() );
+	}
+
 	@Override
 	public int hashCode() {
 		int result = group != null ? group.hashCode() : 0;

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -29,17 +29,13 @@
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.WildcardType;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import javax.validation.Constraint;
 import javax.validation.ValidationException;
 
-import org.slf4j.Logger;
-
 /**
  * Some reflection utility methods.
  *
@@ -47,8 +43,6 @@
  */
 public class ReflectionHelper {
 
-	private static final Logger log = LoggerFactory.make();
-
 	/**
 	 * Private constructor in order to avoid instantiation.
 	 */
@@ -73,133 +67,6 @@
 		return isBuiltInConstraintAnnotation;
 	}
 
-	/**
-	 * Checks whehter the specified annotation is a valid constraint annotation. A constraint annotations has to
-	 * fulfill the following conditions:
-	 * <ul>
-	 * <li>Has to contain a <code>ConstraintValidator</code> implementation.</li>
-	 * <li>Defines a message parameter.</li>
-	 * <li>Defines a group parameter.</li>
-	 * </ul>
-	 *
-	 * @param annotation The annotation to test.
-	 *
-	 * @return <code>true</code> if the annotation fulfills the above condtions, <code>false</code> otherwise.
-	 */
-	public static boolean isConstraintAnnotation(Annotation annotation) {
-
-		Constraint constraint = annotation.annotationType()
-				.getAnnotation( Constraint.class );
-		if ( constraint == null ) {
-			return false;
-		}
-
-		try {
-			getAnnotationParameter( annotation, "message", String.class );
-		}
-		catch ( Exception e ) {
-			String msg = annotation.annotationType().getName() + " contains Constraint annotation, but does " +
-					"not contain a message parameter. Annotation is getting ignored.";
-			log.warn( msg );
-			return false;
-		}
-
-		try {
-			getAnnotationParameter( annotation, "groups", Class[].class );
-		}
-		catch ( Exception e ) {
-			String msg = annotation.annotationType().getName() + " contains Constraint annotation, but does " +
-					"not contain a groups parameter. Annotation is getting ignored.";
-			log.warn( msg );
-			return false;
-		}
-
-		Method[] methods = annotation.getClass().getMethods();
-		for ( Method m : methods ) {
-			if ( m.getName().startsWith( "valid" ) ) {
-				String msg = "Parameters starting with 'valid' are not allowed in a constraint.";
-				log.warn( msg );
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Checks whether a given annotation is a multi value constraint or not.
-	 *
-	 * @param annotation the annotation to check.
-	 *
-	 * @return <code>true</code> if the specified annotation is a multi value constraints, <code>false</code>
-	 *         otherwise.
-	 */
-	public static boolean isMultiValueConstraint(Annotation annotation) {
-		boolean isMultiValueConstraint = false;
-		try {
-			Method m = annotation.getClass().getMethod( "value" );
-			Class returnType = m.getReturnType();
-			if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
-				Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
-				for ( Annotation a : annotations ) {
-					if ( isConstraintAnnotation( a ) || isBuiltInConstraintAnnotation( a ) ) {
-						isMultiValueConstraint = true;
-					}
-					else {
-						isMultiValueConstraint = false;
-						break;
-					}
-				}
-			}
-		}
-		catch ( NoSuchMethodException nsme ) {
-			// ignore
-		}
-		catch ( IllegalAccessException iae ) {
-			// ignore
-		}
-		catch ( InvocationTargetException ite ) {
-			// ignore
-		}
-		return isMultiValueConstraint;
-	}
-
-
-	/**
-	 * Checks whether a given annotation is a multi value constraint and returns the contained constraints if so.
-	 *
-	 * @param annotation the annotation to check.
-	 *
-	 * @return A list of constraint annotations or the empty list if <code>annotation</code> is not a multi constraint
-	 *         annotation.
-	 */
-	public static <A extends Annotation> List<Annotation> getMultiValueConstraints(A annotation) {
-		List<Annotation> annotationList = new ArrayList<Annotation>();
-		try {
-			Method m = annotation.getClass().getMethod( "value" );
-			Class returnType = m.getReturnType();
-			if ( returnType.isArray() && returnType.getComponentType().isAnnotation() ) {
-				Annotation[] annotations = ( Annotation[] ) m.invoke( annotation );
-				for ( Annotation a : annotations ) {
-					if ( isConstraintAnnotation( a ) || isBuiltInConstraintAnnotation( a ) ) {
-						annotationList.add( a );
-					}
-				}
-			}
-		}
-		catch ( NoSuchMethodException nsme ) {
-			// ignore
-		}
-		catch ( IllegalAccessException iae ) {
-			// ignore
-		}
-		catch ( InvocationTargetException ite ) {
-			// ignore
-		}
-		return annotationList;
-	}
-
-
 	@SuppressWarnings("unchecked")
 	public static <T> T getAnnotationParameter(Annotation annotation, String parameterName, Class<T> type) {
 		try {
@@ -502,7 +369,7 @@
 			return true;
 		}
 		catch ( NoSuchFieldException e ) {
-			; // ignore
+			// ignore
 		}
 
 		try {
@@ -510,7 +377,7 @@
 			return true;
 		}
 		catch ( NoSuchMethodException e ) {
-			; // ignore
+			// ignore
 		}
 		return false;
 	}

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/annotationfactory/AnnotationProxy.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -79,7 +79,7 @@
 			}
 		}
 		if ( processedValuesFromDescriptor != descriptor.numberOfElements() ) {
-			throw new RuntimeException( "Trying to instanciate " + annotationType + " with unknown elements" );
+			throw new RuntimeException( "Trying to instanciate " + annotationType + " with unknown paramters." );
 		}
 		return result;
 	}

Modified: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties
===================================================================
--- validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages.properties	2009-02-25 13:09:51 UTC (rev 16031)
@@ -3,7 +3,7 @@
 validator.size=size must be between {min} and {max}
 validator.length=length must be between {min} and {max}
 validator.notEmpty=may not be empty
-validator.pattern=must match "{regex}"
+validator.pattern=must match "{regexp}"
 validator.min=must be greater than {value}
 validator.max=must be less than {value}
 validator.null=must be null

Modified: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
===================================================================
--- validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties	2009-02-25 13:09:51 UTC (rev 16031)
@@ -1,9 +1,9 @@
-# $Id: ValidationMessages.properties 15846 2009-02-02 11:56:15Z hardy.ferentschik $
+# $Id$
 validator.notNull=kann nicht null sein
 validator.size=muss zwischen {min} und {max} liegen
 validator.length=muss zwischen {min} und {max} liegen
 validator.notEmpty=kann nicht leer sein
-validator.pattern=muss auf Ausdruck "{regex}" passen
+validator.pattern=muss auf Ausdruck "{regexp}" passen
 validator.min=muss gr\u00F6\u00DFer sein als {value}
 validator.max=muss kleiner sein als {value}
 validator.null=muss null sein


Property changes on: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_de.properties
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties
===================================================================
--- validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties	2009-02-25 13:09:51 UTC (rev 16031)
@@ -1,9 +1,9 @@
-# $Id: ValidationMessages.properties 15846 2009-02-02 11:56:15Z hardy.ferentschik $
+# $Id$
 validator.notNull=ne peut pas \u00EAtre nul
 validator.size=la taille doit \u00EAtre entre {min} et {max}
 validator.length=length must be between {min} and {max}
 validator.notEmpty=ne peut pas \u00EAtre vide
-validator.pattern=doit suivre "{regex}"
+validator.pattern=doit suivre "{regexp}"
 validator.min=doit \u00EAtre plus grand que {value}
 validator.max=doit \u00EAtre plus petit que {value}
 validator.null=doit \u00EAtre nul


Property changes on: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validation/ValidationMessages_fr.properties
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternValidatorTest.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -17,6 +17,8 @@
 */
 package org.hibernate.validation.constraints;
 
+import javax.validation.constraints.Pattern;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import org.junit.BeforeClass;
@@ -36,7 +38,7 @@
 	public static void init() {
 
 		AnnotationDescriptor descriptor = new AnnotationDescriptor( Pattern.class );
-		descriptor.setValue( "regex", "foobar" );
+		descriptor.setValue( "regexp", "foobar" );
 		descriptor.setValue( "message", "{validator.pattern}" );
 		Pattern p = AnnotationFactory.create( descriptor );
 

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/composition/FrenchZipcode.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -29,9 +29,8 @@
 import javax.validation.OverridesParameters;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+import javax.validation.constraints.Pattern;
 
-import org.hibernate.validation.constraints.Pattern;
-import org.hibernate.validation.constraints.Patterns;
 
 /**
  * @author Hardy Ferentschik
@@ -39,7 +38,7 @@
 @NotNull
 @Size
 // first pattern just duplicates the length of 5 characters, the second pattern is just to proof that parameters can be overridden.
- at Patterns({ @Pattern(regex = "....."), @Pattern(regex = "bar") })
+ at Pattern.List({ @Pattern(regexp = "....."), @Pattern(regexp = "bar") })
 @Constraint(validatedBy = FrenchZipcodeConstraintValidator.class)
 @Documented
 @Target({ METHOD, FIELD, TYPE })
@@ -58,5 +57,5 @@
 			parameter = "message") String sizeMessage() default "A french zip code has a length of 5";
 
 
-	@OverridesParameter(constraint = Pattern.class, parameter = "regex", index = 2) String regex() default "\\d*";
+	@OverridesParameter(constraint = Pattern.class, parameter = "regexp", index = 2) String regex() default "\\d*";
 }

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Engine.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -17,17 +17,17 @@
 */
 package org.hibernate.validation.eg;
 
-import org.hibernate.validation.constraints.Pattern;
-import org.hibernate.validation.constraints.Patterns;
+import javax.validation.constraints.Pattern;
 
+
 /**
  * @author Hardy Ferentschik
  */
 public class Engine {
-	@Patterns({
-			@Pattern(regex = "^[A-Z0-9-]+$",
+	@Pattern.List({
+			@Pattern(regexp = "^[A-Z0-9-]+$",
 					message = "must contain alphabetical characters only"),
-			@Pattern(regex = "^....-....-....$", message = "must match ....-....-....")
+			@Pattern(regexp = "^....-....-....$", message = "must match ....-....-....")
 	})
 	private String serialNumber;
 

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -0,0 +1,134 @@
+// $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.validation.engine;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.List;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.hibernate.validation.constraints.incomplete.NoGroups;
+import org.hibernate.validation.constraints.incomplete.NoMessage;
+import org.hibernate.validation.constraints.incomplete.ValidProperty;
+import org.hibernate.validation.eg.Engine;
+import org.hibernate.validation.eg.Order;
+import org.hibernate.validation.util.ReflectionHelper;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class ConstraintHelperTest {
+
+	private static ConstraintHelper constraintHelper;
+
+	@BeforeClass
+	public static void init() {
+		constraintHelper = new ConstraintHelper();
+	}
+
+	@Test
+	public void testConstraintWithNoMessage() {
+		Annotation annotation = new NoGroups() {
+			public String message() {
+				return "";
+			}
+
+			public Class<? extends Annotation> annotationType() {
+				return this.getClass();
+			}
+		};
+		assertFalse(
+				"The constraint annotation should not be valid", constraintHelper.isConstraintAnnotation( annotation )
+		);
+	}
+
+	@Test
+	public void testConstraintWithNoGroups() {
+		Annotation annotation = new NoMessage() {
+			public Class<?>[] groups() {
+				return null;
+			}
+
+			public Class<? extends Annotation> annotationType() {
+				return this.getClass();
+			}
+		};
+		assertFalse(
+				"The constraint annotation should not be valid", constraintHelper.isConstraintAnnotation( annotation )
+		);
+	}
+
+	@Test
+	public void testConstraintWithValidInPropertyName() {
+		Annotation annotation = new ValidProperty() {
+			public String message() {
+				return null;
+			}
+
+			public Class<?>[] groups() {
+				return null;
+			}
+
+			public int validLength() {
+				return 0;
+			}
+
+			public Class<? extends Annotation> annotationType() {
+				return this.getClass();
+			}
+		};
+		assertFalse(
+				"The constraint annotation should not be valid", constraintHelper.isConstraintAnnotation( annotation )
+		);
+	}
+
+	@Test
+	public void testGetMultiValueConstraints() throws Exception {
+		Engine engine = new Engine();
+		Field[] fields = engine.getClass().getDeclaredFields();
+		assertNotNull( fields );
+		assertTrue( fields.length == 1 );
+		ReflectionHelper.setAccessibility( fields[0] );
+
+		Annotation annotation = fields[0].getAnnotation( Pattern.List.class );
+		assertNotNull( annotation );
+		List<Annotation> multiValueConstraintAnnotations = constraintHelper.getMultiValueConstraints( annotation );
+		assertTrue( "There should be two constraint annotations", multiValueConstraintAnnotations.size() == 2 );
+		assertTrue( "Wrong constraint annotation", multiValueConstraintAnnotations.get( 0 ) instanceof Pattern );
+		assertTrue( "Wrong constraint annotation", multiValueConstraintAnnotations.get( 1 ) instanceof Pattern );
+
+
+		Order order = new Order();
+		fields = order.getClass().getDeclaredFields();
+		assertNotNull( fields );
+		assertTrue( fields.length == 1 );
+		ReflectionHelper.setAccessibility( fields[0] );
+
+		annotation = fields[0].getAnnotation( NotNull.class );
+		assertNotNull( annotation );
+		multiValueConstraintAnnotations = constraintHelper.getMultiValueConstraints( annotation );
+		assertTrue( "There should be no constraint annotations", multiValueConstraintAnnotations.size() == 0 );
+	}
+}


Property changes on: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ConstraintHelperTest.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ResourceBundleMessageInterpolatorTest.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -59,7 +59,7 @@
 	@Test
 	public void testSuccessfulInterpolation() {
 		ConstraintDescriptorImpl<NotNull> descriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new Class<?>[] { }, new BuiltinConstraints()
+				notNull, new Class<?>[] { }, new ConstraintHelper()
 		);
 
 		String expected = "replacement worked";
@@ -82,7 +82,7 @@
 	@Test
 	public void testUnSuccessfulInterpolation() {
 		ConstraintDescriptorImpl<NotNull> descriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new Class<?>[] { }, new BuiltinConstraints()
+				notNull, new Class<?>[] { }, new ConstraintHelper()
 		);
 		String expected = "foo";  // missing {}
 		String actual = interpolator.interpolate( "foo", descriptor, null );
@@ -96,7 +96,7 @@
 	@Test
 	public void testUnkownTokenInterpolation() {
 		ConstraintDescriptorImpl<NotNull> descriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new Class<?>[] { }, new BuiltinConstraints()
+				notNull, new Class<?>[] { }, new ConstraintHelper()
 		);
 		String expected = "{bar}";  // unkown token {}
 		String actual = interpolator.interpolate( "{bar}", descriptor, null );
@@ -106,14 +106,14 @@
 	@Test
 	public void testDefaultInterpolation() {
 		ConstraintDescriptorImpl<NotNull> descriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new Class<?>[] { }, new BuiltinConstraints()
+				notNull, new Class<?>[] { }, new ConstraintHelper()
 		);
 		String expected = "may not be null";
 		String actual = interpolator.interpolate( notNull.message(), descriptor, null );
 		assertEquals( "Wrong substitution", expected, actual );
 
 		ConstraintDescriptorImpl<Size> sizeDescriptor = new ConstraintDescriptorImpl<Size>(
-				size, new Class<?>[] { }, new BuiltinConstraints()
+				size, new Class<?>[] { }, new ConstraintHelper()
 		);
 		expected = "size must be between 0 and 2147483647";  // unkown token {}
 		actual = interpolator.interpolate( size.message(), sizeDescriptor, null );
@@ -125,7 +125,7 @@
 		interpolator = new ResourceBundleMessageInterpolator();
 
 		ConstraintDescriptorImpl<NotNull> descriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new Class<?>[] { }, new BuiltinConstraints()
+				notNull, new Class<?>[] { }, new ConstraintHelper()
 		);
 
 		String expected = "kann nicht null sein";
@@ -138,7 +138,7 @@
 		interpolator = new ResourceBundleMessageInterpolator();
 
 		ConstraintDescriptorImpl<NotNull> descriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new Class<?>[] { }, new BuiltinConstraints()
+				notNull, new Class<?>[] { }, new ConstraintHelper()
 		);
 
 		String expected = "may not be null";
@@ -151,7 +151,7 @@
 		interpolator = new ResourceBundleMessageInterpolator();
 
 		ConstraintDescriptorImpl<NotNull> descriptor = new ConstraintDescriptorImpl<NotNull>(
-				notNull, new Class<?>[] { }, new BuiltinConstraints()
+				notNull, new Class<?>[] { }, new ConstraintHelper()
 		);
 
 		String expected = "no puede ser null";

Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java (from rev 16024, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Car.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -0,0 +1,30 @@
+package org.hibernate.validation.engine.groups;
+
+import javax.validation.GroupSequence;
+import javax.validation.constraints.Pattern;
+import javax.validation.groups.Default;
+
+import org.hibernate.validation.constraints.Length;
+
+/**
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+ at GroupSequence({ Car.class, Car.Test.class })
+public class Car {
+	@Pattern(regexp = ".*", groups = Default.class)
+	@Length(min = 2, max = 20, groups = Car.Test.class)
+	private String type;
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public interface Test {
+
+	}
+}
\ No newline at end of file

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -332,6 +332,41 @@
 	 * HV-113
 	 */
 	@Test
+	public void testRedefiningDefaultGroup2() {
+		Car car = new Car();
+		car.setType( "A" );
+
+		Validator validator = TestUtil.getValidator();
+
+		Set<ConstraintViolation<Car>> constraintViolations = validator.validate( car );
+		assertEquals(
+				"There should be one violations due to the re-defintion of the default group",
+				1,
+				constraintViolations.size()
+		);
+		assertEquals( "Wrong constraint", "length must be between 2 and 20", constraintViolations.iterator().next().getMessage() );
+
+		constraintViolations = validator.validateProperty( car, "type" );
+		assertEquals(
+				"There should be one violations due to the re-defintion of the default group",
+				1,
+				constraintViolations.size()
+		);
+		assertEquals( "Wrong constraint", "length must be between 2 and 20", constraintViolations.iterator().next().getMessage() );
+
+		constraintViolations = validator.validateValue( Car.class, "type", "A" );
+		assertEquals(
+				"There should be one violations due to the re-defintion of the default group",
+				1,
+				constraintViolations.size()
+		);
+		assertEquals( "Wrong constraint", "length must be between 2 and 20", constraintViolations.iterator().next().getMessage() );
+	}
+
+	/**
+	 * HV-113
+	 */
+	@Test
 	public void testInvalidRedefinitionOfDefaultGroup() {
 		Address address = new AddressWithInvalidGroupSequence();
 		Validator validator = TestUtil.getValidator();

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -1,14 +1,16 @@
 package org.hibernate.validation.engine.groups;
 
+import javax.validation.GroupSequence;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 import javax.validation.groups.Default;
 
-import org.hibernate.validation.constraints.Pattern;
 
 /**
  * @author Emmanuel Bernard
  * @author Hardy Ferentschik
  */
+ at GroupSequence({ User.class })
 public class User {
 	@NotNull
 	private String firstname;
@@ -16,7 +18,7 @@
 	@NotNull(groups = Default.class)
 	private String lastname;
 
-	@Pattern(regex = "[0-9 -]?", groups = Optional.class)
+	@Pattern(regexp = "[0-9 -]?", groups = Optional.class)
 	private String phoneNumber;
 
 	@NotNull(groups = { Billable.class, BuyInOneClick.class })

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -18,7 +18,6 @@
 package org.hibernate.validation.util;
 
 import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -28,21 +27,11 @@
 import javax.validation.groups.Default;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import org.junit.Test;
 
-import org.hibernate.validation.constraints.Pattern;
-import org.hibernate.validation.constraints.Patterns;
-import org.hibernate.validation.constraints.incomplete.NoGroups;
-import org.hibernate.validation.constraints.incomplete.NoMessage;
-import org.hibernate.validation.constraints.incomplete.ValidProperty;
-import org.hibernate.validation.eg.Engine;
-import org.hibernate.validation.eg.Order;
-
 /**
  * Tests for the <code>ReflectionHelper</code>.
  *
@@ -129,91 +118,4 @@
 			);
 		}
 	}
-
-	@Test
-	// @SpecAssertion(section = "2.1.1.2", note = "constraint annotation must specify a groups element")
-	public void testConstraintWithNoMessage() {
-		Annotation annotation = new NoGroups() {
-			public String message() {
-				return "";
-			}
-
-			public Class<? extends Annotation> annotationType() {
-				return this.getClass();
-			}
-		};
-		assertFalse(
-				"The constraint annotation should not be valid", ReflectionHelper.isConstraintAnnotation( annotation )
-		);
-	}
-
-	@Test
-	// @SpecAssertion(section = "2.1.1.1", note = "constraint annotation must specify a groups element")
-	public void testConstraintWithNoGroups() {
-		Annotation annotation = new NoMessage() {
-			public Class<?>[] groups() {
-				return null;
-			}
-
-			public Class<? extends Annotation> annotationType() {
-				return this.getClass();
-			}
-		};
-		assertFalse(
-				"The constraint annotation should not be valid", ReflectionHelper.isConstraintAnnotation( annotation )
-		);
-	}
-
-	@Test
-	// @SpecAssertion(section = "2.1.1", note = "properties cannot begin with 'valid'")
-	public void testConstraintWithValidInPropertyName() {
-		Annotation annotation = new ValidProperty() {
-			public String message() {
-				return null;
-			}
-
-			public Class<?>[] groups() {
-				return null;
-			}
-
-			public int validLength() {
-				return 0;
-			}
-
-			public Class<? extends Annotation> annotationType() {
-				return this.getClass();
-			}
-		};
-		assertFalse(
-				"The constraint annotation should not be valid", ReflectionHelper.isConstraintAnnotation( annotation )
-		);
-	}
-
-	@Test
-	public void testGetMultiValueConstraints() throws Exception {
-		Engine engine = new Engine();
-		Field[] fields = engine.getClass().getDeclaredFields();
-		assertNotNull( fields );
-		assertTrue( fields.length == 1 );
-		ReflectionHelper.setAccessibility( fields[0] );
-
-		Annotation annotation = fields[0].getAnnotation( Patterns.class );
-		assertNotNull( annotation );
-		List<Annotation> multiValueConstraintAnnotations = ReflectionHelper.getMultiValueConstraints( annotation );
-		assertTrue( "There should be two constraint annotations", multiValueConstraintAnnotations.size() == 2 );
-		assertTrue( "Wrong constraint annotation", multiValueConstraintAnnotations.get( 0 ) instanceof Pattern );
-		assertTrue( "Wrong constraint annotation", multiValueConstraintAnnotations.get( 1 ) instanceof Pattern );
-
-
-		Order order = new Order();
-		fields = order.getClass().getDeclaredFields();
-		assertNotNull( fields );
-		assertTrue( fields.length == 1 );
-		ReflectionHelper.setAccessibility( fields[0] );
-
-		annotation = fields[0].getAnnotation( NotNull.class );
-		assertNotNull( annotation );
-		multiValueConstraintAnnotations = ReflectionHelper.getMultiValueConstraints( annotation );
-		assertTrue( "There should be no constraint annotations", multiValueConstraintAnnotations.size() == 0 );
-	}
 }

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java	2009-02-25 12:21:36 UTC (rev 16030)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/annotationfactory/AnnotationFactoryTest.java	2009-02-25 13:09:51 UTC (rev 16031)
@@ -18,11 +18,11 @@
 package org.hibernate.validation.util.annotationfactory;
 
 import javax.validation.constraints.Size;
+import javax.validation.constraints.Pattern;
 
 import static org.junit.Assert.assertEquals;
 import org.junit.Test;
 
-import org.hibernate.validation.constraints.Pattern;
 
 /**
  * @author Hardy Ferentschik
@@ -44,16 +44,16 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void createAnnotationProxyMissingRequiredParamter() {
 		AnnotationDescriptor descriptor = new AnnotationDescriptor( Pattern.class );
-		Pattern pattern = AnnotationFactory.create( descriptor );
+		AnnotationFactory.create( descriptor );
 	}
 
 	@Test
 	public void createAnnotationProxyWithRequiredParamter() {
 		AnnotationDescriptor descriptor = new AnnotationDescriptor( Pattern.class );
-		descriptor.setValue( "regex", ".*" );
+		descriptor.setValue( "regexp", ".*" );
 
 		Pattern pattern = AnnotationFactory.create( descriptor );
 
-		assertEquals( "Wrong parameter value", ".*", pattern.regex() );
+		assertEquals( "Wrong parameter value", ".*", pattern.regexp() );
 	}
 }




More information about the hibernate-commits mailing list