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 2023/04/14 16:28:09 UTC

[camel] branch camel-3.x updated (f629ca35774 -> 2ea79b97a9c)

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

davsclaus pushed a change to branch camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git


    from f629ca35774 CAMEL-19256: camel-jdbc - close stmt in the finnal block (#9827) (#9860)
     new 4fbbad60ee1 CAMEL-18904:  Add functions to simple language to create empty map/li… (#9770)
     new 2ea79b97a9c CAMEL-18904: Add functions to simple language to create empty map/list/string

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../modules/languages/pages/simple-language.adoc   |  6 ++++
 .../language/simple/SimpleExpressionBuilder.java   | 26 +++++++++++++++
 .../simple/ast/SimpleFunctionExpression.java       | 11 +++++++
 .../java/org/apache/camel/LanguageTestSupport.java |  8 ++---
 .../apache/camel/language/simple/SimpleTest.java   | 38 ++++++++++++++++++++--
 5 files changed, 83 insertions(+), 6 deletions(-)


[camel] 02/02: CAMEL-18904: Add functions to simple language to create empty map/list/string

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2ea79b97a9cb2073958409b34e122f962e3a9e35
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Apr 14 18:27:45 2023 +0200

    CAMEL-18904: Add functions to simple language to create empty map/list/string
---
 .../camel/language/simple/SimpleExpressionBuilder.java       | 11 +++++------
 .../src/test/java/org/apache/camel/LanguageTestSupport.java  | 12 ------------
 .../java/org/apache/camel/language/simple/SimpleTest.java    |  3 +--
 3 files changed, 6 insertions(+), 20 deletions(-)

diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
index 2bee28b0db7..8cbcc48153a 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
@@ -19,9 +19,8 @@ package org.apache.camel.language.simple;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Random;
 import java.util.TimeZone;
@@ -248,24 +247,24 @@ public final class SimpleExpressionBuilder {
     /**
      * Returns a new empty object of the given type
      */
-    public static Expression newEmptyExpression(String type) {
+    public static Expression newEmptyExpression(final String type) {
 
         return new ExpressionAdapter() {
             @Override
             public Object evaluate(Exchange exchange) {
                 if ("map".equalsIgnoreCase(type)) {
-                    return new HashMap<>();
+                    return new LinkedHashMap<>();
                 } else if ("string".equalsIgnoreCase(type)) {
                     return "";
                 } else if ("list".equalsIgnoreCase(type)) {
                     return new ArrayList<>();
                 }
-                throw new IllegalArgumentException("function empty(%s) has unknown type.".formatted(type));
+                throw new IllegalArgumentException(String.format("Function empty(%s) has unknown type", type));
             }
 
             @Override
             public String toString() {
-                return "empty(%s)".formatted(type);
+                return "empty(" + type + ")";
             }
         };
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java b/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java
index ab1bb9377fe..1164071a65c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java
+++ b/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel;
 
-import java.util.function.Predicate;
-
 import org.apache.camel.spi.Language;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -65,16 +63,6 @@ public abstract class LanguageTestSupport extends ExchangeTestSupport {
         assertExpression(exchange, getLanguageName(), expressionText, expectedValue);
     }
 
-    /**
-     * Asserts that this language expression evaluates in a way that the handed over predicate is true
-     */
-    protected void assertExpression(String expressionText, Predicate<Object> assertion) {
-
-        Object value = evaluateExpression(expressionText, null);
-
-        assertTrue(assertion.test(value));
-    }
-
     /**
      * Asserts that this language expression evaluates to the given value on the current exchange
      */
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
index 48631240d84..9807bb4aa7f 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
@@ -57,7 +57,6 @@ import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
->>>>>>> 7ca0064683f (CAMEL-18904:  Add functions to simple language to create empty map/li… (#9770))
 
 public class SimpleTest extends LanguageTestSupport {
 
@@ -2071,7 +2070,7 @@ public class SimpleTest extends LanguageTestSupport {
 
     private void assertExpressionCreateNewEmpty(
             String type, Class<?> expectedClass, java.util.function.Predicate<Object> isEmptyAssertion) {
-        Object value = evaluateExpression("${empty(%s)}".formatted(type), null);
+        Object value = evaluateExpression("${empty(" + type + ")}", null);
         assertNotNull(value);
         assertIsInstanceOf(expectedClass, value);
         assertTrue(isEmptyAssertion.test(value));


[camel] 01/02: CAMEL-18904: Add functions to simple language to create empty map/li… (#9770)

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4fbbad60ee1c9ae0ca80fd0751d3bb3d24de3e51
Author: Louisa Frison <12...@users.noreply.github.com>
AuthorDate: Wed Apr 5 09:02:50 2023 +0200

    CAMEL-18904:  Add functions to simple language to create empty map/li… (#9770)
    
    * CAMEL-18904:  Add functions to simple language to create empty map/liststring
    
    * CAMEL-18904:  make empty()-simple expressions case-insensitive
    
    ---------
    
    Co-authored-by: louisa-fr <lo...@consol.de>
---
 .../modules/languages/pages/simple-language.adoc   |  6 ++++
 .../language/simple/SimpleExpressionBuilder.java   | 27 +++++++++++++++
 .../simple/ast/SimpleFunctionExpression.java       | 11 ++++++
 .../java/org/apache/camel/LanguageTestSupport.java | 20 ++++++++---
 .../apache/camel/language/simple/SimpleTest.java   | 39 ++++++++++++++++++++--
 5 files changed, 97 insertions(+), 6 deletions(-)

diff --git a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
index 7023b95e8a5..4fa63aaded8 100644
--- a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
+++ b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
@@ -195,6 +195,12 @@ the given id.
 field you can append .FIELD_NAME. For example, you can refer to the
 constant field from Exchange as: `org.apache.camel.Exchange.FILE_NAME`
 
+|empty(type) |depends on parameter |Creates a new empty object of the type given as parameter. The type-parameter-Strings are case-insensitive. +
+
+`string` -> empty String +
+`list`   -> empty ArrayList +
+`map`    -> empty HashMap +
+
 |null |null |represents a *null*
 
 |random(value) |Integer |returns a random Integer between 0 (included) and _value_
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
index 0a400ed0709..2bee28b0db7 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionBuilder.java
@@ -19,6 +19,8 @@ package org.apache.camel.language.simple;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Random;
@@ -243,6 +245,31 @@ public final class SimpleExpressionBuilder {
         };
     }
 
+    /**
+     * Returns a new empty object of the given type
+     */
+    public static Expression newEmptyExpression(String type) {
+
+        return new ExpressionAdapter() {
+            @Override
+            public Object evaluate(Exchange exchange) {
+                if ("map".equalsIgnoreCase(type)) {
+                    return new HashMap<>();
+                } else if ("string".equalsIgnoreCase(type)) {
+                    return "";
+                } else if ("list".equalsIgnoreCase(type)) {
+                    return new ArrayList<>();
+                }
+                throw new IllegalArgumentException("function empty(%s) has unknown type.".formatted(type));
+            }
+
+            @Override
+            public String toString() {
+                return "empty(%s)".formatted(type);
+            }
+        };
+    }
+
     /**
      * Returns a uuid string based on the given generator (default, classic, short, simple)
      */
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 27388e08b55..cc5052b517f 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
@@ -569,6 +569,17 @@ public class SimpleFunctionExpression extends LiteralExpression {
             return SimpleExpressionBuilder.uuidExpression(null);
         }
 
+        // empty function
+        remainder = ifStartsWithReturnRemainder("empty(", function);
+        if (remainder != null) {
+            String value = StringHelper.before(remainder, ")");
+            if (ObjectHelper.isEmpty(value)) {
+                throw new SimpleParserException(
+                        "Valid syntax: ${empty(<type>)} but was: " + function, token.getIndex());
+            }
+            return SimpleExpressionBuilder.newEmptyExpression(value);
+        }
+
         return null;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java b/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java
index 5b8a091cd01..ab1bb9377fe 100644
--- a/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java
+++ b/core/camel-core/src/test/java/org/apache/camel/LanguageTestSupport.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel;
 
+import java.util.function.Predicate;
+
 import org.apache.camel.spi.Language;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -63,6 +65,16 @@ public abstract class LanguageTestSupport extends ExchangeTestSupport {
         assertExpression(exchange, getLanguageName(), expressionText, expectedValue);
     }
 
+    /**
+     * Asserts that this language expression evaluates in a way that the handed over predicate is true
+     */
+    protected void assertExpression(String expressionText, Predicate<Object> assertion) {
+
+        Object value = evaluateExpression(expressionText, null);
+
+        assertTrue(assertion.test(value));
+    }
+
     /**
      * Asserts that this language expression evaluates to the given value on the current exchange
      */
@@ -74,7 +86,7 @@ public abstract class LanguageTestSupport extends ExchangeTestSupport {
      * Asserts that the expression evaluates to one of the two given values
      */
     protected void assertExpression(String expressionText, String expectedValue, String orThisExpectedValue) {
-        Object value = evaluateExpression(expressionText, expectedValue);
+        Object value = evaluateExpression(expressionText, expectedValue.getClass());
 
         assertTrue(expectedValue.equals(value) || orThisExpectedValue.equals(value),
                 "Expression: " + expressionText + " on Exchange: " + exchange);
@@ -83,15 +95,15 @@ public abstract class LanguageTestSupport extends ExchangeTestSupport {
     /**
      * Evaluates the expression
      */
-    protected Object evaluateExpression(String expressionText, String expectedValue) {
+    protected Object evaluateExpression(String expressionText, Class<?> expectedType) {
         Language language = assertResolveLanguage(getLanguageName());
 
         Expression expression = language.createExpression(expressionText);
         assertNotNull(expression, "No Expression could be created for text: " + expressionText + " language: " + language);
 
         Object value;
-        if (expectedValue != null) {
-            value = expression.evaluate(exchange, expectedValue.getClass());
+        if (expectedType != null) {
+            value = expression.evaluate(exchange, expectedType);
         } else {
             value = expression.evaluate(exchange, Object.class);
         }
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
index 669425d0786..48631240d84 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
@@ -49,7 +49,15 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.ResourceLock;
 import org.junit.jupiter.api.parallel.Resources;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+>>>>>>> 7ca0064683f (CAMEL-18904:  Add functions to simple language to create empty map/li… (#9770))
 
 public class SimpleTest extends LanguageTestSupport {
 
@@ -644,7 +652,7 @@ public class SimpleTest extends LanguageTestSupport {
 
     @Test
     public void testDateExchangeCreated() throws Exception {
-        Object out = evaluateExpression("${date:exchangeCreated:hh:mm:ss a}", "" + exchange.getCreated());
+        Object out = evaluateExpression("${date:exchangeCreated:hh:mm:ss a}", ("" + exchange.getCreated()).getClass());
         assertNotNull(out);
     }
 
@@ -2042,6 +2050,33 @@ public class SimpleTest extends LanguageTestSupport {
         assertExpression("${uuid(mygen)}", "1234");
     }
 
+    @Test
+    public void testNewEmpty() {
+        assertExpressionCreateNewEmpty("list", List.class, v -> ((List) v).isEmpty());
+        assertExpressionCreateNewEmpty("LIST", List.class, v -> ((List) v).isEmpty());
+        assertExpressionCreateNewEmpty("List", List.class, v -> ((List) v).isEmpty());
+        assertExpressionCreateNewEmpty("map", Map.class, v -> ((Map) v).isEmpty());
+        assertExpressionCreateNewEmpty("MAP", Map.class, v -> ((Map) v).isEmpty());
+        assertExpressionCreateNewEmpty("Map", Map.class, v -> ((Map) v).isEmpty());
+        assertExpressionCreateNewEmpty("string", String.class, v -> ((String) v).isEmpty());
+        assertExpressionCreateNewEmpty("STRING", String.class, v -> ((String) v).isEmpty());
+        assertExpressionCreateNewEmpty("String", String.class, v -> ((String) v).isEmpty());
+
+        assertThrows(SimpleIllegalSyntaxException.class, () -> evaluateExpression("${empty(falseSyntax}", null));
+        assertThrows(SimpleIllegalSyntaxException.class, () -> evaluateExpression("${empty()}", null));
+        assertThrows(SimpleIllegalSyntaxException.class, () -> evaluateExpression("${empty(}", null));
+        assertThrows(SimpleIllegalSyntaxException.class, () -> evaluateExpression("${empty}", null));
+        assertThrows(IllegalArgumentException.class, () -> evaluateExpression("${empty(unknownType)}", null));
+    }
+
+    private void assertExpressionCreateNewEmpty(
+            String type, Class<?> expectedClass, java.util.function.Predicate<Object> isEmptyAssertion) {
+        Object value = evaluateExpression("${empty(%s)}".formatted(type), null);
+        assertNotNull(value);
+        assertIsInstanceOf(expectedClass, value);
+        assertTrue(isEmptyAssertion.test(value));
+    }
+
     @Override
     protected String getLanguageName() {
         return "simple";