This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-24962 in repository https://gitbox.apache.org/repos/asf/camel.git
commit da044e3bbaa0dd8a4703c3a92b752665b3540e41 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Sep 23 18:41:22 2026 +0200 CAMEL-24963: simple - an operator word in a property default or a bracket key is text, not a predicate Regression from CAMEL-24921: ${properties:msg:value is not set} was read as an 'is' predicate. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../org/apache/camel/language/simple/SimpleSyntaxHints.java | 12 +++++++++--- .../camel/language/simple/SimplePredicateInBracesTest.java | 12 ++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleSyntaxHints.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleSyntaxHints.java index 171a3258aa09..a046b1294e53 100644 --- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleSyntaxHints.java +++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleSyntaxHints.java @@ -259,14 +259,20 @@ public final class SimpleSyntaxHints { } int open = 0; for (int i = 0; i < head.length(); i++) { - if (head.charAt(i) == '(') { + char c = head.charAt(i); + if (c == '(' || c == '[') { open++; - } else if (head.charAt(i) == ')') { + } else if (c == ')' || c == ']') { open--; } } if (open > 0) { - // the operator is inside an argument list that may hold a predicate (iif, filter, forEach) + // the operator is inside an argument list that may hold a predicate (iif, filter, forEach), + // or inside a key such as ${header[order in progress]} + return null; + } + if (head.startsWith("properties:") && head.indexOf(':', 11) > 0) { + // the operator word is in the default value: ${properties:msg:value is not set} return null; } return "${" + head + "}" + function.substring(best); diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateInBracesTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateInBracesTest.java index bdd7d9d67491..970adaa9eb77 100644 --- a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateInBracesTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateInBracesTest.java @@ -81,6 +81,18 @@ public class SimplePredicateInBracesTest extends LanguageTestSupport { assertExpression("${date:now:yyyy-MM-dd}".substring(0, 10) + "}", null, true); } + @Test + public void testAnOperatorWordInAValueIsNotAPredicate() { + // CAMEL-24963: the operator word is in a property default or a bracket key, which is text, not an operator + assertExpression("${properties:msg:value is not set}", "value is not set"); + assertExpression("${properties:msg:a == b}", "a == b"); + exchange.getIn().setHeader("order in progress", "yes"); + assertExpression("${header[order in progress]}", "yes"); + // a closed bracket key can still be compared + exchange.getIn().setHeader("n", 5); + assertPredicate("${header[n] == 5}", true); + } + @Test public void testTheTernaryStillWins() { exchange.getIn().setHeader("n", 5);
