Skip to content

HV-1831 experiments (6.2) #1170

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

Closed
wants to merge 16 commits into from
Closed
Show file tree
Hide file tree
Changes from 14 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,6 +44,7 @@
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.valueextraction.ValueExtractorManager;
Expand Down Expand Up @@ -112,23 +113,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 +162,46 @@ 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
);

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 +264,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 @@ -160,8 +160,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
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
Loading