Skip to content

Commit

Permalink
HV-1439 Have a specific method to check that cascading should be
Browse files Browse the repository at this point in the history
performed on container elements: there is no need to execute part of the
code if only the annotated object is cascaded.
  • Loading branch information
gsmet committed Aug 3, 2017
1 parent 99551f9 commit 39e70a9
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 18 deletions.
Expand Up @@ -583,10 +583,14 @@ private void validateCascadedConstraints(ValidationContext<?> validationContext,
validateCascadedAnnotatedObjectForCurrentGroup( value, validationContext, valueContext, cascadingMetaData );
}

if ( cascadingMetaData.isContainer() && cascadingMetaData.isMarkedForCascadingOnAnnotatedObjectOrContainerElements() ) {
// validate cascading on the container elements
validateCascadedContainerElementsForCurrentGroup( value, validationContext, valueContext,
cascadingMetaData.as( ContainerCascadingMetaData.class ).getContainerElementTypesCascadingMetaData() );
if ( cascadingMetaData.isContainer() ) {
ContainerCascadingMetaData containerCascadingMetaData = cascadingMetaData.as( ContainerCascadingMetaData.class );

if ( containerCascadingMetaData.hasContainerElementsMarkedForCascading() ) {
// validate cascading on the container elements
validateCascadedContainerElementsForCurrentGroup( value, validationContext, valueContext,
containerCascadingMetaData.getContainerElementTypesCascadingMetaData() );
}
}
}
}
Expand Down Expand Up @@ -701,7 +705,7 @@ private void doValidate(Object value, String nodeName) {
}

