Skip to content

Commit

Permalink
HV-1239 Container element constraints for parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
gunnarmorling authored and gsmet committed Mar 13, 2017
1 parent 2d4f0ef commit a46e7b2
Show file tree
Hide file tree
Showing 7 changed files with 447 additions and 13 deletions.
Expand Up @@ -21,5 +21,6 @@ public interface ContainerElementConstraintMappingContext extends Constrainable<
ConstructorTarget,
MethodTarget,
ContainerElementTarget,
ParameterTarget,
Cascadable<ContainerElementConstraintMappingContext> {
}
Expand Up @@ -15,7 +15,9 @@
* @author Kevin Pollet &lt;kevin.pollet@serli.com&gt; (C) 2011 SERLI
*/
public interface ParameterConstraintMappingContext extends ConstraintMappingTarget, CrossParameterTarget, ParameterTarget,
ReturnValueTarget, ConstructorTarget, MethodTarget, Constrainable<ParameterConstraintMappingContext>,
ReturnValueTarget, ConstructorTarget, MethodTarget,
ContainerElementTarget,
Constrainable<ParameterConstraintMappingContext>,
Cascadable<ParameterConstraintMappingContext>,
AnnotationIgnoreOptions<ParameterConstraintMappingContext> {
}
Expand Up @@ -24,6 +24,8 @@
import org.hibernate.validator.cfg.context.ContainerElementConstraintMappingContext;
import org.hibernate.validator.cfg.context.ContainerElementTarget;
import org.hibernate.validator.cfg.context.MethodConstraintMappingContext;
import org.hibernate.validator.cfg.context.ParameterConstraintMappingContext;
import org.hibernate.validator.cfg.context.ParameterTarget;
import org.hibernate.validator.cfg.context.PropertyConstraintMappingContext;
import org.hibernate.validator.internal.engine.cascading.ArrayElement;
import org.hibernate.validator.internal.engine.cascading.ValueExtractorManager;
Expand All @@ -50,7 +52,7 @@ public class ContainerElementConstraintMappingContextImpl extends CascadableCons
private static final Log LOG = LoggerFactory.make();

private final TypeConstraintMappingContextImpl<?> typeContext;
private final ContainerElementTarget parent;
private final ContainerElementTarget parentContainerElementTarget;
private final ConstraintLocation parentLocation;

