/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.test.internal.engine.valuehandling;
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertCorrectPropertyPaths;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.NotNull;
import javax.validation.valueextraction.ExtractedValue;
import javax.validation.valueextraction.ValueExtractor;
import javax.validation.valueextraction.ValueExtractorDefinitionException;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.testutil.TestForIssue;
import org.testng.annotations.Test;
/**
* @author Guillaume Smet
*/
public class ValueExtractorDefinitionInHierarchyTest {
@Test
@TestForIssue(jiraKey = "HV-1290")
public void canFindValueExtractorDefinitionInClassHierarchy() {
Entity entity = new Entity( null );
Validator validator = Validation.byProvider( HibernateValidator.class )
.configure()
.addValueExtractor( new ValueExtractorDefinedInParentClassChild() )
.buildValidatorFactory()
.getValidator();
Set<ConstraintViolation<Entity>> violations = validator.validate( entity );
assertCorrectPropertyPaths( violations, "property.wrapped" );
}
@Test
@TestForIssue(jiraKey = "HV-1290")
public void canFindValueExtractorDefinitionInImplementedInterfaces() {
Entity entity = new Entity( null );
Validator validator = Validation.byProvider( HibernateValidator.class )
.configure()
.addValueExtractor( new ValueExtractorDefinedInImplementedInterfaceChild() )
.buildValidatorFactory()
.getValidator();
Set<ConstraintViolation<Entity>> violations = validator.validate( entity );
assertCorrectPropertyPaths( violations, "property.wrapped" );
}
@Test(expectedExceptions = ValueExtractorDefinitionException.class, expectedExceptionsMessageRegExp = "HV000218.*")
@TestForIssue(jiraKey = "HV-1290")
public void parallelValueExtractorDefinitionsCausesException() throws Exception {
Validation.byProvider( HibernateValidator.class )
.configure()
.addValueExtractor( new ValueExtractorWithParallelDefinitionsChild() )
.buildValidatorFactory()
.getValidator();
}
private class Entity {
private Wrapper<@NotNull String> property;
public Entity(String property) {
this.property = new Wrapper<>( property );
}
@SuppressWarnings("unused")
public Wrapper<String> getProperty() {
return property;
}
}
private class Wrapper<T> {
private final T value;
public Wrapper(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
private static class ValueExtractorDefinedInParentClassChild extends ValueExtractorDefinedInParentClassParent {
@Override
public void extractValues(Wrapper<?> originalValue, ValueReceiver receiver) {
receiver.value( "wrapped", originalValue.getValue() );
}
}
private abstract static class ValueExtractorDefinedInParentClassParent implements ValueExtractor<Wrapper<@ExtractedValue ?>> {
}
private static class ValueExtractorDefinedInImplementedInterfaceChild implements ValueExtractorDefinedInImplementedInterfaceParent {
@Override
public void extractValues(Wrapper<?> originalValue, ValueReceiver receiver) {
receiver.value( "wrapped", originalValue.getValue() );
}
}
private interface ValueExtractorDefinedInImplementedInterfaceParent extends ValueExtractor<Wrapper<@ExtractedValue ?>> {
}
private static class ValueExtractorWithParallelDefinitionsChild implements ValueExtractorWithParallelDefinitionsParent1, ValueExtractorWithParallelDefinitionsParent2 {
@Override
public void extractValues(Wrapper<?> originalValue, ValueReceiver receiver) {
receiver.value( "wrapped", originalValue.getValue() );
}
}
private interface ValueExtractorWithParallelDefinitionsParent1 extends ValueExtractorWithParallelDefinitionsGrandParent1 {
}
private interface ValueExtractorWithParallelDefinitionsParent2 extends ValueExtractorWithParallelDefinitionsGrandParent2 {
}
private interface ValueExtractorWithParallelDefinitionsGrandParent1 extends ValueExtractor<Wrapper<@ExtractedValue ?>> {
}
private interface ValueExtractorWithParallelDefinitionsGrandParent2 extends ValueExtractor<Wrapper<@ExtractedValue ?>> {
}
}