/** * Read JDBC Metadata from the database. Does not create any classes or other ORM releated structures. * * @param catalog * @param schema * @return * @throws SQLException */ public DatabaseCollector readDatabaseSchema(String catalog, String schema) throws SQLException { // use default from settings if nothing else specified. catalog = catalog!=null ? catalog : properties.getProperty(AvailableSettings.DEFAULT_CATALOG); schema = schema!=null ? schema : properties.getProperty(AvailableSettings.DEFAULT_SCHEMA); JDBCReader reader = JDBCReaderFactory.newJDBCReader(properties,revengStrategy,serviceRegistry); DatabaseCollector dbs = new MappingsDatabaseCollector(metadataCollector, reader.getMetaDataDialect()); reader.readDatabaseSchema(dbs, catalog, schema); return dbs; }
/** * Iterates the tables and find all the foreignkeys that refers to something that is available inside the DatabaseCollector. * @param dbs * @param progress * @param tables * @return */ private Map<String, List<ForeignKey>> resolveForeignKeys(DatabaseCollector dbs, Iterator<Table> tables, ProgressListener progress) { List<ForeignKeysInfo> fks = new ArrayList<ForeignKeysInfo>(); while ( tables.hasNext() ) { Table table = (Table) tables.next(); // Done here after the basic process of collections as we might not have touched // all referenced tables (this ensure the columns are the same instances througout the basic JDBC derived model. // after this stage it should be "ok" to divert from keeping columns in sync as it can be required if the same //column is used with different aliases in the ORM mapping. ForeignKeysInfo foreignKeys = ForeignKeyProcessor.processForeignKeys(getMetaDataDialect(), revengStrategy, defaultSchema, defaultCatalog, dbs, table, progress); fks.add( foreignKeys ); } Map<String, List<ForeignKey>> oneToManyCandidates = new HashMap<String, List<ForeignKey>>(); for (Iterator<ForeignKeysInfo> iter = fks.iterator(); iter.hasNext();) { ForeignKeysInfo element = iter.next(); Map<String, List<ForeignKey>> map = element.process( revengStrategy ); // the actual foreignkey is created here. mergeMultiMap( oneToManyCandidates, map ); } return oneToManyCandidates; }
public List<Table> readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema, ProgressListener progress) { try { ReverseEngineeringRuntimeInfo info = new ReverseEngineeringRuntimeInfo(provider, sec, dbs); getMetaDataDialect().configure(info); revengStrategy.configure(info); List<Table> foundTables = new ArrayList<Table>(); if(schemaSelectors==null) { foundTables.addAll(TableProcessor.processTables(getMetaDataDialect(), revengStrategy, defaultSchema, defaultCatalog, dbs, new SchemaSelection(catalog, schema), hasIndices, progress)); } else { for (Iterator<SchemaSelection> iter = schemaSelectors.iterator(); iter.hasNext();) { SchemaSelection selection = iter.next(); foundTables.addAll(TableProcessor.processTables(getMetaDataDialect(), revengStrategy, defaultSchema, defaultCatalog, dbs, selection, hasIndices, progress)); BasicColumnProcessor.processBasicColumns(getMetaDataDialect(), revengStrategy, defaultSchema, defaultCatalog, table, progress); PrimaryKeyProcessor.processPrimaryKey(getMetaDataDialect(), revengStrategy, defaultSchema, defaultCatalog, dbs, table); if(hasIndices.contains(table)) { IndexProcessor.processIndices(getMetaDataDialect(), defaultSchema, defaultCatalog, table); Map<String, List<ForeignKey>> oneToManyCandidates = resolveForeignKeys( dbs, tables, progress ); getMetaDataDialect().close(); revengStrategy.close();
public List<Table> readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema) { return readDatabaseSchema(dbs, catalog, schema, new NoopProgressListener()); }
public static JDBCReader newJDBCReader( Properties properties, ReverseEngineeringStrategy revengStrategy, MetaDataDialect mdd, ServiceRegistry serviceRegistry) { SQLExceptionConverter sqlExceptionConverter = serviceRegistry .getService(JdbcServices.class) .getSqlExceptionHelper() .getSqlExceptionConverter(); ConnectionProvider connectionProvider = serviceRegistry .getService(ConnectionProvider.class); String defaultCatalogName = properties .getProperty(AvailableSettings.DEFAULT_CATALOG); String defaultSchemaName = properties .getProperty(AvailableSettings.DEFAULT_SCHEMA); return new JDBCReader( mdd, connectionProvider, sqlExceptionConverter, defaultCatalogName, defaultSchemaName, revengStrategy ); }
public void visitGenerators(IssueCollector collector) { Iterator<?> iter = iterateGenerators(); Set<?> sequences = Collections.EMPTY_SET; if(dialect.supportsSequences()) { sequences = reader.readSequences(dialect.getQuerySequencesString()); } // TODO: move this check into something that could check per class or collection instead. while ( iter.hasNext() ) { PersistentIdentifierGenerator generator = (PersistentIdentifierGenerator) iter.next(); Object key = generator.generatorKey(); if ( !isSequence(key, sequences) && !isTable( key ) ) { collector.reportIssue( new Issue( "MISSING_ID_GENERATOR", Issue.HIGH_PRIORITY, "Missing sequence or table: " + key)); } } }
public void initialize(Metadata metadata) { super.initialize( metadata); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); ServiceRegistry serviceRegistry = builder.build(); dialect = serviceRegistry.getService(JdbcServices.class).getDialect(); tableSelector = new TableSelectorStrategy( new DefaultReverseEngineeringStrategy() ); reader = JDBCReaderFactory.newJDBCReader( Environment.getProperties(), tableSelector, serviceRegistry); dbc = new DefaultDatabaseCollector(reader.getMetaDataDialect()); }
private boolean isTable(Object key) throws HibernateException { // BIG HACK - should probably utilize the table cache before going to the jdbcreader :( if(key instanceof String) { String[] strings = StringHelper.split(".", (String) key); if(strings.length==1) { tableSelector.clearSchemaSelections(); tableSelector.addSchemaSelection( new SchemaSelection(null,null, strings[0]) ); List<?> list = reader.readDatabaseSchema( dbc, null, null ); return !list.isEmpty(); } else if(strings.length==3) { tableSelector.clearSchemaSelections(); tableSelector.addSchemaSelection( new SchemaSelection(strings[0],strings[1], strings[2]) ); List<?> list = reader.readDatabaseSchema( dbc, null, null ); return !list.isEmpty(); } else if (strings.length==2) { tableSelector.clearSchemaSelections(); tableSelector.addSchemaSelection( new SchemaSelection(null,strings[0], strings[1]) ); List<?> list = reader.readDatabaseSchema( dbc, null, null ); return !list.isEmpty(); } } return false; }
public void visit(Table table, IssueCollector pc) { if ( table.isPhysicalTable() ) { setSchemaSelection( table ); List<?> list = reader.readDatabaseSchema( dbc, null, null ); if ( list.isEmpty() ) { pc.reportIssue( new Issue( "SCHEMA_TABLE_MISSING", Issue.HIGH_PRIORITY, "Missing table " + TableNameQualifier.qualify( table.getCatalog(), table .getSchema(), table.getName() ) ) ); return; } else if ( list.size() > 1 ) { pc.reportIssue( new Issue( "SCHEMA_TABLE_MISSING", Issue.NORMAL_PRIORITY, "Found " + list.size() + " tables for " + TableNameQualifier.qualify( table.getCatalog(), table .getSchema(), table.getName() ) ) ); return; } else { currentDbTable = (Table) list.get( 0 ); visitColumns(table,pc); } } else { // log? } }