package com.hangum.tadpole.engine.sql.paremeter.lang;
import java.util.HashMap;
import java.util.Map;
/**
* Generic token parser
*
* original source : Mybatisc 코드를 수정한것.
*
* @author hangum
*
*/
public class GenericTokenParser {
private final String openToken;
private final String closeToken;
/**
* Maps parameter names to arrays of ints which are the parameter indices.
*/
private Map<Integer, String> mapIndexToName = new HashMap<Integer, String>();
public GenericTokenParser(String openToken, String closeToken) {
this.openToken = openToken;
this.closeToken = closeToken;
}
public String parse(String text) {
final StringBuilder builder = new StringBuilder();
final StringBuilder expression = new StringBuilder();
if (text != null && text.length() > 0) {
char[] src = text.toCharArray();
int offset = 0;
// search open token
int start = text.indexOf(openToken, offset);
while (start > -1) {
if (start > 0 && src[start - 1] == '\\') {
// this open token is escaped. remove the backslash and
// continue.
builder.append(src, offset, start - offset - 1).append(openToken);
offset = start + openToken.length();
} else {
// found open token. let's search close token.
expression.setLength(0);
builder.append(src, offset, start - offset);
offset = start + openToken.length();
int end = text.indexOf(closeToken, offset);
while (end > -1) {
if (end > offset && src[end - 1] == '\\') {
// this close token is escaped. remove the backslash
// and continue.
expression.append(src, offset, end - offset - 1).append(closeToken);
offset = end + closeToken.length();
end = text.indexOf(closeToken, offset);
} else {
expression.append(src, offset, end - offset);
offset = end + closeToken.length();
break;
}
}
if (end == -1) {
// close token was not found.
builder.append(src, start, src.length - start);
offset = src.length;
} else {
String strVariable = text.substring(start + openToken.length(), end);
mapIndexToName.put(mapIndexToName.size()+1, strVariable);
builder.append("?");
offset = end + closeToken.length();
}
}
start = text.indexOf(openToken, offset);
}
if (offset < src.length) {
builder.append(src, offset, src.length - offset);
}
}
return builder.toString();
}
/**
* Returns the index to param names
* @param intIndex
* @return
*/
public String getIndex(Integer intIndex) {
return mapIndexToName.get(intIndex);
}
public Map<Integer, String> getMapIndexToName() {
return mapIndexToName;
}
}