/*
* Created on 2004-12-01
*
*/
package org.hibernate.tool.hbm2x;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.JDBCMetaDataConfiguration;
import org.hibernate.cfg.JDBCReaderFactory;
import org.hibernate.cfg.MetaDataDialectFactory;
import org.hibernate.cfg.reveng.DatabaseCollector;
import org.hibernate.cfg.reveng.DefaultDatabaseCollector;
import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.JDBCReader;
import org.hibernate.cfg.reveng.ReverseEngineeringRuntimeInfo;
import org.hibernate.cfg.reveng.dialect.CachedMetaDataDialect;
import org.hibernate.cfg.reveng.dialect.MetaDataDialect;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.mapping.Table;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.JDBCMetaDataBinderTestCase;
/**
* @author max
*
*/
public class CachedMetaDataTest extends JDBCMetaDataBinderTestCase {
protected void configure(JDBCMetaDataConfiguration configuration) {
super.configure( configuration );
}
public class MockedMetaDataDialect implements MetaDataDialect {
MetaDataDialect delegate;
private boolean failOnDelegateAccess;
public MockedMetaDataDialect(MetaDataDialect realMetaData) {
delegate = realMetaData;
}
public void close() {
delegate.close();
}
public void close(Iterator<?> iterator) {
delegate.close( iterator );
}
public void configure(ReverseEngineeringRuntimeInfo info) {
delegate.configure(info);
}
public Iterator<Map<String, Object>> getColumns(String catalog, String schema, String table, String column) {
if(failOnDelegateAccess) {
throw new IllegalStateException("delegate not accessible");
} else {
return delegate.getColumns( catalog, schema, table, column );
}
}
public Iterator<Map<String, Object>> getExportedKeys(String catalog, String schema, String table) {
if(failOnDelegateAccess) {
throw new IllegalStateException("delegate not accessible");
} else {
return delegate.getExportedKeys( catalog, schema, table );
}
}
public Iterator<Map<String, Object>> getIndexInfo(String catalog, String schema, String table) {
if(failOnDelegateAccess) {
throw new IllegalStateException("delegate not accessible");
} else {
return delegate.getIndexInfo( catalog, schema, table );
}
}
public Iterator<Map<String, Object>> getPrimaryKeys(String catalog, String schema, String name) {
if(failOnDelegateAccess) {
throw new IllegalStateException("delegate not accessible");
} else {
return delegate.getPrimaryKeys( catalog, schema, name );
}
}
public Iterator<Map<String, Object>> getTables(String catalog, String schema, String table) {
if(failOnDelegateAccess) {
throw new IllegalStateException("delegate not accessible");
} else {
return delegate.getTables( catalog, schema, table );
}
}
public boolean needQuote(String name) {
return delegate.needQuote( name );
}
public void setDelegate(Object object) {
this.delegate = null;
}
public void setFailOnDelegateAccess(boolean b) {
failOnDelegateAccess = b;
}
public Iterator<Map<String, Object>> getSuggestedPrimaryKeyStrategyName(String catalog, String schema, String name) {
if(failOnDelegateAccess) {
throw new IllegalStateException("delegate not accessible");
} else {
return delegate.getSuggestedPrimaryKeyStrategyName(catalog, schema, name);
}
}
}
public void testCachedDialect() {
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder();
ServiceRegistry serviceRegistry = builder.build();
Properties properties = cfg.getProperties();
MetaDataDialect realMetaData = MetaDataDialectFactory.createMetaDataDialect( serviceRegistry.getService(JdbcServices.class).getDialect(), cfg.getProperties() );
MockedMetaDataDialect mock = new MockedMetaDataDialect(realMetaData);
CachedMetaDataDialect dialect = new CachedMetaDataDialect(mock);
JDBCReader reader = JDBCReaderFactory.newJDBCReader( properties, new DefaultReverseEngineeringStrategy(), dialect, serviceRegistry );
DatabaseCollector dc = new DefaultDatabaseCollector(reader.getMetaDataDialect());
reader.readDatabaseSchema( dc, null, null );
validate( dc );
mock.setFailOnDelegateAccess(true);
reader = JDBCReaderFactory.newJDBCReader( properties, new DefaultReverseEngineeringStrategy(), dialect, serviceRegistry );
dc = new DefaultDatabaseCollector(reader.getMetaDataDialect());
reader.readDatabaseSchema( dc, null, null );
validate(dc);
}
private void validate(DatabaseCollector dc) {
Iterator<Table> iterator = dc.iterateTables();
Table table = iterator.next();
Table master = null, child = null;
if ("MASTER".equals(table.getName())) {
master = table;
child = iterator.next();
} else if ("CHILD".equals(table.getName())) {
child = table;
master = iterator.next();
} else {
fail("Only tables named 'MASTER' and 'CHILD' should exist");
}
assertNotNull(child);
assertNotNull(master);
iterator = dc.iterateTables();
assertNotNull(iterator.next());
assertNotNull(iterator.next());
assertFalse(iterator.hasNext());
assertHasNext("should have recorded one foreignkey to child table", 1, child.getForeignKeyIterator() );
}
protected String[] getCreateSQL() {
return new String[] {
"create table master ( id char not null, name varchar(20), primary key (id) )",
"create table child ( childid char not null, masterref char, primary key (childid), foreign key (masterref) references master(id) )",
};
}
protected String[] getDropSQL() {
return new String[] {
"drop table child",
"drop table master",
};
}
}