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

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Dec 3 07:26:30 EST 2008


Author: epbernard
Date: 2008-12-03 07:26:29 -0500 (Wed, 03 Dec 2008)
New Revision: 15646

Added:
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/All.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/DefaultAlias.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/First.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Last.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Second.java
   validator/trunk/validation-api/src/main/java/javax/validation/groups/
   validator/trunk/validation-api/src/main/java/javax/validation/groups/Default.java
Modified:
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/ValidatorConstants.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Length.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/NotEmpty.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProvider.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProviderImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidationContext.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintDescriptorImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintViolationImpl.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/LengthConstraintTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternConstraintTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Animal.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Author.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Book.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Dictonary.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/EnglishDictonary.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/impl/ResourceBundleMessageResolverTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java
   validator/trunk/validation-api/src/main/java/javax/validation/ConstraintDescriptor.java
   validator/trunk/validation-api/src/main/java/javax/validation/ConstraintViolation.java
   validator/trunk/validation-api/src/main/java/javax/validation/GroupSequence.java
   validator/trunk/validation-api/src/main/java/javax/validation/Validator.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertFalse.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertTrue.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/Future.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/Max.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/Min.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/NotNull.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/Null.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/Past.java
   validator/trunk/validation-api/src/main/java/javax/validation/constraints/Size.java
Log:
BVAL-79 Groups are now type based

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/ValidatorConstants.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/ValidatorConstants.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/ValidatorConstants.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -1,4 +1,4 @@
-// $Id:$
+// $Id$
 /*
 * JBoss, Home of Professional Open Source
 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
@@ -19,6 +19,7 @@
 
 /**
  * @author Hardy Ferentschik
+ * TODO remove
  */
 public class ValidatorConstants {
 
@@ -28,5 +29,5 @@
     /**
      * The default group/sequence name used when no group parameter is passed to validate().
      */
-    public static final String DEFAULT_GROUP_NAME = "default";
+    //public static final String DEFAULT_GROUP_NAME = "default";
 }

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Length.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Length.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Length.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -36,11 +36,11 @@
 @Target({ METHOD, FIELD, TYPE })
 @Retention(RUNTIME)
 public @interface Length {
-	public abstract int min() default 0;
+	int min() default 0;
 
-	public abstract int max() default Integer.MAX_VALUE;
+	int max() default Integer.MAX_VALUE;
 
-	public abstract String message() default "{validator.length}";
+	String message() default "{validator.length}";
 
-	public abstract String[] groups() default { };
+	Class<?>[] groups() default { };
 }

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/NotEmpty.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/NotEmpty.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/NotEmpty.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -33,7 +33,7 @@
 @Target({ METHOD, FIELD })
 @Retention(RUNTIME)
 public @interface NotEmpty {
-	public abstract String message() default "{validator.notEmpty}";
+	String message() default "{validator.notEmpty}";
 
-	public abstract String[] groups() default { };
+	Class<?>[] groups() default { };
 }
\ No newline at end of file

Modified: 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	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/constraints/Pattern.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -33,9 +33,9 @@
 @Target({ METHOD, FIELD })
 @Retention(RUNTIME)
 public @interface Pattern {
-	public abstract String message() default "{validator.pattern}";
+	String message() default "{validator.pattern}";
 
-	public abstract String[] groups() default { };
+	Class<?>[] groups() default { };
 
 	/**
 	 * @return the regular expression the annotated string must match.

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProvider.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProvider.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProvider.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -59,9 +59,9 @@
 	List<Member> getCascadedMembers();
 
 	/**
-	 * @return A map mapping defined group sequence names to a list of groups.
+	 * @return A map mapping defined group sequences to a list of groups.
 	 */
-	Map<String, List<String>> getGroupSequences();
+	Map<Class<?>, List<Class<?>>> getGroupSequences();
 
 	/**
 	 * @return A list of <code>ValidatorMetaData</code> instances encapsulating the information of all the constraints

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProviderImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProviderImpl.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/MetaDataProviderImpl.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -95,9 +95,9 @@
 	private ConstraintFactory constraintFactory = new ConstraintFactoryImpl();
 
 	/**
-	 * Maps group sequence names to the list of group/sequence names.
+	 * Maps group sequences to the list of group/sequences.
 	 */
-	private Map<String, List<String>> groupSequences = new HashMap<String, List<String>>();
+	private Map<Class<?>, List<Class<?>>> groupSequences = new HashMap<Class<?>, List<Class<?>>>();
 
 	public MetaDataProviderImpl(Class<T> beanClass, ConstraintFactory constraintFactory) {
 		this.beanClass = beanClass;
@@ -159,24 +159,24 @@
 			}
 		}
 
