You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/08/15 07:53:01 UTC

(camel) 07/10: CAMEL-21081: Add iif function to simple language

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

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

commit 7e3d12f77071d7130760ba24a2cf86dedd2a08af
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Aug 15 07:35:51 2024 +0200

    CAMEL-21081: Add iif function to simple language
---
 .../language/csimple/joor/OriginalSimpleTest.java  | 27 ++++++++++++++
 .../camel/language/csimple/CSimpleHelper.java      | 38 +++++++++++++-------
 .../simple/ast/SimpleFunctionExpression.java       | 41 +++++++++++++++++++++-
 3 files changed, 93 insertions(+), 13 deletions(-)

diff --git a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
index 168709b2385..3546fd1b2f8 100644
--- a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
+++ b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
@@ -2108,6 +2108,33 @@ public class OriginalSimpleTest extends LanguageTestSupport {
         assertExpression("${iif(false, ${variableAs('cheese', 'String')}, ${headerAs('counter', 'Integer')})}", "3");
     }
 
+    @Test
+    public void testJoinBody() {
+        List<Object> data = new ArrayList<>();
+        data.add("A");
+        data.add("B");
+        data.add("C");
+        exchange.getIn().setBody(data);
+
+        assertExpression("${join()}", "A,B,C");
+        assertExpression("${join(;)}", "A;B;C");
+        assertExpression("${join(' ')}", "A B C");
+        assertExpression("${join(',','id=')}", "id=A,id=B,id=C");
+        assertExpression("${join(&,id=)}", "id=A&id=B&id=C");
+    }
+
+    @Test
+    @Disabled("TODO: Fix me")
+    public void testJoinHeader() {
+        List<Object> data = new ArrayList<>();
+        data.add("A");
+        data.add("B");
+        data.add("C");
+        exchange.getIn().setHeader("id", data);
+
+        assertExpression("${join('&','id=',${header.id})}", "id=A&id=B&id=C");
+    }
+
     @Override
     protected String getLanguageName() {
         return "csimple";
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
index 941e90fc6b9..7f3d11e6203 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
@@ -24,8 +24,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -71,6 +69,14 @@ public final class CSimpleHelper {
     private CSimpleHelper() {
     }
 
+    public static <T> T convertTo(Exchange exchange, Class<T> type, Object value) {
+        return exchange.getContext().getTypeConverter().convertTo(type, exchange, value);
+    }
+
+    public static <T> T tryConvertTo(Exchange exchange, Class<T> type, Object value) {
+        return exchange.getContext().getTypeConverter().tryConvertTo(type, exchange, value);
+    }
+
     public static <T> T messageAs(Exchange exchange, Class<T> type) {
         return exchange.getMessage(type);
     }
@@ -695,17 +701,25 @@ public final class CSimpleHelper {
         return num;
     }
 
-    public static Object iif(Exchange exchange, Predicate pred, Supplier val1, Supplier val2) {
-        boolean match = pred.test(exchange);
-        if (match) {
-            return val1.get();
-        } else {
-            return val2.get();
+    public static Object join(Exchange exchange, Object value, String separator, String prefix) {
+        Iterator<?> it = convertTo(exchange, Iterator.class, value);
+        StringBuilder sb = new StringBuilder();
+        while (it.hasNext()) {
+            Object o = it.next();
+            if (o != null) {
+                String s = tryConvertTo(exchange, String.class, o);
+                if (s != null) {
+                    if (!sb.isEmpty()) {
+                        sb.append(separator);
+                    }
+                    if (prefix != null) {
+                        sb.append(prefix);
+                    }
+                    sb.append(s);
+                }
+            }
         }
-    }
-
-    public static <T> T convert(Exchange exchange, Class<T> type, Object value) {
-        return exchange.getContext().getTypeConverter().convertTo(type, exchange, value);
+        return sb.toString();
     }
 
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
index e22f79a1ed5..0e82ddd4ce2 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
@@ -1799,6 +1799,45 @@ public class SimpleFunctionExpression extends LiteralExpression {
             return "messageHistory(exchange, true)";
         }
 
+        // join
+        remainder = ifStartsWithReturnRemainder("join(", function);
+        if (remainder != null) {
+            String values = StringHelper.before(remainder, ")");
+            String separator = "\",\"";
+            String prefix = null;
+            String exp = "body";
+            if (ObjectHelper.isNotEmpty(values)) {
+                String[] tokens = StringQuoteHelper.splitSafeQuote(values, ',', false, true);
+                if (tokens.length > 3) {
+                    throw new SimpleParserException(
+                            "Valid syntax: ${join(separator,prefix,expression)} was: " + function, token.getIndex());
+                }
+                // single quotes should be double quotes
+                for (int i = 0; i < tokens.length; i++) {
+                    String s = tokens[i];
+                    if (StringHelper.isSingleQuoted(s)) {
+                        s = StringHelper.removeLeadingAndEndingQuotes(s);
+                        s = StringQuoteHelper.doubleQuote(s);
+                        tokens[i] = s;
+                    } else if (i < 2 && !StringHelper.isDoubleQuoted(s)) {
+                        s = StringQuoteHelper.doubleQuote(s);
+                        tokens[i] = s;
+                    }
+                }
+                if (tokens.length == 3) {
+                    separator = tokens[0];
+                    prefix = tokens[1];
+                    exp = tokens[2];
+                } else if (tokens.length == 2) {
+                    separator = tokens[0];
+                    prefix = tokens[1];
+                } else {
+                    separator = tokens[0];
+                }
+            }
+            return "var val = " + exp + ";\n        return join(exchange, val, " + separator + ", " + prefix + ");";
+        }
+
         // empty function
         remainder = ifStartsWithReturnRemainder("empty(", function);
         if (remainder != null) {
@@ -1835,7 +1874,7 @@ public class SimpleFunctionExpression extends LiteralExpression {
             }
 
             return "Object o = " + tokens[0]
-                   + ";\n        boolean b = convert(exchange, boolean.class, o);\n        return b ? "
+                   + ";\n        boolean b = convertTo(exchange, boolean.class, o);\n        return b ? "
                    + tokens[1] + " : " + tokens[2];
         }