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 da9b9290287 CAMEL-20178: camel-jbang - Transform message to support 
components
da9b9290287 is described below

commit da9b929028745bb2df923e2f3c8712ad09efbe83
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sun Dec 3 17:45:27 2023 +0100

    CAMEL-20178: camel-jbang - Transform message to support components
---
 .../modules/ROOT/pages/camel-jbang.adoc            | 50 ++++++++++++++++++++++
 .../camel/cli/connector/LocalCliConnector.java     | 18 +++++++-
 .../commands/action/TransformMessageAction.java    | 16 +++++--
 3 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 6e36e24ba63..fa67359692b 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -2386,6 +2386,56 @@ You can also transform the message from JSon to XML as 
shown (or any other kind
     id: setBody-fa01
 ----
 
+=== Transforming message using Components
+
+Some components can also be used for message transformation such as Flatpack, 
Velocity, Freemarker, Thymaleaf, and good old XSLT.
+
+TIP: You can use `camel catalog component --filter=transform` to see which 
components can be transformation.
+
+Given the below XML in the `sample.xml` file:
+
+[source,xml]
+----
+<hash>
+  <id type="integer">1369</id>
+  <uid>8c946e1a-fdc5-40d3-9098-44271bdfad65</uid>
+  <account-number>8673088731</account-number>
+  <iban>GB38EFUA27474531363797</iban>
+  <bank-name>ABN AMRO MEZZANINE (UK) LIMITED</bank-name>
+  <routing-number>053228004</routing-number>
+  <swift-bic>AACCGB21</swift-bic>
+</hash>
+----
+
+Then you can transform this using an XSLT named `mystyle.xsl`:
+
+[source,xml]
+----
+<?xml version = "1.0"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
+
+  <xsl:template match="/">
+    <bank>
+       <name><xsl:value-of select="/hash/bank-name/text()"/></name>
+       <bic><xsl:value-of select="/hash/swift-bic/text()"/></bic>
+    </bank>
+  </xsl:template>
+
+</xsl:stylesheet>
+----
+
+Then you can do live changes to the stylesheet and see the output in real-time 
with Camel JBang by running:
+
+[source,bash]
+----
+$ camel transform message --body=file:sample.xml --component=xslt 
--template=file:mystyle.xsl --pretty --watch
+----
+
+You can then edit the `mystyle.xsl` file, and save the file, and watch the 
terminal for updated result.
+
+You can find this example at: 
https://github.com/apache/camel-kamelets-examples/tree/main/jbang/xslt-transform
+
+
 == Listing what Camel components is available
 
 Camel comes with a lot of artifacts out of the box which comes as:
diff --git 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
index 05871e4d527..df593973039 100644
--- 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
+++ 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
@@ -64,6 +64,7 @@ import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.spi.CliConnector;
 import org.apache.camel.spi.CliConnectorFactory;
 import org.apache.camel.spi.ContextReloadStrategy;
+import org.apache.camel.spi.EndpointUriFactory;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.ResourceLoader;
@@ -277,8 +278,9 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
         long timestamp = System.currentTimeMillis();
         String source = root.getString("source");
         String language = root.getString("language");
+        String component = root.getString("component");
         String template = Jsoner.unescape(root.getStringOrDefault("template", 
""));
-        if (template.startsWith("file:")) {
+        if (component == null && template.startsWith("file:")) {
             template = "resource:" + template;
         }
         String body = Jsoner.unescape(root.getString("body"));
@@ -380,6 +382,20 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
                     String result = lastSourceExpression.evaluate(out, 
String.class);
                     out.getMessage().setBody(result);
                 }
+            } else if (component != null) {
+                // transform via component
+                out.setPattern(ExchangePattern.InOut);
+                out.getMessage().setBody(inputBody);
+                if (inputHeaders != null) {
+                    out.getMessage().setHeaders(inputHeaders);
+                }
+                String uri = component + ":" + template;
+                // must disable any kind of content cache on the component, so 
template is always reloaded
+                EndpointUriFactory euf = 
camelContext.getCamelContextExtension().getEndpointUriFactory(component);
+                if (euf.propertyNames().contains("contentCache")) {
+                    uri = uri + "?contentCache=false";
+                }
+                out = producer.send(uri, out);
             } else {
                 // transform via language
                 Language lan = camelContext.resolveLanguage(language);
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
index fd07c1c96d4..140d6193a70 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
@@ -64,6 +64,11 @@ public class TransformMessageAction extends 
ActionWatchCommand {
                         description = "The language to use for message 
transformation")
     private String language;
 
+    @CommandLine.Option(names = {
+            "--component" },
+                        description = "The component to use for message 
transformation")
+    private String component;
+
     @CommandLine.Option(names = {
             "--template" },
                         description = "The template to use for message 
transformation (prefix with file: to refer to loading message body from file)")
@@ -112,12 +117,12 @@ public class TransformMessageAction extends 
ActionWatchCommand {
     @Override
     public Integer doCall() throws Exception {
         // either source or language/template is required
-        if (source == null && template == null && language == null) {
-            System.err.println("Either source or template and language must be 
configured");
+        if (source == null && template == null && language == null && 
component == null) {
+            System.err.println("Either source or template and 
language/component must be configured");
             return -1;
         }
-        if (source == null && (template == null || language == null)) {
-            System.err.println("Both template and language must be 
configured");
+        if (source == null && (template == null || language == null && 
component == null)) {
+            System.err.println("Both template and language/component must be 
configured");
             return -1;
         }
 
@@ -166,6 +171,9 @@ public class TransformMessageAction extends 
ActionWatchCommand {
         if (language != null) {
             root.put("language", language);
         }
+        if (component != null) {
+            root.put("component", component);
+        }
         if (template != null) {
             root.put("template", Jsoner.escape(template));
         }

Reply via email to