package squill.mgen;
import java.util.*;
import squill.mgen.ClassInspectionUtil.ClassInfo;
import squill.mgen.naming.Conventions;
import squill.mgen.naming.NamingStrategy;
public class MapTable {
private final DbTable table;
private Map<String, MapColumn> mapColumns;
private NamingStrategy namingStrategy;
private Set<String> excludeRules;
private ClassInfo modelClass;
private List<MapForeignKey> foreignKeys = new ArrayList<MapForeignKey>();
private final MessageLogger logger;
public MapTable(DbTable table, NamingStrategy namingStrategy, ClassInfo modelClass, Set<String> excludeRules, MessageLogger logger) {
this.table = table;
this.namingStrategy = namingStrategy;
this.modelClass = modelClass;
this.excludeRules = excludeRules;
this.logger = logger;
if (table.getForeignKeys() != null) {
// Determine unique keys
Set<String> targetTablesOnce = new HashSet<String>();
Set<String> targetTablesMany = new HashSet<String>();
for (DbForeignKey fk : table.getForeignKeys()) {
if (targetTablesOnce.contains(fk.getRefTableName())) {
targetTablesMany.add(fk.getRefTableName());
}
if (!targetTablesMany.contains(fk.getRefTableName())) {
targetTablesOnce.add(fk.getRefTableName());
} else {
targetTablesOnce.remove(fk.getRefTableName());
}
}
for (DbForeignKey fk : table.getForeignKeys()) {
if (excludeRules == null || !excludeRules.contains("." + fk.getColName().toLowerCase())
&& !excludeRules.contains("." + fk.getRefColName().toLowerCase())
&& !excludeRules.contains(table.getName().toLowerCase() + "." + fk.getColName().toLowerCase())
&& !excludeRules.contains(fk.getRefTableName().toLowerCase() + "." + fk.getRefColName().toLowerCase())
&& !excludeRules.contains(fk.getRefTableName().toLowerCase())) {
foreignKeys.add(new MapForeignKey(namingStrategy, table, fk, targetTablesOnce.contains(fk.getRefTableName())));
}
}
}
}
public String getJavaName() {
return Conventions.javaBeanName(namingStrategy, table.getName());
}
/** @return Name of reference object */
public String getRefName() {
return Conventions.javaTableName(namingStrategy, table.getName());
}
public boolean hasModelClass() {
return modelClass != null;
}
public String getModelClassName() {
return modelClass.getName();
}
public boolean isReadOnly() {
return table.isReadOnly();
}
public String getName() {
return table.getName();
}
public String getTableName() {
return getName().toLowerCase();
}
public boolean hasPrimaryKey() {
return table.getPrimaryKeyColnames().size() == 1;
}
public MapColumn getPrimaryKey() {
return mapColumns.get(table.getPrimaryKeyColnames().iterator().next());
}
public List<MapColumn> getNonPrimaryColumns() {
List<MapColumn> result = new ArrayList<MapColumn>();
for (MapColumn mapColumn : getColumns().values()) {
if (hasPrimaryKey() && getPrimaryKey() != mapColumn) {
result.add(mapColumn);
}
}
return result;
}
public List<MapForeignKey> getForeignKeys() {
return foreignKeys;
}
public Map<String, MapColumn> getColumns() {
try {
if (mapColumns != null) {
return mapColumns;
}
mapColumns = createMapColumns();
return mapColumns;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private Map<String, MapColumn> createMapColumns() {
final Collection<DbColumn> tableColumns = table.getColumns();
Map<String, MapColumn> columns = new HashMap<String, MapColumn>();
for (DbColumn tableColumn : tableColumns) {
if (excludeRules == null || !excludeRules.contains("." + tableColumn.getLowerCaseName())
&& !excludeRules.contains(getTableName() + "." + tableColumn.getLowerCaseName())) {
columns.put(tableColumn.getName(), new MapColumn(tableColumn, namingStrategy, modelClass));
} else {
logger.info("Skipping column " + tableColumn.getName() + " because of the exclude rules.");
}
}
return columns;
}
public void setExcludeRules(Set<String> excludeRules) {
this.excludeRules = excludeRules;
}
public Set<String> getExcludeRules() {
return excludeRules;
}
}