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

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Feb 20 09:53:16 EST 2009


Author: hardy.ferentschik
Date: 2009-02-20 09:53:16 -0500 (Fri, 20 Feb 2009)
New Revision: 16010

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/groups/GroupChain.java
   validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java
   validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
Log:
HV-92 Added group inheritance and added some more tests.

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-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java	2009-02-20 14:53:16 UTC (rev 16010)
@@ -103,13 +103,48 @@
 				object, messageInterpolator, constraintValidatorFactory
 		);
 
+
+		groups = validateGroupVararg( groups );
+
+		List<ConstraintViolationImpl<T>> list = validateInContext( context, Arrays.asList( groups ) );
+		return new HashSet<ConstraintViolation<T>>( list );
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	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 );
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	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 );
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public BeanDescriptor getConstraintsForClass(Class<?> clazz) {
+		return getBeanMetaData( clazz ).getBeanDescriptor();
+	}
+
+	private Class<?>[] validateGroupVararg(Class<?>[] groups) {
+		if ( groups == null ) {
+			throw new IllegalArgumentException( "null passed as group name" );
+		}
+
 		// if no groups is specified use the default
 		if ( groups.length == 0 ) {
 			groups = DEFAULT_GROUP_ARRAY;
 		}
-
-		List<ConstraintViolationImpl<T>> list = validateInContext( context, Arrays.asList( groups ) );
-		return new HashSet<ConstraintViolation<T>>( list );
+		return groups;
 	}
 
 	/**
@@ -129,15 +164,13 @@
 		GroupChain groupChain = groupChainGenerator.getGroupChainFor( groups );
 		while ( groupChain.hasNext() ) {
 			Group group = groupChain.next();
-			Class<?> currentSequence = group.getSequence();
 			context.setCurrentGroup( group.getGroup() );
 
 			validateConstraints( context );
 			validateCascadedConstraints( context );
 
-			if ( group.partOfSequence() && context.getFailingConstraints().size() > 0 ) {
-				while ( groupChain.hasNext() && currentSequence == groupChain.next().getSequence() ) {
-				}
+			if ( groupChain.inSequence() && context.getFailingConstraints().size() > 0 ) {
+				groupChain.moveToLastInCurrentSequence();
 			}
 		}
 		return context.getFailingConstraints();
@@ -247,15 +280,6 @@
 		}
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
-	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, Class<?>... groups) {
 		if ( object == null ) {
 			throw new IllegalArgumentException( "Validated object cannot be null" );
@@ -270,15 +294,11 @@
 			return;
 		}
 
-		// if no groups is specified use the default
-		if ( groups.length == 0 ) {
-			groups = DEFAULT_GROUP_ARRAY;
-		}
+		groups = validateGroupVararg( groups );
 
 		GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
 		while ( groupChain.hasNext() ) {
 			Group group = groupChain.next();
-			Class<?> currentSequence = group.getSequence();
 			for ( MetaConstraint metaConstraint : metaConstraints ) {
 				if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
 					continue;
@@ -290,26 +310,12 @@
 				failingConstraintViolations.addAll( context.getFailingConstraints() );
 			}
 
-			if ( group.partOfSequence() && failingConstraintViolations.size() > 0 ) {
-				while ( groupChain.hasNext() && currentSequence == groupChain.next().getSequence() ) {
-				}
+			if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+				groupChain.moveToLastInCurrentSequence();
 			}
 		}
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
-	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 );
-	}
-
-	public BeanDescriptor getConstraintsForClass(Class<?> clazz) {
-		return getBeanMetaData( clazz ).getBeanDescriptor();
-	}
-
 	private <T> void validateValue(Class<T> beanType, Object value, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
 		Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
 		collectMetaConstraintsForPath( beanType, propertyIter, metaConstraints );
@@ -318,15 +324,11 @@
 			return;
 		}
 
-		// if no groups is specified use the default
-		if ( groups.length == 0 ) {
-			groups = DEFAULT_GROUP_ARRAY;
-		}
+		groups = validateGroupVararg( groups );
 
 		GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
 		while ( groupChain.hasNext() ) {
 			Group group = groupChain.next();
-			Class<?> currentSequence = group.getSequence();
 
 			for ( MetaConstraint metaConstraint : metaConstraints ) {
 				if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
@@ -341,8 +343,8 @@
 				failingConstraintViolations.addAll( context.getFailingConstraints() );
 			}
 
-			if ( group.partOfSequence() && failingConstraintViolations.size() > 0 ) {
-				break;
+			if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+				groupChain.moveToLastInCurrentSequence();
 			}
 		}
 	}

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java	2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java	2009-02-20 14:53:16 UTC (rev 16010)
@@ -27,10 +27,20 @@
  */
 public class GroupChain {
 
+	/**
+	 * The actual list of groups maintained by this instance.
+	 */
 	private List<Group> groupList = new ArrayList<Group>();
 
+	/**
+	 * A pointer to the next group element.
+	 */
 	private int nextGroupPointer = 0;
 
+	/**
+	 * The current group.
+	 */
+	private Class<?> currentSequence = null;
 
 	/**
 	 * @return Returns <code>true</code> if there is another group in the chain <code>false</code> otherwise.
@@ -43,12 +53,14 @@
 	 * @return Returns the next group in the chain or <code>null</code> if there is none.
 	 */
 	public Group next() {
-		if ( hasNext() ) {
-			return groupList.get( nextGroupPointer++ );
-		}
-		else {
+		if ( !hasNext() ) {
 			return null;
 		}
+
+		Group group = groupList.get( nextGroupPointer );
+		nextGroupPointer++;
+		currentSequence = group.getSequence();
+		return group;
 	}
 
 	/**
@@ -61,7 +73,7 @@
 	public boolean containsSequence(Class<?> groupSequence) {
 		boolean result = false;
 		for ( Group group : groupList ) {
-			if ( groupSequence.getName().equals( group.getSequence() ) ) {
+			if ( groupSequence.getName().equals( group.getSequence().getName() ) ) {
 				result = true;
 				break;
 			}
@@ -69,6 +81,25 @@
 		return result;
 	}
 
+	public void moveToLastInCurrentSequence() {
+		if ( currentSequence == null ) {
+			return;
+		}
+
+		while ( hasNext() ) {
+			if ( currentSequence.getName().equals( groupList.get( nextGroupPointer ).getSequence().getName() ) ) {
+				next();
+			}
+			else {
+				break;
+			}
+		}
+	}
+
+	public boolean inSequence() {
+		return currentSequence != null;
+	}
+
 	void insertGroup(Group group) {
 		if ( nextGroupPointer != 0 ) {
 			throw new RuntimeException( "Trying to modify the GroupChain while iterating." );

Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java	2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java	2009-02-20 14:53:16 UTC (rev 16010)
@@ -47,9 +47,10 @@
 
 		GroupChain chain = new GroupChain();
 		for ( Class<?> clazz : groups ) {
-			if ( clazz.getAnnotation( GroupSequence.class ) == null ) { // normal clazz
+			if ( clazz.getAnnotation( GroupSequence.class ) == null ) {
 				Group group = new Group( clazz );
 				chain.insertGroup( group );
+				insertInheritedGroups( clazz, chain );
 			}
 			else {
 				insertSequence( clazz, chain );
@@ -59,6 +60,14 @@
 		return chain;
 	}
 
+	private void insertInheritedGroups(Class<?> clazz, GroupChain chain) {
+		for ( Class<?> extendedInterface : clazz.getInterfaces() ) {
+			Group group = new Group( extendedInterface );
+			chain.insertGroup( group );
+			insertInheritedGroups(extendedInterface, chain);
+		}
+	}
+
 	private void insertSequence(Class<?> clazz, GroupChain chain) {
 		List<Group> sequence;
 		if ( resolvedSequences.containsKey( clazz ) ) {

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	2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java	2009-02-20 14:53:16 UTC (rev 16010)
@@ -26,6 +26,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import org.junit.Test;
+import org.slf4j.Logger;
 
 import org.hibernate.validation.eg.Actor;
 import org.hibernate.validation.eg.Address;
@@ -34,6 +35,7 @@
 import org.hibernate.validation.eg.Engine;
 import org.hibernate.validation.eg.Order;
 import org.hibernate.validation.eg.UnconstraintEntity;
+import org.hibernate.validation.util.LoggerFactory;
 import org.hibernate.validation.util.TestUtil;
 
 /**
@@ -43,7 +45,8 @@
  */
 public class ValidatorImplTest {
 
-	// @SpecAssertion( section = "3.1" )
+	private static final Logger log = LoggerFactory.make();
+
 	@Test
 	public void testWrongMethodName() {
 		try {
@@ -68,14 +71,22 @@
 	@Test
 	public void testUnconstraintClass() {
 		Validator validator = TestUtil.getValidator();
-		assertTrue( "There should be no constraints", !validator.getConstraintsForClass( UnconstraintEntity.class ).hasConstraints() );
+		assertTrue(
+				"There should be no constraints",
+				!validator.getConstraintsForClass( UnconstraintEntity.class ).hasConstraints()
+		);
 	}
 
 	@Test
 	public void testHasConstraintsAndIsBeanConstrained() {
 		Validator validator = TestUtil.getValidator();
-		assertTrue( "There should not be constraints", !validator.getConstraintsForClass( Customer.class ).hasConstraints() );
-		assertTrue( "It should be constrainted", validator.getConstraintsForClass( Customer.class ).isBeanConstrained() );
+		assertTrue(
+				"There should not be constraints", !validator.getConstraintsForClass( Customer.class ).hasConstraints()
+		);
+		assertTrue(
+				"It should be constrainted", validator.getConstraintsForClass( Customer.class ).isBeanConstrained()
+		);
+		// TODO fix test
 //		assertTrue( "It should be constrainted even if it has no constraint annotations - not implemented yet", validator.getConstraintsForClass( Account.class ).isBeanConstrained() );
 	}
 
@@ -85,10 +96,61 @@
 		validator.validate( null );
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test
+	public void testPassingNullAsGroup() {
+		Validator validator = TestUtil.getValidator();
+		Customer customer = new Customer();
+		try {
+			validator.validate( customer, null );
+			fail();
+		}
+		catch ( IllegalArgumentException e ) {
+			log.trace( "success" );
+		}
+
+		try {
+			validator.validateProperty( customer, "firstName", null );
+			fail();
+		}
+		catch ( IllegalArgumentException e ) {
+			log.trace( "success" );
+		}
+
+		try {
+			validator.validateValue( Customer.class, "firstName", "foobar", null );
+			fail();
+		}
+		catch ( IllegalArgumentException e ) {
+			log.trace( "success" );
+		}
+	}
+
+	@Test
 	public void testValidateWithNullProperty() {
 		Validator validator = TestUtil.getValidator();
-		validator.validateProperty( null, "firstName" );
+		try {
+			validator.validate( null );
+			fail();
+		}
+		catch ( IllegalArgumentException e ) {
+			log.trace( "success" );
+		}
+
+		try {
+			validator.validateProperty( null, "firstName" );
+			fail();
+		}
+		catch ( IllegalArgumentException e ) {
+			log.trace( "success" );
+		}
+
+		try {
+			validator.validateValue( null, "firstName", "foobar" );
+			fail();
+		}
+		catch ( IllegalArgumentException e ) {
+			log.trace( "success" );
+		}
 	}
 
 	@Test
@@ -211,7 +273,9 @@
 		assertEquals( "Wrong message", "may not be empty", constraintViolation.getMessage() );
 		assertEquals( "Wrong root entity", clint, constraintViolation.getRootBean() );
 		assertEquals( "Wrong value", morgan.getLastName(), constraintViolation.getInvalidValue() );
-		assertEquals( "Wrong propertyName", "playedWith[0].playedWith[1].lastName", constraintViolation.getPropertyPath() );
+		assertEquals(
+				"Wrong propertyName", "playedWith[0].playedWith[1].lastName", constraintViolation.getPropertyPath()
+		);
 	}
 
 	@Test

Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java	2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java	2009-02-20 14:53:16 UTC (rev 16010)
@@ -1,9 +1,11 @@
 package org.hibernate.validation.engine.groups;
 
+import javax.validation.groups.Default;
+
 /**
  * Customer can buy without being harrassed by the checking-out process.
  *
  * @author Emmanuel Bernard
  */
-public interface BuyInOneClick {
+public interface BuyInOneClick extends Default, Billable {
 }
\ 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-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java	2009-02-20 14:53:16 UTC (rev 16010)
@@ -192,27 +192,64 @@
 		Validator validator = TestUtil.getValidator();
 
 		Set<ConstraintViolation<User>> constraintViolations = validator.validate( user );
-		assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
+		assertEquals(
+				"There should be two violations against the implicit default group",
+				2,
+				constraintViolations.size()
+		);
 
 		constraintViolations = validator.validate( user, Default.class );
-		assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
+		assertEquals(
+				"There should be two violations against the explicit defualt group",
+				2,
+				constraintViolations.size()
+		);
 
 		constraintViolations = validator.validate( user, Billable.class );
-		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+		assertEquals(
+				"There should be one violation against Billable",
+				1,
+				constraintViolations.size() );
 
+		constraintViolations = validator.validate( user, Default.class, Billable.class );
+		assertEquals(
+				"There should be 3 violation against Default and  Billable",
+				3,
+				constraintViolations.size() );
+
 		constraintViolations = validator.validate( user, BuyInOneClick.class );
-		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+		assertEquals(
+				"Three violations expected since BuyInOneClick extends Default and Billable",
+				3,
+				constraintViolations.size()
+		);
 
 		constraintViolations = validator.validate( user, BuyInOneClick.class, Billable.class );
-		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+		assertEquals(
+				"BuyInOneClick already contains all other groups. Adding Billable does not change the number of violations",
+				3,
+				constraintViolations.size()
+		);
 
 		constraintViolations = validator.validate( user, BuyInOneClick.class, Default.class );
-		assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
+		assertEquals(
+				"BuyInOneClick already contains all other groups. Adding Default does not change the number of violations",
+				3,
+				constraintViolations.size()
+		);
 
 		constraintViolations = validator.validate( user, BuyInOneClick.class, Default.class, Billable.class );
-		assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
+		assertEquals(
+				"BuyInOneClick already contains all other groups. Adding Billable and Default does not change the number of violations",
+				3,
+				constraintViolations.size()
+		);
 
-		constraintViolations = validator.validate( user, BuyInOneClick.class, BuyInOneClick.class );
-		assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+		constraintViolations = validator.validate( user, Billable.class, Billable.class );
+		assertEquals(
+				"Adding the same group twice is still only leads to a single violation",
+				1,
+				constraintViolations.size()
+		);
 	}
 }
\ No newline at end of file




More information about the hibernate-commits mailing list