/*
* Copyright (C) 2005-2012 BetaCONCEPT Limited
*
* This file is part of Astroboa.
*
* Astroboa is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Astroboa is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Astroboa. If not, see <http://www.gnu.org/licenses/>.
*/
package org.betaconceptframework.astroboa.model.impl.query.xpath;
import java.util.Random;
import java.util.regex.Pattern;
/**
* @author Gregory Chomatas (gchomatas@betaconcept.com)
* @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
*
*/
public final class EscapeTextUtil {
private final static int randomNumber = new Random().nextInt(100000);
private final static Expression[] expressions = new Expression[]{
new Expression("\\*", "jcrany"+randomNumber),
new Expression("\"", "jcrphrase"+randomNumber),
new Expression("'", "jcrsingle"+randomNumber),
new Expression(" AND ", " jcrand "+randomNumber),
new Expression(" OR ", " jcror "+randomNumber),
new Expression("-", "jcrdash"+randomNumber),
new Expression("_", "jcrunderscore"+randomNumber),
new Expression("\\+", "jcrplus"+randomNumber),
new Expression("!", "jcrexclamation"+randomNumber),
new Expression("\\(", "jcrleftparenthesis"+randomNumber),
new Expression("\\)", "jcrrightparenthesis"+randomNumber),
new Expression("\\[", "jcrleftsquarebracket"+randomNumber),
new Expression("\\]", "jcrrightbracket"+randomNumber),
new Expression("\\{", "jcrleftcurlybracket"+randomNumber),
new Expression("\\}", "jcrrightcurlybracket"+randomNumber),
new Expression("\\^", "jcrcaret"+randomNumber),
new Expression("~", "jcrswungdash"+randomNumber),
new Expression("\\?", "jcrquestionmark"+randomNumber),
new Expression(":", "jcrcolon"+randomNumber),
new Expression("\\\\", "jcrbackslash"+randomNumber)
};
public static String escape(String text){
for (Expression expression : expressions){
text = expression.escape(text);
}
return text;
}
public static String unescape(String text) {
for (Expression expression : expressions){
text = expression.unescape(text);
}
return text;
}
private static class Expression{
private Pattern patternUsedToEscapeExpression;
private Pattern patternUsedToUnEscapeExpression;
private String temporaryReplacement;
private String finalReplacement;
Expression(String expressionToEscape, String temporaryReplacement, String finalReplacement){
patternUsedToEscapeExpression = Pattern.compile(expressionToEscape);
patternUsedToUnEscapeExpression = Pattern.compile(temporaryReplacement);
this.temporaryReplacement = temporaryReplacement;
this.finalReplacement = finalReplacement;
if (finalReplacement == null){
this.finalReplacement = expressionToEscape;
}
}
Expression(String expressionToEscape, String temporaryReplacement){
this(expressionToEscape, temporaryReplacement, expressionToEscape);
}
public String escape(String text){
return patternUsedToEscapeExpression.matcher(text).replaceAll(temporaryReplacement);
}
public String unescape(String text){
return patternUsedToUnEscapeExpression.matcher(text).replaceAll(finalReplacement);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Expression [finalReplacement=");
builder.append(finalReplacement);
builder.append(", patternUsedToEscapeExpression=");
builder.append(patternUsedToEscapeExpression);
builder.append(", patternUsedToUnEscapeExpression=");
builder.append(patternUsedToUnEscapeExpression);
builder.append(", temporaryReplacement=");
builder.append(temporaryReplacement);
builder.append("]");
return builder.toString();
}
}
}