From: danielhanrahan Date: Thu, 21 Nov 2024 18:05:05 +0000 (+0000) Subject: [Cps Path Parser] Don't quote numbers in comparison X-Git-Tag: 3.5.5~9^2 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=1ea72e9c1dff6b1fcdd584362d1d2aaa1d9ce28d;p=cps.git [Cps Path Parser] Don't quote numbers in comparison Presently, Cps Path Parser will wrap numbers in quotes when normalizing or getting parent path, which can lead to invalid paths. For example: /books[@price > 15] will be normalized to: /books[@price>'15'] This causes trouble when running queries on normalized paths: (CpsPathException: "can use only > with integer") Note this patch will still normalize numbers to string for equality: /books[@price='15'] Much existing code relies on this, and it does not cause problems. Issue-ID: CPS-2365 Signed-off-by: danielhanrahan Change-Id: I15d326ad7db2311b64c636283a4d52623a125176 --- diff --git a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java index ed7dbecc18..b67d70847c 100644 --- a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java +++ b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java @@ -180,12 +180,12 @@ public class CpsPathBuilder extends CpsPathBaseListener { if (!isStartOfExpression) { currentNormalizedPathBuilder.append(" ").append(getLastElement(booleanOperators)).append(" "); } - currentNormalizedPathBuilder.append("@") - .append(name) - .append(operator) - .append("'") - .append(value.toString().replace("'", "''")) - .append("'"); + currentNormalizedPathBuilder.append("@").append(name).append(operator); + if (operator.equals("=")) { + currentNormalizedPathBuilder.append(wrapValueInSingleQuotes(value)); + } else { + currentNormalizedPathBuilder.append(value); + } } private static String getLastElement(final List listOfStrings) { @@ -202,6 +202,10 @@ public class CpsPathBuilder extends CpsPathBaseListener { } } + private static String wrapValueInSingleQuotes(final Object value) { + return "'" + value.toString().replace("'", "''") + "'"; + } + private static String stripFirstAndLastCharacter(final String wrappedString) { return wrappedString.substring(1, wrappedString.length() - 1); } diff --git a/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy b/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy index 16430d2fa5..a1bf28977a 100644 --- a/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy +++ b/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy @@ -87,10 +87,10 @@ class CpsPathQuerySpec extends Specification { 'yang container' | '/cps-path' || '/cps-path' 'descendant anywhere' | '//cps-path' || '//cps-path' 'descendant with leaf condition' | '//cps-path[@key=1]' || "//cps-path[@key='1']" - 'descendant with leaf condition has ">" operator' | '//cps-path[@key>9]' || "//cps-path[@key>'9']" - 'descendant with leaf condition has "<" operator' | '//cps-path[@key<10]' || "//cps-path[@key<'10']" - 'descendant with leaf condition has ">=" operator' | '//cps-path[@key>=8]' || "//cps-path[@key>='8']" - 'descendant with leaf condition has "<=" operator' | '//cps-path[@key<=12]' || "//cps-path[@key<='12']" + 'descendant with leaf condition has ">" operator' | '//cps-path[@key>9]' || "//cps-path[@key>9]" + 'descendant with leaf condition has "<" operator' | '//cps-path[@key<10]' || "//cps-path[@key<10]" + 'descendant with leaf condition has ">=" operator' | '//cps-path[@key>=8]' || "//cps-path[@key>=8]" + 'descendant with leaf condition has "<=" operator' | '//cps-path[@key<=12]' || "//cps-path[@key<=12]" 'descendant with leaf value and ancestor' | '//cps-path[@key=1]/ancestor::parent[@key=1]' || "//cps-path[@key='1']/ancestor::parent[@key='1']" 'parent & child' | '/parent/child' || '/parent/child' 'parent leaf of type Integer & child' | '/parent/child[@code=1]/child2' || "/parent/child[@code='1']/child2"