This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch exchange-log in repository https://gitbox.apache.org/repos/asf/camel.git
commit 0ef2341d0972f21d3542182a2e94049a4572592e Author: Claus Ibsen <[email protected]> AuthorDate: Wed Sep 18 08:42:51 2024 +0200 CAMEL-21234: Add logExchange function to simple language. --- .../language/csimple/joor/OriginalSimpleTest.java | 15 +++++++++++++ .../modules/languages/pages/simple-language.adoc | 2 ++ .../camel/language/csimple/CSimpleHelper.java | 5 +++++ .../simple/ast/SimpleFunctionExpression.java | 4 ++++ .../apache/camel/language/simple/SimpleTest.java | 17 +++++++++++++- .../camel/support/builder/ExpressionBuilder.java | 26 ++++++++++++++++++++++ 6 files changed, 68 insertions(+), 1 deletion(-) 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 c3b2d990983..68cb1ff109d 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 @@ -42,11 +42,13 @@ import org.apache.camel.component.bean.MethodNotFoundException; import org.apache.camel.language.bean.RuntimeBeanExpressionException; import org.apache.camel.language.csimple.CSimpleLanguage; import org.apache.camel.language.simple.types.SimpleIllegalSyntaxException; +import org.apache.camel.spi.ExchangeFormatter; import org.apache.camel.spi.Language; import org.apache.camel.spi.UuidGenerator; import org.apache.camel.spi.VariableRepository; import org.apache.camel.spi.VariableRepositoryFactory; import org.apache.camel.support.ExchangeHelper; +import org.apache.camel.support.LanguageHelper; import org.apache.camel.test.junit5.LanguageTestSupport; import org.apache.camel.util.InetAddressUtil; import org.apache.camel.util.StringHelper; @@ -173,6 +175,19 @@ public class OriginalSimpleTest extends LanguageTestSupport { assertExpression("${exchange}", exchange); } + @Test + public void testLogExchangeExpression() { + Expression exp = context.resolveLanguage("csimple").createExpression("${logExchange}"); + assertNotNull(exp); + + // will use exchange formatter + ExchangeFormatter ef = LanguageHelper.getOrCreateExchangeFormatter(context, null); + String expected = ef.format(exchange); + assertEquals(expected, exp.evaluate(exchange, Object.class)); + + assertExpression("${logExchange}", expected); + } + @Test public void testExchangeOgnlExpression() { Expression exp = context.resolveLanguage("csimple").createExpression("${exchange.exchangeId}"); 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 3182c19c9a5..ec72400bb44 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 @@ -75,6 +75,8 @@ OGNL expression. |id |String |the message id +|logExchange |String | Dumps the exchange for logging purpose (uses `ExchangeFormatter` to format the output). + |messageTimestamp |long |the message timestamp (millis since epoc) that this message originates from. Some systems like JMS, Kafka, AWS have a timestamp on the event/message that Camel received. This method returns the timestamp if a timestamp exists. 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 6d0106b27e0..e62891dba99 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 @@ -289,6 +289,11 @@ public final class CSimpleHelper { return exchange.getProperty(ExchangePropertyKey.STEP_ID, String.class); } + public static String logExchange(Exchange exchange) { + ExchangeFormatter formatter = LanguageHelper.getOrCreateExchangeFormatter(exchange.getContext(), null); + return formatter.format(exchange); + } + public static String fileName(Message message) { return message.getHeader(Exchange.FILE_NAME, String.class); } 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 c7e5308ac20..219147b82c8 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 @@ -595,6 +595,8 @@ public class SimpleFunctionExpression extends LiteralExpression { return ExpressionBuilder.exchangeIdExpression(); } else if (ObjectHelper.equal(expression, "exchange")) { return ExpressionBuilder.exchangeExpression(); + } else if (ObjectHelper.equal(expression, "logExchange")) { + return ExpressionBuilder.dumpExchange(); } else if (ObjectHelper.equal(expression, "exception")) { return ExpressionBuilder.exchangeExceptionExpression(); } else if (ObjectHelper.equal(expression, "exception.message")) { @@ -1106,6 +1108,8 @@ public class SimpleFunctionExpression extends LiteralExpression { return "exchange.getExchangeId()"; } else if (ObjectHelper.equal(expression, "exchange")) { return "exchange"; + } else if (ObjectHelper.equal(expression, "logExchange")) { + return "logExchange(exchange)"; } else if (ObjectHelper.equal(expression, "exception")) { return "exception(exchange)"; } else if (ObjectHelper.equal(expression, "exception.message")) { 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 3b16729a7b6..346ae8c83e7 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 @@ -41,6 +41,7 @@ import org.apache.camel.component.bean.MethodNotFoundException; import org.apache.camel.language.bean.RuntimeBeanExpressionException; import org.apache.camel.language.simple.myconverter.MyCustomDate; import org.apache.camel.language.simple.types.SimpleIllegalSyntaxException; +import org.apache.camel.spi.ExchangeFormatter; import org.apache.camel.spi.Language; import org.apache.camel.spi.PropertiesComponent; import org.apache.camel.spi.Registry; @@ -48,6 +49,7 @@ import org.apache.camel.spi.UuidGenerator; import org.apache.camel.spi.VariableRepository; import org.apache.camel.spi.VariableRepositoryFactory; import org.apache.camel.support.ExchangeHelper; +import org.apache.camel.support.LanguageHelper; import org.apache.camel.util.InetAddressUtil; import org.apache.camel.util.StringHelper; import org.junit.jupiter.api.Test; @@ -160,11 +162,24 @@ public class SimpleTest extends LanguageTestSupport { public void testExchangeExpression() { Expression exp = context.resolveLanguage("simple").createExpression("${exchange}"); assertNotNull(exp); - assertEquals(exchange, exp.evaluate(exchange, Object.class)); + assertEquals(exchange, exp.evaluate(exchange, Object.class)); assertExpression("${exchange}", exchange); } + @Test + public void testLogExchangeExpression() { + Expression exp = context.resolveLanguage("simple").createExpression("${logExchange}"); + assertNotNull(exp); + + // will use exchange formatter + ExchangeFormatter ef = LanguageHelper.getOrCreateExchangeFormatter(context, null); + String expected = ef.format(exchange); + assertEquals(expected, exp.evaluate(exchange, Object.class)); + + assertExpression("${logExchange}", expected); + } + @Test public void testExchangeOgnlExpression() { Expression exp = context.resolveLanguage("simple").createExpression("${exchange.exchangeId}"); 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 d860a9239d1..a0440a27569 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 @@ -43,6 +43,7 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.RuntimeExchangeException; import org.apache.camel.TypeConverter; import org.apache.camel.spi.ClassResolver; +import org.apache.camel.spi.ExchangeFormatter; import org.apache.camel.spi.Language; import org.apache.camel.spi.PropertiesComponent; import org.apache.camel.spi.Registry; @@ -1428,6 +1429,31 @@ public class ExpressionBuilder { }; } + /** + * Returns a dump of the exchange using {@link org.apache.camel.spi.ExchangeFormatter}. + */ + public static Expression dumpExchange() { + return new ExpressionAdapter() { + private ExchangeFormatter formatter; + + @Override + public void init(CamelContext context) { + super.init(context); + this.formatter = LanguageHelper.getOrCreateExchangeFormatter(context, null); + } + + @Override + public Object evaluate(Exchange exchange) { + return formatter.format(exchange); + } + + @Override + public String toString() { + return "dumpExchange"; + } + }; + } + /** * Returns a functional expression for the exchange */
