Skip to content

Commit e5b7c8d

Browse files
committed
HV-1623 Introduce ConstrainedElementKind.GETTER
1 parent 7475853 commit e5b7c8d

15 files changed

+76
-56
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.Collections;
1616
import java.util.Iterator;
1717
import java.util.List;
18+
import java.util.Locale;
1819
import java.util.Map;
1920
import java.util.Map.Entry;
2021
import java.util.Optional;
@@ -42,10 +43,10 @@
4243
import org.hibernate.validator.internal.metadata.raw.BeanConfiguration;
4344
import org.hibernate.validator.internal.metadata.raw.ConfigurationSource;
4445
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement;
45-
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
4646
import org.hibernate.validator.internal.metadata.raw.ConstrainedExecutable;
4747
import org.hibernate.validator.internal.metadata.raw.ConstrainedField;
4848
import org.hibernate.validator.internal.metadata.raw.ConstrainedType;
49+
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
4950
import org.hibernate.validator.internal.properties.Callable;
5051
import org.hibernate.validator.internal.util.CollectionHelper;
5152
import org.hibernate.validator.internal.util.ExecutableHelper;
@@ -736,6 +737,7 @@ public BuilderDelegate(
736737
break;
737738
case CONSTRUCTOR:
738739
case METHOD:
740+
case GETTER:
739741
ConstrainedExecutable constrainedExecutable = (ConstrainedExecutable) constrainedElement;
740742
Callable member = constrainedExecutable.getCallable();
741743

@@ -754,7 +756,7 @@ public BuilderDelegate(
754756
);
755757
}
756758

