Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HV-1831 Unfinished experiments #1157

Open
wants to merge 5 commits into
base: 6.2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.hibernate.validator.cfg.ConstraintMapping;
import org.hibernate.validator.constraints.ParameterScriptAssert;
import org.hibernate.validator.constraints.ScriptAssert;
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
Expand Down Expand Up @@ -480,4 +481,7 @@ default S locales(Locale... locales) {
*/
@Incubating
S customViolationExpressionLanguageFeatureLevel(ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel);

@Incubating
S processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeanTrackingStrategy);
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl;
import org.hibernate.validator.internal.engine.resolver.TraversableResolvers;
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorDescriptor;
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
import org.hibernate.validator.internal.properties.DefaultGetterPropertySelectionStrategy;
Expand Down Expand Up @@ -132,6 +133,7 @@ public abstract class AbstractConfigurationImpl<T extends BaseHibernateValidator
private BeanMetaDataClassNormalizer beanMetaDataClassNormalizer;
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;

protected AbstractConfigurationImpl(BootstrapState state) {
this();
Expand Down Expand Up @@ -660,6 +662,22 @@ public ExpressionLanguageFeatureLevel getCustomViolationExpressionLanguageFeatur
return customViolationExpressionLanguageFeatureLevel;
}

@Override
public T processedBeansTrackingStrategy(ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
if ( LOG.isDebugEnabled() ) {
if ( processedBeansTrackingStrategy != null ) {
LOG.debug( "Setting custom ProcessedBeansTrackingStrategy of type " + processedBeansTrackingStrategy.getClass()
.getName() );
}
}
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
return thisAsT();
}

public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
return processedBeansTrackingStrategy;
}

public final Set<DefaultConstraintMapping> getProgrammaticMappings() {
return programmaticMappings;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowMultipleCascadedValidationOnReturnValues;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowOverridingMethodAlterParameterConstraint;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineAllowParallelMethodsDefineParameterConstraints;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintExpressionLanguageFeatureLevel;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineCustomViolationExpressionLanguageFeatureLevel;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineBeanMetaDataClassNormalizer;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintExpressionLanguageFeatureLevel;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintMappings;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineConstraintValidatorPayload;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineCustomViolationExpressionLanguageFeatureLevel;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineExternalClassLoader;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineFailFast;
import static org.hibernate.validator.internal.engine.ValidatorFactoryConfigurationHelper.determineScriptEvaluatorFactory;
Expand Down Expand Up @@ -44,8 +44,10 @@
import org.hibernate.validator.PredefinedScopeHibernateValidatorFactory;
import org.hibernate.validator.internal.cfg.context.DefaultConstraintMapping;
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
import org.hibernate.validator.internal.engine.constraintvalidation.HibernateConstraintValidatorInitializationContextImpl;
import org.hibernate.validator.internal.engine.constraintvalidation.PredefinedScopeConstraintValidatorManagerImpl;
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
import org.hibernate.validator.internal.engine.tracking.PredefinedScopeProcessedBeansTrackingStrategy;
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
Expand Down Expand Up @@ -112,23 +114,16 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
determineAllowParallelMethodsDefineParameterConstraints( hibernateSpecificConfig, properties )
).build();

this.validatorFactoryScopedContext = new ValidatorFactoryScopedContext(
configurationState.getMessageInterpolator(),
configurationState.getTraversableResolver(),
new ExecutableParameterNameProvider( configurationState.getParameterNameProvider() ),
configurationState.getClockProvider(),
determineTemporalValidationTolerance( configurationState, properties ),
determineScriptEvaluatorFactory( configurationState, properties, externalClassLoader ),
determineFailFast( hibernateSpecificConfig, properties ),
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
determineConstraintValidatorPayload( hibernateSpecificConfig ),
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties )
);
ExecutableParameterNameProvider parameterNameProvider = new ExecutableParameterNameProvider( configurationState.getParameterNameProvider() );
ScriptEvaluatorFactory scriptEvaluatorFactory = determineScriptEvaluatorFactory( configurationState, properties, externalClassLoader );
Duration temporalValidationTolerance = determineTemporalValidationTolerance( configurationState, properties );

HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext = new HibernateConstraintValidatorInitializationContextImpl(
scriptEvaluatorFactory, configurationState.getClockProvider(), temporalValidationTolerance );

this.constraintValidatorManager = new PredefinedScopeConstraintValidatorManagerImpl(
configurationState.getConstraintValidatorFactory(),
this.validatorFactoryScopedContext.getConstraintValidatorInitializationContext()
constraintValidatorInitializationContext
);

