Map<String, List<ForeignKey>> process(ReverseEngineeringStrategy revengStrategy) { Map<String, List<ForeignKey>> oneToManyCandidates = new HashMap<String, List<ForeignKey>>(); Iterator<Entry<String, Table>> iterator = dependentTables.entrySet().iterator(); while (iterator.hasNext() ) { Entry<String, Table> entry = iterator.next(); String fkName = entry.getKey(); Table fkTable = entry.getValue(); List<Column> columns = dependentColumns.get(fkName); List<Column> refColumns = referencedColumns.get(fkName); String className = revengStrategy.tableToClassName(TableIdentifier.create(referencedTable) ); ForeignKey key = fkTable.createForeignKey(fkName, columns, className, null, refColumns); key.setReferencedTable(referencedTable); addToMultiMap(oneToManyCandidates, className, key); } return oneToManyCandidates; }
/** * 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; }
return new ForeignKeysInfo(referencedTable, dependentTables, dependentColumns, referencedColumns);