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    }