package org.springframework.roo.addon.dbre.addon.model; import java.util.LinkedHashSet; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; /** * Represents a table in the database model. * * @author Alan Stewart * @since 1.1 */ public class Table { private String catalog; private final Set<Column> columns = new LinkedHashSet<Column>(); private String description; private final Set<ForeignKey> exportedKeys = new LinkedHashSet<ForeignKey>(); private final Set<ForeignKey> importedKeys = new LinkedHashSet<ForeignKey>(); private boolean includeNonPortableAttributes; private boolean disableVersionFields; private boolean disableGeneratedIdentifiers; private final Set<Index> indices = new LinkedHashSet<Index>(); private boolean joinTable; private final String name; private final Schema schema; Table(final String name, final Schema schema) { Validate.notBlank(name, "Table name required"); Validate.notNull(schema, "Table schema required"); this.name = name; this.schema = schema; } public boolean addColumn(final Column column) { Validate.notNull(column, "Column required"); return columns.add(column); } public boolean addExportedKey(final ForeignKey exportedKey) { Validate.notNull(exportedKey, "Exported key required"); return exportedKeys.add(exportedKey); } public boolean addImportedKey(final ForeignKey foreignKey) { Validate.notNull(foreignKey, "Foreign key required"); return importedKeys.add(foreignKey); } public boolean addIndex(final Index index) { Validate.notNull(index, "Index required"); return indices.add(index); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof Table)) { return false; } final Table other = (Table) obj; if (name == null) { if (other.name != null) { return false; } } else if (!name.equalsIgnoreCase(other.name)) { return false; } if (schema == null) { if (other.schema != null) { return false; } } else if (!schema.equals(other.schema)) { return false; } return true; } public Column findColumn(final String name) { for (final Column column : columns) { if (column.getName().equalsIgnoreCase(name)) { return column; } } return null; } public ForeignKey findImportedKeyByLocalColumnName(final String localColumnName) { for (final ForeignKey foreignKey : importedKeys) { for (final Reference reference : foreignKey.getReferences()) { if (reference.getLocalColumnName().equalsIgnoreCase(localColumnName)) { return foreignKey; } } } return null; } public String getCatalog() { return StringUtils.trimToNull(catalog); } public int getColumnCount() { return columns.size(); } public Set<Column> getColumns() { return columns; } public String getDescription() { return description; } public int getExportedKeyCountByForeignTableName(final String foreignTableName) { int count = 0; for (final ForeignKey exportedKey : exportedKeys) { if (exportedKey.getForeignTableName().equalsIgnoreCase(foreignTableName)) { count++; } } return count; } public Set<ForeignKey> getExportedKeys() { return exportedKeys; } public String getFullyQualifiedTableName() { return DbreModelService.NO_SCHEMA_REQUIRED.equals(schema.getName()) ? name : schema.getName() + "." + name; } public ForeignKey getImportedKey(final String name) { for (final ForeignKey foreignKey : importedKeys) { Validate.notBlank(foreignKey.getName(), "Foreign key name required"); if (foreignKey.getName().equalsIgnoreCase(name)) { return foreignKey; } } return null; } public int getImportedKeyCount() { return importedKeys.size(); } public int getImportedKeyCountByForeignTableName(final String foreignTableName) { int count = 0; for (final ForeignKey foreignKey : importedKeys) { if (foreignKey.getForeignTableName().equalsIgnoreCase(foreignTableName)) { count++; } } return count; } public Set<ForeignKey> getImportedKeys() { return importedKeys; } public Set<Index> getIndices() { return indices; } public String getName() { return name; } public int getPrimaryKeyCount() { return getPrimaryKeys().size(); } public Set<Column> getPrimaryKeys() { final Set<Column> primaryKeys = new LinkedHashSet<Column>(); for (final Column column : columns) { if (column.isPrimaryKey()) { primaryKeys.add(column); } } return primaryKeys; } public Schema getSchema() { return schema; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + name.hashCode(); result = prime * result + schema.hashCode(); return result; } public boolean isIncludeNonPortableAttributes() { return includeNonPortableAttributes; } public boolean isDisableVersionFields() { return disableVersionFields; } public boolean isDisableGeneratedIdentifiers() { return disableGeneratedIdentifiers; } public boolean isJoinTable() { return joinTable; } public void setCatalog(final String catalog) { this.catalog = catalog; } public void setDescription(final String description) { this.description = description; } public void setIncludeNonPortableAttributes(final boolean includeNonPortableAttributes) { this.includeNonPortableAttributes = includeNonPortableAttributes; } public void setDisableVersionFields(final boolean disableVersionFields) { this.disableVersionFields = disableVersionFields; } public void setDisableGeneratedIdentifiers(final boolean disableGeneratedIdentifiers) { this.disableGeneratedIdentifiers = disableGeneratedIdentifiers; } public void setJoinTable(final boolean joinTable) { this.joinTable = joinTable; } @Override public String toString() { return String .format( "Table [name=%s, schema=%s, catalog=%s, description=%s, columns=%s, importedKeys=%s, exportedKeys=%s, indices=%s, includeNonPortableAttributes=%s, disableVersionFields=%s, disableGeneratedIdentifiers=%s]", name, schema.getName(), catalog, description, columns, importedKeys, exportedKeys, indices, includeNonPortableAttributes, disableVersionFields, disableGeneratedIdentifiers); } }