modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
| 6 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
| 33 ++++++++--
2 files changed, 32 insertions(+), 7 deletions(-)
New commits:
commit 16f0613e65135a12f748fed01bdc8455473167b6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Jan 28 18:43:37 2010 -0500
More work for the search value escaping
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index ec06f74..67ab54b 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -369,7 +369,7 @@ public final class CriteriaQueryGenerator {
* Double escape backslashes if they are not treated as string literals
by the db vendor
*
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2674
*/
- formattedValue = QueryUtility.escapeSearchParameter(formattedValue);
+ formattedValue = QueryUtility.handleDoubleEscaping(formattedValue);
if (wantsFuzzyMatching) {
// append '%' onto edges that don't already have
'%' explicitly set from the caller
@@ -378,7 +378,9 @@ public final class CriteriaQueryGenerator {
}
value = formattedValue;
}
- LOG.debug("Bind: (" + critField.getKey() + ", " + value +
")");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Bind: (" + critField.getKey() + ", " +
value + ")");
+ }
query.setParameter(critField.getKey(), value);
}
if (null != this.authorizationPermsFragment) {
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
index 64f0d4c..7f8ab50 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
@@ -27,6 +27,8 @@ import org.rhq.core.db.DatabaseTypeFactory;
public class QueryUtility {
private static String ESCAPE_CHARACTER = null;
+ private static String ESCAPED_PERCENT = null;
+ private static String ESCAPED_UNDERSCORE = null;
/**
* Given the settings for the current DatabaseType, properly handle escaping special
SQL characters.
@@ -39,13 +41,14 @@ public class QueryUtility {
return null;
}
- boolean handleEscapedBackslash = "\\\\".equals(getEscapeCharacter());
-
- if (handleEscapedBackslash) {
- value = ((String) value).replaceAll("\\_", "\\\\_");
- value = ((String) value).replaceAll("\\%", "\\\\%");
+ if (null == ESCAPED_UNDERSCORE) {
+ ESCAPED_UNDERSCORE = getEscapeCharacter() + "_";
+ ESCAPED_PERCENT = getEscapeCharacter() + "%";
}
+ value = value.replaceAll("_", ESCAPED_UNDERSCORE);
+ value = value.replaceAll("%", ESCAPED_PERCENT);
+
return value;
}
@@ -78,4 +81,24 @@ public class QueryUtility {
return ESCAPE_CHARACTER;
}
+ /**
+ * If the current DatabaseType requires double escaping then ensure it is set
correctly. This may be useful
+ * if the search string has been constructed outside of
QueryUtil.formatSearchParameter(String).
+ *
+ * @param value single escaped search string value
+ * @return The double escaped string
+ */
+ public static String handleDoubleEscaping(String value) {
+ if (null == ESCAPE_CHARACTER) {
+ ESCAPE_CHARACTER =
DatabaseTypeFactory.getDefaultDatabaseType().getEscapeCharacter();
+ }
+
+ if ("\\\\".equals(ESCAPE_CHARACTER)) {
+ value = value.replaceAll("\\\\_", ESCAPED_UNDERSCORE);
+ value = value.replaceAll("\\\\%", ESCAPED_PERCENT);
+ }
+
+ return value;
+ }
+
}