1 package org.kuali.common.jdbc; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.util.Arrays; 6 import java.util.List; 7 8 import org.apache.commons.lang3.StringUtils; 9 import org.springframework.util.Assert; 10 11 public class DefaultSqlReader implements SqlReader { 12 13 public static final String DEFAULT_DELIMITER = "/"; 14 public static final DelimiterMode DEFAULT_DELIMITER_MODE = DelimiterMode.OWN_LINE; 15 public static final LineSeparator DEFAULT_LINE_SEPARATOR = LineSeparator.LF; 16 public static final List<String> DEFAULT_COMMENT_TOKENS = Arrays.asList(new String[] { "#", "--" }); 17 public static final boolean DEFAULT_IS_TRIM = true; 18 public static final boolean DEFAULT_IS_IGNORE_COMMENTS = true; 19 20 String delimiter = DEFAULT_DELIMITER; 21 DelimiterMode delimiterMode = DEFAULT_DELIMITER_MODE; 22 LineSeparator lineSeparator = DEFAULT_LINE_SEPARATOR; 23 boolean trim = DEFAULT_IS_TRIM; 24 boolean ignoreComments = DEFAULT_IS_IGNORE_COMMENTS; 25 List<String> commentTokens = DEFAULT_COMMENT_TOKENS; 26 27 @Override 28 public String getSqlStatement(BufferedReader reader) throws IOException { 29 Assert.notNull(delimiter, "delimiter is null"); 30 String line = reader.readLine(); 31 String trimmedLine = StringUtils.trimToNull(line); 32 StringBuilder sb = new StringBuilder(); 33 while (proceed(line, trimmedLine, delimiter, delimiterMode)) { 34 if (!ignore(ignoreComments, sb, trimmedLine, commentTokens)) { 35 sb.append(line + lineSeparator.getValue()); 36 } 37 line = reader.readLine(); 38 trimmedLine = StringUtils.trimToNull(line); 39 } 40 return getReturnValue(sb.toString(), trim, lineSeparator); 41 } 42 43 protected String getReturnValue(String sql, boolean trim, LineSeparator lineSeparator) { 44 if (trim) { 45 sql = StringUtils.trimToNull(sql); 46 } 47 if (sql == null) { 48 return null; 49 } else if (StringUtils.endsWith(sql, lineSeparator.getValue())) { 50 int endIndex = sql.length() - lineSeparator.getValue().length(); 51 return StringUtils.substring(sql, 0, endIndex); 52 } else { 53 return sql; 54 } 55 } 56 57 protected boolean isEndOfSqlStatement(String trimmedLine, String delimiter, DelimiterMode delimiterMode) { 58 switch (delimiterMode) { 59 case END_OF_LINE: 60 return StringUtils.endsWith(trimmedLine, delimiter); 61 case OWN_LINE: 62 return StringUtils.equals(trimmedLine, delimiter); 63 default: 64 throw new IllegalArgumentException("Delimiter mode '" + delimiterMode + "' is unknown"); 65 } 66 } 67 68 protected boolean proceed(String line, String trimmedLine, String delimiter, DelimiterMode delimiterMode) { 69 return line != null && !isEndOfSqlStatement(trimmedLine, delimiter, delimiterMode); 70 } 71 72 protected boolean ignore(boolean ignoreComments, StringBuilder sql, String trimmedLine, List<String> commentTokens) { 73 return ignoreComments && StringUtils.isBlank(sql.toString()) && isSqlComment(trimmedLine, commentTokens); 74 } 75 76 protected boolean isSqlComment(String trimmedLine, List<String> commentTokens) { 77 for (String commentToken : commentTokens) { 78 if (StringUtils.startsWith(trimmedLine, commentToken)) { 79 return true; 80 } 81 } 82 return false; 83 } 84 85 public String getDelimiter() { 86 return delimiter; 87 } 88 89 public void setDelimiter(String delimiter) { 90 this.delimiter = delimiter; 91 } 92 93 public boolean isTrim() { 94 return trim; 95 } 96 97 public void setTrim(boolean trim) { 98 this.trim = trim; 99 } 100 101 public boolean isIgnoreComments() { 102 return ignoreComments; 103 } 104 105 public void setIgnoreComments(boolean ignoreComments) { 106 this.ignoreComments = ignoreComments; 107 } 108 109 public LineSeparator getLineSeparator() { 110 return lineSeparator; 111 } 112 113 public void setLineSeparator(LineSeparator lineSeparator) { 114 this.lineSeparator = lineSeparator; 115 } 116 117 public DelimiterMode getDelimiterMode() { 118 return delimiterMode; 119 } 120 121 public void setDelimiterMode(DelimiterMode delimiterMode) { 122 this.delimiterMode = delimiterMode; 123 } 124 125 public List<String> getCommentTokens() { 126 return commentTokens; 127 } 128 129 public void setCommentTokens(List<String> commentTokens) { 130 this.commentTokens = commentTokens; 131 } 132 133 }