Skip to content

Commit cd139d0

Browse files
committed
HV-1363 Building abstraction over reflection in ConstraintLocation and related code
1 parent 8f08f09 commit cd139d0

File tree

65 files changed

+1157
-861
lines changed

Some content is hidden

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

65 files changed

+1157
-861
lines changed

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

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
import java.lang.annotation.ElementType;
1111
import java.lang.invoke.MethodHandle;
1212
import java.lang.invoke.MethodHandles;
13-
import java.lang.reflect.Executable;
14-
import java.lang.reflect.Field;
15-
import java.lang.reflect.Member;
16-
import java.lang.reflect.Method;
1713
import java.lang.reflect.Type;
1814
import java.lang.reflect.TypeVariable;
1915
import java.security.AccessController;
@@ -24,7 +20,9 @@
2420
import org.hibernate.validator.cfg.AnnotationDef;
2521
import org.hibernate.validator.cfg.ConstraintDef;
2622
import org.hibernate.validator.internal.metadata.location.ConstraintLocation;
27-
import org.hibernate.validator.internal.util.ExecutableHelper;
23+
import org.hibernate.validator.internal.properties.Callable;
24+
import org.hibernate.validator.internal.properties.Property;
25+
import org.hibernate.validator.internal.properties.javabean.JavaBeanField;
2826
import org.hibernate.validator.internal.util.annotation.AnnotationDescriptor;
2927
import org.hibernate.validator.internal.util.annotation.ConstraintAnnotationDescriptor;
3028
import org.hibernate.validator.internal.util.logging.Log;
@@ -58,42 +56,33 @@ static <A extends Annotation> ConfiguredConstraint<A> forType(ConstraintDef<?, A
5856
return new ConfiguredConstraint<>( constraint, ConstraintLocation.forClass( beanType ), ElementType.TYPE );
5957
}
6058

