001 /**
002 * Copyright 2010-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.common.jdbc;
017
018 import java.io.BufferedReader;
019 import java.io.IOException;
020 import java.util.Arrays;
021 import java.util.List;
022
023 import org.apache.commons.lang3.StringUtils;
024 import org.springframework.util.Assert;
025
026 /**
027 * @deprecated
028 */
029 @Deprecated
030 public class DefaultSqlReader implements SqlReader {
031
032 public static final String DEFAULT_DELIMITER = "/";
033 public static final DelimiterMode DEFAULT_DELIMITER_MODE = DelimiterMode.OWN_LINE;
034 public static final LineSeparator DEFAULT_LINE_SEPARATOR = LineSeparator.LF;
035 public static final List<String> DEFAULT_COMMENT_TOKENS = Arrays.asList("#", "--");
036 public static final boolean DEFAULT_IS_TRIM = true;
037 public static final boolean DEFAULT_IS_IGNORE_COMMENTS = true;
038
039 String delimiter = DEFAULT_DELIMITER;
040 DelimiterMode delimiterMode = DEFAULT_DELIMITER_MODE;
041 LineSeparator lineSeparator = DEFAULT_LINE_SEPARATOR;
042 boolean trim = DEFAULT_IS_TRIM;
043 boolean ignoreComments = DEFAULT_IS_IGNORE_COMMENTS;
044 List<String> commentTokens = DEFAULT_COMMENT_TOKENS;
045
046 @Override
047 public SqlMetaData getMetaData(BufferedReader reader) throws IOException {
048 Assert.notNull(delimiter, "delimiter is null");
049 long count = 0;
050 long size = 0;
051 String line = reader.readLine();
052 String trimmedLine = StringUtils.trimToNull(line);
053 while (line != null) {
054 size += line.length();
055 if (isEndOfSqlStatement(trimmedLine, delimiter, delimiterMode)) {
056 count++;
057 }
058 line = reader.readLine();
059 trimmedLine = StringUtils.trimToNull(line);
060 }
061 SqlMetaData smd = new SqlMetaData();
062 smd.setCount(count);
063 smd.setSize(size);
064 return smd;
065 }
066
067 @Override
068 public List<String> getSql(BufferedReader reader) throws IOException {
069 Assert.notNull(delimiter, "delimiter is null");
070 String line = reader.readLine();
071 String trimmedLine = StringUtils.trimToNull(line);
072 StringBuilder sb = new StringBuilder();
073 while (line != null) {
074 if (isEndOfSqlStatement(trimmedLine, delimiter, delimiterMode)) {
075 return Arrays.asList(getReturnValue(sb.toString() + line, trim, lineSeparator));
076 }
077 if (!ignore(ignoreComments, sb, trimmedLine, commentTokens)) {
078 sb.append(line + lineSeparator.getValue());
079 }
080 line = reader.readLine();
081 trimmedLine = StringUtils.trimToNull(line);
082 }
083
084 String result = getReturnValue(sb.toString(), trim, lineSeparator);
085
086 if (result == null) {
087 return null;
088 } else {
089 return Arrays.asList(result);
090 }
091 }
092
093 protected String getReturnValue(String sql, boolean trim, LineSeparator lineSeparator) {
094 if (StringUtils.endsWith(sql, delimiter)) {
095 int endIndex = sql.length() - delimiter.length();
096 sql = StringUtils.substring(sql, 0, endIndex);
097 }
098 if (trim) {
099 sql = StringUtils.trimToNull(sql);
100 }
101 if (sql == null) {
102 return null;
103 } else if (StringUtils.endsWith(sql, lineSeparator.getValue())) {
104 int endIndex = sql.length() - lineSeparator.getValue().length();
105 return StringUtils.substring(sql, 0, endIndex);
106 } else {
107 return sql;
108 }
109 }
110
111 protected boolean isEndOfSqlStatement(String trimmedLine, String delimiter, DelimiterMode delimiterMode) {
112 switch (delimiterMode) {
113 case END_OF_LINE:
114 return StringUtils.endsWith(trimmedLine, delimiter);
115 case OWN_LINE:
116 return StringUtils.equals(trimmedLine, delimiter);
117 default:
118 throw new IllegalArgumentException("Delimiter mode '" + delimiterMode + "' is unknown");
119 }
120 }
121
122 protected boolean proceed(String line, String trimmedLine, String delimiter, DelimiterMode delimiterMode) {
123 if (line == null) {
124 return false;
125 }
126 boolean endOfSqlStatement = isEndOfSqlStatement(trimmedLine, delimiter, delimiterMode);
127 return !endOfSqlStatement;
128 }
129
130 protected boolean ignore(boolean ignoreComments, StringBuilder sql, String trimmedLine, List<String> commentTokens) {
131 if (!ignoreComments) {
132 return false;
133 }
134 if (!StringUtils.isBlank(sql.toString())) {
135 return false;
136 }
137 boolean isComment = isSqlComment(trimmedLine, commentTokens);
138 return isComment;
139 }
140
141 protected boolean isSqlComment(String trimmedLine, List<String> commentTokens) {
142 for (String commentToken : commentTokens) {
143 if (StringUtils.startsWith(trimmedLine, commentToken)) {
144 return true;
145 }
146 }
147 return false;
148 }
149
150 public String getDelimiter() {
151 return delimiter;
152 }
153
154 public void setDelimiter(String delimiter) {
155 this.delimiter = delimiter;
156 }
157
158 public boolean isTrim() {
159 return trim;
160 }
161
162 public void setTrim(boolean trim) {
163 this.trim = trim;
164 }
165
166 public boolean isIgnoreComments() {
167 return ignoreComments;
168 }
169
170 public void setIgnoreComments(boolean ignoreComments) {
171 this.ignoreComments = ignoreComments;
172 }
173
174 public LineSeparator getLineSeparator() {
175 return lineSeparator;
176 }
177
178 public void setLineSeparator(LineSeparator lineSeparator) {
179 this.lineSeparator = lineSeparator;
180 }
181
182 public DelimiterMode getDelimiterMode() {
183 return delimiterMode;
184 }
185
186 public void setDelimiterMode(DelimiterMode delimiterMode) {
187 this.delimiterMode = delimiterMode;
188 }
189
190 public List<String> getCommentTokens() {
191 return commentTokens;
192 }
193
194 public void setCommentTokens(List<String> commentTokens) {
195 this.commentTokens = commentTokens;
196 }
197
198 }