/*
* JBoss, Home of Professional Open Source.
* Copyright 2015, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.jpa.hibernate4.management;
/**
* Represents the Hibernate query name which is passed in as a parameter. The displayQuery can be obtained which
* has spaces and other symbols replaced with a textual description (which shouldn't be changed or localized.
* The localization rule is so that one set of admin scripts will work against any back end system. If it becomes
* more important to localize the textual descriptions, care should be taken to avoid duplicate values when doing so.
*
* @author Scott Marlow
*/
public class QueryName {
// query name as returned from hibernate Statistics.getQueries()
private final String hibernateQuery;
// query name transformed for display use (allowed to be ugly but should be unique)
private final String displayQuery;
// HQL symbol or operators
private static final String SQL_NE = "<>";
private static final String NE_BANG = "!=";
private static final String NE_HAT = "^=";
private static final String LE = "<=";
private static final String GE = ">=";
private static final String CONCAT = "||";
private static final String LT = "<";
private static final String EQ = "=";
private static final String GT = ">";
private static final String OPEN = "(";
private static final String CLOSE = ")";
private static final String OPEN_BRACKET = "[";
private static final String CLOSE_BRACKET = "]";
private static final String PLUS = "+";
private static final String MINUS = "-";
private static final String STAR = "*";
private static final String DIV = "/";
private static final String MOD = "%";
private static final String COLON = ":";
private static final String PARAM = "?";
private static final String COMMA = ",";
private static final String SPACE = " ";
private static final String TAB = "\t";
private static final String NEWLINE = "\n";
private static final String LINEFEED = "\r";
private static final String QUOTE = "'";
private static final String DQUOTE = "\"";
private static final String TICK = "`";
private static final String OPEN_BRACE = "{";
private static final String CLOSE_BRACE = "}";
private static final String HAT = "^";
private static final String AMPERSAND = "&";
// textual representation (not to be localized as we don't won't duplication between any of the values)
private static final String NOT_EQUAL__ = "_not_equal_";
private static final String BANG_NOT_EQUAL__ = "_bang_not_equal_";
private static final String HAT_NOT_EQUAL__ = "_hat_not_equal_";
private static final String LESS_THAN_EQUAL__ = "_less_than_equal_";
private static final String GREATER_THAN_EQUAL__ = "_greater_than_equal_";
private static final String CONCAT__ = "_concat_";
private static final String LESS_THAN__ = "_less_than_";
private static final String EQUAL__ = "_equal_";
private static final String GREATER__ = "_greater_";
private static final String LEFT_PAREN__ = "_left_paren_";
private static final String RIGHT_PAREN__ = "_right_paren_";
private static final String LEFT_BRACKET__ = "_left_bracket_";
private static final String RIGHT_BRACKET__ = "_right_bracket_";
private static final String PLUS__ = "_plus_";
private static final String MINUS__ = "_minus_";
private static final String STAR__ = "_star_";
private static final String DIVIDE__ = "_divide_";
private static final String MODULUS__ = "_modulus_";
private static final String COLON__ = "_colon_";
private static final String PARAM__ = "_param_";
private static final String COMMA__ = "_comma_";
private static final String SPACE__ = "_space_";
private static final String TAB__ = "_tab_";
private static final String NEWLINE__ = "_newline_";
private static final String LINEFEED__ = "_linefeed_";
private static final String QUOTE__ = "_quote_";
private static final String DQUOTE__ = "_double_quote_";
private static final String TICK__ = "_tick_";
private static final String OPEN_BRACE__ = "_left_brace_";
private static final String CLOSE_BRACE__ = "_right_brace_";
private static final String HAT__ = "_hat_";
private static final String AMPERSAND__ = "_ampersand_";
public static QueryName queryName(String query) {
return new QueryName(query);
}
/**
* Construct
*
* @param query
*/
public QueryName(String query) {
hibernateQuery = query;
displayQuery = displayable(query);
}
public String getDisplayName() {
return displayQuery;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
QueryName queryName = (QueryName) o;
if (displayQuery != null ? !displayQuery.equals(queryName.displayQuery) : queryName.displayQuery != null)
return false;
if (hibernateQuery != null ? !hibernateQuery.equals(queryName.hibernateQuery) : queryName.hibernateQuery != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = hibernateQuery != null ? hibernateQuery.hashCode() : 0;
result = 31 * result + (displayQuery != null ? displayQuery.hashCode() : 0);
return result;
}
/**
* transform a Hibernate HQL query into something that can be displayed/used for management operations
*
* @param query
* @return
*/
private String displayable(String query) {
if (query == null ||
query.length() == 0) {
return query;
}
StringBuilder buff = new StringBuilder(query);
// handle two character transforms first
subst(buff, SQL_NE, NOT_EQUAL__);
subst(buff, NE_BANG, BANG_NOT_EQUAL__);
subst(buff, NE_HAT, HAT_NOT_EQUAL__);
subst(buff, LE, LESS_THAN_EQUAL__);
subst(buff, GE, GREATER_THAN_EQUAL__);
subst(buff, CONCAT, CONCAT__);
subst(buff, LT, LESS_THAN__);
subst(buff, EQ, EQUAL__);
subst(buff, GT, GREATER__);
subst(buff, OPEN, LEFT_PAREN__);
subst(buff, CLOSE, RIGHT_PAREN__);
subst(buff, OPEN_BRACKET, LEFT_BRACKET__);
subst(buff, CLOSE_BRACKET, RIGHT_BRACKET__);
subst(buff, PLUS, PLUS__);
subst(buff, MINUS, MINUS__);
subst(buff, STAR, STAR__);
subst(buff, DIV, DIVIDE__);
subst(buff, MOD, MODULUS__);
subst(buff, COLON, COLON__);
subst(buff, PARAM, PARAM__);
subst(buff, COMMA, COMMA__);
subst(buff, SPACE, SPACE__);
subst(buff, TAB, TAB__);
subst(buff, NEWLINE, NEWLINE__);
subst(buff, LINEFEED, LINEFEED__);
subst(buff, QUOTE, QUOTE__);
subst(buff, DQUOTE, DQUOTE__);
subst(buff, TICK, TICK__);
subst(buff, OPEN_BRACE, OPEN_BRACE__);
subst(buff, CLOSE_BRACE, CLOSE_BRACE__);
subst(buff, HAT, HAT__);
subst(buff, AMPERSAND, AMPERSAND__);
return buff.toString();
}
/**
* Substitute sub-strings inside of a string.
*
* @param stringBuilder String buffer to use for substitution (buffer is not reset)
* @param from String to substitute from
* @param to String to substitute to
*/
private static void subst(final StringBuilder stringBuilder, final String from, final String to) {
int begin = 0, end = 0;
while ((end = stringBuilder.indexOf(from, end)) != -1) {
stringBuilder.delete(end, end + from.length());
stringBuilder.insert(end, to);
// update positions
begin = end + to.length();
end = begin;
}
}
}