Open Source Repository

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



org/hibernate/pretty/DDLFormatter.java
//$Id: DDLFormatter.java 7664 2005-07-27 23:29:37Z oneovthafew $
package org.hibernate.pretty;

import java.util.StringTokenizer;

public class DDLFormatter {
  
  private String sql;
  
  public DDLFormatter(String sql) {
    this.sql = sql;
  }

  /**
   * Format an SQL statement using simple rules:
   *  a) Insert newline after each comma;
   *  b) Indent three spaces after each inserted newline;
   * If the statement contains single/double quotes return unchanged,
   * it is too complex and could be broken by simple formatting.
   */
  public String format() {
    if sql.toLowerCase().startsWith("create table") ) {
      return formatCreateTable();
    }
    else if sql.toLowerCase().startsWith("alter table") ) {
      return formatAlterTable();
    }
    else if sql.toLowerCase().startsWith("comment on") ) {
      return formatCommentOn();
    }
    else {
      return "\n    " + sql;
    }
  }

  private String formatCommentOn() {
    StringBuffer result = new StringBuffer(60).append("\n    ");
    StringTokenizer tokens = new StringTokenizersql, " '[]\""true );
  
    boolean quoted = false;
    while tokens.hasMoreTokens() ) {
      String token = tokens.nextToken();
      result.append(token);
      if isQuote(token) ) {
        quoted = !quoted;
      }
      else if (!quoted) {
        if "is".equals(token) ) {
          result.append("\n       ");
        }
      }
    }
    
    return result.toString();
  }

  private String formatAlterTable() {
    StringBuffer result = new StringBuffer(60).append("\n    ");
    StringTokenizer tokens = new StringTokenizersql, " (,)'[]\""true );
  
    boolean quoted = false;
    while tokens.hasMoreTokens() ) {
      String token = tokens.nextToken();
      if isQuote(token) ) {
        quoted = !quoted;
      }
      else if (!quoted) {
        if isBreak(token) ) {
          result.append("\n        ");
        }
      }
      result.append(token);
    }
    
    return result.toString();
  }

  private String formatCreateTable() {
    StringBuffer result = new StringBuffer(60).append("\n    ");
    StringTokenizer tokens = new StringTokenizersql, "(,)'[]\""true );
  
    int depth = 0;
    boolean quoted = false;
    while tokens.hasMoreTokens() ) {
      String token = tokens.nextToken();
      if isQuote(token) ) {
        quoted = !quoted;
        result.append(token);
      }
      else if (quoted) {
        result.append(token);
      }
      else {
        if ")".equals(token) ) {
          depth--;
          if (depth==0result.append("\n    ");
        }
        result.append(token);
        if ",".equals(token&& depth==result.append("\n       ");
        if "(".equals(token) ) {
          depth++;
          if (depth==1result.append("\n        ");
        }
      }
    }
    
    return result.toString();
  }

  private static boolean isBreak(String token) {
    return "drop".equals(token||
      "add".equals(token|| 
      "references".equals(token|| 
      "foreign".equals(token||
      "on".equals(token);
  }

  private static boolean isQuote(String tok) {
    return "\"".equals(tok|| 
        "`".equals(tok|| 
        "]".equals(tok|| 
        "[".equals(tok||
        "'".equals(tok);
  }

}