Skip to content

Commit

Permalink
HV-1328 Add all constraints collections back
Browse files Browse the repository at this point in the history
  • Loading branch information
marko-bekhta committed Jul 19, 2024
1 parent e99c3f1 commit c1abd5d
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -458,11 +458,13 @@ private <U> void validateConstraintsForDefaultGroup(BaseBeanValidationContext<?>
// evaluating the constraints of a bean per class in hierarchy, this is necessary to detect potential default group re-definitions
for ( Class<? super U> clazz : beanMetaData.getClassHierarchy() ) {
BeanMetaData<? super U> hostingBeanMetaData = beanMetaDataManager.getBeanMetaData( clazz );

boolean defaultGroupSequenceIsRedefined = hostingBeanMetaData.isDefaultGroupSequenceRedefined();

// if the current class redefined the default group sequence, this sequence has to be applied to all the class hierarchy.
if ( defaultGroupSequenceIsRedefined ) {
Iterator<Sequence> defaultGroupSequence = hostingBeanMetaData.getDefaultValidationSequence( valueContext.getCurrentBean() );

Set<MetaConstraint<?>> classMetaConstraints = hostingBeanMetaData.getClassMetaConstraints();
Set<MetaConstraint<?>> propertyMetaConstraints = hostingBeanMetaData.getPropertyMetaConstraints();

Expand All @@ -471,10 +473,15 @@ private <U> void validateConstraintsForDefaultGroup(BaseBeanValidationContext<?>
boolean validationSuccessful = true;

for ( Group defaultSequenceMember : groupOfGroups ) {
boolean propertyValidationResult = propertyMetaConstraints.isEmpty() || validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, propertyMetaConstraints, defaultSequenceMember );
validationSuccessful = propertyValidationResult && validationSuccessful;
if ( !validationContext.isFailFastOnPropertyViolationModeEnabled() || propertyValidationResult ) {
validationSuccessful = ( classMetaConstraints.isEmpty() || validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, classMetaConstraints, defaultSequenceMember ) ) && validationSuccessful;
if ( validationContext.isFailFastOnPropertyViolationModeEnabled() ) {
boolean propertyValidationResult = propertyMetaConstraints.isEmpty() || validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, propertyMetaConstraints, defaultSequenceMember );
validationSuccessful = propertyValidationResult && validationSuccessful;
if ( propertyValidationResult ) {
validationSuccessful = ( classMetaConstraints.isEmpty() || validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, classMetaConstraints, defaultSequenceMember ) ) && validationSuccessful;
}
}
else {
validationSuccessful = validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, hostingBeanMetaData.getAllMetaConstraints(), defaultSequenceMember ) && validationSuccessful;
}
}

Expand All @@ -488,9 +495,15 @@ private <U> void validateConstraintsForDefaultGroup(BaseBeanValidationContext<?>
}
// fast path in case the default group sequence hasn't been redefined
else {
boolean propertyValidationResult = validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, hostingBeanMetaData.getDirectPropertyMetaConstraints(), Group.DEFAULT_GROUP );
if ( !validationContext.isFailFastOnPropertyViolationModeEnabled() || propertyValidationResult ) {
validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, hostingBeanMetaData.getDirectClassMetaConstraints(), Group.DEFAULT_GROUP );
if ( validationContext.isFailFastOnPropertyViolationModeEnabled() ) {
boolean propertyValidationResult = validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, hostingBeanMetaData.getDirectPropertyMetaConstraints(), Group.DEFAULT_GROUP );
if ( !validationContext.isFailFastOnPropertyViolationModeEnabled() || propertyValidationResult ) {
validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, hostingBeanMetaData.getDirectClassMetaConstraints(), Group.DEFAULT_GROUP );
}

}
else {
validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, hostingBeanMetaData.getAllDirectMetaConstraints(), Group.DEFAULT_GROUP );
}
validationContext.markCurrentBeanAsProcessed( valueContext );
}
Expand Down Expand Up @@ -531,10 +544,15 @@ private <U> boolean validateConstraintsForSingleDefaultGroupElement(BaseBeanVali
}

private void validateConstraintsForNonDefaultGroup(BaseBeanValidationContext<?> validationContext, BeanValueContext<?, Object> valueContext) {
boolean propertyValidationResult = validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), valueContext.getCurrentBeanMetaData().getPropertyMetaConstraints() );
if ( !validationContext.isFailFastOnPropertyViolationModeEnabled() || propertyValidationResult ) {
validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), valueContext.getCurrentBeanMetaData().getClassMetaConstraints() );
if ( validationContext.isFailFastOnPropertyViolationModeEnabled() ) {
if ( validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), valueContext.getCurrentBeanMetaData().getPropertyMetaConstraints() ) ) {
validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), valueContext.getCurrentBeanMetaData().getClassMetaConstraints() );
}
}
else {
validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), valueContext.getCurrentBeanMetaData().getAllMetaConstraints() );
}

validationContext.markCurrentBeanAsProcessed( valueContext );
}

