/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * 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.jboss.as.jpa.hibernate5.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; } // handle two character transforms first query = query.replace(SQL_NE, NOT_EQUAL__); query = query.replace(NE_BANG, BANG_NOT_EQUAL__); query = query.replace(NE_HAT, HAT_NOT_EQUAL__); query = query.replace(LE, LESS_THAN_EQUAL__); query = query.replace(GE, GREATER_THAN_EQUAL__); query = query.replace(CONCAT, CONCAT__); query = query.replace(LT, LESS_THAN__); query = query.replace(EQ, EQUAL__); query = query.replace(GT, GREATER__); query = query.replace(OPEN, LEFT_PAREN__); query = query.replace(CLOSE, RIGHT_PAREN__); query = query.replace(OPEN_BRACKET, LEFT_BRACKET__); query = query.replace(CLOSE_BRACKET, RIGHT_BRACKET__); query = query.replace(PLUS, PLUS__); query = query.replace(MINUS, MINUS__); query = query.replace(STAR, STAR__); query = query.replace(DIV, DIVIDE__); query = query.replace(MOD, MODULUS__); query = query.replace(COLON, COLON__); query = query.replace(PARAM, PARAM__); query = query.replace(COMMA, COMMA__); query = query.replace(SPACE, SPACE__); query = query.replace(TAB, TAB__); query = query.replace(NEWLINE, NEWLINE__); query = query.replace(LINEFEED, LINEFEED__); query = query.replace(QUOTE, QUOTE__); query = query.replace(DQUOTE, DQUOTE__); query = query.replace(TICK, TICK__); query = query.replace(OPEN_BRACE, OPEN_BRACE__); query = query.replace(CLOSE_BRACE, CLOSE_BRACE__); query = query.replace(HAT, HAT__); query = query.replace(AMPERSAND, AMPERSAND__); return query; } }