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 Experiments - 6.2 #1288

Open
wants to merge 16 commits into
base: 6.2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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 @@ -26,13 +26,14 @@
import org.hibernate.validator.constraints.ParameterScriptAssert;
import org.hibernate.validator.constraints.ScriptAssert;
import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel;
import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
import org.hibernate.validator.spi.nodenameprovider.PropertyNodeNameProvider;
import org.hibernate.validator.spi.properties.GetterPropertySelectionStrategy;
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator;
import org.hibernate.validator.spi.scripting.ScriptEvaluator;
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;

/**
* Base interface for Hibernate Validator specific configurations.
Expand Down Expand Up @@ -480,4 +481,7 @@ default S locales(Locale... locales) {
*/
@Incubating
S customViolationExpressionLanguageFeatureLevel(ExpressionLanguageFeatureLevel expressionLanguageFeatureLevel);

@Incubating
S processedBeansTrackingVoter(ProcessedBeansTrackingVoter processedBeanTrackingVoter);
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
import org.hibernate.validator.spi.properties.GetterPropertySelectionStrategy;
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator;
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;

/**
* Hibernate specific {@code Configuration} implementation.
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 ProcessedBeansTrackingVoter processedBeansTrackingVoter;

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

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

public ProcessedBeansTrackingVoter getProcessedBeansTrackingVoter() {
return processedBeansTrackingVoter;
}

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.DefaultProcessedBeansTrackingVoter;
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 @@ -168,18 +163,49 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState

registerCustomConstraintValidators( constraintMappings, constraintHelper );

// collect all metadata, I don't think we need this work to be in BeanMetaDataManager contract, it can be a specific class (or private method if simple enough)
// it's basically the content of PredefinedScopeBeanMetaDataManager constructor
// the metadata wouldn't be complete because we want to inject the tracking information

// then you build the tracking information from these incomplete metadata

// finally you create a PredefinedScopeBeanMetaDataManager with the augmented metadata pushed to it
// you will need to augment both BeanMetaData and ExecutableMetaData
// I would prototype BeanMetaData first then discuss it before going further

// Note: we want classes to be immutable
// Might be a good idea to push a default method to BeanMetaData as enabling tracking is the default behavior we want
// Maybe first try composition and benchmark it and if good enough, we keep it

this.beanMetaDataManager = new PredefinedScopeBeanMetaDataManager(
constraintCreationContext,
executableHelper,
validatorFactoryScopedContext.getParameterNameProvider(),
parameterNameProvider,
javaBeanHelper,
validationOrderGenerator,
buildMetaDataProviders( constraintCreationContext, xmlMetaDataProvider, constraintMappings ),
methodValidationConfiguration,
determineBeanMetaDataClassNormalizer( hibernateSpecificConfig ),
hibernateSpecificConfig.getBeanClassesToInitialize()
( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingVoter() != null )
? hibernateSpecificConfig.getProcessedBeansTrackingVoter()
: new DefaultProcessedBeansTrackingVoter(),
hibernateSpecificConfig
);

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 ),
constraintValidatorInitializationContext );

if ( LOG.isDebugEnabled() ) {
logValidatorFactoryScopedConfiguration( validatorFactoryScopedContext );
}
Expand Down Expand Up @@ -242,6 +268,10 @@ public boolean isTraversableResolverResultCacheEnabled() {
return validatorFactoryScopedContext.isTraversableResolverResultCacheEnabled();
}

public PredefinedScopeBeanMetaDataManager getBeanMetaDataManager() {
return beanMetaDataManager;
}

@Override
public <T> T unwrap(Class<T> type) {
// allow unwrapping into public super types
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
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.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.determineConstraintExpressionLanguageFeatureLevel;
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;
Expand Down 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.DefaultProcessedBeansTrackingVoter;
import org.hibernate.validator.internal.engine.valueextraction.ValueExtractorManager;
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
import org.hibernate.validator.internal.metadata.BeanMetaDataManagerImpl;
Expand All @@ -65,6 +66,7 @@
import org.hibernate.validator.metadata.BeanMetaDataClassNormalizer;
import org.hibernate.validator.spi.properties.GetterPropertySelectionStrategy;
import org.hibernate.validator.spi.scripting.ScriptEvaluatorFactory;
import org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;

/**
* Factory returning initialized {@code Validator} instances. This is the Hibernate Validator default
Expand Down Expand Up @@ -130,6 +132,8 @@ public class ValidatorFactoryImpl implements HibernateValidatorFactory {

private final ValidationOrderGenerator validationOrderGenerator;

private final ProcessedBeansTrackingVoter processedBeansTrackingVoter;

public ValidatorFactoryImpl(ConfigurationState configurationState) {
ClassLoader externalClassLoader = determineExternalClassLoader( configurationState );

Expand Down Expand Up @@ -160,8 +164,7 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {
determineTraversableResolverResultCacheEnabled( hibernateSpecificConfig, properties ),
determineConstraintValidatorPayload( hibernateSpecificConfig ),
determineConstraintExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ),
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties )
);
determineCustomViolationExpressionLanguageFeatureLevel( hibernateSpecificConfig, properties ) );

ConstraintValidatorManager constraintValidatorManager = new ConstraintValidatorManagerImpl(
configurationState.getConstraintValidatorFactory(),
Expand Down Expand Up @@ -200,6 +203,10 @@ public ValidatorFactoryImpl(ConfigurationState configurationState) {

registerCustomConstraintValidators( constraintMappings, constraintHelper );

this.processedBeansTrackingVoter = ( hibernateSpecificConfig != null && hibernateSpecificConfig.getProcessedBeansTrackingVoter() != null )
? hibernateSpecificConfig.getProcessedBeansTrackingVoter()
: new DefaultProcessedBeansTrackingVoter();

if ( LOG.isDebugEnabled() ) {
logValidatorFactoryScopedConfiguration( validatorFactoryScopedContext );
}
Expand Down Expand Up @@ -318,7 +325,8 @@ Validator createValidator(ConstraintValidatorFactory constraintValidatorFactory,
beanMetadataClassNormalizer,
validationOrderGenerator,
buildMetaDataProviders(),
methodValidationConfiguration
methodValidationConfiguration,
processedBeansTrackingVoter
)
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public class ValidatorFactoryScopedContext {
temporalValidationTolerance ) );
}

private ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
ValidatorFactoryScopedContext(MessageInterpolator messageInterpolator,
TraversableResolver traversableResolver,
ExecutableParameterNameProvider parameterNameProvider,
ClockProvider clockProvider,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ private NodeImpl addMethodNode(String name, Class<?>[] parameterTypes) {
}

public NodeImpl makeLeafNodeIterable() {
requiresWriteableNodeList();
copyNodeList();

currentLeafNode = NodeImpl.makeIterable( currentLeafNode );

Expand All @@ -205,7 +205,7 @@ public NodeImpl makeLeafNodeIterable() {
}

public NodeImpl makeLeafNodeIterableAndSetIndex(Integer index) {
requiresWriteableNodeList();
copyNodeList();

currentLeafNode = NodeImpl.makeIterableAndSetIndex( currentLeafNode, index );

Expand All @@ -215,7 +215,7 @@ public NodeImpl makeLeafNodeIterableAndSetIndex(Integer index) {
}

public NodeImpl makeLeafNodeIterableAndSetMapKey(Object key) {
requiresWriteableNodeList();
copyNodeList();

currentLeafNode = NodeImpl.makeIterableAndSetMapKey( currentLeafNode, key );

Expand Down Expand Up @@ -300,6 +300,10 @@ private void requiresWriteableNodeList() {
return;
}

copyNodeList();
}

private void copyNodeList() {
// Usually, the write operation is about adding one more node, so let's make the list one element larger.
List<Node> newNodeList = new ArrayList<>( nodeList.size() + 1 );
newNodeList.addAll( nodeList );
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* 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 org.hibernate.validator.spi.tracking.ProcessedBeansTrackingVoter;

public class DefaultProcessedBeansTrackingVoter implements ProcessedBeansTrackingVoter {

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

@Override
public Vote isEnabledForReturnValue(Class<?> beanClass, String name, Class<?>[] parameterTypes, boolean hasCascadables) {
return Vote.DEFAULT;
}

@Override
public Vote isEnabledForParameters(Class<?> beanClass, String name, Class<?>[] parameterTypes, boolean hasCascadables) {
return Vote.DEFAULT;
}
}
Loading