|
16 | 16 | */
|
17 | 17 | package org.hibernate.validator.internal.engine;
|
18 | 18 |
|
| 19 | +import java.lang.annotation.Annotation; |
19 | 20 | import java.security.AccessController;
|
20 | 21 | import java.security.PrivilegedAction;
|
21 | 22 | import java.util.Collections;
|
22 | 23 | import java.util.IdentityHashMap;
|
23 | 24 | import java.util.List;
|
24 | 25 | import java.util.Map;
|
25 | 26 | import java.util.Set;
|
26 |
| - |
| 27 | +import javax.validation.ConstraintValidator; |
27 | 28 | import javax.validation.ConstraintValidatorFactory;
|
28 | 29 | import javax.validation.MessageInterpolator;
|
29 | 30 | import javax.validation.ParameterNameProvider;
|
|
35 | 36 | import org.hibernate.validator.HibernateValidatorContext;
|
36 | 37 | import org.hibernate.validator.HibernateValidatorFactory;
|
37 | 38 | import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
|
| 39 | +import org.hibernate.validator.internal.engine.constraintdefinition.ConstraintDefinitionBuilderImpl; |
38 | 40 | import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
|
39 | 41 | import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
|
40 | 42 | import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
|
|
48 | 50 | import org.hibernate.validator.internal.util.privilegedactions.LoadClass;
|
49 | 51 | import org.hibernate.validator.internal.util.privilegedactions.NewInstance;
|
50 | 52 | import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
|
| 53 | +import org.hibernate.validator.internal.engine.constraintdefinition.ConstraintDefinitionContribution; |
| 54 | +import org.hibernate.validator.spi.constraintdefinition.ConstraintDefinitionContributor; |
51 | 55 | import org.hibernate.validator.spi.valuehandling.ValidatedValueUnwrapper;
|
52 | 56 |
|
53 | 57 | import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
|
@@ -167,6 +171,7 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
|
167 | 171 |
|
168 | 172 | tmpValidatedValueHandlers.addAll( hibernateSpecificConfig.getValidatedValueHandlers() );
|
169 | 173 |
|
| 174 | + registerCustomConstraintValidators( hibernateSpecificConfig, properties ); |
170 | 175 | }
|
171 | 176 | this.constraintMappings = Collections.unmodifiableSet( tmpConstraintMappings );
|
172 | 177 |
|
@@ -348,6 +353,70 @@ private List<ValidatedValueUnwrapper<?>> getPropertyConfiguredValidatedValueHand
|
348 | 353 | return handlers;
|
349 | 354 | }
|
350 | 355 |
|
| 356 | + /** |
| 357 | + * Returns a list with {@link org.hibernate.validator.spi.constraintdefinition.ConstraintDefinitionContributor} instances configured via the |
| 358 | + * {@link HibernateValidatorConfiguration#CONSTRAINT_DEFINITION_CONTRIBUTORS} property. |
| 359 | + * |
| 360 | + * @param properties the properties used to bootstrap the factory |
| 361 | + * |
| 362 | + * @return a list with property-configured {@link org.hibernate.validator.spi.constraintdefinition.ConstraintDefinitionContributor}s. May be empty but never {@code null}. |
| 363 | + */ |
| 364 | + private List<ConstraintDefinitionContributor> getPropertyConfiguredConstraintDefinitionContributors( |
| 365 | + Map<String, String> properties) { |
| 366 | + String propertyValue = properties.get( HibernateValidatorConfiguration.CONSTRAINT_DEFINITION_CONTRIBUTORS ); |
| 367 | + |
| 368 | + if ( propertyValue == null || propertyValue.isEmpty() ) { |
| 369 | + return Collections.emptyList(); |
| 370 | + } |
| 371 | + |
| 372 | + String[] constraintDefinitionContributorNames = propertyValue.split( "," ); |
| 373 | + List<ConstraintDefinitionContributor> constraintDefinitionContributors = newArrayList( |
| 374 | + constraintDefinitionContributorNames.length |
| 375 | + ); |
| 376 | + |
| 377 | + for ( String fqcn : constraintDefinitionContributorNames ) { |
| 378 | + @SuppressWarnings("unchecked") |
| 379 | + Class<ConstraintDefinitionContributor> contributorType = (Class<ConstraintDefinitionContributor>) |
| 380 | + run( LoadClass.action( fqcn, ValidatorFactoryImpl.class ) ); |
| 381 | + constraintDefinitionContributors.add( |
| 382 | + run( NewInstance.action( contributorType, "constraint definition contributor class" ) ) |
| 383 | + ); |
| 384 | + } |
| 385 | + |
| 386 | + return constraintDefinitionContributors; |
| 387 | + } |
| 388 | + |
| 389 | + private void registerCustomConstraintValidators(ConfigurationImpl hibernateSpecificConfig, |
| 390 | + Map<String, String> properties) { |
| 391 | + for ( ConstraintDefinitionContributor contributor : hibernateSpecificConfig.getConstraintDefinitionContributors() ) { |
| 392 | + registerConstraintValidators( contributor ); |
| 393 | + } |
| 394 | + |
| 395 | + for ( ConstraintDefinitionContributor contributor : getPropertyConfiguredConstraintDefinitionContributors( |
| 396 | + properties |
| 397 | + ) ) { |
| 398 | + registerConstraintValidators( contributor ); |
| 399 | + } |
| 400 | + } |
| 401 | + |
| 402 | + private <A extends Annotation> void registerConstraintValidators(ConstraintDefinitionContributor contributor) { |
| 403 | + ConstraintDefinitionBuilderImpl builder = new ConstraintDefinitionBuilderImpl(); |
| 404 | + contributor.collectConstraintDefinitions( builder ); |
| 405 | + List<ConstraintDefinitionContribution<?>> constraintDefinitionContributions = builder.getConstraintValidatorContributions(); |
| 406 | + for ( ConstraintDefinitionContribution<?> constraintDefinitionContribution : constraintDefinitionContributions ) { |
| 407 | + @SuppressWarnings("unchecked") |
| 408 | + Class<A> constraintType = (Class<A>) constraintDefinitionContribution.getConstraintType(); |
| 409 | + @SuppressWarnings("unchecked") |
| 410 | + List<Class<? extends ConstraintValidator<A, ?>>> constraintValidatorTypes = (List) constraintDefinitionContribution |
| 411 | + .getConstraintValidators(); |
| 412 | + constraintHelper.putValidatorClasses( |
| 413 | + constraintType, |
| 414 | + constraintValidatorTypes, |
| 415 | + constraintDefinitionContribution.keepDefaults() |
| 416 | + ); |
| 417 | + } |
| 418 | + } |
| 419 | + |
351 | 420 | /**
|
352 | 421 | * Runs the given privileged action, using a privileged block if required.
|
353 | 422 | * <p>
|
|
0 commit comments