14
14
import java .util .List ;
15
15
import java .util .Map ;
16
16
import java .util .Set ;
17
+ import java .util .function .BiConsumer ;
17
18
18
19
import jakarta .validation .spi .ConfigurationState ;
19
20
20
21
import org .hibernate .validator .HibernateValidatorConfiguration ;
22
+ import org .hibernate .validator .HibernateValidatorFactory ;
21
23
import org .hibernate .validator .cfg .ConstraintMapping ;
24
+ import org .hibernate .validator .constraintvalidation .HibernateValidatorFactoryObserver ;
22
25
import org .hibernate .validator .internal .cfg .context .DefaultConstraintMapping ;
23
26
import org .hibernate .validator .internal .engine .constraintdefinition .ConstraintDefinitionContribution ;
24
27
import org .hibernate .validator .internal .engine .constraintvalidation .HibernateConstraintValidatorInitializationSharedServiceManager ;
@@ -48,6 +51,10 @@ final class ValidatorFactoryConfigurationHelper {
48
51
49
52
private static final Log LOG = LoggerFactory .make ( MethodHandles .lookup () );
50
53
54
+ static final BiConsumer <HibernateValidatorFactoryObserver , HibernateValidatorFactory > OBSERVE_FACTORY_CLOSING = HibernateValidatorFactoryObserver ::factoryClosing ;
55
+ static final BiConsumer <HibernateValidatorFactoryObserver , HibernateValidatorFactory > OBSERVE_FACTORY_CLOSED = HibernateValidatorFactoryObserver ::factoryClosed ;
56
+ static final BiConsumer <HibernateValidatorFactoryObserver , HibernateValidatorFactory > OBSERVE_FACTORY_CREATED = HibernateValidatorFactoryObserver ::factoryCreated ;
57
+
51
58
private ValidatorFactoryConfigurationHelper () {
52
59
}
53
60
@@ -61,9 +68,7 @@ static Set<DefaultConstraintMapping> determineConstraintMappings(TypeResolutionH
61
68
ConfigurationState configurationState , JavaBeanHelper javaBeanHelper , ClassLoader externalClassLoader ) {
62
69
Set <DefaultConstraintMapping > constraintMappings = newHashSet ();
63
70
64
- if ( configurationState instanceof AbstractConfigurationImpl ) {
65
- AbstractConfigurationImpl <?> hibernateConfiguration = (AbstractConfigurationImpl <?>) configurationState ;
66
-
71
+ if ( configurationState instanceof AbstractConfigurationImpl <?> hibernateConfiguration ) {
67
72
// programmatic config
68
73
/* We add these first so that constraint mapping created through DefaultConstraintMappingBuilder will take
69
74
* these programmatically defined mappings into account when checking for constraint definition uniqueness
@@ -204,8 +209,7 @@ static boolean determineFailFastOnPropertyViolation(AbstractConfigurationImpl<?>
204
209
205
210
static ScriptEvaluatorFactory determineScriptEvaluatorFactory (ConfigurationState configurationState , Map <String , String > properties ,
206
211
ClassLoader externalClassLoader ) {
207
- if ( configurationState instanceof AbstractConfigurationImpl ) {
208
- AbstractConfigurationImpl <?> hibernateSpecificConfig = (AbstractConfigurationImpl <?>) configurationState ;
212
+ if ( configurationState instanceof AbstractConfigurationImpl <?> hibernateSpecificConfig ) {
209
213
if ( hibernateSpecificConfig .getScriptEvaluatorFactory () != null ) {
210
214
LOG .usingScriptEvaluatorFactory ( hibernateSpecificConfig .getScriptEvaluatorFactory ().getClass () );
211
215
return hibernateSpecificConfig .getScriptEvaluatorFactory ();
@@ -231,8 +235,7 @@ static ScriptEvaluatorFactory determineScriptEvaluatorFactory(ConfigurationState
231
235
}
232
236
233
237
static Duration determineTemporalValidationTolerance (ConfigurationState configurationState , Map <String , String > properties ) {
234
- if ( configurationState instanceof AbstractConfigurationImpl ) {
235
- AbstractConfigurationImpl <?> hibernateSpecificConfig = (AbstractConfigurationImpl <?>) configurationState ;
238
+ if ( configurationState instanceof AbstractConfigurationImpl <?> hibernateSpecificConfig ) {
236
239
if ( hibernateSpecificConfig .getTemporalValidationTolerance () != null ) {
237
240
LOG .logTemporalValidationTolerance ( hibernateSpecificConfig .getTemporalValidationTolerance () );
238
241
return hibernateSpecificConfig .getTemporalValidationTolerance ();
@@ -453,6 +456,42 @@ static boolean determineShowValidatedValuesInTraceLogs(AbstractConfigurationImpl
453
456
return tmpShowValidatedValuesInTraceLogging ;
454
457
}
455
458
459
+ static List <HibernateValidatorFactoryObserver > determineHibernateValidatorFactoryObservers (ConfigurationState configurationState , Map <String , String > properties , ClassLoader externalClassLoader ) {
460
+ List <HibernateValidatorFactoryObserver > observers = newArrayList ();
461
+ if ( configurationState instanceof AbstractConfigurationImpl <?> hibernateSpecificConfig ) {
462
+ observers .addAll ( hibernateSpecificConfig .getHibernateValidatorFactoryObservers () );
463
+ }
464
+
465
+ String [] observerFqcn = properties .getOrDefault ( HibernateValidatorConfiguration .HIBERNATE_VALIDATOR_FACTORY_OBSERVER , "" ).split ( "," );
466
+ for ( String fqcn : observerFqcn ) {
467
+ if ( fqcn == null || fqcn .isBlank () ) {
468
+ continue ;
469
+ }
470
+ try {
471
+ @ SuppressWarnings ("unchecked" )
472
+ Class <? extends HibernateValidatorFactoryObserver > clazz = (Class <? extends HibernateValidatorFactoryObserver >) LoadClass .action ( fqcn , externalClassLoader );
473
+ HibernateValidatorFactoryObserver observer = NewInstance .action ( clazz , "Hibernate Validator factory observer class" );
474
+ observers .add ( observer );
475
+ }
476
+ catch (Exception e ) {
477
+ throw LOG .getUnableToInstantiateFactoryObserverClassException ( fqcn , e );
478
+ }
479
+ }
480
+ return observers ;
481
+ }
482
+
483
+ static void safeObserve (List <HibernateValidatorFactoryObserver > hibernateValidatorFactoryObservers , HibernateValidatorFactory factory ,
484
+ BiConsumer <HibernateValidatorFactoryObserver , HibernateValidatorFactory > action ) {
485
+ for ( HibernateValidatorFactoryObserver observer : hibernateValidatorFactoryObservers ) {
486
+ try {
487
+ action .accept ( observer , factory );
488
+ }
489
+ catch (Exception e ) {
490
+ LOG .unexpectedObserverException ( observer , e );
491
+ }
492
+ }
493
+ }
494
+
456
495
static void logValidatorFactoryScopedConfiguration (ValidatorFactoryScopedContext context ) {
457
496
LOG .logValidatorFactoryScopedConfiguration ( context .getMessageInterpolator ().getClass (), "message interpolator" );
458
497
LOG .logValidatorFactoryScopedConfiguration ( context .getTraversableResolver ().getClass (), "traversable resolver" );
0 commit comments