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/12/30 15:15:12 UTC

(camel) 15/25: CAMEL-19749: Add variables as concept to Camel

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

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

commit 69577edc2cf49e95bf94477813125acf2bc02319
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Dec 29 20:47:25 2023 +0100

    CAMEL-19749: Add variables as concept to Camel
---
 .../apache/camel/language/simple/SimpleTest.java   | 35 ++++++++++++++++++
 .../camel/support/builder/ExpressionBuilder.java   | 43 ++++++++++++++++++++--
 2 files changed, 74 insertions(+), 4 deletions(-)

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 d0f672df846..7550edc2ca4 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
@@ -45,6 +45,8 @@ 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.spi.VariableRepository;
+import org.apache.camel.spi.VariableRepositoryFactory;
 import org.apache.camel.util.InetAddressUtil;
 import org.apache.camel.util.StringHelper;
 import org.junit.jupiter.api.Test;
@@ -951,6 +953,39 @@ public class SimpleTest extends LanguageTestSupport {
         assertExpression("${variables}", variables);
     }
 
+    @Test
+    public void testGlobalVariable() throws Exception {
+        // exchange has 1 variable already set
+        Map<String, Object> variables = exchange.getVariables();
+        assertEquals(1, variables.size());
+
+        VariableRepository global = context.getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class)
+                .getVariableRepository("global");
+        global.setVariable("foo", "123");
+        global.setVariable("bar", "456");
+        global.setVariable("cheese", "gorgonzola");
+
+        // exchange scoped
+        assertExpression("${variable.cheese}", "gauda");
+        assertExpression("${variable.foo}", null);
+        assertExpression("${variable.bar}", null);
+
+        // global scoped
+        assertExpression("${variable.global:cheese}", "gorgonzola");
+        assertExpression("${variable.global:foo}", "123");
+        assertExpression("${variable.global:bar}", "456");
+
+        // exchange scoped
+        assertExpression("${variableAs('cheese', 'String')}", "gauda");
+        assertExpression("${variableAs('foo', 'int')}", null);
+        assertExpression("${variableAA('bar', 'int')}", null);
+
+        // global scoped
+        assertExpression("${variableAs('global:cheese', 'String')}", "gorgonzola");
+        assertExpression("${variableAs('global:foo', 'int')}", 123);
+        assertExpression("${variableAs('global:bar', 'int')}", 456);
+    }
+
     @Test
     public void testVariableKeyWithSpace() throws Exception {
         exchange.getVariables().putAll(exchange.getMessage().getHeaders());
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 2d105ed02f8..2939d2c1362 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
@@ -44,6 +44,8 @@ import org.apache.camel.spi.Language;
 import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.UnitOfWork;
+import org.apache.camel.spi.VariableRepository;
+import org.apache.camel.spi.VariableRepositoryFactory;
 import org.apache.camel.support.ConstantExpressionAdapter;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.ExpressionAdapter;
@@ -196,15 +198,29 @@ public class ExpressionBuilder {
      */
     public static Expression variableExpression(final Expression variableName) {
         return new ExpressionAdapter() {
+            private VariableRepositoryFactory factory;
+
             @Override
             public Object evaluate(Exchange exchange) {
-                String name = variableName.evaluate(exchange, String.class);
-                return exchange.getVariable(name);
+                String key = variableName.evaluate(exchange, String.class);
+                String id = StringHelper.before(key, ":");
+                if (id != null) {
+                    VariableRepository repo = factory.getVariableRepository(id);
+                    if (repo != null) {
+                        key = StringHelper.after(key, ":");
+                        return repo.getVariable(key);
+                    } else {
+                        throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exists");
+                    }
+                } else {
+                    return exchange.getVariable(key);
+                }
             }
 
             @Override
             public void init(CamelContext context) {
                 variableName.init(context);
+                factory = context.getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class);
             }
 
             @Override
@@ -246,6 +262,8 @@ public class ExpressionBuilder {
     public static Expression variableExpression(final Expression variableName, final Expression typeName) {
         return new ExpressionAdapter() {
             private ClassResolver classResolver;
+            private VariableRepositoryFactory factory;
+            private TypeConverter converter;
 
             @Override
             public Object evaluate(Exchange exchange) {
@@ -256,8 +274,23 @@ public class ExpressionBuilder {
                 } catch (ClassNotFoundException e) {
                     throw CamelExecutionException.wrapCamelExecutionException(exchange, e);
                 }
-                String text = variableName.evaluate(exchange, String.class);
-                return exchange.getVariable(text, type);
+                String key = variableName.evaluate(exchange, String.class);
+                String id = StringHelper.before(key, ":");
+                if (id != null) {
+                    VariableRepository repo = factory.getVariableRepository(id);
+                    if (repo != null) {
+                        key = StringHelper.after(key, ":");
+                        Object value = repo.getVariable(key);
+                        if (value != null) {
+                            value = converter.convertTo(type, value);
+                        }
+                        return value;
+                    } else {
+                        throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exists");
+                    }
+                } else {
+                    return exchange.getVariable(key, type);
+                }
             }
 
             @Override
@@ -265,6 +298,8 @@ public class ExpressionBuilder {
                 variableName.init(context);
                 typeName.init(context);
                 classResolver = context.getClassResolver();
+                factory = context.getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class);
+                converter = context.getTypeConverter();
             }
 
             @Override