package org.hibernate.cfg.reveng;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.ForeignKey;
import org.hibernate.mapping.Table;
public class ForeignKeysInfo {
final Map<String, Table> dependentTables;
final Map<String, List<Column>> dependentColumns;
final Map<String, List<Column>> referencedColumns;
private final Table referencedTable;
public ForeignKeysInfo(
Table referencedTable,
Map<String, Table> tables,
Map<String, List<Column>> columns,
Map<String, List<Column>> refColumns) {
this.referencedTable = referencedTable;
this.dependentTables = tables;
this.dependentColumns = columns;
this.referencedColumns = refColumns;
}
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;
}
private void addToMultiMap(Map<String, List<ForeignKey>> multimap, String key, ForeignKey item) {
List<ForeignKey> existing = multimap.get(key);
if(existing == null) {
existing = new ArrayList<ForeignKey>();
multimap.put(key, existing);
}
existing.add(item);
}
}