Skip to content

Commit 171a07f

Browse files
committed
HV-1166 Making extractors customizable;
* Allowing to plug in custom value extractors * Allowing to mark any type variable of a parameterized type for cascaded validation
1 parent a56a86d commit 171a07f

File tree

53 files changed

+1138
-151
lines changed

Some content is hidden

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

53 files changed

+1138
-151
lines changed

engine/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@
138138
<artifactId>moneta</artifactId>
139139
<scope>test</scope>
140140
</dependency>
141+
<dependency>
142+
<groupId>com.google.guava</groupId>
143+
<artifactId>guava</artifactId>
144+
<scope>test</scope>
145+
</dependency>
141146
</dependencies>
142147

143148
<build>

engine/src/main/java/org/hibernate/validator/HibernateValidatorConfiguration.java

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import javax.validation.Configuration;
1010

1111
import org.hibernate.validator.cfg.ConstraintMapping;
12+
import org.hibernate.validator.spi.cascading.ValueExtractor;
1213
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator;
1314
import org.hibernate.validator.spi.time.TimeProvider;
1415
import org.hibernate.validator.spi.valuehandling.ValidatedValueUnwrapper;
@@ -150,6 +151,8 @@ public interface HibernateValidatorConfiguration extends Configuration<Hibernate
150151
*/
151152
HibernateValidatorConfiguration addValidatedValueHandler(ValidatedValueUnwrapper<?> handler);
152153

