org.hibernate.pretty.DDLFormatter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate Show documentation
Show all versions of hibernate Show documentation
Relational Persistence for 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 StringTokenizer( sql, " '[]\"", 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 StringTokenizer( sql, " (,)'[]\"", 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 StringTokenizer( sql, "(,)'[]\"", 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==0) result.append("\n ");
}
result.append(token);
if ( ",".equals(token) && depth==1 ) result.append("\n ");
if ( "(".equals(token) ) {
depth++;
if (depth==1) result.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);
}
}