// Cascade validation to container elements if we are dealing with a container element
if ( cascadingMetaData.isMarkedForCascadingOnAnnotatedObjectOrContainerElements() ) {
if ( cascadingMetaData.hasContainerElementsMarkedForCascading() ) {
ValueContext<?, Object> cascadedTypeArgumentValueContext = buildNewLocalExecutionContext( valueContext, value );
if ( cascadingMetaData.getTypeParameter() != null ) {
cascadedValueContext.setTypeParameter( cascadingMetaData.getDeclaredContainerClass(), cascadingMetaData.getDeclaredTypeParameter() );
Expand Down
Expand Up @@ -83,9 +83,9 @@ public class CascadingMetaDataBuilder {
private final Map<Class<?>, Class<?>> groupConversions;

/**
* Whether the constrained element is directly or indirectly (via type arguments) marked for cascaded validation.
* Whether any container element (it can be nested) is marked for cascaded validation.
*/
private final boolean markedForCascadingOnAnnotatedObjectOrContainerElements;
private final boolean hasContainerElementsMarkedForCascading;

/**
* Whether the constrained element has directly or indirectly (via type arguments) group conversions defined.
Expand All @@ -110,15 +110,15 @@ private CascadingMetaDataBuilder(Type enclosingType, TypeVariable<?> typeParamet
this.groupConversions = CollectionHelper.toImmutableMap( groupConversions );
this.containerElementTypesCascadingMetaData = CollectionHelper.toImmutableMap( containerElementTypesCascadingMetaData );

boolean tmpMarkedForCascadingOnAnnotatedObjectOrContainerElements = cascading;
boolean tmpHasContainerElementsMarkedForCascading = false;
boolean tmpHasGroupConversionsOnAnnotatedObjectOrContainerElements = !groupConversions.isEmpty();
for ( CascadingMetaDataBuilder nestedCascadingTypeParameter : containerElementTypesCascadingMetaData.values() ) {
tmpMarkedForCascadingOnAnnotatedObjectOrContainerElements = tmpMarkedForCascadingOnAnnotatedObjectOrContainerElements
|| nestedCascadingTypeParameter.markedForCascadingOnAnnotatedObjectOrContainerElements;
tmpHasContainerElementsMarkedForCascading = tmpHasContainerElementsMarkedForCascading
|| nestedCascadingTypeParameter.cascading || nestedCascadingTypeParameter.hasContainerElementsMarkedForCascading;
tmpHasGroupConversionsOnAnnotatedObjectOrContainerElements = tmpHasGroupConversionsOnAnnotatedObjectOrContainerElements
|| nestedCascadingTypeParameter.hasGroupConversionsOnAnnotatedObjectOrContainerElements;
}
markedForCascadingOnAnnotatedObjectOrContainerElements = tmpMarkedForCascadingOnAnnotatedObjectOrContainerElements;
hasContainerElementsMarkedForCascading = tmpHasContainerElementsMarkedForCascading;
hasGroupConversionsOnAnnotatedObjectOrContainerElements = tmpHasGroupConversionsOnAnnotatedObjectOrContainerElements;
}

Expand Down Expand Up @@ -170,8 +170,12 @@ public Map<Class<?>, Class<?>> getGroupConversions() {
return groupConversions;
}

public boolean hasContainerElementsMarkedForCascading() {
return hasContainerElementsMarkedForCascading;
}

public boolean isMarkedForCascadingOnAnnotatedObjectOrContainerElements() {
return markedForCascadingOnAnnotatedObjectOrContainerElements;
return cascading || hasContainerElementsMarkedForCascading;
}

public boolean hasGroupConversionsOnAnnotatedObjectOrContainerElements() {
Expand Down
Expand Up @@ -73,9 +73,9 @@ public class ContainerCascadingMetaData implements CascadingMetaData {
private GroupConversionHelper groupConversionHelper;

/**
* Whether the constrained element is directly or indirectly (via type arguments) marked for cascaded validation.
* Whether any container element (it can be nested) is marked for cascaded validation.
*/
private final boolean markedForCascadingOnAnnotatedObjectOrContainerElements;
private final boolean hasContainerElementsMarkedForCascading;

/**
* The set of value extractors which are type compliant and container element compliant with the element where
Expand Down Expand Up @@ -107,17 +107,17 @@ private ContainerCascadingMetaData(ValueExtractorManager valueExtractorManager,

private ContainerCascadingMetaData(ValueExtractorManager valueExtractorManager, Type enclosingType, TypeVariable<?> typeParameter,
Class<?> declaredContainerClass, TypeVariable<?> declaredTypeParameter, List<ContainerCascadingMetaData> containerElementTypesCascadingMetaData,
boolean cascading, GroupConversionHelper groupConversionHelper, boolean markedForCascadingOnElementOrContainerElements) {
boolean cascading, GroupConversionHelper groupConversionHelper, boolean markedForCascadingOnContainerElements) {
this.enclosingType = enclosingType;
this.typeParameter = typeParameter;
this.declaredContainerClass = declaredContainerClass;
this.declaredTypeParameter = declaredTypeParameter;
this.containerElementTypesCascadingMetaData = containerElementTypesCascadingMetaData;
this.cascading = cascading;
this.groupConversionHelper = groupConversionHelper;
this.markedForCascadingOnAnnotatedObjectOrContainerElements = markedForCascadingOnElementOrContainerElements;
this.hasContainerElementsMarkedForCascading = markedForCascadingOnContainerElements;

if ( TypeVariables.isAnnotatedObject( this.typeParameter ) || !markedForCascadingOnElementOrContainerElements ) {
if ( TypeVariables.isAnnotatedObject( this.typeParameter ) || !markedForCascadingOnContainerElements ) {
this.valueExtractorCandidates = Collections.emptySet();
}
else {
Expand Down Expand Up @@ -158,9 +158,13 @@ public boolean isCascading() {
return cascading;
}

public boolean hasContainerElementsMarkedForCascading() {
return hasContainerElementsMarkedForCascading;
}

@Override
public boolean isMarkedForCascadingOnAnnotatedObjectOrContainerElements() {
return markedForCascadingOnAnnotatedObjectOrContainerElements;
return cascading || hasContainerElementsMarkedForCascading;
}

public List<ContainerCascadingMetaData> getContainerElementTypesCascadingMetaData() {
Expand Down

0 comments on commit 39e70a9

Please sign in to comment.