Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2014-2015 the original author or authors.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
  * either express or implied. See the License for the specific language
  * governing permissions and limitations under the License.
  */
 package org.dbflute.twowaysql;
 

Author(s):
modified by jflute (originated in S2Dao)
 
 public class SqlTokenizer {
 
     // ===================================================================================
     //                                                                          Definition
     //                                                                          ==========
     public static final int SQL = 1;
     public static final int COMMENT = 2;
     public static final int ELSE = 3;
     public static final int BIND_VARIABLE = 4;
     public static final int EOF = 99;
 
     // ===================================================================================
     //                                                                           Attribute
     //                                                                           =========
     protected final String _sql;
     protected int _position = 0;
     protected String _token;
     protected int _tokenType = ;
     protected int _nextTokenType = ;
     protected int _bindVariableNum = 0;
 
     // ===================================================================================
     //                                                                         Constructor
     //                                                                         ===========
     public SqlTokenizer(String sql) {
         this. = sql;
     }
 
     // ===================================================================================
     //                                                                                Next
     //                                                                                ====
     public int next() {
         if ( >= .length()) {
              = null;
              = ;
              = ;
             return ;
         }
         switch () {
         case :
             parseSql();
             break;
         case :
             parseComment();
             break;
         case :
             parseElse();
             break;
         case :
             parseBindVariable();
             break;
         default:
             parseEof();
             break;
         }
         return ;
     }
 
     // ===================================================================================
     //                                                                           Parse SQL
     //                                                                           =========
     protected void parseSql() {
         int commentStartPos = .indexOf("/*");
         int commentStartPos2 = .indexOf("#*");
         if (0 < commentStartPos2 && commentStartPos2 < commentStartPos) {
             commentStartPos = commentStartPos2;
         }
         int bindVariableStartPos = .indexOf("?");
         int elseCommentStartPos = -1;
         int elseCommentLength = -1;
         int elseCommentSearchCurrentPosition = ;
         while (true) { // searching nearest next ELSE comment
             final int lineCommentStartPos = .indexOf("--"elseCommentSearchCurrentPosition);
             if (lineCommentStartPos < 0) {
                 break;
             }
            if (calculateNextStartPos(commentStartPosbindVariableStartPos, -1) < lineCommentStartPos) {
                break;
            }
            int skipPos = skipWhitespace(lineCommentStartPos + 2);
            if (skipPos + 4 < .length() && "ELSE".equals(.substring(skipPosskipPos + 4))) {
                elseCommentStartPos = lineCommentStartPos;
                elseCommentLength = skipPos + 4 - lineCommentStartPos;
                break;
            }
            elseCommentSearchCurrentPosition = skipPos;
        }
        int nextStartPos = calculateNextStartPos(commentStartPosbindVariableStartPoselseCommentStartPos);
        if (nextStartPos < 0) {
             = .substring();
             = ;
             = .length();
             = ;
        } else {
             = .substring(nextStartPos);
             = ;
            boolean needNext = nextStartPos == ;
            if (nextStartPos == commentStartPos) {
                 = ;
                 = commentStartPos + 2;
            } else if (nextStartPos == elseCommentStartPos) {
                 = ;
                 = elseCommentStartPos + elseCommentLength;
            } else if (nextStartPos == bindVariableStartPos) {
                 = ;
                 = bindVariableStartPos;
            }
            if (needNext) {
                next();
            }
        }
    }
    protected int calculateNextStartPos(int commentStartPosint bindVariableStartPosint elseCommentStartPos) {
        int nextStartPos = -1;
        if (commentStartPos >= 0) {
            nextStartPos = commentStartPos;
        }
        if (bindVariableStartPos >= 0 && (nextStartPos < 0 || bindVariableStartPos < nextStartPos)) {
            nextStartPos = bindVariableStartPos;
        }
        if (elseCommentStartPos >= 0 && (nextStartPos < 0 || elseCommentStartPos < nextStartPos)) {
            nextStartPos = elseCommentStartPos;
        }
        return nextStartPos;
    }
    protected String nextBindVariableName() {
        return "$" + ++;
    }
    // ===================================================================================
    //                                                                       Parse Comment
    //                                                                       =============
    protected void parseComment() {
        int commentEndPos = .indexOf("*/");
        int commentEndPos2 = .indexOf("*#");
        if (0 < commentEndPos2 && commentEndPos2 < commentEndPos) {
            commentEndPos = commentEndPos2;
        }
        if (commentEndPos < 0) {
        }
         = .substring(commentEndPos);
         = ;
         = commentEndPos + 2;
         = ;
    }
    protected void throwCommentTerminatorNotFoundException(String expression) {
        final ExceptionMessageBuilder br = new ExceptionMessageBuilder();
        br.addNotice("The comment end was NOT found!");
        br.addItem("Advice");
        br.addElement("Please confirm the SQL comment writing.");
        br.addElement("Any comments DOESN'T have a comment end.");
        br.addElement("For example:");
        br.addElement("  (x) -- /*pmb.xxxId3");
        br.addElement("  (o) -- /*pmb.xxxId*/3");
        br.addItem("Specified SQL");
        br.addElement(expression);
        br.addItem("Comment Expression");
        br.addElement();
        final String msg = br.buildExceptionMessage();
        throw new CommentTerminatorNotFoundException(msg);
    }
    // ===================================================================================
    //                                                                     Parse Parameter
    //                                                                     ===============
    protected void parseBindVariable() {
         = nextBindVariableName();
         = ;
         += 1;
         = ;
    }
    protected void parseElse() {
         = null;
         = ;
         = ;
    }
    protected void parseEof() {
         = null;
         = ;
         = ;
    }
    // ===================================================================================
    //                                                                      Skip Character
    //                                                                      ==============
    public String skipToken() {
        return skipToken(false);
    }
    public String skipToken(boolean testValue) {
        int index = .length(); // last index as default
        final String dateLiteralPrefix = extractDateLiteralPrefix(testValue);
        if (dateLiteralPrefix != null) {
             =  + dateLiteralPrefix.length();
        }
        final char quote;
        {
            final char firstChar = ( < .length() ? .charAt() : '\0');
            quote = (firstChar == '(' ? ')' : firstChar);
        }
        final boolean quoting = quote == '\'' || quote == ')';
        for (int i = quoting ?  + 1 : i < .length(); ++i) {
            final char c = .charAt(i);
            if (isNotQuoteEndPoint(quotingc)) {
                index = i;
                break;
            } else if (isBlockCommentBeginPoint(ci)) {
                index = i;
                break;
            } else if (isLineCommentBeginPoint(ci)) {
                index = i;
                break;
            } else if (quoting && isSingleQuoteEndPoint(quoteci)) {
                index = i + 1;
                break;
            } else if (quoting && isQuoteEndPoint(quoteci)) {
                index = i + 1;
                break;
            }
        }
         = .substring(index);
        if (dateLiteralPrefix != null) {
             = dateLiteralPrefix + ;
        }
         = ;
         = ;
         = index;
        return ;
    }
    protected String extractDateLiteralPrefix(boolean testValueString currentSqlint position) {
        if (!testValue) {
            return null;
        }
        if (position >= currentSql.length()) {
            return null;
        }
        final char firstChar = currentSql.charAt(position);
        if (firstChar != 'd' && firstChar != 'D' && firstChar != 't' && firstChar != 'T') {
            return null;
        }
        final String rear;
        {
            final String tmpRear = currentSql.substring(position);
            final int maxlength = "timestamp '".length();
            if (tmpRear.length() > maxlength) {
                // get only the quantity needed for performance
                rear = tmpRear.substring(0, maxlength);
            } else {
                rear = tmpRear;
            }
        }
        final String lowerRear = rear.toLowerCase();
        String literalPrefix = null;
        if (lowerRear.startsWith("date '")) {
            literalPrefix = rear.substring(0, "date ".length());
        } else if (lowerRear.startsWith("date'")) {
            literalPrefix = rear.substring(0, "date".length());
        } else if (lowerRear.startsWith("timestamp '")) { // has max length
            literalPrefix = rear.substring(0, "timestamp ".length());
        } else if (lowerRear.startsWith("timestamp'")) {
            literalPrefix = rear.substring(0, "timestamp".length());
        }
        return literalPrefix;
    }
    protected boolean isNotQuoteEndPoint(boolean quotingchar c) {
        return !quoting && (Character.isWhitespace(c) || c == ',' || c == ')' || c == '(');
    }
    protected boolean isBlockCommentBeginPoint(String currentSqlchar cint i) {
        return c == '/' && isNextCharacter(currentSqli'*');
    }
    protected boolean isLineCommentBeginPoint(String currentSqlchar cint i) {
        return c == '-' && isNextCharacter(currentSqli'-');
    }
    protected boolean isSingleQuoteEndPoint(String currentSqlchar quotechar cint i) {
        final int sqlLen = currentSql.length();
        final boolean endSqlOrNotEscapeQuote = (i + 1 >= sqlLen || currentSql.charAt(i + 1) != '\'');
        return quote == '\'' && c == '\'' && endSqlOrNotEscapeQuote;
    }
    protected boolean isQuoteEndPoint(String currentSqlchar quotechar cint i) {
        return c == quote;
    }
    protected boolean isNextCharacter(String currentSqlint ichar targetChar) {
        return i + 1 < currentSql.length() && currentSql.charAt(i + 1) == targetChar;
    }
    public String skipWhitespace() {
        int index = skipWhitespace();
         = .substring(index);
         = index;
        return ;
    }
    protected int skipWhitespace(int position) {
        int index = .length();
        for (int i = positioni < .length(); ++i) {
            char c = .charAt(i);
            if (!Character.isWhitespace(c)) {
                index = i;
                break;
            }
        }
        return index;
    }
    // ===================================================================================
    //                                                                            Accessor
    //                                                                            ========
    public int getPosition() {
        return ;
    }
    public String getToken() {
        return ;
    }
    public String getBefore() {
        return .substring(0, );
    }
    public String getAfter() {
        return .substring();
    }
    public int getTokenType() {
        return ;
    }
    public int getNextTokenType() {
        return ;
    }
New to GrepCode? Check out our FAQ X