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 f56b04b4e53b CAMEL-23530: Move DataWeave parser to camel-dataweave
component and add auto-detection in DataSonnet
f56b04b4e53b is described below
commit f56b04b4e53b641e08fa879071ece515189074f5
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Aug 6 11:39:52 2026 +0200
CAMEL-23530: Move DataWeave parser to camel-dataweave component and add
auto-detection in DataSonnet
Move the DataWeave AST parser/lexer/converter from camel-jbang-core into
a new camel-dataweave component for broader reuse. The module is a
pure-JDK JAR with zero runtime dependencies.
Add camel-dataweave as a dependency of camel-datasonnet so .dwl files
and inline %dw expressions are automatically transpiled to DataSonnet at
route initialization time with zero configuration. Auto-detection works
by file extension (.dwl) and by content header (%dw).
Fix DataWeave auto-detection by moving detection to
createExpression(String, Object[]) so .dwl extension check runs before
the parent class loads the resource.
Closes #25363
Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
bom/camel-bom/pom.xml | 5 ++
catalog/camel-allcomponents/pom.xml | 5 ++
.../camel/catalog/docs/datasonnet-language.adoc | 84 ++++++++++++++++++++--
.../org/apache/camel/catalog/others.properties | 1 +
.../org/apache/camel/catalog/others/dataweave.json | 15 ++++
components/camel-datasonnet/pom.xml | 4 ++
.../src/main/docs/datasonnet-language.adoc | 84 ++++++++++++++++++++--
.../language/datasonnet/DatasonnetLanguage.java | 43 ++++++++++-
.../datasonnet/DataWeaveAutoDetectTest.java | 67 +++++++++++++++++
.../src/test/resources/simpleMapping.dwl | 7 ++
components/camel-dataweave/pom.xml | 55 ++++++++++++++
.../services/org/apache/camel/other.properties | 7 ++
.../src/generated/resources/dataweave.json | 15 ++++
.../camel/component/dataweave}/DataWeaveAst.java | 2 +-
.../component/dataweave}/DataWeaveConverter.java | 20 +++---
.../camel/component/dataweave}/DataWeaveLexer.java | 2 +-
.../component/dataweave}/DataWeaveParser.java | 16 ++---
.../dataweave}/DataWeaveConverterTest.java | 44 ++++++------
.../component/dataweave}/DataWeaveLexerTest.java | 6 +-
.../component/dataweave}/DataWeaveParserTest.java | 66 ++++++++---------
.../test/resources/dataweave/collection-map.dwl | 0
.../src/test/resources/dataweave/event-message.dwl | 0
.../src/test/resources/dataweave/null-handling.dwl | 0
.../src/test/resources/dataweave/simple-rename.dwl | 0
.../src/test/resources/dataweave/string-ops.dwl | 0
.../src/test/resources/dataweave/type-coercion.dwl | 0
components/pom.xml | 1 +
.../modules/others/examples/json/dataweave.json | 1 +
dsl/camel-jbang/camel-jbang-core/pom.xml | 4 ++
.../jbang/core/commands/TransformDataWeave.java | 2 +-
parent/pom.xml | 5 ++
31 files changed, 466 insertions(+), 95 deletions(-)
diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index ea5383026c76..f6f06b4f00b6 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -707,6 +707,11 @@
<artifactId>camel-datasonnet</artifactId>
<version>4.22.0-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-dataweave</artifactId>
+ <version>4.22.0-SNAPSHOT</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-debezium-common</artifactId>
diff --git a/catalog/camel-allcomponents/pom.xml
b/catalog/camel-allcomponents/pom.xml
index 9ff95f7750ff..0afdc8f168ad 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -597,6 +597,11 @@
<artifactId>camel-datasonnet</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-dataweave</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-debezium-common</artifactId>
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
index 015fc5ca4f63..fb3060a35882 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
@@ -404,25 +404,95 @@ YAML::
====
-== Migrating from DataWeave
+== DataWeave Support
-If you have existing DataWeave (`.dwl`) scripts, Camel provides a transpiler
to convert them to DataSonnet format via the Camel CLI CLI.
+Camel can execute DataWeave (`.dwl`) scripts directly by auto-detecting and
transpiling them to DataSonnet at load time.
+No extra configuration is needed -- just reference a `.dwl` resource and Camel
handles the conversion automatically.
-=== Converting an inline expression
+=== Auto-detection
-[source,bash]
+DataWeave scripts are detected in two ways:
+
+- **By file extension**: any resource ending in `.dwl` (e.g.,
`resource:classpath:transform.dwl`)
+- **By content**: inline expressions starting with the `%dw` header
+
+Once detected, the script is transpiled to DataSonnet and executed via the
datasonnet-mapper runtime.
+The conversion happens once at route initialization, so there is no runtime
overhead.
+
+=== Example
+
+Given a DataWeave file `transform.dwl` on the classpath:
+
+[source,dataweave]
----
-camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
+%dw 2.0
+output application/json
+---
+{
+ orderId: payload.order_id,
+ customer: payload.customer.first_name ++ " " ++ payload.customer.last_name,
+ total: payload.items map ((item) -> item.price * item.qty)
+ reduce ((item, acc = 0) -> acc + item)
+}
----
-=== Converting a file or directory
+You can use it directly in a route:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:in")
+ .transform(datasonnet("resource:classpath:transform.dwl", String.class))
+ .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+ <from uri="direct:in"/>
+ <transform>
+ <datasonnet
resultTypeName="java.lang.String">resource:classpath:transform.dwl</datasonnet>
+ </transform>
+ <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:in
+ steps:
+ - transform:
+ expression:
+ datasonnet:
+ expression: "resource:classpath:transform.dwl"
+ resultType: java.lang.String
+ - to:
+ uri: mock:result
+----
+====
+
+=== CLI Transpiler
+
+You can also convert DataWeave scripts ahead of time using the Camel CLI:
[source,bash]
----
+camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
camel transform dataweave --input my-transform.dwl --output my-transform.ds
camel transform dataweave --input src/main/resources/dwl/ --output
src/main/resources/ds/
----
+=== Supported Constructs
+
The transpiler automatically maps DataWeave constructs to their DataSonnet
equivalents, including:
- `payload` to `body`, `vars` to `cml.variable()`, `attributes.headers` to
`cml.header()`
@@ -431,7 +501,7 @@ The transpiler automatically maps DataWeave constructs to
their DataSonnet equiv
- String operations: `contains`, `startsWith`, `endsWith`, `splitBy`,
`joinBy`, `replace`
- Functions: `sizeOf`, `upper`, `lower`, `trim`, `now`, `uuid`, `abs`,
`round`, `sqrt`
-Constructs that cannot be automatically converted (such as `match`
expressions) are marked with `TODO` comments in the output for manual review.
+Constructs that cannot be automatically converted (such as `match`
expressions) are emitted as `null` for manual review.
== Dependencies
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
index e1c80fb21928..20197d007d61 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
@@ -7,6 +7,7 @@ cluster
componentdsl
console
csimple-joor
+dataweave
debug
diagram
dsl-modeline
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/dataweave.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/dataweave.json
new file mode 100644
index 000000000000..9d86b56df2da
--- /dev/null
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/dataweave.json
@@ -0,0 +1,15 @@
+{
+ "other": {
+ "kind": "other",
+ "name": "dataweave",
+ "title": "DataWeave",
+ "description": "Camel DataWeave support",
+ "deprecated": false,
+ "firstVersion": "4.22.0",
+ "label": "transformation",
+ "supportLevel": "Preview",
+ "groupId": "org.apache.camel",
+ "artifactId": "camel-dataweave",
+ "version": "4.22.0-SNAPSHOT"
+ }
+}
diff --git a/components/camel-datasonnet/pom.xml
b/components/camel-datasonnet/pom.xml
index 3a9591c554f9..e7d941d09471 100644
--- a/components/camel-datasonnet/pom.xml
+++ b/components/camel-datasonnet/pom.xml
@@ -38,6 +38,10 @@
<artifactId>scala-library</artifactId>
<version>${scala-datasonnet-version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-dataweave</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-support</artifactId>
diff --git a/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc
b/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc
index 015fc5ca4f63..fb3060a35882 100644
--- a/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc
+++ b/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc
@@ -404,25 +404,95 @@ YAML::
====
-== Migrating from DataWeave
+== DataWeave Support
-If you have existing DataWeave (`.dwl`) scripts, Camel provides a transpiler
to convert them to DataSonnet format via the Camel CLI CLI.
+Camel can execute DataWeave (`.dwl`) scripts directly by auto-detecting and
transpiling them to DataSonnet at load time.
+No extra configuration is needed -- just reference a `.dwl` resource and Camel
handles the conversion automatically.
-=== Converting an inline expression
+=== Auto-detection
-[source,bash]
+DataWeave scripts are detected in two ways:
+
+- **By file extension**: any resource ending in `.dwl` (e.g.,
`resource:classpath:transform.dwl`)
+- **By content**: inline expressions starting with the `%dw` header
+
+Once detected, the script is transpiled to DataSonnet and executed via the
datasonnet-mapper runtime.
+The conversion happens once at route initialization, so there is no runtime
overhead.
+
+=== Example
+
+Given a DataWeave file `transform.dwl` on the classpath:
+
+[source,dataweave]
----
-camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
+%dw 2.0
+output application/json
+---
+{
+ orderId: payload.order_id,
+ customer: payload.customer.first_name ++ " " ++ payload.customer.last_name,
+ total: payload.items map ((item) -> item.price * item.qty)
+ reduce ((item, acc = 0) -> acc + item)
+}
----
-=== Converting a file or directory
+You can use it directly in a route:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:in")
+ .transform(datasonnet("resource:classpath:transform.dwl", String.class))
+ .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+ <from uri="direct:in"/>
+ <transform>
+ <datasonnet
resultTypeName="java.lang.String">resource:classpath:transform.dwl</datasonnet>
+ </transform>
+ <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:in
+ steps:
+ - transform:
+ expression:
+ datasonnet:
+ expression: "resource:classpath:transform.dwl"
+ resultType: java.lang.String
+ - to:
+ uri: mock:result
+----
+====
+
+=== CLI Transpiler
+
+You can also convert DataWeave scripts ahead of time using the Camel CLI:
[source,bash]
----
+camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
camel transform dataweave --input my-transform.dwl --output my-transform.ds
camel transform dataweave --input src/main/resources/dwl/ --output
src/main/resources/ds/
----
+=== Supported Constructs
+
The transpiler automatically maps DataWeave constructs to their DataSonnet
equivalents, including:
- `payload` to `body`, `vars` to `cml.variable()`, `attributes.headers` to
`cml.header()`
@@ -431,7 +501,7 @@ The transpiler automatically maps DataWeave constructs to
their DataSonnet equiv
- String operations: `contains`, `startsWith`, `endsWith`, `splitBy`,
`joinBy`, `replace`
- Functions: `sizeOf`, `upper`, `lower`, `trim`, `now`, `uuid`, `abs`,
`round`, `sqrt`
-Constructs that cannot be automatically converted (such as `match`
expressions) are marked with `TODO` comments in the output for manual review.
+Constructs that cannot be automatically converted (such as `match`
expressions) are emitted as `null` for manual review.
== Dependencies
diff --git
a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
index 45a7266a2dd6..8d035d4a05cd 100644
---
a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
+++
b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
@@ -29,6 +29,7 @@ import io.github.classgraph.ClassGraph;
import io.github.classgraph.ScanResult;
import org.apache.camel.Expression;
import org.apache.camel.Predicate;
+import org.apache.camel.component.dataweave.DataWeaveConverter;
import org.apache.camel.spi.annotations.Language;
import org.apache.camel.support.LRUCacheFactory;
import org.apache.camel.support.SingleInputTypedLanguageSupport;
@@ -68,9 +69,21 @@ public class DatasonnetLanguage extends
SingleInputTypedLanguageSupport {
}
@Override
- public Expression createExpression(Expression source, String expression,
Object[] properties) {
- expression = loadResource(expression);
+ public Expression createExpression(String expression, Object[] properties)
{
+ if (expression != null) {
+ boolean dwlResource = isDataWeaveResource(expression);
+ if (dwlResource) {
+ expression = loadResource(expression);
+ }
+ if (dwlResource || isDataWeaveContent(expression)) {
+ expression = convertDataWeave(expression);
+ }
+ }
+ return super.createExpression(expression, properties);
+ }
+ @Override
+ public Expression createExpression(Expression source, String expression,
Object[] properties) {
DatasonnetExpression answer = new DatasonnetExpression(expression);
answer.setSource(source);
answer.setResultType(property(Class.class, properties, 0, null));
@@ -100,6 +113,32 @@ public class DatasonnetLanguage extends
SingleInputTypedLanguageSupport {
return classpathImports;
}
+ private static boolean isDataWeaveResource(String expression) {
+ return expression != null && expression.endsWith(".dwl");
+ }
+
+ private static boolean isDataWeaveContent(String expression) {
+ return expression != null &&
expression.stripLeading().startsWith("%dw");
+ }
+
+ private static String convertDataWeave(String expression) {
+ DataWeaveConverter converter = new DataWeaveConverter();
+ converter.setIncludeComments(false);
+ String result;
+ if (expression.contains("%dw") || expression.contains("---")) {
+ result = converter.convert(expression);
+ } else {
+ result = converter.convertExpression(expression);
+ }
+ if (converter.getTodoCount() > 0) {
+ LOG.warn("DataWeave conversion has {} construct(s) that could not
be auto-converted and were emitted as null",
+ converter.getTodoCount());
+ } else {
+ LOG.debug("Converted DataWeave to DataSonnet: {} expression(s)",
converter.getConvertedCount());
+ }
+ return result;
+ }
+
private Map<String, String> discoverDataSonnetLibraries() {
Map<String, String> imports = new HashMap<>();
try (ScanResult scanResult = new ClassGraph().acceptPaths("/").scan())
{
diff --git
a/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/DataWeaveAutoDetectTest.java
b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/DataWeaveAutoDetectTest.java
new file mode 100644
index 000000000000..82aaf0747570
--- /dev/null
+++
b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/DataWeaveAutoDetectTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.language.datasonnet;
+
+import com.datasonnet.document.MediaTypes;
+import org.apache.camel.Exchange;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+class DataWeaveAutoDetectTest extends CamelTestSupport {
+
+ @Test
+ void testDataWeaveResourceAutoDetect() throws Exception {
+ template.sendBody("direct:dwlResource", "{\"name\": \"Camel\"}");
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ Exchange exchange = mock.assertExchangeReceived(0);
+ String response = exchange.getMessage().getBody(String.class);
+ JSONAssert.assertEquals("{\"name\": \"Camel\", \"greeting\": \"Hello,
Camel\"}", response, true);
+ }
+
+ @Test
+ void testDataWeaveInlineAutoDetect() throws Exception {
+ template.sendBody("direct:dwlInline", "{\"name\": \"Camel\"}");
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ Exchange exchange = mock.assertExchangeReceived(0);
+ String response = exchange.getMessage().getBody(String.class);
+ JSONAssert.assertEquals("{\"greeting\": \"Hello, Camel\"}", response,
true);
+ }
+
+ @Override
+ protected RoutesBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:dwlResource")
+
.transform(datasonnet("resource:classpath:simpleMapping.dwl", String.class,
+ MediaTypes.APPLICATION_JSON_VALUE,
MediaTypes.APPLICATION_JSON_VALUE))
+ .to("mock:result");
+
+ from("direct:dwlInline")
+ .transform(datasonnet(
+ "%dw 2.0\noutput application/json\n---\n{
greeting: \"Hello, \" ++ payload.name }",
+ String.class,
+ MediaTypes.APPLICATION_JSON_VALUE,
MediaTypes.APPLICATION_JSON_VALUE))
+ .to("mock:result");
+ }
+ };
+ }
+}
diff --git a/components/camel-datasonnet/src/test/resources/simpleMapping.dwl
b/components/camel-datasonnet/src/test/resources/simpleMapping.dwl
new file mode 100644
index 000000000000..79ac36005bb7
--- /dev/null
+++ b/components/camel-datasonnet/src/test/resources/simpleMapping.dwl
@@ -0,0 +1,7 @@
+%dw 2.0
+output application/json
+---
+{
+ name: payload.name,
+ greeting: "Hello, " ++ payload.name
+}
diff --git a/components/camel-dataweave/pom.xml
b/components/camel-dataweave/pom.xml
new file mode 100644
index 000000000000..4d590aba80fb
--- /dev/null
+++ b/components/camel-dataweave/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>components</artifactId>
+ <version>4.22.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-dataweave</artifactId>
+ <packaging>jar</packaging>
+
+ <name>Camel :: DataWeave</name>
+ <description>Camel DataWeave support</description>
+
+ <properties>
+ <firstVersion>4.22.0</firstVersion>
+ <label>transformation</label>
+ <title>DataWeave</title>
+ </properties>
+
+ <dependencies>
+ <!-- test dependencies -->
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git
a/components/camel-dataweave/src/generated/resources/META-INF/services/org/apache/camel/other.properties
b/components/camel-dataweave/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 000000000000..40bc48ca1d26
--- /dev/null
+++
b/components/camel-dataweave/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=dataweave
+groupId=org.apache.camel
+artifactId=camel-dataweave
+version=4.22.0-SNAPSHOT
+projectName=Camel :: DataWeave
+projectDescription=Camel DataWeave support
diff --git a/components/camel-dataweave/src/generated/resources/dataweave.json
b/components/camel-dataweave/src/generated/resources/dataweave.json
new file mode 100644
index 000000000000..9d86b56df2da
--- /dev/null
+++ b/components/camel-dataweave/src/generated/resources/dataweave.json
@@ -0,0 +1,15 @@
+{
+ "other": {
+ "kind": "other",
+ "name": "dataweave",
+ "title": "DataWeave",
+ "description": "Camel DataWeave support",
+ "deprecated": false,
+ "firstVersion": "4.22.0",
+ "label": "transformation",
+ "supportLevel": "Preview",
+ "groupId": "org.apache.camel",
+ "artifactId": "camel-dataweave",
+ "version": "4.22.0-SNAPSHOT"
+ }
+}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveAst.java
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveAst.java
similarity index 98%
rename from
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveAst.java
rename to
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveAst.java
index 4b75a0569aff..f1ef34b9b40b 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveAst.java
+++
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveAst.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
import java.util.List;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverter.java
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveConverter.java
similarity index 96%
rename from
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverter.java
rename to
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveConverter.java
index 3842f29b2c5e..6bc12820c8ea 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverter.java
+++
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveConverter.java
@@ -14,13 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
import java.util.ArrayList;
import java.util.List;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.*;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveAst.*;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
/**
* Converts DataWeave 2.0 scripts to DataSonnet. Parses the DataWeave input,
walks the AST, and emits equivalent
@@ -84,7 +84,7 @@ public class DataWeaveConverter {
return emitNode(ast);
}
- // ── Emission ──
+ // -- Emission --
private String emit(DataWeaveAst node) {
if (node instanceof Script script) {
@@ -352,7 +352,7 @@ public class DataWeaveConverter {
case "Boolean" -> "cml.toBoolean(" + expr + ")";
default -> {
todoCount++;
- yield expr + (includeComments ? " // TODO: manual conversion
needed — as " + tc.type() : "");
+ yield expr + (includeComments ? " // TODO: manual conversion
needed -- as " + tc.type() : "");
}
};
}
@@ -410,9 +410,9 @@ public class DataWeaveConverter {
yield "c.max(" + argStr + ")";
}
case "read" -> "std.parseJson(" + argStr + ")"
- + (includeComments ? " // NOTE: assumes JSON input
— DW read() supports multiple formats" : "");
+ + (includeComments ? " // NOTE: assumes JSON input
-- DW read() supports multiple formats" : "");
case "write" -> "std.manifestJsonEx(" + argStr + ", \" \")"
- + (includeComments ? " // NOTE: outputs JSON — DW
write() supports multiple formats" : "");
+ + (includeComments ? " // NOTE: outputs JSON -- DW
write() supports multiple formats" : "");
default -> fc.name() + "(" + argStr + ")";
};
}
@@ -436,7 +436,7 @@ public class DataWeaveConverter {
List<String> paramNames = lambdaParamNames(lam);
String body = emitNode(lam.body());
if (paramNames.size() == 2) {
- // DW: map ((item, index) -> body) — DS:
std.mapWithIndex(function(index, item) body, collection)
+ // DW: map ((item, index) -> body) -- DS:
std.mapWithIndex(function(index, item) body, collection)
// Parameter order is swapped: DW is (item, index), DS is
(index, item)
return "std.mapWithIndex(function(" + paramNames.get(1) + ", "
+ paramNames.get(0)
+ ") " + body + ", " + collection + ")";
@@ -498,7 +498,7 @@ public class DataWeaveConverter {
if (dbe.lambda() instanceof Lambda lam) {
List<String> paramNames = lambdaParamNames(lam);
String body = emitNode(lam.body());
- // distinctBy keeps first occurrence per key — use distinctBy
helper
+ // distinctBy keeps first occurrence per key -- use distinctBy
helper
return "c.distinctBy(" + collection + ", function(" +
paramNames.get(0) + ") " + body + ")";
}
return "c.distinct(" + collection + ")";
@@ -593,7 +593,7 @@ public class DataWeaveConverter {
todoCount++;
convertedCount--;
return includeComments
- ? "// TODO: manual conversion needed — " + u.reason() + ": " +
u.originalText() + "\nnull"
+ ? "// TODO: manual conversion needed -- " + u.reason() + ": "
+ u.originalText() + "\nnull"
: "null";
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexer.java
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveLexer.java
similarity index 99%
rename from
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexer.java
rename to
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveLexer.java
index 1d74d45d7382..703424acaeb6 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexer.java
+++
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveLexer.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
import java.util.ArrayList;
import java.util.List;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParser.java
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveParser.java
similarity index 98%
rename from
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParser.java
rename to
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveParser.java
index 8c2f62c29dfb..e91187d23f17 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParser.java
+++
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveParser.java
@@ -14,13 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
import java.util.ArrayList;
import java.util.List;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.TokenType;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveLexer.TokenType;
/**
* Recursive descent parser for DataWeave 2.0 scripts producing {@link
DataWeaveAst} nodes.
@@ -45,7 +45,7 @@ public class DataWeaveParser {
return parseExpression();
}
- // ── Header parsing ──
+ // -- Header parsing --
private DataWeaveAst.Header parseHeader() {
String version = "2.0";
@@ -57,7 +57,7 @@ public class DataWeaveParser {
|| checkIdentifier("output") || checkIdentifier("input");
if (!hasHeader) {
- // No header section — skip directly to body
+ // No header section -- skip directly to body
return new DataWeaveAst.Header(version, null, inputs);
}
@@ -118,7 +118,7 @@ public class DataWeaveParser {
return sb.toString();
}
- // ── Expression parsing (precedence climbing) ──
+ // -- Expression parsing (precedence climbing) --
private DataWeaveAst parseExpression() {
// Handle var/fun declarations at expression level
@@ -442,7 +442,7 @@ public class DataWeaveParser {
expr = new DataWeaveAst.ReplaceExpr(expr, target, replacement);
} else if (checkIdentifier("match")) {
advance(); // match
- // Capture the match block as unsupported — skip braces
+ // Capture the match block as unsupported -- skip braces
StringBuilder matchText = new StringBuilder("match ");
if (check(TokenType.LBRACE)) {
int depth = 1;
@@ -717,7 +717,7 @@ public class DataWeaveParser {
return new DataWeaveAst.ArrayLit(elements);
}
- // ── Token helpers ──
+ // -- Token helpers --
private Token current() {
return pos < tokens.size() ? tokens.get(pos) :
tokens.get(tokens.size() - 1);
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverterTest.java
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveConverterTest.java
similarity index 95%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverterTest.java
rename to
components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveConverterTest.java
index c2424bd1e66a..97441b844b19 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverterTest.java
+++
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveConverterTest.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
import java.io.IOException;
import java.io.InputStream;
@@ -34,7 +34,7 @@ class DataWeaveConverterTest {
converter = new DataWeaveConverter();
}
- // ── Header conversion ──
+ // -- Header conversion --
@Test
void testHeaderConversion() {
@@ -51,7 +51,7 @@ class DataWeaveConverterTest {
assertTrue(result.contains("*/"));
}
- // ── Field access ──
+ // -- Field access --
@Test
void testPayloadToBody() {
@@ -83,7 +83,7 @@ class DataWeaveConverterTest {
assertEquals("cml.header('page')", result);
}
- // ── Operators ──
+ // -- Operators --
@Test
void testStringConcat() {
@@ -109,7 +109,7 @@ class DataWeaveConverterTest {
assertEquals("body.active && body.verified", result);
}
- // ── Default operator ──
+ // -- Default operator --
@Test
void testDefault() {
@@ -117,7 +117,7 @@ class DataWeaveConverterTest {
assertEquals("cml.defaultVal(body.currency, \"USD\")", result);
}
- // ── Type coercion ──
+ // -- Type coercion --
@Test
void testAsNumber() {
@@ -143,7 +143,7 @@ class DataWeaveConverterTest {
assertEquals("cml.toBoolean(body.active)", result);
}
- // ── Built-in functions ──
+ // -- Built-in functions --
@Test
void testSizeOf() {
@@ -194,7 +194,7 @@ class DataWeaveConverterTest {
assertTrue(converter.needsCamelLib());
}
- // ── String operations ──
+ // -- String operations --
@Test
void testContains() {
@@ -221,7 +221,7 @@ class DataWeaveConverterTest {
assertEquals("std.strReplace(body.text, \"old\", \"new\")", result);
}
- // ── Collection operations ──
+ // -- Collection operations --
@Test
void testMap() {
@@ -265,7 +265,7 @@ class DataWeaveConverterTest {
assertTrue(result.contains("item.tags"));
}
- // ── If/else ──
+ // -- If/else --
@Test
void testIfElse() {
@@ -274,7 +274,7 @@ class DataWeaveConverterTest {
assertEquals("if body.age >= 18 then \"adult\" else \"minor\"",
result);
}
- // ── Object and array literals ──
+ // -- Object and array literals --
@Test
void testObjectLiteral() {
@@ -289,7 +289,7 @@ class DataWeaveConverterTest {
assertEquals("[1, 2, 3]", result);
}
- // ── Full script tests ──
+ // -- Full script tests --
@Test
void testSimpleRenameScript() throws IOException {
@@ -382,7 +382,7 @@ class DataWeaveConverterTest {
assertTrue(result.contains("name: body.name"));
}
- // ── startsWith / endsWith ──
+ // -- startsWith / endsWith --
@Test
void testStartsWith() {
@@ -398,7 +398,7 @@ class DataWeaveConverterTest {
assertTrue(converter.needsCamelLib());
}
- // ── Math functions ──
+ // -- Math functions --
@Test
void testAbs() {
@@ -427,17 +427,17 @@ class DataWeaveConverterTest {
assertTrue(converter.needsCamelLib());
}
- // ── mapWithIndex parameter order ──
+ // -- mapWithIndex parameter order --
@Test
void testMapWithIndex() {
+ // DataSonnet std.mapWithIndex uses function(index, item), so params
must be swapped
String result = converter.convertExpression(
"payload.items map ((item, idx) -> { index: idx, name:
item.name })");
- // DataSonnet std.mapWithIndex uses function(index, item), so params
must be swapped
assertTrue(result.contains("std.mapWithIndex(function(idx, item)"));
}
- // ── distinctBy ──
+ // -- distinctBy --
@Test
void testDistinctBy() {
@@ -448,7 +448,7 @@ class DataWeaveConverterTest {
assertTrue(converter.needsCamelLib());
}
- // ── Lambda shorthand ──
+ // -- Lambda shorthand --
@Test
void testLambdaShorthand() {
@@ -456,7 +456,7 @@ class DataWeaveConverterTest {
assertTrue(result.contains("function(x) x.name"));
}
- // ── match expression ──
+ // -- match expression --
@Test
void testMatchExpressionUnsupported() {
@@ -466,7 +466,7 @@ class DataWeaveConverterTest {
assertTrue(converter.getTodoCount() > 0);
}
- // ── Multi-value selector ──
+ // -- Multi-value selector --
@Test
void testMultiValueSelector() {
@@ -475,7 +475,7 @@ class DataWeaveConverterTest {
assertEquals(0, converter.getTodoCount());
}
- // ── Escape handling ──
+ // -- Escape handling --
@Test
void testStringEscapesPreserved() {
@@ -483,7 +483,7 @@ class DataWeaveConverterTest {
assertTrue(result.contains("\"\\n\""), "Newline escape should be
preserved, got: " + result);
}
- // ── Helpers ──
+ // -- Helpers --
private String loadResource(String path) throws IOException {
try (InputStream is =
getClass().getClassLoader().getResourceAsStream(path)) {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexerTest.java
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveLexerTest.java
similarity index 96%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexerTest.java
rename to
components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveLexerTest.java
index 9395ac07424c..6d3b844babe1 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexerTest.java
+++
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveLexerTest.java
@@ -14,12 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
import java.util.List;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.TokenType;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveLexer.TokenType;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParserTest.java
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveParserTest.java
similarity index 83%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParserTest.java
rename to
components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveParserTest.java
index 8802531c2932..fcc71cc4e025 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParserTest.java
+++
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveParserTest.java
@@ -14,31 +14,31 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
import java.util.List;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.ArrayLit;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.BinaryOp;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.DefaultExpr;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.FieldAccess;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.FunctionCall;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Identifier;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.IfElse;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.IndexAccess;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Lambda;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.LambdaShorthand;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.MapExpr;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.NumberLit;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.ObjectLit;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Parens;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Script;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.StringLit;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.TypeCoercion;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.UnaryOp;
-import
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Unsupported;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.VarDecl;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveAst.ArrayLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.BinaryOp;
+import org.apache.camel.component.dataweave.DataWeaveAst.DefaultExpr;
+import org.apache.camel.component.dataweave.DataWeaveAst.FieldAccess;
+import org.apache.camel.component.dataweave.DataWeaveAst.FunctionCall;
+import org.apache.camel.component.dataweave.DataWeaveAst.Identifier;
+import org.apache.camel.component.dataweave.DataWeaveAst.IfElse;
+import org.apache.camel.component.dataweave.DataWeaveAst.IndexAccess;
+import org.apache.camel.component.dataweave.DataWeaveAst.Lambda;
+import org.apache.camel.component.dataweave.DataWeaveAst.LambdaShorthand;
+import org.apache.camel.component.dataweave.DataWeaveAst.MapExpr;
+import org.apache.camel.component.dataweave.DataWeaveAst.NumberLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.ObjectLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.Parens;
+import org.apache.camel.component.dataweave.DataWeaveAst.Script;
+import org.apache.camel.component.dataweave.DataWeaveAst.StringLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.TypeCoercion;
+import org.apache.camel.component.dataweave.DataWeaveAst.UnaryOp;
+import org.apache.camel.component.dataweave.DataWeaveAst.Unsupported;
+import org.apache.camel.component.dataweave.DataWeaveAst.VarDecl;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -67,7 +67,7 @@ class DataWeaveParserTest {
return new DataWeaveParser(tokens).parse();
}
- // ── Header ──
+ // -- Header --
@Test
void shouldParseHeaderVersionAndOutputType() {
@@ -109,7 +109,7 @@ class DataWeaveParserTest {
assertInstanceOf(Identifier.class, script.body());
}
- // ── Literals and field access ──
+ // -- Literals and field access --
@Test
void shouldParseLiterals() {
@@ -129,7 +129,7 @@ class DataWeaveParserTest {
assertEquals("payload", assertInstanceOf(Identifier.class,
fa.object()).name());
}
- // ── Precedence ──
+ // -- Precedence --
@Test
void shouldGiveMultiplicationHigherPrecedenceThanAddition() {
@@ -165,7 +165,7 @@ class DataWeaveParserTest {
assertEquals("+", assertInstanceOf(BinaryOp.class,
parens.expr()).op());
}
- // ── Object / array literals ──
+ // -- Object / array literals --
@Test
void shouldParseObjectLiteralWithStaticAndDynamicKeys() {
@@ -186,7 +186,7 @@ class DataWeaveParserTest {
assertEquals("2", assertInstanceOf(NumberLit.class,
arr.elements().get(1)).value());
}
- // ── Collection operations / lambdas ──
+ // -- Collection operations / lambdas --
@Test
void shouldParseMapWithExplicitLambda() {
@@ -205,7 +205,7 @@ class DataWeaveParserTest {
assertEquals(List.of("name"), sh.fields());
}
- // ── Function calls ──
+ // -- Function calls --
@Test
void shouldParseBuiltinFunctionCall() {
@@ -215,7 +215,7 @@ class DataWeaveParserTest {
assertEquals("payload", assertInstanceOf(Identifier.class,
call.args().get(0)).name());
}
- // ── Type coercion ──
+ // -- Type coercion --
@Test
void shouldParseTypeCoercionWithoutFormat() {
@@ -231,7 +231,7 @@ class DataWeaveParserTest {
assertEquals("yyyy-MM-dd", tc.format());
}
- // ── Control flow ──
+ // -- Control flow --
@Test
void shouldParseIfElse() {
@@ -257,7 +257,7 @@ class DataWeaveParserTest {
assertEquals("x", assertInstanceOf(Identifier.class,
var.body()).name());
}
- // ── Unary ──
+ // -- Unary --
@Test
void shouldParseLogicalNot() {
@@ -266,7 +266,7 @@ class DataWeaveParserTest {
assertEquals("a", assertInstanceOf(Identifier.class,
not.operand()).name());
}
- // ── Graceful degradation ──
+ // -- Graceful degradation --
@Test
void shouldRepresentMatchExpressionAsUnsupported() {
@@ -278,9 +278,9 @@ class DataWeaveParserTest {
@Test
void shouldNotThrowOnUnbalancedInput() {
- // expect() silently skips a missing RPAREN, so a best-effort AST is
still produced
List<Token> tokens = new DataWeaveLexer("(a + b").tokenize();
assertEquals(DataWeaveLexer.TokenType.EOF, tokens.get(tokens.size() -
1).type());
+ // expect() silently skips a missing RPAREN, so a best-effort AST is
still produced
assertInstanceOf(Parens.class, parseExpr("(a + b"));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/collection-map.dwl
b/components/camel-dataweave/src/test/resources/dataweave/collection-map.dwl
similarity index 100%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/collection-map.dwl
rename to
components/camel-dataweave/src/test/resources/dataweave/collection-map.dwl
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/event-message.dwl
b/components/camel-dataweave/src/test/resources/dataweave/event-message.dwl
similarity index 100%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/event-message.dwl
rename to
components/camel-dataweave/src/test/resources/dataweave/event-message.dwl
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/null-handling.dwl
b/components/camel-dataweave/src/test/resources/dataweave/null-handling.dwl
similarity index 100%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/null-handling.dwl
rename to
components/camel-dataweave/src/test/resources/dataweave/null-handling.dwl
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/simple-rename.dwl
b/components/camel-dataweave/src/test/resources/dataweave/simple-rename.dwl
similarity index 100%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/simple-rename.dwl
rename to
components/camel-dataweave/src/test/resources/dataweave/simple-rename.dwl
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/string-ops.dwl
b/components/camel-dataweave/src/test/resources/dataweave/string-ops.dwl
similarity index 100%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/string-ops.dwl
rename to components/camel-dataweave/src/test/resources/dataweave/string-ops.dwl
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/type-coercion.dwl
b/components/camel-dataweave/src/test/resources/dataweave/type-coercion.dwl
similarity index 100%
rename from
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/type-coercion.dwl
rename to
components/camel-dataweave/src/test/resources/dataweave/type-coercion.dwl
diff --git a/components/pom.xml b/components/pom.xml
index e09d87cfe482..5c9fca05136b 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -120,6 +120,7 @@
<module>camel-cyberark-vault</module>
<module>camel-dapr</module>
<module>camel-datasonnet</module>
+ <module>camel-dataweave</module>
<module>camel-debug</module>
<module>camel-diagram</module>
<module>camel-debezium</module>
diff --git a/docs/components/modules/others/examples/json/dataweave.json
b/docs/components/modules/others/examples/json/dataweave.json
new file mode 120000
index 000000000000..d2175aae6006
--- /dev/null
+++ b/docs/components/modules/others/examples/json/dataweave.json
@@ -0,0 +1 @@
+../../../../../../components/camel-dataweave/src/generated/resources/dataweave.json
\ No newline at end of file
diff --git a/dsl/camel-jbang/camel-jbang-core/pom.xml
b/dsl/camel-jbang/camel-jbang-core/pom.xml
index d369b09415b0..d3066b4c5e6f 100644
--- a/dsl/camel-jbang/camel-jbang-core/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-core/pom.xml
@@ -45,6 +45,10 @@
<dependencies>
<!-- camel -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-dataweave</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-diagram</artifactId>
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
index bc3ff95df84d..e08ed966680f 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
@@ -23,7 +23,7 @@ import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveConverter;
+import org.apache.camel.component.dataweave.DataWeaveConverter;
import picocli.CommandLine;
import picocli.CommandLine.Command;
diff --git a/parent/pom.xml b/parent/pom.xml
index 1a8f16f90ce7..a3958175c1f7 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1247,6 +1247,11 @@
<artifactId>camel-datasonnet</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-dataweave</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-debezium-common</artifactId>