/*
* 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;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.ElementType;
import javax.validation.Configuration;
import javax.validation.Path;
import javax.validation.TraversableResolver;
import javax.validation.ValidationException;
import javax.validation.ValidatorFactory;
import org.testng.annotations.Test;
import org.hibernate.validator.HibernateValidatorConfiguration;
import org.hibernate.validator.testutil.TestForIssue;
import static org.hibernate.validator.testutils.ValidatorUtil.getConfiguration;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNotSame;
import static org.testng.Assert.assertTrue;
/**
* @author Hardy Ferentschik
*/
public class ConfigurationImplTest {
@Test
@TestForIssue(jiraKey = "HV-563")
public void testCallBuildValidatorFactoryMultipleTimes() {
final Configuration<HibernateValidatorConfiguration> configuration = getConfiguration();
ValidatorFactory factory1 = configuration.buildValidatorFactory();
assertNotNull( factory1 );
ValidatorFactory factory2 = configuration.buildValidatorFactory();
assertNotNull( factory2 );
assertNotSame( factory1, factory2 );
}
@Test
@TestForIssue(jiraKey = "HV-563")
public void testConfigurationReusableAndMutable() {
final Configuration<HibernateValidatorConfiguration> configuration = getConfiguration();
ValidatorFactory factory1 = configuration.buildValidatorFactory();
assertNotNull( factory1 );
configuration.traversableResolver( new TestTraversableResolver() );
ValidatorFactory factory2 = configuration.buildValidatorFactory();
assertNotNull( factory2 );
assertNotSame( factory1.getTraversableResolver(), factory2.getTraversableResolver() );
assertTrue( factory2.getTraversableResolver() instanceof TestTraversableResolver );
}
@Test
@TestForIssue(jiraKey = "HV-563")
public void testReusableConfigurationWithInputStream() throws Exception {
final Configuration<HibernateValidatorConfiguration> configuration = getConfiguration();
InputStream mappingStream = ConfigurationImplTest.class.getResourceAsStream( "mapping.xml" );
try {
configuration.addMapping( mappingStream );
ValidatorFactory factory1 = configuration.buildValidatorFactory();
assertNotNull( factory1 );
ValidatorFactory factory2 = configuration.buildValidatorFactory();
assertNotNull( factory2 );
assertNotSame( factory1, factory2 );
}
finally {
mappingStream.close();
}
}
@Test
@TestForIssue(jiraKey = "HV-563")
public void testReusableConfigurationWithNonResettableInputStream() throws Exception {
final Configuration<HibernateValidatorConfiguration> configuration = getConfiguration();
InputStream mappingStream = ConfigurationImplTest.class.getResourceAsStream( "mapping.xml" );
try {
configuration.addMapping( new NonResettableInputStream( mappingStream ) );
ValidatorFactory factory1 = configuration.buildValidatorFactory();
assertNotNull( factory1 );
ValidatorFactory factory2 = configuration.buildValidatorFactory();
assertNotNull( factory2 );
assertNotSame( factory1, factory2 );
}
finally {
mappingStream.close();
}
}
@Test(expectedExceptions = ValidationException.class, expectedExceptionsMessageRegExp = "HV000190.*")
// UnableToDetermineSchemaVersionException
@TestForIssue(jiraKey = "HV-563")
public void testReusableConfigurationWithClosedInputStream() throws Exception {
final Configuration<HibernateValidatorConfiguration> configuration = getConfiguration();
InputStream mappingStream = ConfigurationImplTest.class.getResourceAsStream( "mapping.xml" );
try {
configuration.addMapping( mappingStream );
ValidatorFactory factory1 = configuration.buildValidatorFactory();
assertNotNull( factory1 );
}
finally {
mappingStream.close();
}
configuration.buildValidatorFactory();
}
private static class TestTraversableResolver implements TraversableResolver {
@Override
public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
return true;
}
@Override
public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
return true;
}
}
private static class NonResettableInputStream extends InputStream {
private InputStream delegate;
public NonResettableInputStream(InputStream delegate) {
this.delegate = delegate;
}
@Override
public int read() throws IOException {
return delegate.read();
}
}
}