61-
static <A extends Annotation> ConfiguredConstraint<A> forProperty(ConstraintDef<?, A> constraint, Member member) {
62-
if ( member instanceof Field ) {
63-
return new ConfiguredConstraint<>(
64-
constraint,
65-
ConstraintLocation.forField( (Field) member ),
66-
ElementType.FIELD
67-
);
68-
}
69-
else {
70-
return new ConfiguredConstraint<>(
59+
static <A extends Annotation> ConfiguredConstraint<A> forProperty(ConstraintDef<?, A> constraint, Property property) {
60+
return new ConfiguredConstraint<>(
7161
constraint,
72-
ConstraintLocation.forGetter( (Method) member ),
73-
ElementType.METHOD
74-
);
75-
}
62+
ConstraintLocation.forProperty( property ),
63+
property instanceof JavaBeanField ? ElementType.FIELD : ElementType.METHOD
64+
);
7665
}
7766

78-
public static <A extends Annotation> ConfiguredConstraint<A> forParameter(ConstraintDef<?, A> constraint, Executable executable, int parameterIndex) {
67+
public static <A extends Annotation> ConfiguredConstraint<A> forParameter(ConstraintDef<?, A> constraint, Callable callable, int parameterIndex) {
7968
return new ConfiguredConstraint<>(
80-
constraint, ConstraintLocation.forParameter( executable, parameterIndex ), ExecutableHelper.getElementType( executable )
69+
constraint, ConstraintLocation.forParameter( callable, parameterIndex ), callable.isConstructor() ? ElementType.CONSTRUCTOR : ElementType.METHOD
8170
);
8271
}
8372

84-
public static <A extends Annotation> ConfiguredConstraint<A> forExecutable(ConstraintDef<?, A> constraint, Executable executable) {
73+
public static <A extends Annotation> ConfiguredConstraint<A> forExecutable(ConstraintDef<?, A> constraint, Callable callable) {
8574
return new ConfiguredConstraint<>(
86-
constraint, ConstraintLocation.forReturnValue( executable ), ExecutableHelper.getElementType( executable )
75+
constraint, ConstraintLocation.forReturnValue( callable ), callable.isConstructor() ? ElementType.CONSTRUCTOR : ElementType.METHOD
8776
);
8877
}
8978

90-
public static <A extends Annotation> ConfiguredConstraint<A> forCrossParameter(ConstraintDef<?, A> constraint, Executable executable) {
79+
public static <A extends Annotation> ConfiguredConstraint<A> forCrossParameter(ConstraintDef<?, A> constraint, Callable callable) {
9180
return new ConfiguredConstraint<>(
92-
constraint, ConstraintLocation.forCrossParameter( executable ), ExecutableHelper.getElementType( executable )
81+
constraint, ConstraintLocation.forCrossParameter( callable ), callable.isConstructor() ? ElementType.CONSTRUCTOR : ElementType.METHOD
9382
);
9483
}
9584

96-
public static <A extends Annotation> ConfiguredConstraint<A> forTypeArgument(ConstraintDef<?, A> constraint,ConstraintLocation delegate, TypeVariable<?> typeArgument, Type typeOfAnnotatedElement) {
85+
public static <A extends Annotation> ConfiguredConstraint<A> forTypeArgument(ConstraintDef<?, A> constraint, ConstraintLocation delegate, TypeVariable<?> typeArgument, Type typeOfAnnotatedElement) {
9786
return new ConfiguredConstraint<>(
9887
constraint,
9988
ConstraintLocation.forTypeArgument( delegate, typeArgument, typeOfAnnotatedElement ),

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
*/
77
package org.hibernate.validator.internal.cfg.context;
88

9-
import java.lang.reflect.Constructor;
10-
119
import org.hibernate.validator.cfg.context.ConstructorConstraintMappingContext;
10+
import org.hibernate.validator.internal.properties.Callable;
1211

1312
/**
1413
* Constraint mapping creational context representing a constructor.
@@ -17,15 +16,15 @@
1716
*/
1817
class ConstructorConstraintMappingContextImpl extends ExecutableConstraintMappingContextImpl implements ConstructorConstraintMappingContext {
1918

20-
<T> ConstructorConstraintMappingContextImpl(TypeConstraintMappingContextImpl<T> typeContext, Constructor<T> constructor) {
19+
<T> ConstructorConstraintMappingContextImpl(TypeConstraintMappingContextImpl<T> typeContext, Callable constructor) {
2120
super( typeContext, constructor );
2221
}
2322

2423
@Override
2524
public ConstructorConstraintMappingContext ignoreAnnotations(boolean ignoreAnnotations) {
2625
typeContext.mapping
2726
.getAnnotationProcessingOptions()
28-
.ignoreConstraintAnnotationsOnMember( executable, ignoreAnnotations );
27+
.ignoreConstraintAnnotationsOnMember( callable, ignoreAnnotations );
2928

3029
return this;
3130
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ final class CrossParameterConstraintMappingContextImpl
3232

3333
@Override
3434
public CrossParameterConstraintMappingContext constraint(ConstraintDef<?, ?> definition) {
35-
super.addConstraint( ConfiguredConstraint.forCrossParameter( definition, executableContext.getExecutable() ) );
35+
super.addConstraint( ConfiguredConstraint.forCrossParameter( definition, executableContext.getCallable() ) );
3636
return this;
3737
}
3838

3939
@Override
4040
public CrossParameterConstraintMappingContext ignoreAnnotations(boolean ignoreAnnotations) {
4141
mapping.getAnnotationProcessingOptions().ignoreConstraintAnnotationsForCrossParameterConstraint(
42-
executableContext.getExecutable(), ignoreAnnotations
42+
executableContext.getCallable(), ignoreAnnotations
4343
);
4444
return this;
4545
}

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

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
1010

1111
import java.lang.invoke.MethodHandles;
12-
import java.lang.reflect.Executable;
1312
import java.util.Collections;
1413
import java.util.List;
1514

@@ -24,7 +23,7 @@
2423
import org.hibernate.validator.internal.metadata.raw.ConstrainedElement;
2524
import org.hibernate.validator.internal.metadata.raw.ConstrainedExecutable;
2625
import org.hibernate.validator.internal.metadata.raw.ConstrainedParameter;
27-
import org.hibernate.validator.internal.util.ReflectionHelper;
26+
import org.hibernate.validator.internal.properties.Callable;
2827
import org.hibernate.validator.internal.util.TypeResolutionHelper;
2928
import org.hibernate.validator.internal.util.logging.Log;
3029
import org.hibernate.validator.internal.util.logging.LoggerFactory;
@@ -41,28 +40,28 @@ abstract class ExecutableConstraintMappingContextImpl {
4140
private static final Log LOG = LoggerFactory.make( MethodHandles.lookup() );
4241

4342
protected final TypeConstraintMappingContextImpl<?> typeContext;
44-
protected final Executable executable;
43+
protected final Callable callable;
4544
private final ParameterConstraintMappingContextImpl[] parameterContexts;
4645
private ReturnValueConstraintMappingContextImpl returnValueContext;
4746
private CrossParameterConstraintMappingContextImpl crossParameterContext;
4847

49-
protected ExecutableConstraintMappingContextImpl(TypeConstraintMappingContextImpl<?> typeContext, Executable executable) {
48+
protected ExecutableConstraintMappingContextImpl(TypeConstraintMappingContextImpl<?> typeContext, Callable callable) {
5049
this.typeContext = typeContext;
51-
this.executable = executable;
52-
this.parameterContexts = new ParameterConstraintMappingContextImpl[executable.getParameterTypes().length];
50+
this.callable = callable;
51+
this.parameterContexts = new ParameterConstraintMappingContextImpl[callable.getParameterTypes().length];
5352
}
5453

5554
public ParameterConstraintMappingContext parameter(int index) {
56-
if ( index < 0 || index >= executable.getParameterTypes().length ) {
57-
throw LOG.getInvalidExecutableParameterIndexException( executable, index );
55+
if ( index < 0 || index >= callable.getParameterTypes().length ) {
56+
throw LOG.getInvalidExecutableParameterIndexException( callable, index );
5857
}
5958

6059
ParameterConstraintMappingContextImpl context = parameterContexts[index];
6160

6261
if ( context != null ) {
6362
throw LOG.getParameterHasAlreadyBeConfiguredViaProgrammaticApiException(
6463
typeContext.getBeanClass(),
65-
executable,
64+
callable,
6665
index
6766
);
6867
}
@@ -76,7 +75,7 @@ public CrossParameterConstraintMappingContext crossParameter() {
7675
if ( crossParameterContext != null ) {
7776
throw LOG.getCrossParameterElementHasAlreadyBeConfiguredViaProgrammaticApiException(
7877
typeContext.getBeanClass(),
79-
executable
78+
callable
8079
);
8180
}
8281

@@ -88,16 +87,16 @@ public ReturnValueConstraintMappingContext returnValue() {
8887
if ( returnValueContext != null ) {
8988
throw LOG.getReturnValueHasAlreadyBeConfiguredViaProgrammaticApiException(
9089
typeContext.getBeanClass(),
91-
executable
90+
callable
9291
);
9392
}
9493

9594
returnValueContext = new ReturnValueConstraintMappingContextImpl( this );
9695
return returnValueContext;
9796
}
9897

99-
public Executable getExecutable() {
100-
return executable;
98+
public Callable getCallable() {
99+
return callable;
101100
}
102101

103102
public TypeConstraintMappingContextImpl<?> getTypeContext() {
@@ -108,7 +107,7 @@ public ConstrainedElement build(ConstraintHelper constraintHelper, TypeResolutio
108107
ValueExtractorManager valueExtractorManager) {
109108
return new ConstrainedExecutable(
110109
ConfigurationSource.API,
111-
executable,
110+
callable,
112111
getParameters( constraintHelper, typeResolutionHelper, valueExtractorManager ),
113112
crossParameterContext != null ? crossParameterContext.getConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ) : Collections.<MetaConstraint<?>>emptySet(),
114113
returnValueContext != null ? returnValueContext.getConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ) : Collections.<MetaConstraint<?>>emptySet(),
@@ -130,8 +129,8 @@ private List<ConstrainedParameter> getParameters(ConstraintHelper constraintHelp
130129
constrainedParameters.add(
131130
new ConstrainedParameter(
132131
ConfigurationSource.API,
133-
executable,
134-
ReflectionHelper.typeOf( executable, i ),
132+
callable,
133+
callable.typeOfParameter( i ),
135134
i
136135
)
137136
);

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
*/
77
package org.hibernate.validator.internal.cfg.context;
88

9-
import java.lang.reflect.Method;
10-
119
import org.hibernate.validator.cfg.context.MethodConstraintMappingContext;
10+
import org.hibernate.validator.internal.properties.Callable;
1211

1312
/**
1413
* Constraint mapping creational context representing a method.
@@ -17,15 +16,15 @@
1716
*/
1817
class MethodConstraintMappingContextImpl extends ExecutableConstraintMappingContextImpl implements MethodConstraintMappingContext {
1918

20-
MethodConstraintMappingContextImpl(TypeConstraintMappingContextImpl<?> typeContext, Method method) {
21-
super( typeContext, method );
19+
MethodConstraintMappingContextImpl(TypeConstraintMappingContextImpl<?> typeContext, Callable callable) {
20+
super( typeContext, callable );
2221
}
2322

2423
@Override
2524
public MethodConstraintMappingContext ignoreAnnotations(boolean ignoreAnnotations) {
2625
typeContext.mapping
2726
.getAnnotationProcessingOptions()
28-
.ignoreConstraintAnnotationsOnMember( executable, ignoreAnnotations );
27+
.ignoreConstraintAnnotationsOnMember( callable, ignoreAnnotations );
2928

3029
return this;
3130
}

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.hibernate.validator.internal.metadata.location.ConstraintLocation;
2222
import org.hibernate.validator.internal.metadata.raw.ConfigurationSource;
2323
import org.hibernate.validator.internal.metadata.raw.ConstrainedParameter;
24-
import org.hibernate.validator.internal.util.ReflectionHelper;
2524
import org.hibernate.validator.internal.util.TypeResolutionHelper;
2625

2726
/**
@@ -41,7 +40,7 @@ final class ParameterConstraintMappingContextImpl
4140
ParameterConstraintMappingContextImpl(ExecutableConstraintMappingContextImpl executableContext, int parameterIndex) {
4241
super(
4342
executableContext.getTypeContext().getConstraintMapping(),
44-
executableContext.executable.getGenericParameterTypes()[parameterIndex]
43+
executableContext.callable.getGenericParameterTypes()[parameterIndex]
4544
);
4645

4746
this.executableContext = executableContext;
@@ -58,7 +57,7 @@ public ParameterConstraintMappingContext constraint(ConstraintDef<?, ?> definiti
5857
super.addConstraint(
5958
ConfiguredConstraint.forParameter(
6059
definition,
61-
executableContext.getExecutable(),
60+
executableContext.getCallable(),
6261
parameterIndex
6362
)
6463
);
@@ -68,7 +67,7 @@ public ParameterConstraintMappingContext constraint(ConstraintDef<?, ?> definiti
6867
@Override
6968
public ParameterConstraintMappingContext ignoreAnnotations(boolean ignoreAnnotations) {
7069
mapping.getAnnotationProcessingOptions().ignoreConstraintAnnotationsOnParameter(
71-
executableContext.getExecutable(),
70+
executableContext.getCallable(),
7271
parameterIndex,
7372
ignoreAnnotations
7473
);
@@ -105,7 +104,7 @@ public ContainerElementConstraintMappingContext containerElementType() {
105104
return super.containerElement(
106105
this,
107106
executableContext.getTypeContext(),
108-
ConstraintLocation.forParameter( executableContext.getExecutable(), parameterIndex )
107+
ConstraintLocation.forParameter( executableContext.getCallable(), parameterIndex )
109108
);
110109
}
111110

@@ -114,19 +113,19 @@ public ContainerElementConstraintMappingContext containerElementType(int index,
114113
return super.containerElement(
115114
this,
116115
executableContext.getTypeContext(),
117-
ConstraintLocation.forParameter( executableContext.getExecutable(), parameterIndex ),
116+
ConstraintLocation.forParameter( executableContext.getCallable(), parameterIndex ),
118117
index,
119118
nestedIndexes
120119
);
121120
}
122121

123122
public ConstrainedParameter build(ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
124123
ValueExtractorManager valueExtractorManager) {
125-
Type parameterType = ReflectionHelper.typeOf( executableContext.getExecutable(), parameterIndex );
124+
Type parameterType = executableContext.getCallable().typeOfParameter( parameterIndex );
126125

127126
return new ConstrainedParameter(
128127
ConfigurationSource.API,
129-
executableContext.getExecutable(),
128+
executableContext.getCallable(),
130129
parameterType,
131130
parameterIndex,
132131
getConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ),

0 commit comments

Comments
 (0)