/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.mapping;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.mapping.Any;
import org.hibernate.mapping.Array;
import org.hibernate.mapping.Bag;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.DependantValue;
import org.hibernate.mapping.IdentifierBag;
import org.hibernate.mapping.List;
import org.hibernate.mapping.ManyToOne;
import org.hibernate.mapping.Map;
import org.hibernate.mapping.OneToMany;
import org.hibernate.mapping.OneToOne;
import org.hibernate.mapping.PrimitiveArray;
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.Set;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;
import org.hibernate.mapping.ValueVisitor;
import org.hibernate.testing.boot.MetadataBuildingContextTestingImpl;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author max
*/
public class ValueVisitorTest extends BaseUnitTestCase {
private StandardServiceRegistry serviceRegistry;
private MetadataBuildingContext metadataBuildingContext;
@Before
public void prepare() {
serviceRegistry = new StandardServiceRegistryBuilder().build();
metadataBuildingContext = new MetadataBuildingContextTestingImpl( serviceRegistry );
}
@After
public void release() {
StandardServiceRegistryBuilder.destroy( serviceRegistry );
}
@Test
public void testProperCallbacks() {
final MetadataImplementor metadata =
(MetadataImplementor) new MetadataSources( serviceRegistry )
.buildMetadata();
final Table tbl = new Table();
final RootClass rootClass = new RootClass( metadataBuildingContext );
ValueVisitor vv = new ValueVisitorValidator();
new Any( metadata, tbl ).accept( vv );
new Array( metadata, rootClass ).accept( vv );
new Bag( metadata, rootClass ).accept( vv );
new Component( metadata, rootClass ).accept( vv );
new DependantValue( metadata, tbl, null ).accept( vv );
new IdentifierBag( metadata, rootClass ).accept( vv );
new List( metadata, rootClass ).accept( vv );
new ManyToOne( metadata, tbl ).accept( vv );
new Map( metadata, rootClass ).accept( vv );
new OneToMany( metadata, rootClass ).accept( vv );
new OneToOne( metadata, tbl, rootClass ).accept( vv );
new PrimitiveArray( metadata, rootClass ).accept( vv );
new Set( metadata, rootClass ).accept( vv );
new SimpleValue( metadata ).accept( vv );
}
static public class ValueVisitorValidator implements ValueVisitor {
public Object accept(PrimitiveArray primitiveArray) {
return validate( PrimitiveArray.class, primitiveArray );
}
public Object accept(Bag bag) {
return validate( Bag.class, bag );
}
public Object accept(DependantValue value) {
return validate( DependantValue.class, value );
}
private Object validate(Class expectedClass, Object visitee) {
if ( !visitee.getClass().getName().equals( expectedClass.getName() ) ) {
throw new IllegalStateException(
visitee.getClass().getName()
+ " did not call proper accept method. Was "
+ expectedClass.getName()
);
}
return null;
}
public Object accept(IdentifierBag bag) {
return validate( IdentifierBag.class, bag );
}
public Object accept(List list) {
return validate( List.class, list );
}
public Object accept(Map map) {
return validate( Map.class, map );
}
public Object accept(Array list) {
return validate( Array.class, list );
}
public Object accept(OneToMany many) {
return validate( OneToMany.class, many );
}
public Object accept(Set set) {
return validate( Set.class, set );
}
public Object accept(Any any) {
return validate( Any.class, any );
}
public Object accept(SimpleValue value) {
return validate( SimpleValue.class, value );
}
public Object accept(Component component) {
return validate( Component.class, component );
}
public Object accept(ManyToOne mto) {
return validate( ManyToOne.class, mto );
}
public Object accept(OneToOne oto) {
return validate( OneToOne.class, oto );
}
}
}