Skip to content

Commit 8bb498e

Browse files
marko-bekhtagsmet
authored andcommitted
HV-1623 Extract class-level metadata from property metadata case
1 parent 418e010 commit 8bb498e

File tree

5 files changed

+160
-22
lines changed

5 files changed

+160
-22
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ public BeanMetaDataImpl(Class<T> beanClass,
196196
Set<String> tmpUnconstrainedExecutables = newHashSet();
197197

198198
boolean hasConstraints = false;
199+
Set<MetaConstraint<?>> allMetaConstraints = newHashSet();
199200

200201
for ( ConstraintMetaData constraintMetaData : constraintMetaDataSet ) {
201202
boolean elementHasConstraints = constraintMetaData.isCascading() || constraintMetaData.isConstrained();
@@ -204,6 +205,9 @@ public BeanMetaDataImpl(Class<T> beanClass,
204205
if ( constraintMetaData.getKind() == ElementKind.PROPERTY ) {
205206
propertyMetaDataSet.add( (PropertyMetaData) constraintMetaData );
206207
}
208+
else if ( constraintMetaData.getKind() == ElementKind.BEAN ) {
209+
allMetaConstraints.addAll( ( (ClassMetaData) constraintMetaData ).getAllConstraints() );
210+
}
207211
else {
208212
ExecutableMetaData executableMetaData = (ExecutableMetaData) constraintMetaData;
209213
if ( elementHasConstraints ) {
@@ -216,7 +220,6 @@ public BeanMetaDataImpl(Class<T> beanClass,
216220
}
217221

218222
Set<Cascadable> cascadedProperties = newHashSet();
219-
Set<MetaConstraint<?>> allMetaConstraints = newHashSet();
220223

221224
for ( PropertyMetaData propertyMetaData : propertyMetaDataSet ) {
222225
propertyMetaDataMap.put( propertyMetaData.getName(), propertyMetaData );
@@ -696,7 +699,7 @@ private static class BuilderDelegate {
696699
private final TypeResolutionHelper typeResolutionHelper;
697700
private final ValueExtractorManager valueExtractorManager;
698701
private final ExecutableParameterNameProvider parameterNameProvider;
699-
private MetaDataBuilder propertyBuilder;
702+
private MetaDataBuilder metaDataBuilder;
700703
private ExecutableMetaData.Builder methodBuilder;
701704
private final MethodValidationConfiguration methodValidationConfiguration;
702705
private final int hashCode;
@@ -723,7 +726,7 @@ public BuilderDelegate(
723726
switch ( constrainedElement.getKind() ) {
724727
case FIELD:
725728
ConstrainedField constrainedField = (ConstrainedField) constrainedElement;
726-
propertyBuilder = new PropertyMetaData.Builder(
729+
metaDataBuilder = new PropertyMetaData.Builder(
727730
beanClass,
728731
constrainedField,
729732
constraintHelper,
@@ -752,7 +755,7 @@ public BuilderDelegate(
752755
}
753756

754757
if ( constrainedExecutable.isGetterMethod() ) {
755-
propertyBuilder = new PropertyMetaData.Builder(
758+
metaDataBuilder = new PropertyMetaData.Builder(
756759
beanClass,
757760
constrainedExecutable,
758761
constraintHelper,
@@ -763,7 +766,7 @@ public BuilderDelegate(
763766
break;
764767
case TYPE:
765768
ConstrainedType constrainedType = (ConstrainedType) constrainedElement;
766-
propertyBuilder = new PropertyMetaData.Builder(
769+
metaDataBuilder = new ClassMetaData.Builder(
767770
beanClass,
768771
constrainedType,
769772
constraintHelper,
@@ -784,8 +787,8 @@ public boolean add(ConstrainedElement constrainedElement) {
784787
added = true;
785788
}
786789

787-
if ( propertyBuilder != null && propertyBuilder.accepts( constrainedElement ) ) {
788-
propertyBuilder.add( constrainedElement );
790+
if ( metaDataBuilder != null && metaDataBuilder.accepts( constrainedElement ) ) {
791+
metaDataBuilder.add( constrainedElement );
789792

790793
if ( !added && constrainedElement.getKind() == ConstrainedElementKind.METHOD && methodBuilder == null ) {
791794
ConstrainedExecutable constrainedMethod = (ConstrainedExecutable) constrainedElement;
@@ -810,8 +813,8 @@ public boolean add(ConstrainedElement constrainedElement) {
810813
public Set<ConstraintMetaData> build() {
811814
Set<ConstraintMetaData> metaDataSet = newHashSet();
812815

813-
if ( propertyBuilder != null ) {
814-
metaDataSet.add( propertyBuilder.build() );
816+
if ( metaDataBuilder != null ) {
817+
metaDataSet.add( metaDataBuilder.build() );
815818
}
816819

817820
if ( methodBuilder != null ) {
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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.metadata.aggregated;
8+
9+
import java.util.List;
10+
import java.util.Set;
11+
12+
import javax.validation.ElementKind;
13+
14+
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
15+
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
16+
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
17+
import org.hibernate.validator.internal.metadata.descriptor.ClassDescriptorImpl;
18+
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement;
19+
import org.hibernate.validator.internal.metadata.raw.ConstrainedType;
20+
import org.hibernate.validator.internal.util.TypeResolutionHelper;
21+
22+
/**
23+
* Represents the constraint related meta data for a type i.e. class-level
24+
* constraints.
25+
*
26+
* @author Gunnar Morling
27+
* @author Guillaume Smet
28+
* @author Marko Bekhta
29+
*/
30+
public class ClassMetaData extends AbstractConstraintMetaData {
31+
32+
private ClassMetaData(Class<?> beanClass,
33+
Set<MetaConstraint<?>> constraints,
34+
Set<MetaConstraint<?>> containerElementsConstraints) {
35+
super(
36+
beanClass.getSimpleName(),
37+
beanClass,
38+
constraints,
39+
containerElementsConstraints,
40+
false,
41+
!constraints.isEmpty() || !containerElementsConstraints.isEmpty()
42+
);
43+
}
44+
45+
@Override
46+
public ClassDescriptorImpl asDescriptor(boolean defaultGroupSequenceRedefined, List<Class<?>> defaultGroupSequence) {
47+
return new ClassDescriptorImpl(
48+
getType(),
49+
asDescriptors( getDirectConstraints() ),
50+
defaultGroupSequenceRedefined,
51+
defaultGroupSequence
52+
);
53+
}
54+
55+
@Override
56+
public String toString() {
57+
return "ClassLevelMetaData [type=" + getType() + "]]";
58+
}
59+
60+
@Override
61+
public ElementKind getKind() {
62+
return ElementKind.BEAN;
63+
}
64+
65+
@Override
66+
public int hashCode() {
67+
return super.hashCode();
68+
}
69+
70+
@Override
71+
public boolean equals(Object obj) {
72+
if ( this == obj ) {
73+
return true;
74+
}
75+
if ( !super.equals( obj ) ) {
76+
return false;
77+
}
78+
if ( getClass() != obj.getClass() ) {
79+
return false;
80+
}
81+
return true;
82+
}
83+
84+
public static class Builder extends MetaDataBuilder {
85+
public Builder(Class<?> beanClass, ConstrainedType constrainedType, ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
86+
ValueExtractorManager valueExtractorManager) {
87+
super( beanClass, constraintHelper, typeResolutionHelper, valueExtractorManager );
88+
89+
add( constrainedType );
90+
}
91+
92+
@Override
93+
public boolean accepts(ConstrainedElement constrainedElement) {
94+
return constrainedElement.getKind() == ConstrainedElement.ConstrainedElementKind.TYPE;
95+
}
96+
97+
@Override
98+
public final void add(ConstrainedElement constrainedElement) {
99+
super.add( constrainedElement );
100+
}
101+
102+
@Override
103+
public ClassMetaData build() {
104+
return new ClassMetaData(
105+
getBeanClass(),
106+
adaptOriginsAndImplicitGroups( getDirectConstraints() ),
107+
adaptOriginsAndImplicitGroups( getContainerElementConstraints() )
108+
);
109+
}
110+
}
111+
}

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
3636
import org.hibernate.validator.internal.metadata.raw.ConstrainedExecutable;
3737
import org.hibernate.validator.internal.metadata.raw.ConstrainedField;
38-
import org.hibernate.validator.internal.metadata.raw.ConstrainedType;
3938
import org.hibernate.validator.internal.properties.Constrainable;
4039
import org.hibernate.validator.internal.properties.Property;
4140
import org.hibernate.validator.internal.properties.javabean.JavaBeanGetter;
@@ -151,7 +150,6 @@ public boolean equals(Object obj) {
151150
public static class Builder extends MetaDataBuilder {
152151

153152
private static final EnumSet<ConstrainedElementKind> SUPPORTED_ELEMENT_KINDS = EnumSet.of(
154-
ConstrainedElementKind.TYPE,
155153
ConstrainedElementKind.FIELD,
156154
ConstrainedElementKind.METHOD
157155
);
@@ -169,15 +167,6 @@ public Builder(Class<?> beanClass, ConstrainedField constrainedProperty, Constra
169167
add( constrainedProperty );
170168
}
171169

172-
public Builder(Class<?> beanClass, ConstrainedType constrainedType, ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
173-
ValueExtractorManager valueExtractorManager) {
174-
super( beanClass, constraintHelper, typeResolutionHelper, valueExtractorManager );
175-
176-
this.propertyName = null;
177-
this.propertyType = null;
178-
add( constrainedType );
179-
}
180-
181170
public Builder(Class<?> beanClass, ConstrainedExecutable constrainedMethod, ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
182171
ValueExtractorManager valueExtractorManager) {
183172
super( beanClass, constraintHelper, typeResolutionHelper, valueExtractorManager );
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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.metadata.descriptor;
8+
9+
import java.lang.reflect.Type;
10+
import java.util.List;
11+
import java.util.Set;
12+
13+
import javax.validation.metadata.ElementDescriptor;
14+
15+
/**
16+
* Describes a validated type class-level constraints.
17+
*
18+
* @author Marko Bekhta
19+
*/
20+
public class ClassDescriptorImpl extends ElementDescriptorImpl implements ElementDescriptor {
21+
22+
public ClassDescriptorImpl(Type beanType,
23+
Set<ConstraintDescriptorImpl<?>> constraints,
24+
boolean defaultGroupSequenceRedefined,
25+
List<Class<?>> defaultGroupSequence) {
26+
super( beanType, constraints, defaultGroupSequenceRedefined, defaultGroupSequence );
27+
}
28+
29+
@Override
30+
public String toString() {
31+
final StringBuilder sb = new StringBuilder();
32+
sb.append( getClass().getSimpleName() );
33+
sb.append( "{beanType=" ).append( getElementClass() );
34+
sb.append( '}' );
35+
return sb.toString();
36+
}
37+
}

engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,6 @@ private <T> BeanConfiguration<T> retrieveBeanConfiguration(Class<T> beanClass) {
136136
constrainedElements.addAll( getMethodMetaData( beanClass ) );
137137
constrainedElements.addAll( getConstructorMetaData( beanClass ) );
138138

139-
//TODO GM: currently class level constraints are represented by a PropertyMetaData. This
140-
//works but seems somewhat unnatural
141139
Set<MetaConstraint<?>> classLevelConstraints = getClassLevelConstraints( beanClass );
142140
if ( !classLevelConstraints.isEmpty() ) {
143141
ConstrainedType classLevelMetaData =

0 commit comments

Comments
 (0)