/*
* 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.namingstrategy.complete;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.registry.BootstrapServiceRegistry;
import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* @author Steve Ebersole
*/
public abstract class BaseNamingTests extends BaseUnitTestCase {
@Test
public void doTest() {
final MetadataSources metadataSources = new MetadataSources();
try {
applySources( metadataSources );
final Metadata metadata = metadataSources.getMetadataBuilder()
.applyImplicitNamingStrategy( getImplicitNamingStrategyToUse() )
.build();
validateCustomer( metadata );
validateOrder( metadata );
validateZipCode( metadata );
validateCustomerRegisteredTrademarks( metadata );
validateCustomerAddresses( metadata );
validateCustomerOrders( metadata );
validateCustomerIndustries( metadata );
}
finally {
ServiceRegistry metaServiceRegistry = metadataSources.getServiceRegistry();
if(metaServiceRegistry instanceof BootstrapServiceRegistry ) {
BootstrapServiceRegistryBuilder.destroy( metaServiceRegistry );
}
}
}
protected abstract void applySources(MetadataSources metadataSources);
protected abstract ImplicitNamingStrategy getImplicitNamingStrategyToUse();
protected void validateCustomer(Metadata metadata) {
final PersistentClass customerBinding = metadata.getEntityBinding( Customer.class.getName() );
assertNotNull( customerBinding );
validateCustomerPrimaryTableName( customerBinding.getTable().getQuotedName() );
assertEquals( 1, customerBinding.getIdentifier().getColumnSpan() );
validateCustomerPrimaryKeyColumn( (Column) customerBinding.getIdentifier().getColumnIterator().next() );
assertNotNull( customerBinding.getVersion() );
assertEquals( 1, customerBinding.getVersion().getColumnSpan() );
validateCustomerVersionColumn( (Column) customerBinding.getVersion().getColumnIterator().next() );
final Property nameBinding = customerBinding.getProperty( "name" );
assertNotNull( nameBinding );
assertEquals( 1, nameBinding.getColumnSpan() );
validateCustomerNameColumn( (Column) nameBinding.getColumnIterator().next() );
final Property hqAddressBinding = customerBinding.getProperty( "hqAddress" );
assertNotNull( hqAddressBinding );
assertEquals( 3, hqAddressBinding.getColumnSpan() );
validateCustomerHqAddressComponent( assertTyping( Component.class, hqAddressBinding.getValue() ) );
}
protected abstract void validateCustomerPrimaryTableName(String name);
protected abstract void validateCustomerPrimaryKeyColumn(Column column);
protected abstract void validateCustomerVersionColumn(Column column);
protected abstract void validateCustomerNameColumn(Column column);
protected abstract void validateCustomerHqAddressComponent(Component component);
protected void validateOrder(Metadata metadata) {
final PersistentClass orderBinding = metadata.getEntityBinding( Order.class.getName() );
assertNotNull( orderBinding );
validateOrderPrimaryTableName( orderBinding.getTable().getQuotedName() );
assertEquals( 1, orderBinding.getIdentifier().getColumnSpan() );
validateOrderPrimaryKeyColumn( (Column) orderBinding.getIdentifier().getColumnIterator().next() );
final Property referenceCodeBinding = orderBinding.getProperty( "referenceCode" );
assertNotNull( referenceCodeBinding );
assertEquals( 1, referenceCodeBinding.getColumnSpan() );
validateOrderReferenceCodeColumn( (Column) referenceCodeBinding.getColumnIterator().next() );
final Property placedBinding = orderBinding.getProperty( "placed" );
assertNotNull( placedBinding );
assertEquals( 1, placedBinding.getColumnSpan() );
validateOrderPlacedColumn( (Column) placedBinding.getColumnIterator().next() );
final Property fulfilledBinding = orderBinding.getProperty( "fulfilled" );
assertNotNull( fulfilledBinding );
assertEquals( 1, fulfilledBinding.getColumnSpan() );
validateOrderFulfilledColumn( (Column) fulfilledBinding.getColumnIterator().next() );
final Property customerBinding = orderBinding.getProperty( "customer" );
assertNotNull( customerBinding );
assertEquals( 1, customerBinding.getColumnSpan() );
validateOrderCustomerColumn( (Column) customerBinding.getColumnIterator().next() );
}
protected abstract void validateOrderPrimaryTableName(String name);
protected abstract void validateOrderPrimaryKeyColumn(Column column);
protected abstract void validateOrderReferenceCodeColumn(Column column);
protected abstract void validateOrderFulfilledColumn(Column column);
protected abstract void validateOrderPlacedColumn(Column column);
protected abstract void validateOrderCustomerColumn(Column column);
protected void validateZipCode(Metadata metadata) {
final PersistentClass zipCodeBinding = metadata.getEntityBinding( ZipCode.class.getName() );
assertNotNull( zipCodeBinding );
validateZipCodePrimaryTableName( zipCodeBinding.getTable().getQuotedName() );
assertEquals( 1, zipCodeBinding.getIdentifier().getColumnSpan() );
validateZipCodePrimaryKeyColumn( (Column) zipCodeBinding.getIdentifier().getColumnIterator().next() );
final Property codeBinding = zipCodeBinding.getProperty( "code" );
assertNotNull( codeBinding );
assertEquals( 1, codeBinding.getColumnSpan() );
validateZipCodeCodeColumn( (Column) codeBinding.getColumnIterator().next() );
final Property cityBinding = zipCodeBinding.getProperty( "city" );
assertNotNull( cityBinding );
assertEquals( 1, cityBinding.getColumnSpan() );
validateZipCodeCityColumn( (Column) cityBinding.getColumnIterator().next() );
final Property stateBinding = zipCodeBinding.getProperty( "state" );
assertNotNull( stateBinding );
assertEquals( 1, stateBinding.getColumnSpan() );
validateZipCodeStateColumn( (Column) stateBinding.getColumnIterator().next() );
}
protected abstract void validateZipCodePrimaryTableName(String name);
protected abstract void validateZipCodePrimaryKeyColumn(Column column);
protected abstract void validateZipCodeCodeColumn(Column column);
protected abstract void validateZipCodeCityColumn(Column column);
protected abstract void validateZipCodeStateColumn(Column column);
protected void validateCustomerRegisteredTrademarks(Metadata metadata) {
final Collection collectionBinding = metadata.getCollectionBinding( Customer.class.getName() + ".registeredTrademarks" );
assertNotNull( collectionBinding );
validateCustomerRegisteredTrademarksTableName( collectionBinding.getCollectionTable().getQuotedName() );
assertEquals( 1, collectionBinding.getKey().getColumnSpan() );
validateCustomerRegisteredTrademarksKeyColumn( (Column) collectionBinding.getKey().getColumnIterator().next() );
assertEquals( 1, collectionBinding.getElement().getColumnSpan() );
validateCustomerRegisteredTrademarksElementColumn(
(Column) collectionBinding.getElement()
.getColumnIterator()
.next()
);
}
protected abstract void validateCustomerRegisteredTrademarksTableName(String name);
protected abstract void validateCustomerRegisteredTrademarksKeyColumn(Column column);
protected abstract void validateCustomerRegisteredTrademarksElementColumn(Column column);
protected void validateCustomerAddresses(Metadata metadata) {
final Collection collectionBinding = metadata.getCollectionBinding( Customer.class.getName() + ".addresses" );
assertNotNull( collectionBinding );
validateCustomerAddressesTableName( collectionBinding.getCollectionTable().getQuotedName() );
assertEquals( 1, collectionBinding.getKey().getColumnSpan() );
validateCustomerAddressesKeyColumn( (Column) collectionBinding.getKey().getColumnIterator().next() );
assertEquals( 3, collectionBinding.getElement().getColumnSpan() );
validateCustomerAddressesElementComponent( assertTyping( Component.class, collectionBinding.getElement() ) );
}
protected abstract void validateCustomerAddressesTableName(String name);
protected abstract void validateCustomerAddressesKeyColumn(Column column);
protected abstract void validateCustomerAddressesElementComponent(Component component);
protected void validateCustomerOrders(Metadata metadata) {
final Collection collectionBinding = metadata.getCollectionBinding( Customer.class.getName() + ".orders" );
assertNotNull( collectionBinding );
validateCustomerOrdersTableName( collectionBinding.getCollectionTable().getQuotedName() );
assertEquals( 1, collectionBinding.getKey().getColumnSpan() );
validateCustomerOrdersKeyColumn( (Column) collectionBinding.getKey().getColumnIterator().next() );
assertEquals( 1, collectionBinding.getElement().getColumnSpan() );
validateCustomerOrdersElementColumn( (Column) collectionBinding.getElement().getColumnIterator().next() );
}
protected abstract void validateCustomerOrdersTableName(String name);
protected abstract void validateCustomerOrdersKeyColumn(Column column);
protected abstract void validateCustomerOrdersElementColumn(Column column);
protected void validateCustomerIndustries(Metadata metadata) {
final Collection collectionBinding = metadata.getCollectionBinding( Customer.class.getName() + ".industries" );
assertNotNull( collectionBinding );
validateCustomerIndustriesTableName( collectionBinding.getCollectionTable().getQuotedName() );
assertEquals( 1, collectionBinding.getKey().getColumnSpan() );
validateCustomerIndustriesKeyColumn( (Column) collectionBinding.getKey().getColumnIterator().next() );
assertEquals( 1, collectionBinding.getElement().getColumnSpan() );
validateCustomerIndustriesElementColumn( (Column) collectionBinding.getElement().getColumnIterator().next() );
}
protected abstract void validateCustomerIndustriesTableName(String name);
protected abstract void validateCustomerIndustriesKeyColumn(Column column);
protected abstract void validateCustomerIndustriesElementColumn(Column column);
}