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 f2a3cc20d07 CAMEL-19014 - Fixing issue about concurrence on the 
SimpleLanguage (#9333)
f2a3cc20d07 is described below

commit f2a3cc20d07271cc2bfba26cb3ecdcf4c119866d
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Mar 11 10:08:08 2023 +0100

    CAMEL-19014 - Fixing issue about concurrence on the SimpleLanguage (#9333)
---
 .../apache/camel/builder/ExpressionBuilderTest.java |  7 +++++++
 .../camel/support/builder/ExpressionBuilder.java    | 21 +++++++++++++++++----
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git 
a/core/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
index 12a38d1df3b..e68bf307161 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/builder/ExpressionBuilderTest.java
@@ -134,6 +134,13 @@ public class ExpressionBuilderTest extends TestSupport {
         assertExpression(headerExpression("name", String.class), exchange, 
"James");
     }
 
+    @Test
+    public void testConstantsOnly() throws Exception {
+        Expression expression = concatExpression(
+                List.of(constantExpression("Hello"), constantExpression(" big 
"), constantExpression("World")));
+        assertExpression(expression, exchange, "Hello big World");
+    }
+
     @Override
     @BeforeEach
     public void setUp() throws Exception {
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
index c514185dc68..78fddbd3fc0 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
@@ -20,7 +20,6 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
@@ -1701,9 +1700,13 @@ public class ExpressionBuilder {
     private static Expression concatExpressionOptimized(final 
Collection<Expression> expressions, final String description) {
         return new ExpressionAdapter() {
             private Collection<Object> optimized;
+            private String optimizedValue;
 
             @Override
             public Object evaluate(Exchange exchange) {
+                if (optimizedValue != null) {
+                    return optimizedValue;
+                }
                 StringBuilder buffer = new StringBuilder();
                 Collection<?> col = optimized != null ? optimized : 
expressions;
                 for (Object obj : col) {
@@ -1713,8 +1716,8 @@ public class ExpressionBuilder {
                         if (text != null) {
                             buffer.append(text);
                         }
-                    } else {
-                        buffer.append((String) obj);
+                    } else if (obj != null) {
+                        buffer.append(obj);
                     }
                 }
                 return buffer.toString();
@@ -1724,6 +1727,7 @@ public class ExpressionBuilder {
             public void init(CamelContext context) {
                 if (optimized == null) {
                     Collection<Object> preprocessedExpression = new 
ArrayList<>(expressions.size());
+                    boolean constantsOnly = true;
                     for (Expression expression : expressions) {
                         expression.init(context);
                         if (expression instanceof ConstantExpressionAdapter) {
@@ -1731,9 +1735,18 @@ public class ExpressionBuilder {
                             preprocessedExpression.add(value.toString());
                         } else {
                             preprocessedExpression.add(expression);
+                            constantsOnly = false;
                         }
                     }
-                    optimized = preprocessedExpression;
+                    if (constantsOnly) {
+                        StringBuilder sb = new StringBuilder();
+                        for (Object o : preprocessedExpression) {
+                            sb.append(o);
+                        }
+                        optimizedValue = sb.toString();
+                    } else {
+                        optimized = preprocessedExpression;
+                    }
                 } else {
                     for (Expression expression : expressions) {
                         expression.init(context);

Reply via email to