/**
Expand All @@ -75,11 +77,11 @@ public class ContainerElementConstraintMappingContextImpl extends CascadableCons

private final Set<ConfiguredConstraint<?>> constraints;

ContainerElementConstraintMappingContextImpl(TypeConstraintMappingContextImpl<?> typeContext, ContainerElementTarget parent, ConstraintLocation parentLocation,
int index) {
ContainerElementConstraintMappingContextImpl(TypeConstraintMappingContextImpl<?> typeContext, ContainerElementTarget parentContainerElementTarget,
ConstraintLocation parentLocation, int index) {
super( typeContext.getConstraintMapping(), parentLocation.getTypeForValidatorResolution() );
this.typeContext = typeContext;
this.parent = parent;
this.parentContainerElementTarget = parentContainerElementTarget;
this.parentLocation = parentLocation;
this.configuredType = parentLocation.getTypeForValidatorResolution();

Expand Down Expand Up @@ -122,14 +124,24 @@ public MethodConstraintMappingContext method(String name, Class<?>... parameterT
return typeContext.method( name, parameterTypes );
}

@Override
public ParameterConstraintMappingContext parameter(int index) {
if ( parentContainerElementTarget instanceof ParameterTarget ) {
return ( (ParameterTarget) parentContainerElementTarget ).parameter( index );
}
else {
throw new RuntimeException();
}
}

@Override
public ContainerElementConstraintMappingContext containerElement() {
return parent.containerElement( 0 );
return parentContainerElementTarget.containerElement( 0 );
}

@Override
public ContainerElementConstraintMappingContext containerElement(int index, int... nestedIndexes) {
return parent.containerElement( index, nestedIndexes );
return parentContainerElementTarget.containerElement( index, nestedIndexes );
}

ContainerElementConstraintMappingContext nestedContainerElement(int[] nestedIndexes) {
Expand All @@ -139,7 +151,7 @@ ContainerElementConstraintMappingContext nestedContainerElement(int[] nestedInde

ContainerElementConstraintMappingContextImpl nestedContext = new ContainerElementConstraintMappingContextImpl(
typeContext,
parent,
parentContainerElementTarget,
ConstraintLocation.forTypeArgument( parentLocation, typeParameter, getContainerElementType() ),
nestedIndexes[0]
);
Expand Down
Expand Up @@ -7,17 +7,18 @@
package org.hibernate.validator.internal.cfg.context;

import java.lang.reflect.Type;
import java.util.Collections;

import org.hibernate.validator.cfg.ConstraintDef;
import org.hibernate.validator.cfg.context.ConstructorConstraintMappingContext;
import org.hibernate.validator.cfg.context.ContainerElementConstraintMappingContext;
import org.hibernate.validator.cfg.context.CrossParameterConstraintMappingContext;
import org.hibernate.validator.cfg.context.MethodConstraintMappingContext;
import org.hibernate.validator.cfg.context.ParameterConstraintMappingContext;
import org.hibernate.validator.cfg.context.ReturnValueConstraintMappingContext;
import org.hibernate.validator.internal.engine.cascading.ValueExtractorManager;
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl.ConstraintType;
import org.hibernate.validator.internal.metadata.location.ConstraintLocation;
import org.hibernate.validator.internal.metadata.raw.ConfigurationSource;
import org.hibernate.validator.internal.metadata.raw.ConstrainedParameter;
import org.hibernate.validator.internal.util.ReflectionHelper;
Expand Down Expand Up @@ -99,9 +100,28 @@ public MethodConstraintMappingContext method(String name, Class<?>... parameterT
return executableContext.getTypeContext().method( name, parameterTypes );
}

@Override
public ContainerElementConstraintMappingContext containerElement() {
return super.containerElement(
this,
executableContext.getTypeContext(),
ConstraintLocation.forParameter( executableContext.getExecutable(), parameterIndex )
);
}

@Override
public ContainerElementConstraintMappingContext containerElement(int index, int... nestedIndexes) {
return super.containerElement(
this,
executableContext.getTypeContext(),
ConstraintLocation.forParameter( executableContext.getExecutable(), parameterIndex ),
index,
nestedIndexes
);
}

public ConstrainedParameter build(ConstraintHelper constraintHelper, TypeResolutionHelper typeResolutionHelper,
ValueExtractorManager valueExtractorManager) {
// TODO HV-919 Support specification of type parameter constraints via XML and API
Type parameterType = ReflectionHelper.typeOf( executableContext.getExecutable(), parameterIndex );

return new ConstrainedParameter(
Expand All @@ -110,7 +130,7 @@ public ConstrainedParameter build(ConstraintHelper constraintHelper, TypeResolut
parameterType,
parameterIndex,
getConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ),
Collections.emptySet(),
getTypeArgumentConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ),
groupConversions,
getCascadedTypeParameters()
);
Expand Down
Expand Up @@ -232,7 +232,7 @@ public void declaringContainerElementConstraintForNonExistingNestedTypeArgumentI
newMapping
.type( FishTank.class )
.property( "fishOfTheMonth", FIELD )
.containerElement( 2 );
.containerElement( 1, 2 );
}

@Test(expectedExceptions = ValidationException.class, expectedExceptionsMessageRegExp = "HV000213.*")
Expand Down
Expand Up @@ -229,7 +229,7 @@ public void declaringContainerElementConstraintForNonExistingNestedTypeArgumentI
newMapping
.type( FishTank.class )
.property( "fishOfTheMonth", METHOD )
.containerElement( 2 );
.containerElement( 1, 2 );
}

@Test(expectedExceptions = ValidationException.class, expectedExceptionsMessageRegExp = "HV000213.*")
Expand Down

0 comments on commit a46e7b2

Please sign in to comment.