Skip to content

Commit

Permalink
HV-1480 Avoid creating a list in the common case when we only have the
Browse files Browse the repository at this point in the history
default violation

Also optimize a bit the concatenation of the default violation and the
custom ones to avoid creating a list too small and resize it each time.
  • Loading branch information
gsmet authored and gunnarmorling committed Oct 18, 2017
1 parent 87affe0 commit 4a053a5
Showing 1 changed file with 30 additions and 19 deletions.
Expand Up @@ -6,8 +6,6 @@
*/
package org.hibernate.validator.internal.engine.constraintvalidation;

import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
Expand All @@ -30,6 +28,7 @@

import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.hibernate.validator.internal.util.CollectionHelper;
import org.hibernate.validator.internal.util.Contracts;
import org.hibernate.validator.internal.util.logging.Log;
import org.hibernate.validator.internal.util.logging.LoggerFactory;
Expand All @@ -47,9 +46,9 @@ public class ConstraintValidatorContextImpl implements HibernateConstraintValida
private Map<String, Object> expressionVariables;
private final List<String> methodParameterNames;
private final ClockProvider clockProvider;
private final List<ConstraintViolationCreationContext> constraintViolationCreationContexts = newArrayList( 3 );
private final PathImpl basePath;
private final ConstraintDescriptor<?> constraintDescriptor;
private List<ConstraintViolationCreationContext> constraintViolationCreationContexts;
private boolean defaultDisabled;
private Object dynamicPayload;

Expand Down Expand Up @@ -129,25 +128,34 @@ public final ConstraintDescriptor<?> getConstraintDescriptor() {
}

public final List<ConstraintViolationCreationContext> getConstraintViolationCreationContexts() {
if ( defaultDisabled && constraintViolationCreationContexts.size() == 0 ) {
throw log.getAtLeastOneCustomMessageMustBeCreatedException();
if ( defaultDisabled ) {
if ( constraintViolationCreationContexts == null || constraintViolationCreationContexts.size() == 0 ) {
throw log.getAtLeastOneCustomMessageMustBeCreatedException();
}

return CollectionHelper.toImmutableList( constraintViolationCreationContexts );
}

List<ConstraintViolationCreationContext> returnedConstraintViolationCreationContexts = new ArrayList<>(
constraintViolationCreationContexts
);
if ( !defaultDisabled ) {
returnedConstraintViolationCreationContexts.add(
new ConstraintViolationCreationContext(
getDefaultConstraintMessageTemplate(),
basePath,
messageParameters != null ? new HashMap<>( messageParameters ) : Collections.emptyMap(),
expressionVariables != null ? new HashMap<>( expressionVariables ) : Collections.emptyMap(),
dynamicPayload
)
);
if ( constraintViolationCreationContexts == null || constraintViolationCreationContexts.size() == 0 ) {
return Collections.singletonList( getDefaultConstraintViolationCreationContext() );
}
return returnedConstraintViolationCreationContexts;

List<ConstraintViolationCreationContext> returnedConstraintViolationCreationContexts =
new ArrayList<>( constraintViolationCreationContexts.size() + 1 );
returnedConstraintViolationCreationContexts.addAll( constraintViolationCreationContexts );
returnedConstraintViolationCreationContexts.add( getDefaultConstraintViolationCreationContext() );

return CollectionHelper.toImmutableList( returnedConstraintViolationCreationContexts );
}

private ConstraintViolationCreationContext getDefaultConstraintViolationCreationContext() {
return new ConstraintViolationCreationContext(
getDefaultConstraintMessageTemplate(),
basePath,
messageParameters != null ? new HashMap<>( messageParameters ) : Collections.emptyMap(),
expressionVariables != null ? new HashMap<>( expressionVariables ) : Collections.emptyMap(),
dynamicPayload
);
}

public List<String> getMethodParameterNames() {
Expand All @@ -164,6 +172,9 @@ protected NodeBuilderBase(String template, PathImpl path) {
}

public ConstraintValidatorContext addConstraintViolation() {
if ( constraintViolationCreationContexts == null ) {
constraintViolationCreationContexts = CollectionHelper.newArrayList( 3 );
}
constraintViolationCreationContexts.add(
new ConstraintViolationCreationContext(
messageTemplate,
Expand Down

0 comments on commit 4a053a5

Please sign in to comment.