Open Source Repository

Home /hibernate/hibernate-3.2.6.ga | Repository Home


org/hibernate/tool/hbm2ddl/TableMetadata.java
//$Id: TableMetadata.java 10725 2006-11-06 14:35:20Z [email protected] $
package org.hibernate.tool.hbm2ddl;

import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * JDBC table metadata
 @author Christoph Sturm, Max Rydahl Andersen
 */
public class TableMetadata {
  
  private static final Log log = LogFactory.getLog(TableMetadata.class);
  
  private final String catalog;
  private final String schema;
  private final String name;
  private final Map columns = new HashMap();
  private final Map foreignKeys = new HashMap();
  private final Map indexes = new HashMap();

  TableMetadata(ResultSet rs, DatabaseMetaData meta, boolean extrasthrows SQLException {
    catalog = rs.getString("TABLE_CAT");
    schema = rs.getString("TABLE_SCHEM");
    name = rs.getString("TABLE_NAME");
    initColumns(meta);
    if (extras) {
      initForeignKeys(meta);
      initIndexes(meta);
    }
    String cat = catalog==null "" : catalog + '.';
    String schem = schema==null "" : schema + '.';
    log.info"table found: " + cat + schem + name );
    log.info"columns: " + columns.keySet() );
    if (extras) {
      log.info"foreign keys: " + foreignKeys.keySet() );
      log.info"indexes: " + indexes.keySet() );
    }
  }

  public String getName() {
    return name;
  }

  public String getCatalog() {
    return catalog;
  }
  
  public String getSchema() {
    return schema;
  }
  
  public String toString() {
    return "TableMetadata(" + name + ')';
  }

  public ColumnMetadata getColumnMetadata(String columnName) {
    return (ColumnMetadatacolumns.getcolumnName.toLowerCase() );
  }

  public ForeignKeyMetadata getForeignKeyMetadata(String keyName) {
    return (ForeignKeyMetadataforeignKeys.getkeyName.toLowerCase() );
  }

  public IndexMetadata getIndexMetadata(String indexName) {
    return (IndexMetadataindexes.getindexName.toLowerCase() );
  }

  private void addForeignKey(ResultSet rsthrows SQLException {
    String fk = rs.getString("FK_NAME");

    if (fk == nullreturn;

    ForeignKeyMetadata info = getForeignKeyMetadata(fk);
    if (info == null) {
      info = new ForeignKeyMetadata(rs);
      foreignKeys.putinfo.getName().toLowerCase(), info );
    }

    info.addColumngetColumnMetadatars.getString("FKCOLUMN_NAME") ) );
  }

  private void addIndex(ResultSet rsthrows SQLException {
    String index = rs.getString("INDEX_NAME");

    if (index == nullreturn;

    IndexMetadata info = getIndexMetadata(index);
    if (info == null) {
      info = new IndexMetadata(rs);
      indexes.putinfo.getName().toLowerCase(), info );
    }

    info.addColumngetColumnMetadatars.getString("COLUMN_NAME") ) );
  }

  public void addColumn(ResultSet rsthrows SQLException {
    String column = rs.getString("COLUMN_NAME");

    if (column==nullreturn;

    if getColumnMetadata(column== null ) {
      ColumnMetadata info = new ColumnMetadata(rs);
      columns.putinfo.getName().toLowerCase(), info );
    }
  }

  private void initForeignKeys(DatabaseMetaData metathrows SQLException {
    ResultSet rs = null;

    try {
      rs = meta.getImportedKeys(catalog, schema, name);
      while rs.next() ) addForeignKey(rs);
    }
    finally {
      if (rs != nullrs.close();
    }
  }

  private void initIndexes(DatabaseMetaData metathrows SQLException {
    ResultSet rs = null;

    try {
      rs = meta.getIndexInfo(catalog, schema, name, false, true);
      
      while rs.next() ) {
        if rs.getShort("TYPE"== DatabaseMetaData.tableIndexStatistic continue;
        addIndex(rs);
      }
    }
    finally {
      if (rs != nullrs.close();
    }
  }

  private void initColumns(DatabaseMetaData metathrows SQLException {
    ResultSet rs = null;
    
    try {
      rs = meta.getColumns(catalog, schema, name, "%");
      while rs.next() ) addColumn(rs);
    }
    finally  {
      if (rs != nullrs.close();
    }
  }
  
}