154+
HibernateValidatorConfiguration addCascadedValueExtractor(ValueExtractor<?> extractor);
155+
153156
/**
154157
* Sets the class loader to be used for loading user-provided resources:
155158
* <ul>

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.validator.cfg.context.CrossParameterConstraintMappingContext;
1616
import org.hibernate.validator.cfg.context.ParameterConstraintMappingContext;
1717
import org.hibernate.validator.cfg.context.ReturnValueConstraintMappingContext;
18+
import org.hibernate.validator.internal.engine.cascading.AnnotatedObject;
1819
import org.hibernate.validator.internal.engine.valuehandling.UnwrapMode;
1920
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
2021
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
@@ -112,7 +113,7 @@ public ConstrainedElement build(ConstraintHelper constraintHelper, ExecutablePar
112113
returnValueContext != null ? returnValueContext.getConstraints( constraintHelper ) : Collections.<MetaConstraint<?>>emptySet(),
113114
Collections.<MetaConstraint<?>>emptySet(),
114115
returnValueContext != null ? returnValueContext.getGroupConversions() : Collections.<Class<?>, Class<?>>emptyMap(),
115-
returnValueContext != null ? returnValueContext.isCascading() : false,
116+
returnValueContext != null && returnValueContext.isCascading() ? Collections.singletonList( AnnotatedObject.INSTANCE ) : Collections.emptyList(),
116117
returnValueContext != null ? returnValueContext.unwrapMode() : UnwrapMode.AUTOMATIC
117118
);
118119
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.validator.cfg.context.MethodConstraintMappingContext;
1515
import org.hibernate.validator.cfg.context.ParameterConstraintMappingContext;
1616
import org.hibernate.validator.cfg.context.ReturnValueConstraintMappingContext;
17+
import org.hibernate.validator.internal.engine.cascading.AnnotatedObject;
1718
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
1819
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
1920
import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl.ConstraintType;
@@ -106,7 +107,7 @@ public ConstrainedParameter build(ConstraintHelper constraintHelper, ExecutableP
106107
getConstraints( constraintHelper ),
107108
Collections.<MetaConstraint<?>>emptySet(),
108109
groupConversions,
109-
isCascading,
110+
isCascading ? Collections.singletonList( AnnotatedObject.INSTANCE ) : Collections.emptyList(),
110111
unwrapMode()
111112
);
112113
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.validator.cfg.context.ConstructorConstraintMappingContext;
1818
import org.hibernate.validator.cfg.context.MethodConstraintMappingContext;
1919
import org.hibernate.validator.cfg.context.PropertyConstraintMappingContext;
20+
import org.hibernate.validator.internal.engine.cascading.AnnotatedObject;
2021
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
2122
import org.hibernate.validator.internal.metadata.core.MetaConstraint;
2223
import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl.ConstraintType;
@@ -99,7 +100,7 @@ ConstrainedElement build(ConstraintHelper constraintHelper) {
99100
getConstraints( constraintHelper ),
100101
Collections.<MetaConstraint<?>>emptySet(),
101102
groupConversions,
102-
isCascading,
103+
isCascading ? Collections.singletonList( AnnotatedObject.INSTANCE ) : Collections.emptyList(),
103104
unwrapMode()
104105
);
105106
}
@@ -109,7 +110,7 @@ ConstrainedElement build(ConstraintHelper constraintHelper) {
109110
(Executable) member,
110111
getConstraints( constraintHelper ),
111112
groupConversions,
112-
isCascading,
113+
isCascading ? Collections.singletonList( AnnotatedObject.INSTANCE ) : Collections.emptyList(),
113114
unwrapMode()
114115
);
115116
}

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

+16
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.io.InputStream;
1616
import java.security.AccessController;
1717
import java.security.PrivilegedAction;
18+
import java.util.ArrayList;
1819
import java.util.List;
1920
import java.util.Map;
2021
import java.util.Set;
@@ -49,6 +50,7 @@
4950
import org.hibernate.validator.internal.xml.ValidationXmlParser;
5051
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
5152
import org.hibernate.validator.resourceloading.PlatformResourceBundleLocator;
53+
import org.hibernate.validator.spi.cascading.ValueExtractor;
5254
import org.hibernate.validator.spi.cfg.ConstraintMappingContributor;
5355
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator;
5456
import org.hibernate.validator.spi.time.TimeProvider;
@@ -96,6 +98,7 @@ public class ConfigurationImpl implements HibernateValidatorConfiguration, Confi
9698
private final Set<DefaultConstraintMapping> programmaticMappings = newHashSet();
9799
private boolean failFast;
98100
private final List<ValidatedValueUnwrapper<?>> validatedValueHandlers = newArrayList();
101+
private final List<ValueExtractor<?>> cascadedValueExtractors = new ArrayList<>();
99102
private ClassLoader externalClassLoader;
100103
private TimeProvider timeProvider;
101104
private final MethodValidationConfiguration methodValidationConfiguration = new MethodValidationConfiguration();
@@ -283,6 +286,15 @@ public HibernateValidatorConfiguration addValidatedValueHandler(ValidatedValueUn
283286
return this;
284287
}
285288

289+
@Override
290+
public HibernateValidatorConfiguration addCascadedValueExtractor(ValueExtractor<?> extractor) {
291+
Contracts.assertNotNull( extractor, MESSAGES.parameterMustNotBeNull( "extractor" ) );
292+
cascadedValueExtractors.add( extractor );
293+
294+
return this;
295+
}
296+
297+
286298
public final ConstraintMappingContributor getServiceLoaderBasedConstraintMappingContributor() {
287299
return serviceLoaderBasedConstraintMappingContributor;
288300
}
@@ -403,6 +415,10 @@ public List<ValidatedValueUnwrapper<?>> getValidatedValueHandlers() {
403415
return validatedValueHandlers;
404416
}
405417

418+
public List<ValueExtractor<?>> getCascadedValueExtractors() {
419+
return cascadedValueExtractors;
420+
}
421+
406422
public TimeProvider getTimeProvider() {
407423
return timeProvider;
408424
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import javax.validation.Validator;
1717

1818
import org.hibernate.validator.HibernateValidatorContext;
19+
import org.hibernate.validator.internal.engine.cascading.ValueExtractors;
1920
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
2021
import org.hibernate.validator.spi.time.TimeProvider;
2122
import org.hibernate.validator.spi.valuehandling.ValidatedValueUnwrapper;
@@ -37,6 +38,7 @@ public class ValidatorContextImpl implements HibernateValidatorContext {
3738
private ExecutableParameterNameProvider parameterNameProvider;
3839
private boolean failFast;
3940
private final List<ValidatedValueUnwrapper<?>> validatedValueHandlers;
41+
private final ValueExtractors valueExtractors;
4042
private TimeProvider timeProvider;
4143
private final MethodValidationConfiguration methodValidationConfiguration = new MethodValidationConfiguration();
4244

@@ -51,6 +53,8 @@ public ValidatorContextImpl(ValidatorFactoryImpl validatorFactory) {
5153
this.validatedValueHandlers = new ArrayList<>(
5254
validatorFactory.getValidatedValueHandlers()
5355
);
56+
// TODO make overwritable per this context
57+
this.valueExtractors = validatorFactory.getValueExtractors();
5458
this.timeProvider = validatorFactory.getTimeProvider();
5559
}
5660

@@ -148,6 +152,7 @@ public Validator getValidator() {
148152
parameterNameProvider,
149153
failFast,
150154
validatedValueHandlers,
155+
valueExtractors,
151156
timeProvider,
152157
methodValidationConfiguration
153158
);

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

+16-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.lang.annotation.Annotation;
1313
import java.security.AccessController;
1414
import java.security.PrivilegedAction;
15+
import java.util.ArrayList;
1516
import java.util.Collections;
1617
import java.util.IdentityHashMap;
1718
import java.util.List;
@@ -30,6 +31,7 @@
3031
import org.hibernate.validator.HibernateValidatorFactory;
3132
import org.hibernate.validator.cfg.ConstraintMapping;
3233
import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
34+
import org.hibernate.validator.internal.engine.cascading.ValueExtractors;
3335
import org.hibernate.validator.internal.engine.constraintdefinition.ConstraintDefinitionContribution;
3436
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
3537
import org.hibernate.validator.internal.engine.time.DefaultTimeProvider;
@@ -46,6 +48,7 @@
4648
import org.hibernate.validator.internal.util.logging.LoggerFactory;
4749
import org.hibernate.validator.internal.util.privilegedactions.LoadClass;
4850
import org.hibernate.validator.internal.util.privilegedactions.NewInstance;
51+
import org.hibernate.validator.spi.cascading.ValueExtractor;
4952
import org.hibernate.validator.spi.cfg.ConstraintMappingContributor;
5053
import org.hibernate.validator.spi.time.TimeProvider;
5154
import org.hibernate.validator.spi.valuehandling.ValidatedValueUnwrapper;
@@ -139,6 +142,8 @@ public class ValidatorFactoryImpl implements HibernateValidatorFactory {
139142
*/
140143
private final List<ValidatedValueUnwrapper<?>> validatedValueHandlers;
141144

