package org.nutz.dao.impl.sql; import org.nutz.lang.util.LinkedArray; import org.nutz.lang.util.LinkedCharArray; /** * 通过 add 函数,可以增加需要逃逸的字符,以及如何逃逸 * <p> * 然后调用 escape 函数,执行逃逸 * * @author zozoh(zozohtnt@gmail.com) * */ public class ValueEscaper { public ValueEscaper() { this.charStack = new LinkedCharArray(20); this.escapeStack = new LinkedArray<String>(20); } private LinkedCharArray charStack; private LinkedArray<String> escapeStack; private char[] chars; private String[] escapes; /** * 设定逃逸方式 * * @param c * 要逃逸的字符 * @param s * 如何逃逸 * @return 自身 */ public ValueEscaper add(char c, String s) { charStack.push(c); escapeStack.push(s); return this; } /** * 在执行 escape 前,这个函数一定要调用,它会把你增加的逃逸设置,初始化一下 * * @return 自身 */ public ValueEscaper ready() { chars = charStack.toArray(); escapes = escapeStack.toArray(); return this; } /** * 根据逃逸的设置,对传入的字符串进行逃逸 * * @param cs * 字符序列 * @return 逃逸后的字符序列 */ public CharSequence escape(CharSequence cs) { StringBuilder sb = new StringBuilder(); boolean find; for (int i = 0; i < cs.length(); i++) { char c = cs.charAt(i); find = false; for (int x = 0; x < chars.length; x++) { if (c == chars[x]) { sb.append(escapes[x]); find = true; break; } } if (!find) sb.append(c); } return sb; } }