org.hibernate.validator.internal.engine.constraintvalidation.CrossParameterConstraintValidatorContextImpl Maven / Gradle / Ivy
/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or .
*/
package org.hibernate.validator.internal.engine.constraintvalidation;
import java.util.List;
import jakarta.validation.ClockProvider;
import jakarta.validation.ElementKind;
import jakarta.validation.metadata.ConstraintDescriptor;
import org.hibernate.validator.constraintvalidation.HibernateCrossParameterConstraintValidatorContext;
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.hibernate.validator.internal.util.Contracts;
/**
* @author Marko Bekhta
*/
public class CrossParameterConstraintValidatorContextImpl extends ConstraintValidatorContextImpl implements HibernateCrossParameterConstraintValidatorContext {
private final List methodParameterNames;
public CrossParameterConstraintValidatorContextImpl(List methodParameterNames, ClockProvider clockProvider, PathImpl propertyPath, ConstraintDescriptor constraintDescriptor, Object constraintValidatorPayload) {
super( clockProvider, propertyPath, constraintDescriptor, constraintValidatorPayload );
Contracts.assertTrue( propertyPath.getLeafNode().getKind() == ElementKind.CROSS_PARAMETER, "Context can only be used for corss parameter validation" );
this.methodParameterNames = methodParameterNames;
}
@Override
public final ConstraintViolationBuilder buildConstraintViolationWithTemplate(String messageTemplate) {
return new CrossParameterConstraintViolationBuilderImpl(
methodParameterNames,
messageTemplate,
getCopyOfBasePath()
);
}
@Override
public List getMethodParameterNames() {
return methodParameterNames;
}
@Override
public T unwrap(Class type) {
//allow unwrapping into public super types
if ( type.isAssignableFrom( HibernateCrossParameterConstraintValidatorContext.class ) ) {
return type.cast( this );
}
return super.unwrap( type );
}
private class CrossParameterConstraintViolationBuilderImpl extends ConstraintViolationBuilderImpl {
private final List methodParameterNames;
private CrossParameterConstraintViolationBuilderImpl(List methodParameterNames, String template, PathImpl path) {
super( template, path );
this.methodParameterNames = methodParameterNames;
}
@Override
public NodeBuilderDefinedContext addParameterNode(int index) {
dropLeafNode();
propertyPath.addParameterNode( methodParameterNames.get( index ), index );
return new NodeBuilder( messageTemplate, propertyPath );
}
private void dropLeafNode() {
propertyPath = PathImpl.createCopyWithoutLeafNode( propertyPath );
}
}
}