Skip to content

Commit 5eb1fb4

Browse files
committed
[value-context-changes] Return metadata hierarchy instead of a class one
1 parent b544643 commit 5eb1fb4

File tree

6 files changed

+36
-26
lines changed

6 files changed

+36
-26
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,7 @@ private <U> void validateConstraintsForDefaultGroup(BaseBeanValidationContext<?>
456456
final Map<Class<?>, Class<?>> validatedInterfaces = new HashMap<>();
457457

458458
// evaluating the constraints of a bean per class in hierarchy, this is necessary to detect potential default group re-definitions
459-
for ( Class<? super U> clazz : beanMetaData.getClassHierarchy() ) {
460-
BeanMetaData<? super U> hostingBeanMetaData = beanMetaDataManager.getBeanMetaData( clazz );
459+
for ( BeanMetaData<? super U> hostingBeanMetaData : beanMetaData.getBeanMetadataHierarchy() ) {
461460
boolean defaultGroupSequenceIsRedefined = hostingBeanMetaData.isDefaultGroupSequenceRedefined();
462461

463462
// if the current class redefined the default group sequence, this sequence has to be applied to all the class hierarchy.
@@ -470,7 +469,7 @@ private <U> void validateConstraintsForDefaultGroup(BaseBeanValidationContext<?>
470469
boolean validationSuccessful = true;
471470

472471
for ( Group defaultSequenceMember : groupOfGroups ) {
473-
validationSuccessful = validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz,
472+
validationSuccessful = validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, hostingBeanMetaData.getBeanClass(),
474473
metaConstraints, defaultSequenceMember );
475474
}
476475

@@ -485,7 +484,7 @@ private <U> void validateConstraintsForDefaultGroup(BaseBeanValidationContext<?>
485484
// fast path in case the default group sequence hasn't been redefined
486485
else {
487486
Set<MetaConstraint<?>> metaConstraints = hostingBeanMetaData.getDirectMetaConstraints();
488-
validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, clazz, metaConstraints,
487+
validateConstraintsForSingleDefaultGroupElement( validationContext, valueContext, validatedInterfaces, hostingBeanMetaData.getBeanClass(), metaConstraints,
489488
Group.DEFAULT_GROUP );
490489
validationContext.markCurrentBeanAsProcessed( valueContext );
491490
}

engine/src/main/java/org/hibernate/validator/internal/metadata/BeanMetaDataManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private <T> BeanMetaDataImpl<T> createBeanMetaData(Class<T> clazz) {
193193
}
194194
}
195195

196-
return builder.build();
196+
return builder.build( this );
197197
}
198198

199199
/**

engine/src/main/java/org/hibernate/validator/internal/metadata/PredefinedScopeBeanMetaDataManager.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,13 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
7474
Map<Class<?>, BeanMetaData<?>> tmpBeanMetadataMap = new HashMap<>();
7575

7676
for ( Class<?> validatedClass : beanClassesToInitialize ) {
77-
@SuppressWarnings("unchecked")
78-
List<Class<?>> classHierarchy = (List<Class<?>>) (Object) ClassHierarchyHelper.getHierarchy( validatedClass, Filters.excludeInterfaces() );
79-
80-
// note that the hierarchy also contains the initial class
81-
for ( Class<?> hierarchyElement : classHierarchy ) {
82-
tmpBeanMetadataMap.put( beanMetaDataClassNormalizer.normalize( hierarchyElement ),
83-
createBeanMetaData( constraintCreationContext, executableHelper, parameterNameProvider,
84-
javaBeanHelper, validationOrderGenerator, optionalMetaDataProviders, methodValidationConfiguration,
85-
metaDataProviders, hierarchyElement ) );
77+
BeanMetaData<?> beanMetaData = createBeanMetaData( this, constraintCreationContext, executableHelper, parameterNameProvider,
78+
javaBeanHelper, validationOrderGenerator, optionalMetaDataProviders, methodValidationConfiguration,
79+
metaDataProviders, validatedClass );
80+
81+
tmpBeanMetadataMap.put( validatedClass, beanMetaData );
82+
for ( BeanMetaData<?> metaData : beanMetaData.getBeanMetadataHierarchy() ) {
83+
tmpBeanMetadataMap.put( metaData.getBeanClass(), metaData );
8684
}
8785
}
8886

@@ -115,7 +113,8 @@ public void clear() {
115113
*
116114
* @return A bean meta data object for the given type.
117115
*/
118-
private static <T> BeanMetaDataImpl<T> createBeanMetaData(ConstraintCreationContext constraintCreationContext,
116+
private static <T> BeanMetaDataImpl<T> createBeanMetaData(BeanMetaDataManager beanMetaDataManager,
117+
ConstraintCreationContext constraintCreationContext,
119118
ExecutableHelper executableHelper,
120119
ExecutableParameterNameProvider parameterNameProvider,
121120
JavaBeanHelper javaBeanHelper,
@@ -134,7 +133,7 @@ private static <T> BeanMetaDataImpl<T> createBeanMetaData(ConstraintCreationCont
134133
}
135134
}
136135

137-
return builder.build();
136+
return builder.build( beanMetaDataManager );
138137
}
139138

140139
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,5 +112,5 @@ public interface BeanMetaData<T> extends Validatable {
112112
* @return Returns a list of classes representing the class hierarchy for the entity. The list start with the
113113
* element itself and goes up the hierarchy chain. Interfaces are not included.
114114
*/
115-
List<Class<? super T>> getClassHierarchy();
115+
List<BeanMetaData<? super T>> getBeanMetadataHierarchy();
116116
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.validator.internal.engine.ConstraintCreationContext;
1515
import org.hibernate.validator.internal.engine.MethodValidationConfiguration;
1616
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
17+
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
1718
import org.hibernate.validator.internal.metadata.raw.BeanConfiguration;
1819
import org.hibernate.validator.internal.metadata.raw.ConfigurationSource;
1920
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement;
@@ -126,14 +127,15 @@ private void addMetaDataToBuilder(ConstrainedElement constrainableElement, Set<B
126127
);
127128
}
128129

129-
public BeanMetaDataImpl<T> build() {
130+
public BeanMetaDataImpl<T> build(BeanMetaDataManager beanMetaDataManager) {
130131
Set<ConstraintMetaData> aggregatedElements = newHashSet();
131132

132133
for ( BuilderDelegate builder : builders ) {
133134
aggregatedElements.addAll( builder.build() );
134135
}
135136

136137
return new BeanMetaDataImpl<>(
138+
beanMetaDataManager,
137139
beanClass,
138140
defaultGroupSequence,
139141
defaultGroupSequenceProvider,

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.hibernate.validator.internal.engine.groups.Sequence;
3131
import org.hibernate.validator.internal.engine.groups.ValidationOrder;
3232
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
33+
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
3334
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
3435
import org.hibernate.validator.internal.metadata.descriptor.BeanDescriptorImpl;
3536
import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl;
@@ -138,11 +139,11 @@ public final class BeanMetaDataImpl<T> implements BeanMetaData<T> {
138139
private final ValidationOrder validationOrder;
139140

140141
/**
141-
* The class hierarchy for this class starting with the class itself going up the inheritance chain. Interfaces
142+
* The bean metadata hierarchy for this class starting with the class itself going up the inheritance chain. Interfaces
142143
* are not included.
143144
*/
144145
@Immutable
145-
private final List<Class<? super T>> classHierarchyWithoutInterfaces;
146+
private final List<BeanMetaData<? super T>> beanMetadataHierarchyWithoutInterfaces;
146147

147148
/**
148149
* {code true} if the default group sequence is redefined, either via a group sequence redefinition or a group
@@ -168,12 +169,11 @@ public final class BeanMetaDataImpl<T> implements BeanMetaData<T> {
168169
* @param defaultGroupSequenceProvider The default group sequence provider if set.
169170
* @param constraintMetaDataSet All constraint meta data relating to the represented type.
170171
*/
171-
public BeanMetaDataImpl(Class<T> beanClass,
172+
public BeanMetaDataImpl(BeanMetaDataManager beanMetaDataManager, Class<T> beanClass,
172173
List<Class<?>> defaultGroupSequence,
173174
DefaultGroupSequenceProvider<? super T> defaultGroupSequenceProvider,
174175
Set<ConstraintMetaData> constraintMetaDataSet,
175176
ValidationOrderGenerator validationOrderGenerator) {
176-
177177
this.validationOrderGenerator = validationOrderGenerator;
178178
this.beanClass = beanClass;
179179
this.propertyMetaDataMap = newHashMap();
@@ -219,10 +219,20 @@ else if ( constraintMetaData.getKind() == ElementKind.BEAN ) {
219219
this.cascadedProperties = CollectionHelper.toImmutableSet( cascadedProperties );
220220
this.allMetaConstraints = CollectionHelper.toImmutableSet( allMetaConstraints );
221221

222-
this.classHierarchyWithoutInterfaces = CollectionHelper.toImmutableList( ClassHierarchyHelper.getHierarchy(
222+
// get the metadata for all other classes in hierarchy:
223+
List<Class<? super T>> hierarchy = ClassHierarchyHelper.getHierarchy(
223224
beanClass,
224225
Filters.excludeInterfaces()
225-
) );
226+
);
227+
List<BeanMetaData<? super T>> beanMetadataHierarchy = new ArrayList<>( hierarchy.size() );
228+
// metadata for a class `beanClass` should go as a first element in the list
229+
beanMetadataHierarchy.add( this );
230+
for ( int index = 1; index < hierarchy.size(); index++ ) {
231+
beanMetadataHierarchy.add( beanMetaDataManager.getBeanMetaData( hierarchy.get( index ) ) );
232+
}
233+
234+
this.beanMetadataHierarchyWithoutInterfaces = CollectionHelper.toImmutableList( beanMetadataHierarchy );
235+
226236

227237
DefaultGroupSequenceContext<? super T> defaultGroupContext = getDefaultGroupSequenceData( beanClass, defaultGroupSequence, defaultGroupSequenceProvider, validationOrderGenerator );
228238
this.defaultGroupSequenceProvider = defaultGroupContext.defaultGroupSequenceProvider;
@@ -352,8 +362,8 @@ public boolean isDefaultGroupSequenceRedefined() {
352362
}
353363

354364
@Override
355-
public List<Class<? super T>> getClassHierarchy() {
356-
return classHierarchyWithoutInterfaces;
365+
public List<BeanMetaData<? super T>> getBeanMetadataHierarchy() {
366+
return beanMetadataHierarchyWithoutInterfaces;
357367
}
358368

359369
private static BeanDescriptor createBeanDescriptor(Class<?> beanClass, Set<MetaConstraint<?>> allMetaConstraints,

0 commit comments

Comments
 (0)