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 2022/09/03 14:00:09 UTC

[camel] branch main updated: CAMEL-17823: simple language new uuid function.

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 b22e889c010 CAMEL-17823: simple language new uuid function.
b22e889c010 is described below

commit b22e889c010cae39202910599a2d0957b83e8c3c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Sep 3 15:59:57 2022 +0200

    CAMEL-17823: simple language new uuid function.
---
 .../modules/languages/pages/simple-language.adoc   | 11 +++++-
 .../language/simple/SimpleExpressionBuilder.java   | 45 ++++++++++++++++++++++
 .../simple/ast/SimpleFunctionExpression.java       | 10 +++++
 .../apache/camel/language/simple/SimpleTest.java   | 28 ++++++++++++++
 4 files changed, 92 insertions(+), 2 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 5626af3421b..734f41c1c20 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
@@ -168,11 +168,11 @@ the ?method=methodname syntax that is used by the xref:components::bean-componen
 component. Camel will by default lookup a bean by the given name. However if you need to refer
 to a bean class (such as calling a static method) then you can prefix with type, such as `bean:type:fqnClassName`.
 
-|`properties:key:default` |String |Lookup a property with the given key. If the key does
+|properties:key:default |String |Lookup a property with the given key. If the key does
 not exists or has no value, then an optional default value can be
 specified.
 
-|`propertiesExist:key` |String |Checks whether a property placeholder with the given key exists or not.
+|propertiesExist:key |String |Checks whether a property placeholder with the given key exists or not.
 The result can be negated by prefixing the key with `!`.
 
 |routeId |String |Returns the id of the current route the
@@ -218,6 +218,13 @@ the error handler logs in case of an unhandled exception.
 |messageHistory(false) |String |As messageHistory but without the exchange details (only
 includes the route stack-trace). This can be used if you do not want to
 log sensitive data from the message itself.
+
+|uuid(type) |String |Returns an UUID using the Camel `UuidGenerator`.
+You can choose between `default`, `classic`, `short` and `simple` as the type.
+If no type is given the default is used. It is also possible to use a custom `UuidGenerator`
+and bind the bean to the xref:manual::registry.adoc[Registry] with an id. For example `${uuid(myGenerator}`
+where the ID is _myGenerator_.
+
 |=======================================================================
 
 == OGNL expression support
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 af825f9ea9b..14a1139d588 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
@@ -37,9 +37,14 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.ExchangeFormatter;
 import org.apache.camel.spi.Language;
+import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.ClassicUuidGenerator;
+import org.apache.camel.support.DefaultUuidGenerator;
 import org.apache.camel.support.ExpressionAdapter;
 import org.apache.camel.support.MessageHelper;
+import org.apache.camel.support.ShortUuidGenerator;
+import org.apache.camel.support.SimpleUuidGenerator;
 import org.apache.camel.support.builder.ExpressionBuilder;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
 import org.apache.camel.util.FileUtil;
@@ -238,6 +243,46 @@ public final class SimpleExpressionBuilder {
         };
     }
 
+    /**
+     * Returns a uuid string based on the given generator (default, classic, short, simple)
+     */
+    public static Expression uuidExpression(final String generator) {
+        return new ExpressionAdapter() {
+
+            UuidGenerator uuid;
+
+            @Override
+            public Object evaluate(Exchange exchange) {
+                return uuid.generateUuid();
+            }
+
+            @Override
+            public void init(CamelContext context) {
+                if ("classic".equalsIgnoreCase(generator)) {
+                    uuid = new ClassicUuidGenerator();
+                } else if ("short".equals(generator)) {
+                    uuid = new ShortUuidGenerator();
+                } else if ("simple".equals(generator)) {
+                    uuid = new SimpleUuidGenerator();
+                } else if (generator == null || "default".equals(generator)) {
+                    uuid = new DefaultUuidGenerator();
+                } else {
+                    // lookup custom generator
+                    uuid = CamelContextHelper.mandatoryLookup(context, generator, UuidGenerator.class);
+                }
+            }
+
+            @Override
+            public String toString() {
+                if (generator != null) {
+                    return "uuid(" + generator + ")";
+                } else {
+                    return "uuid";
+                }
+            }
+        };
+    }
+
     public static Expression fileNameExpression() {
         return new ExpressionAdapter() {
             @Override
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 a737c323d9a..0bff750ffaf 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
@@ -557,6 +557,16 @@ public class SimpleFunctionExpression extends LiteralExpression {
         } else if (ObjectHelper.equal(function, "messageHistory")) {
             return SimpleExpressionBuilder.messageHistoryExpression(true);
         }
+
+        // uuid function
+        remainder = ifStartsWithReturnRemainder("uuid", function);
+        if (remainder != null) {
+            String values = StringHelper.between(remainder, "(", ")");
+            return SimpleExpressionBuilder.uuidExpression(values);
+        } else if (ObjectHelper.equal(function, "uuid")) {
+            return SimpleExpressionBuilder.uuidExpression(null);
+        }
+
         return null;
     }
 
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 d0243353312..57fcbf88bf3 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
@@ -43,6 +43,7 @@ import org.apache.camel.language.simple.types.SimpleIllegalSyntaxException;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.util.InetAddressUtil;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.ResourceLock;
@@ -2004,6 +2005,33 @@ public class SimpleTest extends LanguageTestSupport {
         assertPredicate("${propertiesExist:!myKey}", false);
     }
 
+    @Test
+    public void testUuid() throws Exception {
+        Expression expression = context.resolveLanguage("simple").createExpression("${uuid}");
+        String s = expression.evaluate(exchange, String.class);
+        assertNotNull(s);
+
+        expression = context.resolveLanguage("simple").createExpression("${uuid(default)}");
+        s = expression.evaluate(exchange, String.class);
+        assertNotNull(s);
+
+        expression = context.resolveLanguage("simple").createExpression("${uuid(short)}");
+        s = expression.evaluate(exchange, String.class);
+        assertNotNull(s);
+
+        expression = context.resolveLanguage("simple").createExpression("${uuid(simple)}");
+        s = expression.evaluate(exchange, String.class);
+        assertNotNull(s);
+
+        expression = context.resolveLanguage("simple").createExpression("${uuid(classic)}");
+        s = expression.evaluate(exchange, String.class);
+        assertNotNull(s);
+
+        // custom generator
+        context.getRegistry().bind("mygen", (UuidGenerator) () -> "1234");
+        assertExpression("${uuid(mygen)}", "1234");
+    }
+
     @Override
     protected String getLanguageName() {
         return "simple";