757-
if ( constrainedExecutable.isGetterMethod() ) {
759+
if ( constrainedElement.getKind() == ConstrainedElementKind.GETTER ) {
758760
metaDataBuilder = new PropertyMetaData.Builder(
759761
beanClass,
760762
constrainedExecutable,
@@ -774,6 +776,9 @@ public BuilderDelegate(
774776
valueExtractorManager
775777
);
776778
break;
779+
default:
780+
throw new IllegalStateException(
781+
String.format( Locale.ROOT, "Constrained element kind '%1$s' not supported here.", constrainedElement.getKind() ) );
777782
}
778783

779784
this.hashCode = buildHashCode();
@@ -790,7 +795,7 @@ public boolean add(ConstrainedElement constrainedElement) {
790795
if ( metaDataBuilder != null && metaDataBuilder.accepts( constrainedElement ) ) {
791796
metaDataBuilder.add( constrainedElement );
792797

793-
if ( !added && constrainedElement.getKind() == ConstrainedElementKind.METHOD && methodBuilder == null ) {
798+
if ( !added && constrainedElement.getKind().isMethod() && methodBuilder == null ) {
794799
ConstrainedExecutable constrainedMethod = (ConstrainedExecutable) constrainedElement;
795800
methodBuilder = new ExecutableMetaData.Builder(
796801
beanClass,

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,11 @@ public static class Builder extends MetaDataBuilder {
254254
private final Set<String> signatures = newHashSet();
255255

256256
/**
257-
* Either CONSTRUCTOR or METHOD.
257+
* Either CONSTRUCTOR, METHOD or GETTER.
258258
*/
259259
private final ConstrainedElementKind kind;
260260
private final Set<ConstrainedExecutable> constrainedExecutables = newHashSet();
261261
private Callable callable;
262-
private final boolean isGetterMethod;
263262
private final Set<MetaConstraint<?>> crossParameterConstraints = newHashSet();
264263
private final Set<MethodConfigurationRule> rules;
265264
private boolean isConstrained = false;
@@ -293,7 +292,6 @@ public Builder(
293292
this.kind = constrainedExecutable.getKind();
294293
this.callable = constrainedExecutable.getCallable();
295294
this.rules = methodValidationConfiguration.getConfiguredRuleSet();
296-
this.isGetterMethod = constrainedExecutable.isGetterMethod();
297295

298296
add( constrainedExecutable );
299297
}
@@ -397,7 +395,7 @@ public ExecutableMetaData build() {
397395
adaptOriginsAndImplicitGroups( crossParameterConstraints ),
398396
cascadingMetaDataBuilder.build( valueExtractorManager, callable ),
399397
isConstrained,
400-
isGetterMethod
398+
kind == ConstrainedElementKind.GETTER
401399
);
402400
}
403401

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,10 @@ public static Cascadable.Builder builder(ConstrainedElementKind constrainedEleme
8080
if ( ConstrainedElementKind.FIELD == constrainedElementKind ) {
8181
return new FieldCascadable.Builder( valueExtractorManager, property, cascadingMetaDataBuilder );
8282
}
83-
else if ( ConstrainedElementKind.METHOD == constrainedElementKind ) {
83+
else if ( ConstrainedElementKind.GETTER == constrainedElementKind ) {
8484
return new GetterCascadable.Builder( valueExtractorManager, property, cascadingMetaDataBuilder );
8585
}
86-
throw new IllegalStateException( "It should either be field or method." );
86+
throw new IllegalStateException( "It should be either a field or a getter." );
8787
}
8888
}
8989
}

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public static class Builder extends MetaDataBuilder {
151151

152152
private static final EnumSet<ConstrainedElementKind> SUPPORTED_ELEMENT_KINDS = EnumSet.of(
153153
ConstrainedElementKind.FIELD,
154-
ConstrainedElementKind.METHOD
154+
ConstrainedElementKind.GETTER
155155
);
156156

157157
private final String propertyName;
@@ -182,11 +182,6 @@ public boolean accepts(ConstrainedElement constrainedElement) {
182182
return false;
183183
}
184184

185-
if ( constrainedElement.getKind() == ConstrainedElementKind.METHOD &&
186-
!( (ConstrainedExecutable) constrainedElement ).isGetterMethod() ) {
187-
return false;
188-
}
189-
190185
return Objects.equals( getPropertyName( constrainedElement ), propertyName );
191186
}
192187

@@ -222,7 +217,7 @@ private Optional<Constrainable> getConstrainableFromConstrainedElement(Constrain
222217
LOG.getUnexpectedConstraintElementType( ConstrainedField.class, constrainedElement.getClass() );
223218
}
224219
}
225-
else if ( constrainedElement.getKind() == ConstrainedElementKind.METHOD ) {
220+
else if ( constrainedElement.getKind() == ConstrainedElementKind.GETTER ) {
226221
if ( constrainedElement instanceof ConstrainedExecutable ) {
227222
return Optional.of( ( (ConstrainedExecutable) constrainedElement ).getCallable() );
228223
}
@@ -235,7 +230,7 @@ else if ( constrainedElement.getKind() == ConstrainedElementKind.METHOD ) {
235230

236231
@Override
237232
protected Set<MetaConstraint<?>> adaptConstraints(ConstrainedElement constrainedElement, Set<MetaConstraint<?>> constraints) {
238-
if ( constraints.isEmpty() || constrainedElement.getKind() != ConstrainedElementKind.METHOD ) {
233+
if ( constraints.isEmpty() || constrainedElement.getKind() != ConstrainedElementKind.GETTER ) {
239234
return constraints;
240235
}
241236

@@ -304,7 +299,7 @@ private String getPropertyName(ConstrainedElement constrainedElement) {
304299
if ( constrainedElement.getKind() == ConstrainedElementKind.FIELD ) {
305300
return ( (ConstrainedField) constrainedElement ).getProperty().getPropertyName();
306301
}
307-
else if ( constrainedElement.getKind() == ConstrainedElementKind.METHOD ) {
302+
else if ( constrainedElement.getKind() == ConstrainedElementKind.GETTER ) {
308303
return ( (ConstrainedExecutable) constrainedElement ).getCallable().as( Property.class ).getPropertyName();
309304
}
310305

engine/src/main/java/org/hibernate/validator/internal/metadata/location/ConstraintLocation.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.lang.annotation.ElementType;
1010
import java.lang.reflect.Type;
1111
import java.lang.reflect.TypeVariable;
12+
import java.util.Locale;
1213

1314
import org.hibernate.validator.internal.engine.path.PathImpl;
1415
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
@@ -110,8 +111,7 @@ enum ConstraintLocationKind {
110111
PARAMETER( ElementType.PARAMETER ),
111112
FIELD( ElementType.FIELD ),
112113
GETTER( ElementType.METHOD ),
113-
TYPE_USE( ElementType.TYPE_USE ),
114-
;
114+
TYPE_USE( ElementType.TYPE_USE );
115115

116116
private final ElementType elementType;
117117

@@ -131,10 +131,24 @@ public boolean isMethod() {
131131
return this == METHOD || this == GETTER;
132132
}
133133

134-
public static ConstraintLocationKind of(Callable callable) {
135-
return callable.getConstrainedElementKind() == ConstrainedElementKind.CONSTRUCTOR
136-
? ConstraintLocationKind.CONSTRUCTOR
137-
: callable instanceof JavaBeanGetter ? ConstraintLocationKind.GETTER : ConstraintLocationKind.METHOD;
134+
public static ConstraintLocationKind of(ConstrainedElementKind constrainedElementKind) {
135+
switch ( constrainedElementKind ) {
136+
case CONSTRUCTOR:
137+
return ConstraintLocationKind.CONSTRUCTOR;
138+
case FIELD:
139+
return ConstraintLocationKind.FIELD;
140+
case METHOD:
141+
return ConstraintLocationKind.METHOD;
142+
case PARAMETER:
143+
return ConstraintLocationKind.PARAMETER;
144+
case TYPE:
145+
return ConstraintLocationKind.TYPE;
146+
case GETTER:
147+
return ConstraintLocationKind.GETTER;
148+
default:
149+
throw new IllegalArgumentException(
150+
String.format( Locale.ROOT, "Constrained element kind '%1$s' not supported.", constrainedElementKind ) );
151+
}
138152
}
139153
}
140154
}

engine/src/main/java/org/hibernate/validator/internal/metadata/location/CrossParameterConstraintLocation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class CrossParameterConstraintLocation implements ConstraintLocation {
2828

2929
CrossParameterConstraintLocation(Callable callable) {
3030
this.callable = callable;
31-
this.kind = ConstraintLocationKind.of( callable );
31+
this.kind = ConstraintLocationKind.of( callable.getConstrainedElementKind() );
3232
}
3333

3434
@Override

engine/src/main/java/org/hibernate/validator/internal/metadata/location/ParameterConstraintLocation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public ParameterConstraintLocation(Callable callable, int index) {
3232
this.callable = callable;
3333
this.index = index;
3434
this.typeForValidatorResolution = ReflectionHelper.boxedType( callable.getParameterGenericType( index ) );
35-
this.kind = ConstraintLocationKind.of( callable );
35+
this.kind = ConstraintLocationKind.of( callable.getConstrainedElementKind() );
3636
}
3737

3838
@Override

engine/src/main/java/org/hibernate/validator/internal/metadata/location/ReturnValueConstraintLocation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class ReturnValueConstraintLocation implements ConstraintLocation {
2929

3030
ReturnValueConstraintLocation(Callable callable) {
3131
this.callable = callable;
32-
this.kind = ConstraintLocationKind.of( callable );
32+
this.kind = ConstraintLocationKind.of( callable.getConstrainedElementKind() );
3333
}
3434

3535
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ private ConstrainedExecutable findExecutableMetaData(Executable executable) {
303303

304304
Map<ConstraintType, List<ConstraintDescriptorImpl<?>>> executableConstraints = findConstraints(
305305
javaBeanExecutable,
306-
ConstraintLocationKind.of( javaBeanExecutable )
306+
ConstraintLocationKind.of( javaBeanExecutable.getConstrainedElementKind() )
307307
).stream().collect( Collectors.groupingBy( ConstraintDescriptorImpl::getConstraintType ) );
308308

309309
Set<MetaConstraint<?>> crossParameterConstraints;

engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedElement.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,6 @@
4040
*/
4141
public interface ConstrainedElement extends Iterable<MetaConstraint<?>> {
4242

43-
/**
44-
* The kind of a {@link ConstrainedElement}. Can be used to determine an
45-
* element's type when traversing over a collection of constrained elements.
46-
*
47-
* @author Gunnar Morling
48-
*/
49-
enum ConstrainedElementKind {
50-
TYPE, FIELD, CONSTRUCTOR, METHOD, PARAMETER
51-
}
52-
5343
/**
5444
* Returns the kind of this constrained element.
5545
*
@@ -91,4 +81,28 @@ enum ConstrainedElementKind {
9181
* Returns the configuration source contributing this constrained element.
9282
*/
9383
ConfigurationSource getSource();
84+
85+
/**
86+
* The kind of a {@link ConstrainedElement}. Can be used to determine an
87+
* element's type when traversing over a collection of constrained elements.
88+
*
89+
* @author Gunnar Morling
90+
*/
91+
enum ConstrainedElementKind {
92+
93+
TYPE,
94+
FIELD,
95+
CONSTRUCTOR,
96+
METHOD,
97+
PARAMETER,
98+
GETTER;
99+
100+
public boolean isExecutable() {
101+
return this == CONSTRUCTOR || isMethod();
102+
}
103+
104+
public boolean isMethod() {
105+
return this == METHOD || this == GETTER;
106+
}
107+
}
94108
}

engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedExecutable.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.hibernate.validator.internal.metadata.aggregated.CascadingMetaDataBuilder;
2121
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
2222
import org.hibernate.validator.internal.properties.Callable;
23-
import org.hibernate.validator.internal.properties.Property;
2423
import org.hibernate.validator.internal.util.CollectionHelper;
2524
import org.hibernate.validator.internal.util.logging.Log;
2625
import org.hibernate.validator.internal.util.logging.LoggerFactory;
@@ -51,8 +50,6 @@ public class ConstrainedExecutable extends AbstractConstrainedElement {
5150
@Immutable
5251
private final Set<MetaConstraint<?>> crossParameterConstraints;
5352

54-
private final boolean isGetterMethod;
55-
5653
/**
5754
* Creates a new executable meta data object for a parameter-less executable.
5855
*
@@ -123,7 +120,6 @@ public ConstrainedExecutable(
123120
this.crossParameterConstraints = CollectionHelper.toImmutableSet( crossParameterConstraints );
124121
this.parameterMetaData = CollectionHelper.toImmutableList( parameterMetaData );
125122
this.hasParameterConstraints = hasParameterConstraints( parameterMetaData ) || !crossParameterConstraints.isEmpty();
126-
this.isGetterMethod = callable instanceof Property;
127123
}
128124

129125
/**
@@ -190,16 +186,6 @@ public boolean hasParameterConstraints() {
190186
return hasParameterConstraints;
191187
}
192188

193-
/**
194-
* Whether the represented executable is a JavaBeans getter executable or not.
195-
*
196-
* @return {@code True}, if this executable is a getter method, {@code false}
197-
* otherwise.
198-
*/
199-
public boolean isGetterMethod() {
200-
return isGetterMethod;
201-
}
202-
203189
public Callable getCallable() {
204190
return callable;
205191
}

engine/src/main/java/org/hibernate/validator/internal/properties/javabean/JavaBeanGetter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.security.PrivilegedAction;
1212

1313
import org.hibernate.validator.HibernateValidatorPermission;
14+
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement.ConstrainedElementKind;
1415
import org.hibernate.validator.internal.properties.Property;
1516
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
1617
import org.hibernate.validator.internal.util.ReflectionHelper;
@@ -67,14 +68,19 @@ public boolean hasParameters() {
6768

6869
@Override
6970
public String getParameterName(ExecutableParameterNameProvider parameterNameProvider, int parameterIndex) {
70-
throw new IllegalStateException( "Getters cannot have parameters" );
71+
throw new IllegalStateException( "Getters may not have parameters" );
7172
}
7273

7374
@Override
7475
public Class<?> getDeclaringClass() {
7576
return declaringClass;
7677
}
7778

79+
@Override
80+
public ConstrainedElementKind getConstrainedElementKind() {
81+
return ConstrainedElementKind.GETTER;
82+
}
83+
7884
@Override
7985
public boolean equals(Object o) {
8086
if ( this == o ) {

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/CrossParameterStaxBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ Set<MetaConstraint<?>> build(Callable callable) {
8989
ConstraintLocation constraintLocation = ConstraintLocation.forCrossParameter( callable );
9090

9191
Set<MetaConstraint<?>> crossParameterConstraints = constraintTypeStaxBuilders.stream()
92-
.map( builder -> builder.build( constraintLocation, ConstraintLocationKind.of( callable ), ConstraintType.CROSS_PARAMETER ) )
92+
.map( builder -> builder.build( constraintLocation, ConstraintLocationKind.of( callable.getConstrainedElementKind() ),
93+
ConstraintType.CROSS_PARAMETER ) )
9394
.collect( Collectors.toSet() );
9495

9596
// ignore annotations

engine/src/main/java/org/hibernate/validator/internal/xml/mapping/ReturnValueStaxBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ CascadingMetaDataBuilder build(
5656

5757
ConstraintLocation constraintLocation = ConstraintLocation.forReturnValue( callable );
5858
returnValueConstraints.addAll( constraintTypeStaxBuilders.stream()
59-
.map( builder -> builder.build( constraintLocation, ConstraintLocationKind.of( callable ), ConstraintDescriptorImpl.ConstraintType.GENERIC ) )
59+
.map( builder -> builder.build( constraintLocation, ConstraintLocationKind.of( callable.getConstrainedElementKind() ),
60+
ConstraintDescriptorImpl.ConstraintType.GENERIC ) )
6061
.collect( Collectors.toSet() ) );
6162

6263
ContainerElementTypeConfiguration containerElementTypeConfiguration = getContainerElementTypeConfiguration( callable.getType(), constraintLocation );

engine/src/test/java/org/hibernate/validator/test/cfg/ConstraintMappingTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ private ConstrainedField getConstrainedField(BeanConfiguration<?> beanConfigurat
589589

590590
private ConstrainedExecutable getConstrainedExecutable(BeanConfiguration<?> beanConfiguration, String executableName) {
591591
for ( ConstrainedElement constrainedElement : beanConfiguration.getConstrainedElements() ) {
592-
if ( constrainedElement.getKind() == ConstrainedElementKind.METHOD &&
592+
if ( constrainedElement.getKind().isMethod() &&
593593
( (ConstrainedExecutable) constrainedElement ).getCallable().getName().equals( executableName ) ) {
594594
return (ConstrainedExecutable) constrainedElement;
595595
}

0 commit comments

Comments
 (0)