Skip to content

Commit

Permalink
HV-429 Factorize code between validatePropertyInContext() and validat…
Browse files Browse the repository at this point in the history
…eValueInContext().
  • Loading branch information
kevinpollet authored and hferentschik committed Feb 21, 2011
1 parent c563639 commit 7156f8b
Showing 1 changed file with 66 additions and 174 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -683,134 +683,6 @@ private <T, U, V> Set<ConstraintViolation<T>> validatePropertyInContext(Validati
return context.getFailingConstraints();
}

/**
* Validates the property constraints associated to the current {@code ValueContext} group.
*
* @param valueContext The current validation context.
* @param validationContext The global validation context.
* @param metaConstraintsMap All constraints associated to the property.
*
* @return The number of constraint violations raised when validating the {@code ValueContext} current group.
*/
private <T, U, V> int validatePropertyForCurrentGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap) {
BeanMetaData<U> beanMetaData = getBeanMetaData( valueContext.getCurrentBeanType() );

if ( !valueContext.validatingDefault() ) {
int numberOfConstraintViolationsBefore = validationContext.getFailingConstraints().size();
Collection<List<BeanMetaConstraint<T, ?>>> propertyMetaConstraints = metaConstraintsMap.values();
for ( List<BeanMetaConstraint<T, ?>> metaConstraints : propertyMetaConstraints ) {
for ( BeanMetaConstraint<T, ?> metaConstraint : metaConstraints ) {
if ( isValidationRequired( validationContext, valueContext, metaConstraint ) ) {
@SuppressWarnings("unchecked")
V valueToValidate = (V) metaConstraint.getValue( valueContext.getCurrentBean() );
valueContext.setCurrentValidatedValue( valueToValidate );
metaConstraint.validateConstraint( validationContext, valueContext );
if ( validationContext.shouldFailFast() ) {
return validationContext.getFailingConstraints()
.size() - numberOfConstraintViolationsBefore;
}
}
}
}
return validationContext.getFailingConstraints().size() - numberOfConstraintViolationsBefore;
}

if ( beanMetaData.defaultGroupSequenceIsRedefined() ) {
return validatePropertyForRedefinedDefaultGroup(
valueContext, validationContext, metaConstraintsMap, beanMetaData
);
}
return validatePropertyForDefaultGroup( valueContext, validationContext, metaConstraintsMap );
}

/**
* Validates the property for the default group when the default group is redefined on the bean hosting
* the property to validate.
*
* @param valueContext The current validation context.
* @param validationContext The global validation context.
* @param metaConstraintsMap All constraints associated to the property.
* @param beanMetaData MetaData of the bean hosting the property to validate.
*
* @return The number of constraint violations raised when validating the default group.
*/
private <T, U, V> int validatePropertyForRedefinedDefaultGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap, BeanMetaData<U> beanMetaData) {
int numberOfConstraintViolationsBefore = validationContext.getFailingConstraints().size();
List<Class<?>> defaultGroupSequence = beanMetaData.getDefaultGroupSequence( valueContext.getCurrentBean() );

for ( Class<?> groupClass : defaultGroupSequence ) {
valueContext.setCurrentGroup( groupClass );
Collection<List<BeanMetaConstraint<T, ?>>> propertyMetaConstraints = metaConstraintsMap.values();
for ( List<BeanMetaConstraint<T, ?>> metaConstraints : propertyMetaConstraints ) {
for ( BeanMetaConstraint<T, ?> metaConstraint : metaConstraints ) {
if ( isValidationRequired( validationContext, valueContext, metaConstraint ) ) {
@SuppressWarnings("unchecked")
V valueToValidate = (V) metaConstraint.getValue( valueContext.getCurrentBean() );
valueContext.setCurrentValidatedValue( valueToValidate );
metaConstraint.validateConstraint( validationContext, valueContext );
if ( validationContext.shouldFailFast() ) {
return validationContext.getFailingConstraints()
.size() - numberOfConstraintViolationsBefore;
}
}
}
}
if ( validationContext.getFailingConstraints().size() > numberOfConstraintViolationsBefore ) {
break;
}
}



return validationContext.getFailingConstraints().size() - numberOfConstraintViolationsBefore;
}

