/* * Created on 2004-12-01 * */ package org.hibernate.tool.hbm2x; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.JDBCMetaDataConfiguration; import org.hibernate.cfg.JDBCReaderFactory; 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.SchemaSelection; import org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect; import org.hibernate.mapping.Table; import org.hibernate.service.ServiceRegistry; import org.hibernate.tool.JDBCMetaDataBinderTestCase; import org.hibernate.tool.hbmlint.detector.TableSelectorStrategy; /** * @author max * */ public class IncrementalSchemaReadingTest extends JDBCMetaDataBinderTestCase { protected void configure(JDBCMetaDataConfiguration configuration) { super.configure( configuration ); } public class MockedMetaDataDialect extends JDBCMetaDataDialect { List<String> gottenTables = new ArrayList<String>(); public Iterator<Map<String, Object>> getTables(String catalog, String schema, String table) { gottenTables.add(table); return super.getTables( catalog, schema, table ); } } public void testReadSchemaIncremental() { StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); builder.applySettings(cfg.getProperties()); ServiceRegistry serviceRegistry = builder.build(); TableSelectorStrategy tss = new TableSelectorStrategy(new DefaultReverseEngineeringStrategy()); MockedMetaDataDialect mockedMetaDataDialect = new MockedMetaDataDialect(); JDBCReader reader = JDBCReaderFactory.newJDBCReader( cfg.getProperties(), tss, mockedMetaDataDialect, serviceRegistry); tss.addSchemaSelection( new SchemaSelection(null,null, "CHILD") ); DatabaseCollector dc = new DefaultDatabaseCollector(reader.getMetaDataDialect()); reader.readDatabaseSchema( dc, null, null ); assertEquals(mockedMetaDataDialect.gottenTables.size(),1); assertEquals(mockedMetaDataDialect.gottenTables.get(0),"CHILD"); Iterator<Table> iterator = dc.iterateTables(); Table firstChild = iterator.next(); assertEquals(firstChild.getName(), "CHILD"); assertFalse(iterator.hasNext()); assertFalse("should not record foreignkey to table it doesn't know about yet",firstChild.getForeignKeyIterator().hasNext()); tss.clearSchemaSelections(); tss.addSchemaSelection( new SchemaSelection(null, null, "MASTER") ); mockedMetaDataDialect.gottenTables.clear(); reader.readDatabaseSchema( dc, null, null ); assertEquals(mockedMetaDataDialect.gottenTables.size(),1); assertEquals(mockedMetaDataDialect.gottenTables.get(0),"MASTER"); iterator = dc.iterateTables(); assertNotNull(iterator.next()); assertNotNull(iterator.next()); assertFalse(iterator.hasNext()); Table table = dc.getTable( "PUBLIC", "PUBLIC", "CHILD" ); assertSame( firstChild, table ); assertHasNext("should have recorded one foreignkey to child table", 1, firstChild.getForeignKeyIterator() ); tss.clearSchemaSelections(); reader.readDatabaseSchema( dc, null, null ); Table finalMaster = dc.getTable( "PUBLIC", "PUBLIC", "MASTER" ); assertSame(firstChild, dc.getTable( "PUBLIC", "PUBLIC", "CHILD" )); assertHasNext( 1, firstChild.getForeignKeyIterator() ); assertHasNext( 0, finalMaster.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", }; } }