This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new ff2e76ace63b CAMEL-22904: camel-core - Simple language ternary parser 
should not fail for log expressions (#21059)
ff2e76ace63b is described below

commit ff2e76ace63b6714e0a40d513047cc84afcb7773
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jan 26 12:20:38 2026 +0100

    CAMEL-22904: camel-core - Simple language ternary parser should not fail 
for log expressions (#21059)
---
 .../camel/language/simple/SimpleExpressionParser.java     | 15 +++++++++++----
 .../camel/language/simple/types/SimpleTokenType.java      | 14 ++++++++++++++
 .../apache/camel/language/simple/SimpleOperatorTest.java  |  2 --
 3 files changed, 25 insertions(+), 6 deletions(-)

diff --git 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
index 2179907af405..c46c556c86f0 100644
--- 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
+++ 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
@@ -238,6 +238,7 @@ public class SimpleExpressionParser extends 
BaseSimpleParser {
 
         // counter to keep track of number of functions in the tokens
         AtomicInteger functions = new AtomicInteger();
+        AtomicInteger ternary = new AtomicInteger();
 
         LiteralNode imageToken = null;
         for (SimpleToken token : tokens) {
@@ -247,7 +248,7 @@ public class SimpleExpressionParser extends 
BaseSimpleParser {
             }
 
             // create a node from the token
-            SimpleNode node = createNode(token, functions);
+            SimpleNode node = createNode(token, functions, ternary);
             if (node != null) {
                 // a new token was created so the current image token need to 
be added first
                 if (imageToken != null) {
@@ -274,14 +275,14 @@ public class SimpleExpressionParser extends 
BaseSimpleParser {
         }
     }
 
-    private SimpleNode createNode(SimpleToken token, AtomicInteger functions) {
+    private SimpleNode createNode(SimpleToken token, AtomicInteger functions, 
AtomicInteger ternary) {
         // expression only support functions, unary operators, ternary 
operators, and other operators
         if (token.getType().isFunctionStart()) {
             // starting a new function
             functions.incrementAndGet();
             return new SimpleFunctionStart(token, cacheExpression, 
skipFileFunctions);
         } else if (functions.get() > 0 && token.getType().isFunctionEnd()) {
-            // there must be a start function already, to let this be a end 
function
+            // there must be a start function already, to let this be an end 
function
             functions.decrementAndGet();
             return new SimpleFunctionEnd(token);
         } else if (token.getType().isUnary()) {
@@ -289,7 +290,13 @@ public class SimpleExpressionParser extends 
BaseSimpleParser {
             if (!nodes.isEmpty() && nodes.get(nodes.size() - 1) instanceof 
SimpleFunctionEnd) {
                 return new UnaryExpression(token);
             }
-        } else if (token.getType().isTernary()) {
+        } else if (token.getType().isTernaryStart()) {
+            // starting a new ternary
+            ternary.incrementAndGet();
+            return new TernaryExpression(token);
+        } else if (ternary.get() > 0 && token.getType().isTernaryEnd()) {
+            // there must be a start ternary already, to let this be an end 
ternary
+            ternary.decrementAndGet();
             return new TernaryExpression(token);
         } else if (token.getType().isOther()) {
             return new OtherExpression(token);
diff --git 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java
 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java
index ba41ee1a7508..6a773d8816f6 100644
--- 
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java
+++ 
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java
@@ -180,6 +180,20 @@ public final class SimpleTokenType {
         return type == TokenType.ternaryOperator;
     }
 
+    /**
+     * Whether the type is ternary start operator (?)
+     */
+    public boolean isTernaryStart() {
+        return type == TokenType.ternaryOperator && "?".equals(value);
+    }
+
+    /**
+     * Whether the type is ternary start operator (:)
+     */
+    public boolean isTernaryEnd() {
+        return type == TokenType.ternaryOperator && ":".equals(value);
+    }
+
     @Override
     public String toString() {
         return value;
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
index f8717a09078c..2fe58b9b5b8c 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
@@ -20,7 +20,6 @@ import org.apache.camel.Exchange;
 import org.apache.camel.LanguageTestSupport;
 import org.apache.camel.language.simple.types.SimpleIllegalSyntaxException;
 import org.apache.camel.spi.Registry;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -889,7 +888,6 @@ public class SimpleOperatorTest extends LanguageTestSupport 
{
     }
 
     @Test
-    @Disabled("TODO: CAMEL-22904")
     public void testTernaryLog() {
         exchange.getIn().setBody("Hello World");
         assertExpression(">>> Message received from WebSocket Client : 
${body}",

Reply via email to