/**
* Validates the property for the default group.
* <p>
* This method checks that the default group sequence is not redefined in the class hierarchy for a superclass
* hosting constraints for the property to validate.
* </p>
*
* @param valueContext The current validation context.
* @param validationContext The global validation context.
* @param metaConstraintsMap All constraints associated to the property to check.
*
* @return The number of constraint violations raised when validating the default group.
*/
private <T, U, V, E> int validatePropertyForDefaultGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap) {
int numberOfConstraintViolationsBefore = validationContext.getFailingConstraints().size();
Set<Class<?>> hostingBeanClasses = metaConstraintsMap.keySet();

for ( Class<?> clazz : hostingBeanClasses ) {
BeanMetaData<E> hostingBeanMetaData = getBeanMetaData( (Class<E>) clazz );
List<Class<?>> defaultGroupSequence = hostingBeanMetaData.getDefaultGroupSequence( (E) valueContext.getCurrentBean() );
List<BeanMetaConstraint<T, ?>> propertyMetaConstraints = metaConstraintsMap.get( clazz );

for ( Class<?> groupClass : defaultGroupSequence ) {
valueContext.setCurrentGroup( groupClass );
for ( BeanMetaConstraint<T, ?> metaConstraint : propertyMetaConstraints ) {
if ( isValidationRequired( validationContext, valueContext, metaConstraint ) ) {
@SuppressWarnings("unchecked")
V valueToValidate = (V) metaConstraint.getValue( valueContext.getCurrentBean() );
valueContext.setCurrentValidatedValue( valueToValidate );
metaConstraint.validateConstraint( validationContext, valueContext );
if ( validationContext.shouldFailFast() ) {
return validationContext.getFailingConstraints()
.size() - numberOfConstraintViolationsBefore;
}
}
}
if ( validationContext.getFailingConstraints().size() > numberOfConstraintViolationsBefore ) {
break;
}
}

}

return validationContext.getFailingConstraints().size() - numberOfConstraintViolationsBefore;
}

