Skip to content

Commit abd5bf5

Browse files
committed
[value-context-changes] Introduce HibernateConstrainedType, that wraps class
`HibernateConstrainedType` wraps a class and is used as a key for metadata manager. It can also wrap strings or any other objects/data for metadata of property holders and other kinds of objects.
1 parent 686a788 commit abd5bf5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+660
-301
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.engine;
8+
9+
import java.util.List;
10+
11+
/**
12+
* An interface that represents a type/class of a bean that will be validated.
13+
* Based on this type set of constraints will be determined, and applied to the
14+
* validated object.
15+
*
16+
* @author Marko Bekhta
17+
* @since 6.1
18+
*/
19+
public interface HibernateConstrainedType<T> {
20+
21+
/**
22+
* @return a class of an object that will be validated.
23+
*/
24+
Class<T> getActuallClass();
25+
26+
List<HibernateConstrainedType<? super T>> getHierarchy();
27+
28+
boolean isInterface();
29+
}

engine/src/main/java/org/hibernate/validator/internal/cfg/context/TypeConstraintMappingContextImpl.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.hibernate.validator.cfg.context.MethodConstraintMappingContext;
2424
import org.hibernate.validator.cfg.context.PropertyConstraintMappingContext;
2525
import org.hibernate.validator.cfg.context.TypeConstraintMappingContext;
26+
import org.hibernate.validator.internal.engine.constrainedtype.JavaBeanConstrainedType;
2627
import org.hibernate.validator.internal.engine.ConstraintCreationContext;
2728
import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl.ConstraintType;
2829
import org.hibernate.validator.internal.metadata.raw.BeanConfiguration;
@@ -231,7 +232,7 @@ public ConstructorConstraintMappingContext constructor(Class<?>... parameterType
231232
BeanConfiguration<C> build(ConstraintCreationContext constraintCreationContext) {
232233
return new BeanConfiguration<>(
233234
ConfigurationSource.API,
234-
beanClass,
235+
new JavaBeanConstrainedType<>( beanClass ),
235236
buildConstraintElements( constraintCreationContext ),
236237
defaultGroupSequence,
237238
getDefaultGroupSequenceProvider()

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

+96-64
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.internal.engine.constrainedtype;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
import org.hibernate.validator.engine.HibernateConstrainedType;
13+
import org.hibernate.validator.internal.util.classhierarchy.ClassHierarchyHelper;
14+
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
15+
16+
/**
17+
* An implementation of {@link HibernateConstrainedType} for regular JavaBeans.
18+
* Wrapps a {@link Class} object to adapt it to the needs of HV usages.
19+
*
20+
* @author Marko Bekhta
21+
*/
22+
public class JavaBeanConstrainedType<T> implements HibernateConstrainedType<T> {
23+
24+
private final Class<T> clazz;
25+
26+
public JavaBeanConstrainedType(Class<T> clazz) {
27+
this.clazz = clazz;
28+
}
29+
30+
@Override
31+
public Class<T> getActuallClass() {
32+
return clazz;
33+
}
34+
35+
@Override
36+
public List<HibernateConstrainedType<? super T>> getHierarchy() {
37+
List<Class<? super T>> hierarchy = ClassHierarchyHelper.getHierarchy( clazz );
38+
List<HibernateConstrainedType<? super T>> result = new ArrayList<>( hierarchy.size() );
39+
for ( Class<? super T> clazzz : hierarchy ) {
40+
result.add( new JavaBeanConstrainedType<>( clazzz ) );
41+
}
42+
return result;
43+
}
44+
45+
@Override
46+
public boolean isInterface() {
47+
return clazz.isInterface();
48+
}
49+
50+
public HibernateConstrainedType<T> normalize(BeanMetaDataClassNormalizer normalizer) {
51+
return new NormalizedJavaBeanConstrainedType<>( normalizer, clazz );
52+
}
53+
54+
@Override
55+
public boolean equals(Object o) {
56+
if ( this == o ) {
57+
return true;
58+
}
59+
if ( o == null || !( o instanceof JavaBeanConstrainedType ) ) {
60+
return false;
61+
}
62+
63+
JavaBeanConstrainedType<?> that = (JavaBeanConstrainedType<?>) o;
64+
65+
if ( !clazz.equals( that.clazz ) ) {
66+
return false;
67+
}
68+
69+
return true;
70+
}
71+
72+
@Override
73+
public int hashCode() {
74+
return clazz.hashCode();
75+
}
76+
77+
@Override
78+
public String toString() {
79+
return "JavaBeanConstrainedType{" +
80+
"clazz=" + clazz +
81+
'}';
82+
}
83+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.internal.engine.constrainedtype;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
import org.hibernate.validator.engine.HibernateConstrainedType;
13+
import org.hibernate.validator.internal.util.classhierarchy.ClassHierarchyHelper;
14+
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
15+
16+
/**
17+
* Uses {@link org.hibernate.validator.metadata.BeanMetaDataClassNormalizer} before
18+
* creating a {@link HibernateConstrainedType}.
19+
*
20+
* @author Marko Bekhta
21+
*/
22+
public class NormalizedJavaBeanConstrainedType<T> extends JavaBeanConstrainedType<T> {
23+
private final BeanMetaDataClassNormalizer normalizer;
24+
25+
public NormalizedJavaBeanConstrainedType(BeanMetaDataClassNormalizer normalizer, Class<T> clazz) {
26+
super( (Class<T>) normalizer.normalize( clazz ) );
27+
this.normalizer = normalizer;
28+
}
29+
30+
@Override
31+
public List<HibernateConstrainedType<? super T>> getHierarchy() {
32+
List<Class<? super T>> hierarchy = ClassHierarchyHelper.getHierarchy( getActuallClass() );
33+
List<HibernateConstrainedType<? super T>> result = new ArrayList<>( hierarchy.size() );
34+
//TODO : question - do we actually need to normalize anything here. Wouldn't it be enough to normalize only when
35+
// the metadata is retrieved ?
36+
for ( Class<? super T> clazzz : hierarchy ) {
37+
result.add( (NormalizedJavaBeanConstrainedType<? super T>) new NormalizedJavaBeanConstrainedType<>( normalizer, normalizer.normalize( clazzz ) ) );
38+
}
39+
return result;
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
8+
/**
9+
* Classes implementing {@link org.hibernate.validator.engine.HibernateConstrainedType}.
10+
*/
11+
package org.hibernate.validator.internal.engine.constrainedtype;

engine/src/main/java/org/hibernate/validator/internal/engine/validationcontext/ValidationContextBuilder.java

+11-10
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import javax.validation.TraversableResolver;
1313

1414
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorInitializationContext;
15+
import org.hibernate.validator.engine.HibernateConstrainedType;
1516
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
1617
import org.hibernate.validator.internal.engine.path.PathImpl;
1718
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData;
@@ -43,49 +44,49 @@ public ValidationContextBuilder(
4344
this.validatorScopedContext = validatorScopedContext;
4445
}
4546

46-
public <T> BaseBeanValidationContext<T> forValidate(Class<T> rootBeanClass, BeanMetaData<T> rootBeanMetaData, T rootBean) {
47+
public <T> BaseBeanValidationContext<T> forValidate(HibernateConstrainedType<T> constrainedType, BeanMetaData<T> rootBeanMetaData, T rootBean) {
4748
return new BeanValidationContext<>(
4849
constraintValidatorManager,
4950
constraintValidatorFactory,
5051
validatorScopedContext,
5152
traversableResolver,
5253
constraintValidatorInitializationContext,
5354
rootBean,
54-
rootBeanClass,
55+
constrainedType.getActuallClass(),
5556
rootBeanMetaData
5657
);
5758
}
5859

59-
public <T> BaseBeanValidationContext<T> forValidateProperty(Class<T> rootBeanClass, BeanMetaData<T> rootBeanMetaData, T rootBean, PathImpl propertyPath) {
60+
public <T> BaseBeanValidationContext<T> forValidateProperty(HibernateConstrainedType<T> constrainedType, BeanMetaData<T> rootBeanMetaData, T rootBean, PathImpl propertyPath) {
6061
return new PropertyValidationContext<>(
6162
constraintValidatorManager,
6263
constraintValidatorFactory,
6364
validatorScopedContext,
6465
traversableResolver,
6566
constraintValidatorInitializationContext,
6667
rootBean,
67-
rootBeanClass,
68+
constrainedType.getActuallClass(),
6869
rootBeanMetaData,
6970
propertyPath.getLeafNode().getName()
7071
);
7172
}
7273

73-
public <T> BaseBeanValidationContext<T> forValidateValue(Class<T> rootBeanClass, BeanMetaData<T> rootBeanMetaData, PathImpl propertyPath) {
74+
public <T> BaseBeanValidationContext<T> forValidateValue(HibernateConstrainedType<T> constrainedType, BeanMetaData<T> rootBeanMetaData, PathImpl propertyPath) {
7475
return new PropertyValidationContext<>(
7576
constraintValidatorManager,
7677
constraintValidatorFactory,
7778
validatorScopedContext,
7879
traversableResolver,
7980
constraintValidatorInitializationContext,
8081
null, //root bean
81-
rootBeanClass,
82+
constrainedType.getActuallClass(),
8283
rootBeanMetaData,
8384
propertyPath.getLeafNode().getName()
8485
);
8586
}
8687

8788
public <T> ExecutableValidationContext<T> forValidateParameters(
88-
Class<T> rootBeanClass,
89+
HibernateConstrainedType<T> constrainedType,
8990
BeanMetaData<T> rootBeanMetaData,
9091
T rootBean,
9192
Executable executable,
@@ -97,7 +98,7 @@ public <T> ExecutableValidationContext<T> forValidateParameters(
9798
traversableResolver,
9899
constraintValidatorInitializationContext,
99100
rootBean,
100-
rootBeanClass,
101+
constrainedType.getActuallClass(),
101102
rootBeanMetaData,
102103
executable,
103104
rootBeanMetaData.getMetaDataFor( executable ),
@@ -106,7 +107,7 @@ public <T> ExecutableValidationContext<T> forValidateParameters(
106107
}
107108

108109
public <T> ExecutableValidationContext<T> forValidateReturnValue(
109-
Class<T> rootBeanClass,
110+
HibernateConstrainedType<T> constrainedType,
110111
BeanMetaData<T> rootBeanMetaData,
111112
T rootBean,
112113
Executable executable,
@@ -118,7 +119,7 @@ public <T> ExecutableValidationContext<T> forValidateReturnValue(
118119
traversableResolver,
119120
constraintValidatorInitializationContext,
120121
rootBean,
121-
rootBeanClass,
122+
constrainedType.getActuallClass(),
122123
rootBeanMetaData,
123124
executable,
124125
rootBeanMetaData.getMetaDataFor( executable ),

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.hibernate.validator.internal.metadata;
88

9+
import org.hibernate.validator.engine.HibernateConstrainedType;
910
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData;
1011

1112
/**
@@ -16,7 +17,7 @@
1617
*/
1718
public interface BeanMetaDataManager {
1819

19-
<T> BeanMetaData<T> getBeanMetaData(Class<T> beanClass);
20+
<T> BeanMetaData<T> getBeanMetaData(HibernateConstrainedType<T> constrainedType);
2021

2122
void clear();
2223
}

0 commit comments

Comments
 (0)