Skip to content

Commit

Permalink
HV-1439 Reduce the contention on the beanMetaDataCache concurrent map
Browse files Browse the repository at this point in the history
I introduced the infrastructure for that quite some time ago but only
used it for properties, whereas it's also beneficial in the method
validation path.
  • Loading branch information
gsmet committed Aug 3, 2017
1 parent de37a14 commit 9d89307
Showing 1 changed file with 24 additions and 30 deletions.
Expand Up @@ -443,7 +443,7 @@ private void validateConstraintsForCurrentGroup(ValidationContext<?> validationC
}

private <U> void validateConstraintsForDefaultGroup(ValidationContext<?> validationContext, ValueContext<U, Object> valueContext) {
final BeanMetaData<U> beanMetaData = beanMetaDataManager.getBeanMetaData( valueContext.getCurrentBeanType() );
final BeanMetaData<U> beanMetaData = valueContext.getCurrentBeanMetaData();
final Map<Class<?>, Class<?>> validatedInterfaces = newHashMap();

// evaluating the constraints of a bean per class in hierarchy, this is necessary to detect potential default group re-definitions
Expand Down Expand Up @@ -515,8 +515,7 @@ private <U> boolean validateConstraintsForSingleDefaultGroupElement(ValidationCo
}

private void validateConstraintsForNonDefaultGroup(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext) {
BeanMetaData<?> beanMetaData = beanMetaDataManager.getBeanMetaData( valueContext.getCurrentBeanType() );
validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), beanMetaData.getMetaConstraints() );
validateMetaConstraints( validationContext, valueContext, valueContext.getCurrentBean(), valueContext.getCurrentBeanMetaData().getMetaConstraints() );
validationContext.markCurrentBeanAsProcessed( valueContext );
}

Expand Down Expand Up @@ -776,7 +775,7 @@ private <T> Set<ConstraintViolation<T>> validateValueInContext(ValidationContext
ValueContext<?, Object> valueContext = getValueContextForValueValidation( context, propertyPath );
valueContext.setCurrentValidatedValue( value );

BeanMetaData<?> beanMetaData = beanMetaDataManager.getBeanMetaData( valueContext.getCurrentBeanType() );
BeanMetaData<?> beanMetaData = valueContext.getCurrentBeanMetaData();
if ( beanMetaData.defaultGroupSequenceIsRedefined() ) {
validationOrder.assertDefaultGroupSequenceIsExpandable( beanMetaData.getDefaultGroupSequence( null ) );
}
Expand Down Expand Up @@ -828,6 +827,15 @@ private <T> void validateParametersInContext(ValidationContext<T> validationCont
);
}

if ( parameterValues.length != executableMetaData.getParameterTypes().length ) {
throw log.getInvalidParameterCountForExecutableException(
ExecutableHelper.getExecutableAsString(
executableMetaData.getType().toString() + "#" + executableMetaData.getName(),
executableMetaData.getParameterTypes()
), parameterValues.length, executableMetaData.getParameterTypes().length
);
}