this.validationOrderGenerator = new ValidationOrderGenerator();
Expand Down Expand Up @@ -171,7 +166,7 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
this.beanMetaDataManager = new PredefinedScopeBeanMetaDataManager(
constraintCreationContext,
executableHelper,
validatorFactoryScopedContext.getParameterNameProvider(),
parameterNameProvider,
javaBeanHelper,
validationOrderGenerator,
buildMetaDataProviders( constraintCreationContext, xmlMetaDataProvider, constraintMappings ),
Expand All @@ -180,6 +175,23 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
hibernateSpecificConfig.getBeanClassesToInitialize()
);

this.validatorFactoryScopedContext = new ValidatorFactoryScopedContext(
configurationState.getMessageInterpolator(),
configurationState.getTraversableResolver(),
parameterNameProvider,
configurationState.getClockProvider(),
temporalValidationTolerance,
scriptEvaluatorFactory,
determineFailFast( hibernateSpecificConfig, properties ),
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
determineConstraintValidatorPayload( hibernateSpecificConfig ),
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
: new PredefinedScopeProcessedBeansTrackingStrategy( beanMetaDataManager ),
constraintValidatorInitializationContext );

if ( LOG.isDebugEnabled() ) {
logValidatorFactoryScopedConfiguration( validatorFactoryScopedContext );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManagerImpl;
import org.hibernate.validator.internal.engine.groups.ValidationOrderGenerator;
import org.hibernate.validator.internal.engine.tracking.HasCascadablesProcessedBeansTrackingStrategy;
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
import org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl;
Expand Down Expand Up @@ -160,8 +161,10 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
determineConstraintValidatorPayload( hibernateSpecificConfig ),
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties )
);
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingStrategy() != null )
? hibernateSpecificConfig.getProcessedBeansTrackingStrategy()
: new HasCascadablesProcessedBeansTrackingStrategy() );

