Skip to content

Commit 89a2ad3

Browse files
gsmetgunnarmorling
authored andcommitted
HV-1481 Move the logic out of the flow of ValidatorImpl
1 parent 0762ec4 commit 89a2ad3

File tree

4 files changed

+54
-21
lines changed

4 files changed

+54
-21
lines changed

engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaData;
5555
import org.hibernate.validator.internal.metadata.aggregated.ContainerCascadingMetaData;
5656
import org.hibernate.validator.internal.metadata.aggregated.ExecutableMetaData;
57-
import org.hibernate.validator.internal.metadata.aggregated.NonContainerCascadingMetaData;
5857
import org.hibernate.validator.internal.metadata.aggregated.ParameterMetaData;
5958
import org.hibernate.validator.internal.metadata.aggregated.PropertyMetaData;
6059
import org.hibernate.validator.internal.metadata.aggregated.ReturnValueMetaData;
@@ -581,28 +580,15 @@ private void validateCascadedConstraints(ValidationContext<?> validationContext,
581580
CascadingMetaData cascadingMetaData = cascadable.getCascadingMetaData();
582581

583582
if ( value != null ) {
583+
CascadingMetaData effectiveCascadingMetaData = cascadingMetaData.addRuntimeLegacyCollectionSupport( value.getClass() );
584+
584585
// validate cascading on the annotated object
585-
if ( cascadingMetaData.isCascading() ) {
586-
validateCascadedAnnotatedObjectForCurrentGroup( value, validationContext, valueContext, cascadingMetaData );
587-
588-
if ( !cascadingMetaData.isContainer() ) {
589-
// We might be in the case where the legacy @Valid support for collections and arrays has been used on a type for which
590-
// it cannot be detected at bootstrap time: thus we need to check with the runtime type.
591-
// Note that if it has been detected at bootstrap time, the cascading metadata has been modified to include it
592-
// and we are then in the container case.
593-
NonContainerCascadingMetaData nonContainerCascadingMetaData = cascadingMetaData.as( NonContainerCascadingMetaData.class );
594-
ContainerCascadingMetaData legacyContainerCascadingMetaData = nonContainerCascadingMetaData
595-
.getLegacyContainerCascadingMetaData( value.getClass() );
596-
597-
if ( legacyContainerCascadingMetaData != null ) {
598-
validateCascadedContainerElementsForCurrentGroup( value, validationContext, valueContext,
599-
Collections.singletonList( legacyContainerCascadingMetaData ) );
600-
}
601-
}
586+
if ( effectiveCascadingMetaData.isCascading() ) {
587+
validateCascadedAnnotatedObjectForCurrentGroup( value, validationContext, valueContext, effectiveCascadingMetaData );
602588
}
603589

604-
if ( cascadingMetaData.isContainer() ) {
605-
ContainerCascadingMetaData containerCascadingMetaData = cascadingMetaData.as( ContainerCascadingMetaData.class );
590+
if ( effectiveCascadingMetaData.isContainer() ) {
591+
ContainerCascadingMetaData containerCascadingMetaData = effectiveCascadingMetaData.as( ContainerCascadingMetaData.class );
606592

607593
if ( containerCascadingMetaData.hasContainerElementsMarkedForCascading() ) {
608594
// validate cascading on the container elements

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/CascadingMetaData.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,19 @@ public interface CascadingMetaData {
4141
boolean isContainer();
4242

4343
<T extends CascadingMetaData> T as(Class<T> clazz);
44+
45+
/**
46+
* Add additional cascading metadata when:
47+
* <ul>
48+
* <li>the element is marked with {@code @Valid},</li>
49+
* <li>the runtime type of the element is collection based (e.g. collections, maps or arrays),</li>
50+
* <li>and the static type isn't collection based.</li>
51+
* </ul>
52+
* <p>
53+
* An example of this particular situation is: {@code @Valid private Object element = new ArrayList<String>()}.
54+
* <p>
55+
* Note that if the static type is collection based, the cascading information are directly included at bootstrap
56+
* time.
57+
*/
58+
CascadingMetaData addRuntimeLegacyCollectionSupport(Class<?> valueClass);
4459
}

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/ContainerCascadingMetaData.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,19 @@ private ContainerCascadingMetaData(ValueExtractorManager valueExtractorManager,
131131
}
132132
}
133133

134+
ContainerCascadingMetaData(Type enclosingType, List<ContainerCascadingMetaData> containerElementTypesCascadingMetaData,
135+
GroupConversionHelper groupConversionHelper) {
136+
this.enclosingType = enclosingType;
137+
this.typeParameter = AnnotatedObject.INSTANCE;
138+
this.declaredContainerClass = null;
139+
this.declaredTypeParameter = null;
140+
this.containerElementTypesCascadingMetaData = containerElementTypesCascadingMetaData;
141+
this.cascading = true;
142+
this.groupConversionHelper = groupConversionHelper;
143+
this.hasContainerElementsMarkedForCascading = true;
144+
this.valueExtractorCandidates = Collections.emptySet();
145+
}
146+
134147
ContainerCascadingMetaData(Type enclosingType, TypeVariable<?> typeParameter, Class<?> declaredContainerClass, TypeVariable<?> declaredTypeParameter,
135148
GroupConversionHelper groupConversionHelper, Set<ValueExtractorDescriptor> valueExtractorCandidates) {
136149
this.enclosingType = enclosingType;
@@ -208,6 +221,11 @@ public <T extends CascadingMetaData> T as(Class<T> clazz) {
208221
throw LOG.getUnableToCastException( this, clazz );
209222
}
210223

224+
@Override
225+
public CascadingMetaData addRuntimeLegacyCollectionSupport(Class<?> valueClass) {
226+
return this;
227+
}
228+
211229
@Override
212230
public String toString() {
213231
StringBuilder sb = new StringBuilder();

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/NonContainerCascadingMetaData.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,21 @@ public boolean isContainer() {
101101
return false;
102102
}
103103

104-
public ContainerCascadingMetaData getLegacyContainerCascadingMetaData(Class<?> valueClass) {
104+
@Override
105+
public CascadingMetaData addRuntimeLegacyCollectionSupport(Class<?> valueClass) {
106+
if ( !cascading ) {
107+
return this;
108+
}
109+
110+
ContainerCascadingMetaData legacyContainerElementCascadingMetaData = getLegacyContainerElementCascadingMetaData( valueClass );
111+
if ( legacyContainerElementCascadingMetaData == null ) {
112+
return this;
113+
}
114+
115+
return new ContainerCascadingMetaData( valueClass, Collections.singletonList( legacyContainerElementCascadingMetaData ), groupConversionHelper );
116+
}
117+
118+
private ContainerCascadingMetaData getLegacyContainerElementCascadingMetaData(Class<?> valueClass) {
105119
if ( List.class.isAssignableFrom( valueClass ) ) {
106120
return new ContainerCascadingMetaData( List.class, List.class.getTypeParameters()[0], List.class, List.class.getTypeParameters()[0],
107121
groupConversionHelper, LegacyCollectionSupportValueExtractors.LIST );

0 commit comments

Comments
 (0)