[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