Expand Down Expand Up @@ -1158,7 +1176,7 @@ private <T> void validateReturnValueForSingleGroup(BaseBeanValidationContext<T>
* @param propertyPath The property path for which constraints have to be collected.
*
* @return Returns an instance of {@code ValueContext} which describes the local validation context associated to
* the given property path.
* the given property path.
*/
private <V> BeanValueContext<?, V> getValueContextForPropertyValidation(BaseBeanValidationContext<?> validationContext, PathImpl propertyPath) {
Class<?> clazz = validationContext.getRootBeanClass();
Expand Down Expand Up @@ -1233,6 +1251,7 @@ else if ( propertyPathNode.getKey() != null ) {
*
* @param rootBeanClass The class of the root bean.
* @param propertyPath The property path for which constraints have to be collected.
*
* @return Returns an instance of {@code ValueContext} which describes the local validation context associated to
* the given property path.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,16 @@ public boolean isDefaultGroupSequenceRedefined() {
return false;
}

@Override
public Set<MetaConstraint<?>> getAllMetaConstraints() {
return Collections.emptySet();
}

@Override
public Set<MetaConstraint<?>> getAllDirectMetaConstraints() {
return Collections.emptySet();
}

@Override
public Set<MetaConstraint<?>> getClassMetaConstraints() {
return Collections.emptySet();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@ public interface BeanMetaData<T> extends Validatable {
*/
Set<MetaConstraint<?>> getPropertyMetaConstraints();

/**
* @return A set of {@code MetaConstraint} instances encapsulating the information of all constraints
* defined on the bean. This collection includes constraints from super classes as well
*/
Set<MetaConstraint<?>> getAllMetaConstraints();

/**
* @return A set of class level {@code MetaConstraint} instances encapsulating the information of all the constraints
* defined on the bean directly (including constraints defined on implemented interfaces). It does not
Expand All @@ -107,6 +113,12 @@ public interface BeanMetaData<T> extends Validatable {
*/
Set<MetaConstraint<?>> getDirectPropertyMetaConstraints();

/**
* @return A set of {@code MetaConstraint} instances encapsulating the information of all the constraints
* defined on the bean directly (including constraints defined on implemented interfaces). It does not
* contain constraints from super classes or interfaces implemented by super classes
*/
Set<MetaConstraint<?>> getAllDirectMetaConstraints();
/**
* Returns the constraint-related metadata for the given executable of the
* class represented by this bean metadata.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ public final class BeanMetaDataImpl<T> implements BeanMetaData<T> {
@Immutable
private final Set<MetaConstraint<?>> propertyMetaConstraints;

/**
* Combination of class and property level constraints for this bean type (defined on any implemented interfaces or super types)
*/
@Immutable
private final Set<MetaConstraint<?>> allMetaConstraints;

/**
* Set of all class level constraints which are directly defined on the bean or any of the directly implemented interfaces
*/
Expand All @@ -101,6 +107,12 @@ public final class BeanMetaDataImpl<T> implements BeanMetaData<T> {
@Immutable
private final Set<MetaConstraint<?>> directPropertyMetaConstraints;

/**
* Set of all constraints which are directly defined on the bean or any of the directly implemented interfaces
*/
@Immutable
private final Set<MetaConstraint<?>> allDirectMetaConstraints;

/**
* Contains constrained related meta data for all the constrained methods and constructors of the type represented
* by this bean meta data. Keyed by executable, values are an aggregated view on each executable together with all
Expand Down Expand Up @@ -233,6 +245,12 @@ else if ( constraintMetaData.getKind() == ElementKind.BEAN ) {
this.classMetaConstraints = CollectionHelper.toImmutableSet( classMetaConstraints );
this.propertyMetaConstraints = CollectionHelper.toImmutableSet( propertyMetaConstraints );

Set<MetaConstraint<?>> allMetaConstraints = newHashSet( classMetaConstraints.size() + propertyMetaConstraints.size() );
allMetaConstraints.addAll( classMetaConstraints );
allMetaConstraints.addAll( propertyMetaConstraints );

this.allMetaConstraints = CollectionHelper.toImmutableSet( allMetaConstraints );

this.classHierarchyWithoutInterfaces = CollectionHelper.toImmutableList( ClassHierarchyHelper.getHierarchy(
beanClass,
Filters.excludeInterfaces()
Expand All @@ -245,6 +263,7 @@ else if ( constraintMetaData.getKind() == ElementKind.BEAN ) {

this.directClassMetaConstraints = getDirectConstraints( classMetaConstraints );
this.directPropertyMetaConstraints = getDirectConstraints( propertyMetaConstraints );
this.allDirectMetaConstraints = getDirectConstraints( allMetaConstraints );

this.executableMetaDataMap = CollectionHelper.toImmutableMap( bySignature( executableMetaDataSet ) );
this.unconstrainedExecutables = CollectionHelper.toImmutableSet( tmpUnconstrainedExecutables );
Expand Down Expand Up @@ -315,6 +334,11 @@ public Set<MetaConstraint<?>> getPropertyMetaConstraints() {
return propertyMetaConstraints;
}

@Override
public Set<MetaConstraint<?>> getAllMetaConstraints() {
return allMetaConstraints;
}

@Override
public Set<MetaConstraint<?>> getDirectClassMetaConstraints() {
return directClassMetaConstraints;
Expand All @@ -325,6 +349,11 @@ public Set<MetaConstraint<?>> getDirectPropertyMetaConstraints() {
return directPropertyMetaConstraints;
}

@Override
public Set<MetaConstraint<?>> getAllDirectMetaConstraints() {
return allDirectMetaConstraints;
}

@Override
public Optional<ExecutableMetaData> getMetaDataFor(Executable executable) {
Signature signature = ExecutableHelper.getSignature( executable );
Expand Down

0 comments on commit c1abd5d

Please sign in to comment.