private <T, U, V> Set<ConstraintViolation<T>> validateValueInContext(ValidationContext<T, ConstraintViolation<T>> context, V value, PathImpl propertyPath, GroupChain groupChain) {
Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap = new HashMap<Class<?>, List<BeanMetaConstraint<T, ?>>>();
ValueContext<U, V> valueContext = collectMetaConstraintsForPath(
Expand All @@ -827,7 +699,7 @@ private <T, U, V> Set<ConstraintViolation<T>> validateValueInContext(ValidationC
while ( groupIterator.hasNext() ) {
Group group = groupIterator.next();
valueContext.setCurrentGroup( group.getGroup() );
validateValueForCurrentGroup( valueContext, context, metaConstraintsMap );
validatePropertyForCurrentGroup( valueContext, context, metaConstraintsMap );
if ( context.shouldFailFast() ) {
return context.getFailingConstraints();
}
Expand All @@ -839,7 +711,7 @@ private <T, U, V> Set<ConstraintViolation<T>> validateValueInContext(ValidationC
List<Group> sequence = sequenceIterator.next();
for ( Group group : sequence ) {
valueContext.setCurrentGroup( group.getGroup() );
int numberOfConstraintViolations = validateValueForCurrentGroup(
int numberOfConstraintViolations = validatePropertyForCurrentGroup(
valueContext, context, metaConstraintsMap
);
if ( context.shouldFailFast() ) {
Expand All @@ -854,15 +726,29 @@ private <T, U, V> Set<ConstraintViolation<T>> validateValueInContext(ValidationC
return context.getFailingConstraints();
}

private <T, U, V> int validateValueForCurrentGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap) {
/**
* Validates the property constraints associated to the current {@code ValueContext} group.
*
* @param valueContext The current validation context.
* @param validationContext The global validation context.
* @param metaConstraintsMap All constraints associated to the property.
*
* @return The number of constraint violations raised when validating the {@code ValueContext} current group.
*/
private <T, U, V> int validatePropertyForCurrentGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap) {
BeanMetaData<U> beanMetaData = getBeanMetaData( valueContext.getCurrentBeanType() );

if ( !valueContext.validatingDefault() ) {
int numberOfConstraintViolationsBefore = validationContext.getFailingConstraints().size();
Collection<List<BeanMetaConstraint<T, ?>>> propertyMetaConstraints = metaConstraintsMap.values();
for ( List<BeanMetaConstraint<T, ?>> metaConstraints : propertyMetaConstraints ) {
for ( MetaConstraint<T, ?> metaConstraint : metaConstraints ) {
for ( BeanMetaConstraint<T, ?> metaConstraint : metaConstraints ) {
if ( isValidationRequired( validationContext, valueContext, metaConstraint ) ) {
if ( valueContext.getCurrentBean() != null ) {
@SuppressWarnings("unchecked")
V valueToValidate = (V) metaConstraint.getValue( valueContext.getCurrentBean() );
valueContext.setCurrentValidatedValue( valueToValidate );
}
metaConstraint.validateConstraint( validationContext, valueContext );
if ( validationContext.shouldFailFast() ) {
return validationContext.getFailingConstraints()
Expand All @@ -875,92 +761,99 @@ private <T, U, V> int validateValueForCurrentGroup(ValueContext<U, V> valueConte
}

if ( beanMetaData.defaultGroupSequenceIsRedefined() ) {
return validateValueForRedefinedDefaultGroup(
return validatePropertyForRedefinedDefaultGroup(
valueContext, validationContext, metaConstraintsMap, beanMetaData
);
}

return validateValueForDefaultGroup( valueContext, validationContext, metaConstraintsMap );
return validatePropertyForDefaultGroup( valueContext, validationContext, metaConstraintsMap );
}

/**
* Validates the current value (corresponding to the value given in parameter of the
* {@link ValidatorImpl#validateValue} method) for the default group.
* <p>
* This method checks if a super class of the bean class hosting the property to validate redefined the default
* group. If that's the case, according to the spec, the super class default group sequence is applied.
* </p>
* Validates the property for the default group when the default group is redefined on the bean hosting
* the property to validate.
*
* @param valueContext The current validation context.
* @param validationContext The global validation context.
* @param metaConstraintsMap All constraints associated to the property to check.
* @param metaConstraintsMap All constraints associated to the property.
* @param beanMetaData MetaData of the bean hosting the property to validate.
*
* @return The number of constraint violations raised when validating the default group.
*/
private <T, U, V, E> int validateValueForDefaultGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap) {
private <T, U, V> int validatePropertyForRedefinedDefaultGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap, BeanMetaData<U> beanMetaData) {
int numberOfConstraintViolationsBefore = validationContext.getFailingConstraints().size();
Set<Class<?>> hostingBeanClasses = metaConstraintsMap.keySet();

for ( Class<?> clazz : hostingBeanClasses ) {
BeanMetaData<E> hostingBeanMetaData = getBeanMetaData( (Class<E>) clazz );
List<Class<?>> defaultGroupSequence = hostingBeanMetaData.getDefaultGroupSequence( null );
List<BeanMetaConstraint<T, ?>> propertyMetaConstraints = metaConstraintsMap.get( clazz );
List<Class<?>> defaultGroupSequence = beanMetaData.getDefaultGroupSequence( valueContext.getCurrentBean() );

for ( Class<?> groupClass : defaultGroupSequence ) {
valueContext.setCurrentGroup( groupClass );
for ( MetaConstraint<T, ?> metaConstraint : propertyMetaConstraints ) {
for ( Class<?> groupClass : defaultGroupSequence ) {
valueContext.setCurrentGroup( groupClass );
Collection<List<BeanMetaConstraint<T, ?>>> propertyMetaConstraints = metaConstraintsMap.values();
for ( List<BeanMetaConstraint<T, ?>> metaConstraints : propertyMetaConstraints ) {
for ( BeanMetaConstraint<T, ?> metaConstraint : metaConstraints ) {
if ( isValidationRequired( validationContext, valueContext, metaConstraint ) ) {
if ( valueContext.getCurrentBean() != null ) {
@SuppressWarnings("unchecked")
V valueToValidate = (V) metaConstraint.getValue( valueContext.getCurrentBean() );
valueContext.setCurrentValidatedValue( valueToValidate );
}
metaConstraint.validateConstraint( validationContext, valueContext );
if ( validationContext.shouldFailFast() ) {
return validationContext.getFailingConstraints()
.size() - numberOfConstraintViolationsBefore;
}
}
}
if ( validationContext.getFailingConstraints().size() > numberOfConstraintViolationsBefore ) {
break;
}
}

if ( validationContext.getFailingConstraints().size() > numberOfConstraintViolationsBefore ) {
break;
}
}

return validationContext.getFailingConstraints().size() - numberOfConstraintViolationsBefore;
}

/**
* Validates the current value hosted in the {@code valueContext} parameter for the default group.
* Validates the property for the default group.
* <p>
* This method validates the default group sequence redefined in the bean class hosting the property to validate.
* This method checks that the default group sequence is not redefined in the class hierarchy for a superclass
* hosting constraints for the property to validate.
* </p>
*
* @param valueContext The current validation context.
* @param validationContext The global validation context.
* @param metaConstraintsMap All constraints associated to the property to check.
* @param beanMetaData MetaData of the bean hosting the property to validate.
*
* @return The number of constraint violations raised when validating the redefined default group sequence.
* @return The number of constraint violations raised when validating the default group.
*/
private <T, U, V> int validateValueForRedefinedDefaultGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap, BeanMetaData<U> beanMetaData) {
private <T, U, V, E> int validatePropertyForDefaultGroup(ValueContext<U, V> valueContext, ValidationContext<T, ConstraintViolation<T>> validationContext, Map<Class<?>, List<BeanMetaConstraint<T, ?>>> metaConstraintsMap) {
int numberOfConstraintViolationsBefore = validationContext.getFailingConstraints().size();
List<Class<?>> defaultGroupSequence = beanMetaData.getDefaultGroupSequence( null );

for ( Class<?> groupClass : defaultGroupSequence ) {
valueContext.setCurrentGroup( groupClass );
Collection<List<BeanMetaConstraint<T, ?>>> propertyMetaConstraints = metaConstraintsMap.values();
for ( List<BeanMetaConstraint<T, ?>> metaConstraints : propertyMetaConstraints ) {
for ( MetaConstraint<T, ?> metaConstraint : metaConstraints ) {
for ( Entry<Class<?>, List<BeanMetaConstraint<T, ?>>> entry : metaConstraintsMap.entrySet() ) {
BeanMetaData<E> hostingBeanMetaData = getBeanMetaData( (Class<E>) entry.getKey() );
List<BeanMetaConstraint<T, ?>> propertyMetaConstraints = entry.getValue();

List<Class<?>> defaultGroupSequence = hostingBeanMetaData.getDefaultGroupSequence( (E) valueContext.getCurrentBean() );

for ( Class<?> groupClass : defaultGroupSequence ) {
valueContext.setCurrentGroup( groupClass );
for ( BeanMetaConstraint<T, ?> metaConstraint : propertyMetaConstraints ) {
if ( isValidationRequired( validationContext, valueContext, metaConstraint ) ) {
if ( valueContext.getCurrentBean() != null ) {
@SuppressWarnings("unchecked")
V valueToValidate = (V) metaConstraint.getValue( valueContext.getCurrentBean() );
valueContext.setCurrentValidatedValue( valueToValidate );
}
metaConstraint.validateConstraint( validationContext, valueContext );
if ( validationContext.shouldFailFast() ) {
return validationContext.getFailingConstraints()
.size() - numberOfConstraintViolationsBefore;
}
}
}
if ( validationContext.getFailingConstraints().size() > numberOfConstraintViolationsBefore ) {
break;
}
}
if ( validationContext.getFailingConstraints().size() > numberOfConstraintViolationsBefore ) {
break;
}

}

return validationContext.getFailingConstraints().size() - numberOfConstraintViolationsBefore;
Expand Down Expand Up @@ -1284,19 +1177,18 @@ private <T, U, V> ValueContext<U, V> collectMetaConstraintsForPath(Class<T> claz
}

if ( !propertyIter.hasNext() ) {
Map<Class<?>, List<BeanMetaConstraint<T, ? extends Annotation>>> beanMetaConstraints = metaData.getMetaConstraintsAsMap();
Set<Class<?>> hostingBeanClasses = beanMetaConstraints.keySet();
for ( Class<?> beanClass : hostingBeanClasses ) {
for ( Entry<Class<?>, List<BeanMetaConstraint<T, ? extends Annotation>>> entry : metaData.getMetaConstraintsAsMap()
.entrySet() ) {
List<BeanMetaConstraint<T, ?>> propertyMetaConstraints = new ArrayList<BeanMetaConstraint<T, ?>>();
List<BeanMetaConstraint<T, ? extends Annotation>> constraints = beanMetaConstraints.get( beanClass );
List<BeanMetaConstraint<T, ? extends Annotation>> constraints = entry.getValue();
for ( BeanMetaConstraint<T, ?> metaConstraint : constraints ) {
if ( elem.getName() != null && elem.getName()
.equals( metaConstraint.getLocation().getPropertyName() ) ) {
propertyMetaConstraints.add( metaConstraint );
}
}
if ( !propertyMetaConstraints.isEmpty() ) {
metaConstraintsMap.put( beanClass, propertyMetaConstraints );
metaConstraintsMap.put( entry.getKey(), propertyMetaConstraints );
}
}
}
Expand Down

0 comments on commit 7156f8b

Please sign in to comment.