-		for ( Map.Entry<String, List<String>> mapEntry : groupSequences.entrySet() ) {
-			List<String> groupNames = mapEntry.getValue();
-			List<String> expandedGroupNames = new ArrayList<String>();
-			for ( String groupName : groupNames ) {
-				expandedGroupNames.addAll( expandGroupSequenceNames( groupName ) );
+		for ( Map.Entry<Class<?>, List<Class<?>>> mapEntry : groupSequences.entrySet() ) {
+			List<Class<?>> groups = mapEntry.getValue();
+			List<Class<?>> expandedGroups = new ArrayList<Class<?>>();
+			for ( Class<?> group : groups ) {
+				expandedGroups.addAll( expandGroupSequences( group ) );
 			}
-			groupSequences.put( mapEntry.getKey(), expandedGroupNames );
+			groupSequences.put( mapEntry.getKey(), expandedGroups );
 		}
 		if ( log.isDebugEnabled() && !groupSequences.isEmpty() ) {
 			log.debug( "Expanded groups sequences: {}", groupSequences );
 		}
 	}
 
-	private List<String> expandGroupSequenceNames(String group) {
-		List<String> groupList = new ArrayList<String>();
+	private List<Class<?>> expandGroupSequences(Class<?> group) {
+		List<Class<?>> groupList = new ArrayList<Class<?>>();
 		if ( groupSequences.containsKey( group ) ) {
-			for ( String s : groupSequences.get( group ) ) {
-				groupList.addAll( expandGroupSequenceNames( s ) );
+			for ( Class<?> localGroup : groupSequences.get( group ) ) {
+				groupList.addAll( expandGroupSequences( localGroup ) );
 			}
 		}
 		else {
@@ -275,8 +275,8 @@
 
 	@SuppressWarnings("unchecked")
 	private <A extends Annotation> ConstraintDescriptorImpl buildConstraintDescriptor(A annotation, Class constraintClass) {
-		String[] groups = ReflectionHelper.getAnnotationParameter( annotation, "groups", String[].class );
-		for ( String groupName : groups ) {
+		Class<?>[] groups = ReflectionHelper.getAnnotationParameter( annotation, "groups", Class[].class );
+		for ( Class<?> groupName : groups ) {
 			if ( groupSequences.containsKey( groupName ) ) {
 				throw new ValidationException( groupName + " is illegally used as group and sequence name." );
 			}
@@ -414,7 +414,7 @@
 		return cascadedMembers;
 	}
 
-	public Map<String, List<String>> getGroupSequences() {
+	public Map<Class<?>, List<Class<?>>> getGroupSequences() {
 		return groupSequences;
 	}
 

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidationContext.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidationContext.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidationContext.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -47,10 +47,10 @@
 	private final T rootBean;
 
 	/**
-	 * Maps for each group name to an identity set to keep track of already validated objects. We have to make sure
+	 * Maps for each group to an identity set to keep track of already validated objects. We have to make sure
 	 * that each object gets only validated once (per group).
 	 */
-	private final Map<String, IdentitySet> processedObjects;
+	private final Map<Class<?>, IdentitySet> processedObjects;
 
 	/**
 	 * A list of all failing constraints so far.
@@ -65,7 +65,7 @@
 	/**
 	 * The current group which is getting processed.
 	 */
-	private String currentGroup;
+	private Class<?> currentGroup;
 
 	/**
 	 * Stack for keep track of the currently validated object.
@@ -80,7 +80,7 @@
 	public ValidationContext(T rootBean, Object object) {
 		this.rootBean = rootBean;
 		validatedobjectStack.push( new ValidatedBean(object) );
-		processedObjects = new HashMap<String, IdentitySet>();
+		processedObjects = new HashMap<Class<?>, IdentitySet>();
 		propertyPath = "";
 		failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
 	}
@@ -105,11 +105,11 @@
 		return rootBean;
 	}
 
-	public String getCurrentGroup() {
+	public Class<?> getCurrentGroup() {
 		return currentGroup;
 	}
 
-	public void setCurrentGroup(String currentGroup) {
+	public void setCurrentGroup(Class<?> currentGroup) {
 		this.currentGroup = currentGroup;
 	}
 
@@ -182,7 +182,7 @@
 		return propertyPath;
 	}
 
-	public boolean needsValidation(Set<String> groups) {
+	public boolean needsValidation(Set<Class<?>> groups) {
 		return groups.contains( currentGroup );
 	}
 

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	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -31,10 +31,9 @@
 import javax.validation.ConstraintDescriptor;
 import javax.validation.ConstraintViolation;
 import javax.validation.MessageResolver;
-import javax.validation.PropertyDescriptor;
 import javax.validation.Validator;
+import javax.validation.groups.Default;
 
-import org.hibernate.validation.ValidatorConstants;
 import org.hibernate.validation.Version;
 import org.hibernate.validation.impl.ConstraintDescriptorImpl;
 import org.hibernate.validation.impl.ConstraintViolationImpl;
@@ -77,6 +76,7 @@
 	private final MessageResolver messageResolver;
 	
 	private final ValidatorFactoryImplementor factory;
+	private static final Class<?>[] DEFAULT_GROUP = new Class<?>[] { Default.class };
 
 	public ValidatorImpl(ValidatorFactoryImplementor factory, MessageResolver messageResolver) {
 		this.factory = factory;
@@ -87,18 +87,18 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	public <T> Set<ConstraintViolation<T>> validate(T object, String... groups) {
+	public <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups) {
 		if ( object == null ) {
 			throw new IllegalArgumentException( "Validation of a null object" );
 		}
 
 		ValidationContext<T> context = new ValidationContext<T>( object );
-		List<ConstraintViolationImpl<T>> list = validate( context, Arrays.asList( groups ) );
+		List<ConstraintViolationImpl<T>> list = validateInContext( context, Arrays.asList( groups ) );
 		return new HashSet<ConstraintViolation<T>>( list );
 	}
 
 	/**
-	 * Validates the ovject contained in <code>context</code>.
+	 * Validates the object contained in <code>context</code>.
 	 *
 	 * @param context A context object containing the object to validate together with other state information needed
 	 * for validation.
@@ -109,23 +109,23 @@
 	 * @todo Currently we iterate the cascaded fields multiple times. Maybe we should change to an approach where we iterate the object graph only once.
 	 * @todo Context root bean can be a different object than the current Validator<T> hence two different generics variables
 	 */
-	private <T> List<ConstraintViolationImpl<T>> validate(ValidationContext<T> context, List<String> groups) {
+	private <T> List<ConstraintViolationImpl<T>> validateInContext(ValidationContext<T> context, List<Class<?>> groups) {
 		if ( context.peekValidatedObject() == null ) {
 			return Collections.emptyList();
 		}
 
 		// if no group is specified use the default
 		if ( groups.size() == 0 ) {
-			groups = Arrays.asList( ValidatorConstants.DEFAULT_GROUP_NAME );
+			groups = Arrays.asList( DEFAULT_GROUP );
 		}
 
-		List<String> expandedGroups;
+		List<Class<?>> expandedGroups;
 		boolean isGroupSequence;
-		for ( String group : groups ) {
-			expandedGroups = new ArrayList<String>();
-			isGroupSequence = expandGroupName( context.peekValidatedObjectType(), group, expandedGroups );
+		for ( Class<?> group : groups ) {
+			expandedGroups = new ArrayList<Class<?>>();
+			isGroupSequence = expandGroup( context.peekValidatedObjectType(), group, expandedGroups );
 
-			for ( String expandedGroupName : expandedGroups ) {
+			for ( Class<?> expandedGroupName : expandedGroups ) {
 				context.setCurrentGroup( expandedGroupName );
 
 				validateConstraints( context );
@@ -223,6 +223,7 @@
 		for ( Member member : cascadedMembers ) {
 			Type type = ReflectionHelper.typeOf( member );
 			context.pushProperty( ReflectionHelper.getPropertyName( member ) );
+			//FIXME change accessibility only once, that's somewhat costly. do it when Member is created
 			ReflectionHelper.setAccessibility( member );
 			Object value = ReflectionHelper.getValue( member, context.peekValidatedObject() );
 			validateCascadedConstraint( context, type, value );
@@ -253,7 +254,7 @@
 			context.replacePropertyIndex( propertyIndex );
 
 			context.pushValidatedObject( actualValue );
-			validate( context, Arrays.asList( context.getCurrentGroup() ) );
+			validateInContext( context, Arrays.asList( new Class<?>[] { context.getCurrentGroup() } ) );
 			context.popValidatedObject();
 			i++;
 		}
@@ -263,14 +264,15 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	public <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, String... groups) {
+	public <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups) {
 		List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
 		validateProperty( object, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
 		return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
 	}
 
 
-	private <T> void validateProperty(T object, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, String... groups) {
+	private <T> void validateProperty(T object, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
+		if ( object == null ) throw new IllegalArgumentException("Validated object cannot be null");
 		@SuppressWarnings( "unchecked" )
 		final Class<T> beanType = (Class<T>) object.getClass();
 
@@ -282,18 +284,18 @@
 
 		// if no group is specified use the default
 		if ( groups.length == 0 ) {
-			groups = new String[] { ValidatorConstants.DEFAULT_GROUP_NAME };
+			groups = DEFAULT_GROUP;
 		}
 
-		List<String> expandedGroups;
+		List<Class<?>> expandedGroups;
 		boolean isGroupSequence;
-		for ( String group : groups ) {
-			expandedGroups = new ArrayList<String>();
-			isGroupSequence = expandGroupName( beanType, group, expandedGroups );
+		for ( Class<?> group : groups ) {
+			expandedGroups = new ArrayList<Class<?>>();
+			isGroupSequence = expandGroup( beanType, group, expandedGroups );
 
-			for ( String expandedGroupName : expandedGroups ) {
+			for ( Class<?> expandedGroup : expandedGroups ) {
 
-				if ( !wrapper.descriptor.isInGroups( expandedGroupName ) ) {
+				if ( !wrapper.descriptor.isInGroups( expandedGroup ) ) {
 					continue;
 				}
 
@@ -332,7 +334,7 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, String... groups) {
+	public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
 		List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
 		validateValue( beanType, value, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
 		return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
@@ -343,7 +345,7 @@
 	}
 
 
-	private <T> void validateValue(Class<T> beanType, Object object, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, String... groups) {
+	private <T> void validateValue(Class<T> beanType, Object object, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
 		ConstraintDescriptorImpl constraintDescriptor = getConstraintDescriptorForPath( beanType, propertyIter );
 
 		if ( constraintDescriptor == null ) {
@@ -352,18 +354,18 @@
 
 		// if no group is specified use the default
 		if ( groups.length == 0 ) {
-			groups = new String[] { ValidatorConstants.DEFAULT_GROUP_NAME };
+			groups = DEFAULT_GROUP;
 		}
 
-		List<String> expandedGroups;
+		List<Class<?>> expandedGroups;
 		boolean isGroupSequence;
-		for ( String group : groups ) {
-			expandedGroups = new ArrayList<String>();
-			isGroupSequence = expandGroupName( beanType, group, expandedGroups );
+		for ( Class<?> group : groups ) {
+			expandedGroups = new ArrayList<Class<?>>();
+			isGroupSequence = expandGroup( beanType, group, expandedGroups );
 
-			for ( String expandedGroupName : expandedGroups ) {
+			for ( Class<?> expandedGroup : expandedGroups ) {
 
-				if ( !constraintDescriptor.isInGroups( expandedGroupName ) ) {
+				if ( !constraintDescriptor.isInGroups( expandedGroup ) ) {
 					continue;
 				}
 
@@ -384,7 +386,7 @@
 								null,
 								object,
 								propertyIter.getOriginalProperty(),  //FIXME use error.getProperty()
-								"",
+								null, //FIXME why is this a null group!! Used to be "" string should it be Default. Looks weird
 								constraintDescriptor
 						);
 						addFailingConstraint( failingConstraintViolations, failingConstraintViolation );
@@ -505,25 +507,25 @@
 	 * Checks whether the provided group name is a group sequence and if so expands the group name and add the expanded
 	 * groups names to <code>expandedGroupName </code>
 	 *
-	 * @param groupName The group name to expand
-	 * @param expandedGroupNames The exanded group names or just a list with the single provided group name id the name
+	 * @param group The group to expand
+	 * @param expandedGroups The exanded group names or just a list with the single provided group name id the name
 	 * was not expandable
 	 *
 	 * @return <code>true</code> if an expansion took place, <code>false</code> otherwise.
 	 */
-	private <T> boolean expandGroupName(Class<T> beanType, String groupName, List<String> expandedGroupNames) {
-		if ( expandedGroupNames == null ) {
+	private <T> boolean expandGroup(Class<T> beanType, Class<?> group, List<Class<?>> expandedGroups) {
+		if ( expandedGroups == null ) {
 			throw new IllegalArgumentException( "List cannot be empty" );
 		}
 
 		boolean isGroupSequence;
 		MetaDataProviderImpl<T> metaDataProvider = factory.getMetadataProvider( beanType );
-		if ( metaDataProvider.getGroupSequences().containsKey( groupName ) ) {
-			expandedGroupNames.addAll( metaDataProvider.getGroupSequences().get( groupName ) );
+		if ( metaDataProvider.getGroupSequences().containsKey( group ) ) {
+			expandedGroups.addAll( metaDataProvider.getGroupSequences().get( group ) );
 			isGroupSequence = true;
 		}
 		else {
-			expandedGroupNames.add( groupName );
+			expandedGroups.add( group );
 			isGroupSequence = false;
 		}
 		return isGroupSequence;

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintDescriptorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintDescriptorImpl.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintDescriptorImpl.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -30,6 +30,7 @@
 import javax.validation.ConstraintDescriptor;
 import javax.validation.ReportAsViolationFromCompositeConstraint;
 import javax.validation.ValidationException;
+import javax.validation.groups.Default;
 
 /**
  * Describe a single constraint.
@@ -41,16 +42,17 @@
 	private final Annotation annotation;
 	private final Constraint constraintImplementation;
 	private final Class<? extends Constraint> constraintClass;
-	private final Set<String> groups;
+	private final Set<Class<?>> groups;
 	private final Map<String, Object> parameters;
 	private final boolean isReportAsSingleInvalidConstraint;
+	private static final Class<?>[] DEFAULT_GROUP = new Class<?>[] { Default.class };
 
-	public ConstraintDescriptorImpl(Annotation annotation, String[] groups, Constraint validator, Class<? extends Constraint> constraintClass) {
+	public ConstraintDescriptorImpl(Annotation annotation, Class<?>[] groups, Constraint validator, Class<? extends Constraint> constraintClass) {
 		this.annotation = annotation;
 		if ( groups.length == 0 ) {
-			groups = new String[] { "default" };
+			groups = DEFAULT_GROUP;
 		}
-		this.groups = new HashSet<String>();
+		this.groups = new HashSet<Class<?>>();
 		this.groups.addAll( Arrays.asList( groups ) );
 		this.constraintImplementation = validator;
 		this.parameters = getAnnotationParameters( annotation );
@@ -71,7 +73,7 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	public Set<String> getGroups() {
+	public Set<Class<?>> getGroups() {
 		return groups;
 	}
 
@@ -82,7 +84,7 @@
 		return constraintClass;
 	}
 
-	public boolean isInGroups(String group) {
+	public boolean isInGroups(Class<?> group) {
 		return groups.contains( group );
 	}
 

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintViolationImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintViolationImpl.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/impl/ConstraintViolationImpl.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -32,7 +32,7 @@
 	private Class<T> beanClass;
 	private Object value;
 	private String propertyPath;
-	private HashSet<String> groups;
+	private Set<Class<?>> groups;
 	private Object leafBeanInstance;
 	private final ConstraintDescriptor constraintDescriptor;
 	private String rawMessage;
@@ -40,14 +40,14 @@
 
 	public ConstraintViolationImpl(String rawMessage, String interpolatedMessage, T rootBean, Class<T> beanClass,
 								   Object leafBeanInstance, Object value,
-								   String propertyPath, String group, ConstraintDescriptor constraintDescriptor) {
+								   String propertyPath, Class<?> group, ConstraintDescriptor constraintDescriptor) {
 		this.rawMessage = rawMessage;
 		this.interpolatedMessage = interpolatedMessage;
 		this.rootBean = rootBean;
 		this.beanClass = beanClass;
 		this.value = value;
 		this.propertyPath = propertyPath;
-		groups = new HashSet<String>();
+		groups = new HashSet<Class<?>>();
 		groups.add( group );
 		this.leafBeanInstance = leafBeanInstance;
 		this.constraintDescriptor = constraintDescriptor;
@@ -92,7 +92,7 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	public Set<String> getGroups() {
+	public Set<Class<?>> getGroups() {
 		return groups;
 	}
 
@@ -100,7 +100,7 @@
 		return this.constraintDescriptor;
 	}
 
-	public void addGroups(Set<String> groupSet) {
+	public void addGroups(Set<Class<?>> groupSet) {
 		groups.addAll( groupSet );
 	}
 

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	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/util/ReflectionHelper.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -121,7 +121,7 @@
 		}
 
 		try {
-			getAnnotationParameter( annotation, "groups", String[].class );
+			getAnnotationParameter( annotation, "groups", Class[].class );
 		}
 		catch ( Exception e ) {
 			String msg = annotation.annotationType().getName() + " contains ConstraintValidator annotation, but does " +

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/LengthConstraintTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/LengthConstraintTest.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/LengthConstraintTest.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -46,8 +46,8 @@
 						return "{validator.length}";
 					}
 
-					public String[] groups() {
-						return new String[0];
+					public Class<?>[] groups() {
+						return new Class<?>[0];
 					}
 
 					public Class<? extends Annotation> annotationType() {

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternConstraintTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternConstraintTest.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/constraints/PatternConstraintTest.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -38,8 +38,8 @@
 						return "{validator.pattern}";
 					}
 
-					public String[] groups() {
-						return new String[0];
+					public Class<?>[] groups() {
+						return new Class<?>[0];
 					}
 
 					public String regex() {

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/All.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/All.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/All.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -0,0 +1,8 @@
+package org.hibernate.validation.eg;
+
+/**
+ * Groups including all validations
+ * @author Emmanuel Bernard
+ */
+public interface All {
+}

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Animal.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Animal.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Animal.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -29,10 +29,10 @@
 		PROKARYOTA, EUKARYOTA
 	}
 
-	@NotEmpty(groups = { "first", "second" })
+	@NotEmpty(groups = { First.class, Second.class })
 	private String name;
 
-	@NotNull(groups = "first")
+	@NotNull(groups = First.class)
 	private Domain domain;
 
 	public String getName() {

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Author.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Author.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Author.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -27,14 +27,14 @@
  */
 public class Author {
 
-	@NotEmpty(groups = "last")
+	@NotEmpty(groups = Last.class)
 	private String firstName;
 
-	@NotNull(groups = "first")
-	@NotEmpty(groups = "first")
+	@NotNull(groups = First.class)
+	@NotEmpty(groups = First.class)
 	private String lastName;
 
-	@Length(max = 20, groups = "last")
+	@Length(max = 20, groups = Last.class)
 	private String company;
 
 	public String getFirstName() {

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Book.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Book.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Book.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -19,6 +19,7 @@
 
 import javax.validation.GroupSequence;
 import javax.validation.Valid;
+import javax.validation.groups.Default;
 import javax.validation.constraints.NotNull;
 
 import org.hibernate.validation.constraints.Length;
@@ -27,17 +28,17 @@
 /**
  * @author Hardy Ferentschik
  */
- at GroupSequence(name = "default", sequence = { "first", "second", "last" })
+ at GroupSequence(name = Default.class, sequence = { First.class, Second.class, Last.class })
 public class Book {
-	@NotNull(groups = "first")
-	@NotEmpty(groups = "first")
+	@NotNull(groups = First.class)
+	@NotEmpty(groups = First.class)
 	private String title;
 
-	@Length(max = 30, groups = "second")
+	@Length(max = 30, groups = Second.class)
 	private String subtitle;
 
 	@Valid
-	@NotNull(groups = "first")
+	@NotNull(groups = First.class)
 	private Author author;
 
 	public String getTitle() {

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/DefaultAlias.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/DefaultAlias.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/DefaultAlias.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -0,0 +1,7 @@
+package org.hibernate.validation.eg;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface DefaultAlias {
+}

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Dictonary.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Dictonary.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Dictonary.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -19,6 +19,7 @@
 
 import javax.validation.GroupSequence;
 import javax.validation.GroupSequences;
+import javax.validation.groups.Default;
 import javax.validation.constraints.NotNull;
 
 import org.hibernate.validation.constraints.NotEmpty;
@@ -27,16 +28,16 @@
  * @author Hardy Ferentschik
  */
 @GroupSequences({
-		@GroupSequence(name = "default-alias", sequence = { "default" }),
-		@GroupSequence(name = "all", sequence = { "default", "translate" })
+		@GroupSequence(name = DefaultAlias.class, sequence = { Default.class }),
+		@GroupSequence(name = All.class, sequence = { Default.class, Dictonary.Translate.class })
 })
 public class Dictonary extends Book {
-	@NotNull(groups = "translate")
-	@NotEmpty(groups = "translate")
+	@NotNull(groups = Translate.class)
+	@NotEmpty(groups = Translate.class)
 	private String translatesTo;
 
-	@NotNull(groups = "translate")
-	@NotEmpty(groups = "translate")
+	@NotNull(groups = Translate.class)
+	@NotEmpty(groups = Translate.class)
 	private String translatesFrom;
 
 	public String getTranslatesTo() {
@@ -54,4 +55,10 @@
 	public void setTranslatesFrom(String translatesFrom) {
 		this.translatesFrom = translatesFrom;
 	}
+
+	/**
+	 * Translator related constraints
+	 */
+	public interface Translate {
+	}
 }

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/EnglishDictonary.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/EnglishDictonary.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/EnglishDictonary.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -19,12 +19,13 @@
 
 import javax.validation.GroupSequence;
 import javax.validation.GroupSequences;
+import javax.validation.groups.Default;
 
 /**
  * @author Hardy Ferentschik
  */
 @GroupSequences({
-		@GroupSequence(name = "default", sequence = { "first" })  // illegal - default is already defined in Book
+		@GroupSequence(name = Default.class, sequence = { First.class })  // illegal - default is already defined in Book
 })
 public class EnglishDictonary extends Dictonary {
 }
\ No newline at end of file

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/First.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/First.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/First.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -0,0 +1,9 @@
+package org.hibernate.validation.eg;
+
+/**
+ * Group executed first in the validation
+ * 
+ * @author Emmanuel Bernard
+ */
+public interface First {
+}

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Last.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Last.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Last.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -0,0 +1,9 @@
+package org.hibernate.validation.eg;
+
+/**
+ * Group executed Last in the validation
+ * 
+ * @author Emmanuel Bernard
+ */
+public interface Last {
+}

Added: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Second.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Second.java	                        (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/eg/Second.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -0,0 +1,9 @@
+package org.hibernate.validation.eg;
+
+/**
+ * Group executed second during the validation
+ * 
+ * @author Emmanuel Bernard
+ */
+public interface Second {
+}

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -23,6 +23,7 @@
 import javax.validation.ValidationException;
 import javax.validation.Validator;
 import javax.validation.Validation;
+import javax.validation.groups.Default;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -41,6 +42,10 @@
 import org.hibernate.validation.eg.EnglishDictonary;
 import org.hibernate.validation.eg.Order;
 import org.hibernate.validation.eg.Unconstraint;
+import org.hibernate.validation.eg.First;
+import org.hibernate.validation.eg.Second;
+import org.hibernate.validation.eg.Last;
+import org.hibernate.validation.eg.DefaultAlias;
 import org.hibernate.validation.HibernateValidatorFactoryBuilder;
 
 /**
@@ -109,7 +114,7 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testValidateWithNullProperty() {
 		Validator validator = getHibernateValidator();
-		validator.validate( null, "firstName" );
+		validator.validateProperty( null, "firstName" );
 	}
 
 	@Test
@@ -123,17 +128,16 @@
 		book.setTitle( "" );
 		book.setAuthor( author );
 
-		Set<ConstraintViolation<Book>> constraintViolations = validator.validate( book, "first", "second", "last" );
+		Set<ConstraintViolation<Book>> constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
 		assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
 
 		author.setFirstName( "Gavin" );
 		author.setLastName( "King" );
 
-		constraintViolations = validator.validate( book, "first", "second", "last" );
+		constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
 		ConstraintViolation constraintViolation = constraintViolations.iterator().next();
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 		assertEquals( "Wrong message", "may not be empty", constraintViolation.getInterpolatedMessage() );
-		assertEquals( "Wrong bean class", Book.class, constraintViolation.getBeanClass() );
 		assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", book.getTitle(), constraintViolation.getInvalidValue() );
 		assertEquals( "Wrong propertyName", "title", constraintViolation.getPropertyPath() );
@@ -141,11 +145,10 @@
 		book.setTitle( "Hibernate Persistence with JPA" );
 		book.setSubtitle( "Revised Edition of Hibernate in Action" );
 
-		constraintViolations = validator.validate( book, "first", "second", "last" );
+		constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
 		constraintViolation = constraintViolations.iterator().next();
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 		assertEquals( "Wrong message", "length must be between 0 and 30", constraintViolation.getInterpolatedMessage() );
-		assertEquals( "Wrong bean class", Book.class, constraintViolation.getBeanClass() );
 		assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", book.getSubtitle(), constraintViolation.getInvalidValue() );
 		assertEquals( "Wrong propertyName", "subtitle", constraintViolation.getPropertyPath() );
@@ -153,18 +156,17 @@
 		book.setSubtitle( "Revised Edition" );
 		author.setCompany( "JBoss a divison of RedHat" );
 
-		constraintViolations = validator.validate( book, "first", "second", "last" );
+		constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
 		constraintViolation = constraintViolations.iterator().next();
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 		assertEquals( "Wrong message", "length must be between 0 and 20", constraintViolation.getInterpolatedMessage() );
-		assertEquals( "Wrong bean class", Author.class, constraintViolation.getBeanClass() );
 		assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", author.getCompany(), constraintViolation.getInvalidValue() );
 		assertEquals( "Wrong propertyName", "author.company", constraintViolation.getPropertyPath() );
 
 		author.setCompany( "JBoss" );
 
-		constraintViolations = validator.validate( book, "first", "second", "last" );
+		constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
 		assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
 	}
 
@@ -178,17 +180,16 @@
 		Book book = new Book();
 		book.setAuthor( author );
 
-		Set<ConstraintViolation<Book>> constraintViolations = validator.validate( book, "default" );
+		Set<ConstraintViolation<Book>> constraintViolations = validator.validate( book, Default.class );
 		assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
 
 		author.setFirstName( "Gavin" );
 		author.setLastName( "King" );
 
-		constraintViolations = validator.validate( book, "default" );
+		constraintViolations = validator.validate( book, Default.class );
 		ConstraintViolation constraintViolation = constraintViolations.iterator().next();
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 		assertEquals( "Wrong message", "may not be null", constraintViolation.getInterpolatedMessage() );
-		assertEquals( "Wrong bean class", Book.class, constraintViolation.getBeanClass() );
 		assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", book.getTitle(), constraintViolation.getInvalidValue() );
 		assertEquals( "Wrong propertyName", "title", constraintViolation.getPropertyPath() );
@@ -196,18 +197,18 @@
 		book.setTitle( "Hibernate Persistence with JPA" );
 		book.setSubtitle( "Revised Edition of Hibernate in Action" );
 
-		constraintViolations = validator.validate( book, "default" );
+		constraintViolations = validator.validate( book, Default.class );
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 
 		book.setSubtitle( "Revised Edition" );
 		author.setCompany( "JBoss a divison of RedHat" );
 
-		constraintViolations = validator.validate( book, "default" );
+		constraintViolations = validator.validate( book, Default.class );
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 
 		author.setCompany( "JBoss" );
 
-		constraintViolations = validator.validate( book, "default" );
+		constraintViolations = validator.validate( book, Default.class );
 		assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
 	}
 
@@ -239,7 +240,7 @@
 		author.setCompany( "Langenscheidt Publ." );
 		dictonary.setAuthor( author );
 
-		Set<ConstraintViolation<Dictonary>> constraintViolations = validator.validate( dictonary, "default-alias" );
+		Set<ConstraintViolation<Dictonary>> constraintViolations = validator.validate( dictonary, DefaultAlias.class );
 		assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
 	}
 
@@ -250,7 +251,7 @@
 		elepfant.setName( "" );
 		elepfant.setDomain( Animal.Domain.EUKARYOTA );
 
-		Set<ConstraintViolation<Animal>> constraintViolations = validator.validate( elepfant, "first", "second" );
+		Set<ConstraintViolation<Animal>> constraintViolations = validator.validate( elepfant, First.class, Second.class );
 		assertEquals(
 				"The should be two invalid constraints since the same propertyName gets validated in both groups",
 				1,
@@ -258,9 +259,9 @@
 		);
 
 		ConstraintViolation constraintViolation = constraintViolations.iterator().next();
-		Set<String> expected = new HashSet<String>();
-		expected.add( "first" );
-		expected.add( "second" );
+		Set<Class<?>> expected = new HashSet<Class<?>>();
+		expected.add( First.class );
+		expected.add( Second.class );
 		assertEquals(
 				"The constraint should be invalid for both groups",
 				expected,
@@ -330,7 +331,6 @@
 		ConstraintViolation constraintViolation = constraintViolations.iterator().next();
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 		assertEquals( "Wrong message", "may not be null", constraintViolation.getInterpolatedMessage() );
-		assertEquals( "Wrong bean class", Order.class, constraintViolation.getBeanClass() );
 		assertEquals( "Wrong root entity", customer, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", order1.getOrderNumber(), constraintViolation.getInvalidValue() );
 		assertEquals( "Wrong propertyName", "orderList[0].orderNumber", constraintViolation.getPropertyPath() );
@@ -382,7 +382,6 @@
 		ConstraintViolation constraintViolation = constraintViolations.iterator().next();
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 		assertEquals( "Wrong message", "may not be empty", constraintViolation.getInterpolatedMessage() );
-		assertEquals( "Wrong bean class", Actor.class, constraintViolation.getBeanClass() );
 		assertEquals( "Wrong root entity", clint, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", morgan.getLastName(), constraintViolation.getInvalidValue() );
 		assertEquals( "Wrong propertyName", "playedWith[0].playedWith[1].lastName", constraintViolation.getPropertyPath() );
@@ -402,7 +401,6 @@
 		ConstraintViolation constraintViolation = constraintViolations.iterator().next();
 		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
 		assertEquals( "Wrong message", "may not be null", constraintViolation.getInterpolatedMessage() );
-		assertEquals( "Wrong bean class", null, constraintViolation.getBeanClass() );
 		assertEquals( "Wrong root entity", null, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", order.getOrderNumber(), constraintViolation.getInvalidValue() );
 		assertEquals( "Wrong propertyName", "orderList[0].orderNumber", constraintViolation.getPropertyPath() );

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/impl/ResourceBundleMessageResolverTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/impl/ResourceBundleMessageResolverTest.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/impl/ResourceBundleMessageResolverTest.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -52,8 +52,8 @@
 				return "{validator.notNull}";
 			}
 
-			public String[] groups() {
-				return new String[] { };
+			public Class<?>[] groups() {
+				return new Class<?>[] { };
 			}
 
 			public Class<? extends Annotation> annotationType() {
@@ -74,8 +74,8 @@
 				return "{validator.length}";
 			}
 
-			public String[] groups() {
-				return new String[] { };
+			public Class<?>[] groups() {
+				return new Class<?>[] { };
 			}
 
 			public Class<? extends Annotation> annotationType() {
@@ -87,7 +87,7 @@
 	@Test
 	public void testSuccessfulInterpolation() {
 		ConstraintDescriptorImpl desciptor = new ConstraintDescriptorImpl(
-				notNull, new String[] { }, new NotNullConstraint(), NotNullConstraint.class
+				notNull, new Class<?>[] { }, new NotNullConstraint(), NotNullConstraint.class
 		);
 
 		String expected = "replacement worked";
@@ -110,7 +110,7 @@
 	@Test
 	public void testUnSuccessfulInterpolation() {
 		ConstraintDescriptorImpl desciptor = new ConstraintDescriptorImpl(
-				notNull, new String[] { }, new NotNullConstraint(), NotNullConstraint.class
+				notNull, new Class<?>[] { }, new NotNullConstraint(), NotNullConstraint.class
 		);
 		String expected = "foo";  // missing {}
 		String actual = resolver.interpolate( "foo", desciptor, null );
@@ -124,7 +124,7 @@
 	@Test
 	public void testUnkownTokenInterpolation() {
 		ConstraintDescriptorImpl desciptor = new ConstraintDescriptorImpl(
-				notNull, new String[] { }, new NotNullConstraint(), NotNullConstraint.class
+				notNull, new Class<?>[] { }, new NotNullConstraint(), NotNullConstraint.class
 		);
 		String expected = "{bar}";  // unkown token {}
 		String actual = resolver.interpolate( "{bar}", desciptor, null );
@@ -134,13 +134,13 @@
 	@Test
 	public void testDefaultInterpolation() {
 		ConstraintDescriptorImpl desciptor = new ConstraintDescriptorImpl(
-				notNull, new String[] { }, new NotNullConstraint(), NotNullConstraint.class
+				notNull, new Class<?>[] { }, new NotNullConstraint(), NotNullConstraint.class
 		);
 		String expected = "may not be null";
 		String actual = resolver.interpolate( notNull.message(), desciptor, null );
 		assertEquals( "Wrong substitution", expected, actual );
 
-		desciptor = new ConstraintDescriptorImpl( length, new String[] { }, new NotNullConstraint(), NotNullConstraint.class );
+		desciptor = new ConstraintDescriptorImpl( length, new Class<?>[] { }, new NotNullConstraint(), NotNullConstraint.class );
 		expected = "length must be between 0 and 2147483647";  // unkown token {}
 		actual = resolver.interpolate( length.message(), desciptor, null );
 		assertEquals( "Wrong substitution", expected, actual );

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	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/util/ReflectionHelperTest.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import javax.validation.ValidationException;
+import javax.validation.groups.Default;
 import javax.validation.constraints.NotNull;
 
 import static org.junit.Assert.assertEquals;
@@ -94,8 +95,8 @@
 				return "test";
 			}
 
-			public String[] groups() {
-				return new String[] { "default" };
+			public Class<?>[] groups() {
+				return new Class<?>[] { Default.class };
 			}
 
 			public Class<? extends Annotation> annotationType() {
@@ -105,8 +106,8 @@
 		String message = ReflectionHelper.getAnnotationParameter( testAnnotation, "message", String.class );
 		assertEquals( "Wrong message", "test", message );
 
-		String[] group = ReflectionHelper.getAnnotationParameter( testAnnotation, "groups", String[].class );
-		assertEquals( "Wrong message", "default", group[0] );
+		Class<?>[] group = ReflectionHelper.getAnnotationParameter( testAnnotation, "groups", Class[].class );
+		assertEquals( "Wrong message", Default.class, group[0] );
 
 		try {
 			ReflectionHelper.getAnnotationParameter( testAnnotation, "message", Integer.class );

Modified: validator/trunk/validation-api/src/main/java/javax/validation/ConstraintDescriptor.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/ConstraintDescriptor.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/ConstraintDescriptor.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -40,7 +40,7 @@
 	/**
 	 * @return The groups the constraint is applied on.
 	 */
-	Set<String> getGroups();
+	Set<Class<?>> getGroups();
 
 	/**
 	 * @return the constraint implementation class

Modified: validator/trunk/validation-api/src/main/java/javax/validation/ConstraintViolation.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/ConstraintViolation.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/ConstraintViolation.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -70,7 +70,7 @@
 	 *
 	 * TODO: considering removal, if you think it's important, speak up
 	 */
-	Set<String> getGroups();
+	Set<Class<?>> getGroups();
 
 	/**
 	 * Constraint metadata reported to fail.

Modified: validator/trunk/validation-api/src/main/java/javax/validation/GroupSequence.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/GroupSequence.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/GroupSequence.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -23,12 +23,17 @@
 import java.lang.annotation.Target;
 
 /**
+ * Define a group sequence
+ * Should be hosted by an
+ *
+ * @author Emmanuel Bernard
  * @author Hardy Ferentschik
  */
 @Target({ TYPE })
 @Retention(RUNTIME)
 public @interface GroupSequence {
-	String name();
+	//TODO depreciate
+	Class<?> name();
 
-	String[] sequence();
+	Class<?>[] sequence();
 }

Modified: validator/trunk/validation-api/src/main/java/javax/validation/Validator.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/Validator.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/Validator.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -33,28 +33,28 @@
 	 * validate all constraints on object
 	 *
 	 * @param object object to validate
-	 * @param groups group name(s) (including group sequence names) targeted
-	 * for validation (default to &lt;code&gt;default&lt;/code&gt;)
+	 * @param groups groups targeted for validation
+	 *               (default to {@link javax.validation.groups.Default})
 	 *
 	 * @return constraint violations or an empty Set if none
 	 *
 	 * @throws IllegalArgumentException e if object is null
 	 */
-	<T> Set<ConstraintViolation<T>> validate(T object, String... groups);
+	<T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);
 
 	/**
 	 * validate all constraints on &lt;code&gt;propertyName&lt;/code&gt; property of object
 	 *
 	 * @param object object to validate
 	 * @param propertyName property to validate (ie field and getter constraints)
-	 * @param groups group name(s) (including group sequence names) targeted
-	 * for validation (default to &lt;code&gt;default&lt;/code&gt;)
+	 * @param groups groups targeted for validation
+	 *               (default to {@link javax.validation.groups.Default})
 	 *
 	 * @return constraint violations or an empty Set if none
 	 *
 	 * @throws IllegalArgumentException e if object is null or if propertyName is not present
 	 */
-	<T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, String... groups);
+	<T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups);
 
 	/**
 	 * validate all constraints on <code>propertyName</code> property
@@ -64,13 +64,14 @@
 	 *
 	 * @param propertyName property to validate
 	 * @param value property value to validate
-	 * @param groups group name(s) (including group sequence names) targeted
-	 * for validation (default to <code>default</code>)
+	 * @param groups groups targeted for validation
+	 *               (default to {@link javax.validation.groups.Default})
 	 *
 	 * @return constraint violations or an empty Set if none
 	 * @throws IllegalArgumentException e if propertyName is not present
 	 */
-	<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, String... groups);
+	<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName,
+												  Object value, Class<?>... groups);
 
 	/**
 	 * Return the descriptor object describing bean constraints

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertFalse.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertFalse.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertFalse.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -39,5 +39,5 @@
 public @interface AssertFalse {
 	String message() default "{validator.assertFalse}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 }
\ No newline at end of file

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertTrue.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertTrue.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/AssertTrue.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -39,5 +39,5 @@
 public @interface AssertTrue {
 	String message() default "{validator.assertTrue}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 }
\ No newline at end of file

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/Digits.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -49,7 +49,7 @@
 public @interface Digits {
 	String message() default "{validator.digits}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 
 	/**
 	 * @return maximum number of integral digits accepted for this number

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/Future.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/Future.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/Future.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -50,5 +50,5 @@
 public @interface Future {
 	String message() default "{validator.future}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 }
\ No newline at end of file

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/Max.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/Max.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/Max.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -51,7 +51,7 @@
 public @interface Max {
 	String message() default "{validator.max}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 
 	/**
 	 * @return Value the element must be lower or equal to

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/Min.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/Min.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/Min.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -51,7 +51,7 @@
 public @interface Min {
 	String message() default "{validator.min}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 
 	/**
 	 * @return Value the element must be higher or equal to

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/NotNull.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/NotNull.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/NotNull.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -37,5 +37,5 @@
 public @interface NotNull {
 	String message() default "{validator.notNull}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 }

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/Null.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/Null.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/Null.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -37,6 +37,6 @@
 public @interface Null {
 	String message() default "{validator.null}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 }
 

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/Past.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/Past.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/Past.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -50,5 +50,5 @@
 public @interface Past {
 	String message() default "{validator.past}";
 
-	String[] groups() default { };
+	Class<?>[] groups() default { };
 }
\ No newline at end of file

Modified: validator/trunk/validation-api/src/main/java/javax/validation/constraints/Size.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/constraints/Size.java	2008-12-03 11:22:31 UTC (rev 15645)
+++ validator/trunk/validation-api/src/main/java/javax/validation/constraints/Size.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -43,7 +43,7 @@
 @Documented
 public @interface Size {
 	String message() default "{validator.min}";
-	String[] groups() default {};
+	Class<?>[] groups() default {};
 
 	/**
 	 * @return size the element must be higher or equal to

Added: validator/trunk/validation-api/src/main/java/javax/validation/groups/Default.java
===================================================================
--- validator/trunk/validation-api/src/main/java/javax/validation/groups/Default.java	                        (rev 0)
+++ validator/trunk/validation-api/src/main/java/javax/validation/groups/Default.java	2008-12-03 12:26:29 UTC (rev 15646)
@@ -0,0 +1,10 @@
+package javax.validation.groups;
+
+/**
+ * Default Bean Validation group
+ *
+ * @author Emmanuel Bernard
+ * TODO should it be named DefaultGroup?
+ */
+public interface Default {
+}




More information about the hibernate-commits mailing list