if ( beanMetaData.defaultGroupSequenceIsRedefined() ) {
validationOrder.assertDefaultGroupSequenceIsExpandable(
beanMetaData.getDefaultGroupSequence(
Expand All @@ -839,7 +847,7 @@ private <T> void validateParametersInContext(ValidationContext<T> validationCont
// process first single groups
Iterator<Group> groupIterator = validationOrder.getGroupIterator();
while ( groupIterator.hasNext() ) {
validateParametersForGroup( validationContext, parameterValues, groupIterator.next() );
validateParametersForGroup( validationContext, executableMetaData, parameterValues, groupIterator.next() );
if ( shouldFailFast( validationContext ) ) {
return;
}
Expand Down Expand Up @@ -871,7 +879,7 @@ private <T> void validateParametersInContext(ValidationContext<T> validationCont
int numberOfViolations = validationContext.getFailingConstraints().size();

for ( Group group : groupOfGroups ) {
validateParametersForGroup( validationContext, parameterValues, group );
validateParametersForGroup( validationContext, executableMetaData, parameterValues, group );
if ( shouldFailFast( validationContext ) ) {
return;
}
Expand All @@ -891,26 +899,17 @@ private <T> void validateParametersInContext(ValidationContext<T> validationCont
}
}

private <T> void validateParametersForGroup(ValidationContext<T> validationContext, Object[] parameterValues, Group group) {
BeanMetaData<T> beanMetaData = beanMetaDataManager.getBeanMetaData( validationContext.getRootBeanClass() );
ExecutableMetaData executableMetaData = beanMetaData.getMetaDataFor( validationContext.getExecutable() );

if ( parameterValues.length != executableMetaData.getParameterTypes().length ) {
throw log.getInvalidParameterCountForExecutableException(
ExecutableHelper.getExecutableAsString(
executableMetaData.getType().toString() + "#" + executableMetaData.getName(),
executableMetaData.getParameterTypes()
), parameterValues.length, executableMetaData.getParameterTypes().length
);
}
private <T> void validateParametersForGroup(ValidationContext<T> validationContext, ExecutableMetaData executableMetaData, Object[] parameterValues,
Group group) {
Contracts.assertNotNull( executableMetaData, "executableMetaData may not be null" );

// TODO GM: define behavior with respect to redefined default sequences. Should only the
// sequence from the validated bean be honored or also default sequence definitions up in
// the inheritance tree?
// For now a redefined default sequence will only be considered if specified at the bean
// hosting the validated itself, but no other default sequence from parent types
if ( group.isDefaultGroup() ) {
Iterator<Sequence> defaultGroupSequence = beanMetaData.getDefaultValidationSequence( validationContext.getRootBean() );
Iterator<Sequence> defaultGroupSequence = validationContext.getRootBeanMetaData().getDefaultValidationSequence( validationContext.getRootBean() );

while ( defaultGroupSequence.hasNext() ) {
Sequence sequence = defaultGroupSequence.next();
Expand Down Expand Up @@ -1027,7 +1026,7 @@ private <V, T> void validateReturnValueInContext(ValidationContext<T> context, T

// process first single groups
while ( groupIterator.hasNext() ) {
validateReturnValueForGroup( context, bean, value, groupIterator.next() );
validateReturnValueForGroup( context, executableMetaData, bean, value, groupIterator.next() );
if ( shouldFailFast( context ) ) {
return;
}
Expand Down Expand Up @@ -1062,7 +1061,7 @@ private <V, T> void validateReturnValueInContext(ValidationContext<T> context, T
for ( GroupWithInheritance groupOfGroups : sequence ) {
int numberOfFailingConstraintsBeforeGroup = context.getFailingConstraints().size();
for ( Group group : groupOfGroups ) {
validateReturnValueForGroup( context, bean, value, group );
validateReturnValueForGroup( context, executableMetaData, bean, value, group );
if ( shouldFailFast( context ) ) {
return;
}
Expand All @@ -1085,14 +1084,9 @@ private <V, T> void validateReturnValueInContext(ValidationContext<T> context, T
}

//TODO GM: if possible integrate with validateParameterForGroup()
private <T> void validateReturnValueForGroup(ValidationContext<T> validationContext, T bean, Object value, Group group) {
BeanMetaData<T> beanMetaData = beanMetaDataManager.getBeanMetaData( validationContext.getRootBeanClass() );
ExecutableMetaData executableMetaData = beanMetaData.getMetaDataFor( validationContext.getExecutable() );

if ( executableMetaData == null ) {
// nothing to validate
return;
}
private <T> void validateReturnValueForGroup(ValidationContext<T> validationContext, ExecutableMetaData executableMetaData, T bean, Object value,
Group group) {
Contracts.assertNotNull( executableMetaData, "executableMetaData may not be null" );

// TODO GM: define behavior with respect to redefined default sequences. Should only the
// sequence from the validated bean be honored or also default sequence definitions up in
Expand All @@ -1101,7 +1095,7 @@ private <T> void validateReturnValueForGroup(ValidationContext<T> validationCont
// hosting the validated itself, but no other default sequence from parent types

if ( group.isDefaultGroup() ) {
Iterator<Sequence> defaultGroupSequence = beanMetaData.getDefaultValidationSequence( bean );
Iterator<Sequence> defaultGroupSequence = validationContext.getRootBeanMetaData().getDefaultValidationSequence( bean );

while ( defaultGroupSequence.hasNext() ) {
Sequence sequence = defaultGroupSequence.next();
Expand Down

0 comments on commit 9d89307

Please sign in to comment.