ConstraintValidatorManager constraintValidatorManager = new ConstraintValidatorManagerImpl(
configurationState.getConstraintValidatorFactory(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorInitializationContext;
import org.hibernate.validator.internal.engine.constraintvalidation.HibernateConstraintValidatorInitializationContextImpl;
import org.hibernate.validator.internal.engine.tracking.ProcessedBeansTrackingStrategy;
import org.hibernate.validator.internal.util.Contracts;
import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
Expand Down Expand Up @@ -78,6 +79,11 @@ public class ValidatorFactoryScopedContext {
*/
private final ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;

/**
* Strategy used to enable or not processed beans tracking.
*/
private final ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;

/**
* The constraint validator initialization context.
*/
Expand All @@ -93,15 +99,16 @@ public class ValidatorFactoryScopedContext {
boolean traversableResolverResultCacheEnabled,
Object constraintValidatorPayload,
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel) {
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
this( messageInterpolator, traversableResolver, parameterNameProvider, clockProvider, temporalValidationTolerance, scriptEvaluatorFactory, failFast,
traversableResolverResultCacheEnabled, constraintValidatorPayload, constraintExpressionLanguageFeatureLevel,
customViolationExpressionLanguageFeatureLevel,
customViolationExpressionLanguageFeatureLevel, processedBeansTrackingStrategy,
new HibernateConstraintValidatorInitializationContextImpl( scriptEvaluatorFactory, clockProvider,
temporalValidationTolerance ) );
}

private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
TraversableResolver traversableResolver,
ExecutableParameterNameProvider parameterNameProvider,
ClockProvider clockProvider,
Expand All @@ -112,6 +119,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
Object constraintValidatorPayload,
ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel,
ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel,
ProcessedBeansTrackingStrategy processedBeanTrackingStrategy,
HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext) {
this.messageInterpolator = messageInterpolator;
this.traversableResolver = traversableResolver;
Expand All @@ -124,6 +132,7 @@ private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
this.constraintValidatorPayload = constraintValidatorPayload;
this.constraintExpressionLanguageFeatureLevel = constraintExpressionLanguageFeatureLevel;
this.customViolationExpressionLanguageFeatureLevel = customViolationExpressionLanguageFeatureLevel;
this.processedBeansTrackingStrategy = processedBeanTrackingStrategy;
this.constraintValidatorInitializationContext = constraintValidatorInitializationContext;
}

Expand Down Expand Up @@ -175,6 +184,10 @@ public ExpressionLanguageFeatureLevel getCustomViolationExpressionLanguageFeatur
return this.customViolationExpressionLanguageFeatureLevel;
}

public ProcessedBeansTrackingStrategy getProcessedBeansTrackingStrategy() {
return processedBeansTrackingStrategy;
}

static class Builder {
private final ValidatorFactoryScopedContext defaultContext;

Expand All @@ -189,6 +202,7 @@ static class Builder {
private Object constraintValidatorPayload;
private ExpressionLanguageFeatureLevel constraintExpressionLanguageFeatureLevel;
private ExpressionLanguageFeatureLevel customViolationExpressionLanguageFeatureLevel;
private ProcessedBeansTrackingStrategy processedBeansTrackingStrategy;
private HibernateConstraintValidatorInitializationContextImpl constraintValidatorInitializationContext;

Builder(ValidatorFactoryScopedContext defaultContext) {
Expand All @@ -206,6 +220,7 @@ static class Builder {
this.constraintValidatorPayload = defaultContext.constraintValidatorPayload;
this.constraintExpressionLanguageFeatureLevel = defaultContext.constraintExpressionLanguageFeatureLevel;
this.customViolationExpressionLanguageFeatureLevel = defaultContext.customViolationExpressionLanguageFeatureLevel;
this.processedBeansTrackingStrategy = defaultContext.processedBeansTrackingStrategy;
this.constraintValidatorInitializationContext = defaultContext.constraintValidatorInitializationContext;
}

Expand Down Expand Up @@ -292,6 +307,12 @@ public ValidatorFactoryScopedContext.Builder setCustomViolationExpressionLanguag
return this;
}

public ValidatorFactoryScopedContext.Builder setProcessedBeansTrackingStrategy(
ProcessedBeansTrackingStrategy processedBeansTrackingStrategy) {
this.processedBeansTrackingStrategy = processedBeansTrackingStrategy;
return this;
}

public ValidatorFactoryScopedContext build() {
return new ValidatorFactoryScopedContext(
messageInterpolator,
Expand All @@ -305,6 +326,7 @@ public ValidatorFactoryScopedContext build() {
constraintValidatorPayload,
constraintExpressionLanguageFeatureLevel,
customViolationExpressionLanguageFeatureLevel,
processedBeansTrackingStrategy,
HibernateConstraintValidatorInitializationContextImpl.of(
constraintValidatorInitializationContext,
scriptEvaluatorFactory,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.internal.engine.tracking;

import java.lang.reflect.Executable;

public class HasCascadablesProcessedBeansTrackingStrategy implements ProcessedBeansTrackingStrategy {

@Override
public boolean isEnabledForBean(Class<?> beanClass, boolean hasCascadables) {
return hasCascadables;
}

@Override
public boolean isEnabledForReturnValue(Executable executable, boolean hasCascadables) {
return hasCascadables;
}

@Override
public boolean isEnabledForParameters(Executable executable, boolean hasCascadables) {
return hasCascadables;
}

@Override
public void clear() {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.internal.engine.tracking;

import java.lang.reflect.Executable;
import java.util.HashMap;
import java.util.Map;

import org.hibernate.validator.internal.metadata.PredefinedScopeBeanMetaDataManager;
import org.hibernate.validator.internal.util.CollectionHelper;

public class PredefinedScopeProcessedBeansTrackingStrategy implements ProcessedBeansTrackingStrategy {

private final Map<Class<?>, Boolean> trackingEnabledForBeans;

private final Map<Executable, Boolean> trackingEnabledForReturnValues;

private final Map<Executable, Boolean> trackingEnabledForParameters;

public PredefinedScopeProcessedBeansTrackingStrategy(PredefinedScopeBeanMetaDataManager beanMetaDataManager) {
// TODO: build the maps from the information inside the beanMetaDataManager
// There is a good chance we will need a structure with the whole hierarchy of constraint classes.
// That's something we could add to PredefinedScopeBeanMetaDataManager, as we are already doing similar things
// there (see the ClassHierarchyHelper.getHierarchy call).
// In the predefined scope case, we will have the whole hierarchy of constrained classes passed to
// PredefinedScopeBeanMetaDataManager.

this.trackingEnabledForBeans = CollectionHelper.toImmutableMap( new HashMap<>() );
this.trackingEnabledForReturnValues = CollectionHelper.toImmutableMap( new HashMap<>() );
this.trackingEnabledForParameters = CollectionHelper.toImmutableMap( new HashMap<>() );
}

@Override
public boolean isEnabledForBean(Class<?> rootBeanClass, boolean hasCascadables) {
if ( !hasCascadables ) {
return false;
}

return trackingEnabledForBeans.getOrDefault( rootBeanClass, true );
}

@Override
public boolean isEnabledForReturnValue(Executable executable, boolean hasCascadables) {
if ( !hasCascadables ) {
return false;
}

return trackingEnabledForReturnValues.getOrDefault( executable, true );
}

@Override
public boolean isEnabledForParameters(Executable executable, boolean hasCascadables) {
if ( !hasCascadables ) {
return false;
}

return trackingEnabledForParameters.getOrDefault( executable, true );
}

@Override
public void clear() {
trackingEnabledForBeans.clear();
trackingEnabledForReturnValues.clear();
trackingEnabledForParameters.clear();
}
}
Loading