001: //$Id: DDLFormatter.java 7664 2005-07-27 23:29:37Z oneovthafew $
002: package org.hibernate.pretty;
003:
004: import java.util.StringTokenizer;
005:
006: public class DDLFormatter {
007:
008: private String sql;
009:
010: public DDLFormatter(String sql) {
011: this .sql = sql;
012: }
013:
014: /**
015: * Format an SQL statement using simple rules:
016: * a) Insert newline after each comma;
017: * b) Indent three spaces after each inserted newline;
018: * If the statement contains single/double quotes return unchanged,
019: * it is too complex and could be broken by simple formatting.
020: */
021: public String format() {
022: if (sql.toLowerCase().startsWith("create table")) {
023: return formatCreateTable();
024: } else if (sql.toLowerCase().startsWith("alter table")) {
025: return formatAlterTable();
026: } else if (sql.toLowerCase().startsWith("comment on")) {
027: return formatCommentOn();
028: } else {
029: return "\n " + sql;
030: }
031: }
032:
033: private String formatCommentOn() {
034: StringBuffer result = new StringBuffer(60).append("\n ");
035: StringTokenizer tokens = new StringTokenizer(sql, " '[]\"",
036: true);
037:
038: boolean quoted = false;
039: while (tokens.hasMoreTokens()) {
040: String token = tokens.nextToken();
041: result.append(token);
042: if (isQuote(token)) {
043: quoted = !quoted;
044: } else if (!quoted) {
045: if ("is".equals(token)) {
046: result.append("\n ");
047: }
048: }
049: }
050:
051: return result.toString();
052: }
053:
054: private String formatAlterTable() {
055: StringBuffer result = new StringBuffer(60).append("\n ");
056: StringTokenizer tokens = new StringTokenizer(sql, " (,)'[]\"",
057: true);
058:
059: boolean quoted = false;
060: while (tokens.hasMoreTokens()) {
061: String token = tokens.nextToken();
062: if (isQuote(token)) {
063: quoted = !quoted;
064: } else if (!quoted) {
065: if (isBreak(token)) {
066: result.append("\n ");
067: }
068: }
069: result.append(token);
070: }
071:
072: return result.toString();
073: }
074:
075: private String formatCreateTable() {
076: StringBuffer result = new StringBuffer(60).append("\n ");
077: StringTokenizer tokens = new StringTokenizer(sql, "(,)'[]\"",
078: true);
079:
080: int depth = 0;
081: boolean quoted = false;
082: while (tokens.hasMoreTokens()) {
083: String token = tokens.nextToken();
084: if (isQuote(token)) {
085: quoted = !quoted;
086: result.append(token);
087: } else if (quoted) {
088: result.append(token);
089: } else {
090: if (")".equals(token)) {
091: depth--;
092: if (depth == 0)
093: result.append("\n ");
094: }
095: result.append(token);
096: if (",".equals(token) && depth == 1)
097: result.append("\n ");
098: if ("(".equals(token)) {
099: depth++;
100: if (depth == 1)
101: result.append("\n ");
102: }
103: }
104: }
105:
106: return result.toString();
107: }
108:
109: private static boolean isBreak(String token) {
110: return "drop".equals(token) || "add".equals(token)
111: || "references".equals(token)
112: || "foreign".equals(token) || "on".equals(token);
113: }
114:
115: private static boolean isQuote(String tok) {
116: return "\"".equals(tok) || "`".equals(tok) || "]".equals(tok)
117: || "[".equals(tok) || "'".equals(tok);
118: }
119:
120: }
|