145+
private final ValueExtractors valueExtractors;
146+
142147
public ValidatorFactoryImpl(ConfigurationState configurationState) {
143148
ClassLoader externalClassLoader = getExternalClassLoader( configurationState );
144149

@@ -177,7 +182,7 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
177182
boolean tmpAllowParallelMethodsDefineParameterConstraints = false;
178183

179184
List<ValidatedValueUnwrapper<?>> tmpValidatedValueHandlers = newArrayList( 5 );
180-
185+
List<ValueExtractor<?>> cascadedValueExtractors = null;
181186
if ( configurationState instanceof ConfigurationImpl ) {
182187
ConfigurationImpl hibernateSpecificConfig = (ConfigurationImpl) configurationState;
183188

@@ -195,6 +200,8 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
195200
.isAllowParallelMethodsDefineParameterConstraints();
196201

197202
tmpValidatedValueHandlers.addAll( hibernateSpecificConfig.getValidatedValueHandlers() );
203+
204+
cascadedValueExtractors = new ArrayList<>( hibernateSpecificConfig.getCascadedValueExtractors() );
198205
}
199206

200207
registerCustomConstraintValidators( constraintMappings, constraintHelper );
@@ -206,7 +213,7 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
206213
)
207214
);
208215
this.validatedValueHandlers = Collections.unmodifiableList( tmpValidatedValueHandlers );
209-
216+
this.valueExtractors = new ValueExtractors( cascadedValueExtractors );
210217
tmpFailFast = checkPropertiesForBoolean( properties, HibernateValidatorConfiguration.FAIL_FAST, tmpFailFast );
211218
this.failFast = tmpFailFast;
212219

@@ -313,6 +320,7 @@ public Validator getValidator() {
313320
parameterNameProvider,
314321
failFast,
315322
validatedValueHandlers,
323+
valueExtractors,
316324
timeProvider,
317325
methodValidationConfiguration
318326
);
@@ -350,6 +358,10 @@ public List<ValidatedValueUnwrapper<?>> getValidatedValueHandlers() {
350358
return validatedValueHandlers;
351359
}
352360

361+
ValueExtractors getValueExtractors() {
362+
return valueExtractors;
363+
}
364+
353365
TimeProvider getTimeProvider() {
354366
return timeProvider;
355367
}
@@ -385,6 +397,7 @@ Validator createValidator(ConstraintValidatorFactory constraintValidatorFactory,
385397
ExecutableParameterNameProvider parameterNameProvider,
386398
boolean failFast,
387399
List<ValidatedValueUnwrapper<?>> validatedValueHandlers,
400+
ValueExtractors valueExtractors,
388401
TimeProvider timeProvider,
389402
MethodValidationConfiguration methodValidationConfiguration) {
390403

@@ -412,6 +425,7 @@ Validator createValidator(ConstraintValidatorFactory constraintValidatorFactory,
412425
timeProvider,
413426
typeResolutionHelper,
414427
validatedValueHandlers,
428+
valueExtractors,
415429
constraintValidatorManager,
416430
failFast
417431
);

0 commit comments

Comments
 (0)