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);

Reply via email to