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

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

commit 0320e1982e02a8c095a322f8a2f051cea2ded052
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Tue Oct 29 09:27:31 2024 +0100

    CAMEL-21391: Add support for <dataFormats> in yaml DSL
---
 .../org/apache/camel/catalog/models-app/beans.json |  13 +--
 .../org/apache/camel/catalog/models-app/camel.json |  13 +--
 .../apache/camel/catalog/schemas/camel-spring.xsd  |  15 +++
 .../dsl/yaml/deserializers/CustomResolver.java     |   2 +
 .../DataFormatsDefinitionDeserializer.java         | 102 +++++++++++++++++++++
 .../generated/resources/schema/camelYamlDsl.json   |  10 ++
 .../apache/camel/dsl/yaml/DataFormatsTest.groovy   |  49 ++++++++++
 7 files changed, 192 insertions(+), 12 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/beans.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/beans.json
index dea9b5905d1..142431336a4 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/beans.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/beans.json
@@ -14,11 +14,12 @@
   "properties": {
     "component-scan": { "index": 0, "kind": "element", "displayName": 
"Component-scan", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.app.ComponentScanDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Component scanning that can auto-discover Camel route builders from the 
classpath." },
     "bean": { "index": 1, "kind": "element", "displayName": "Bean", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.BeanFactoryDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "List of bean" },
-    "restConfiguration": { "index": 2, "kind": "element", "displayName": "Rest 
Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.rest.RestConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
Rest DSL Configuration" },
-    "rest": { "index": 3, "kind": "element", "displayName": "Rest", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.rest.RestDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel Rest DSL" },
-    "routeConfiguration": { "index": 4, "kind": "element", "displayName": 
"Route Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.RouteConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
route configurations" },
-    "routeTemplate": { "index": 5, "kind": "element", "displayName": "Route 
Template", "group": "common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteTemplateDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel route 
templates" },
-    "templatedRoute": { "index": 6, "kind": "element", "displayName": 
"Templated Route", "group": "common", "required": false, "type": "array", 
"javaType": "java.util.List<org.apache.camel.model.TemplatedRouteDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
routes to be created from template" },
-    "route": { "index": 7, "kind": "element", "displayName": "Route", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteDefinition>", "deprecated": false, 
"autowired": false, "secret": false, "description": "Camel routes" }
+    "dataFormat": { "index": 2, "kind": "element", "displayName": "Data 
Format", "group": "common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.DataFormatDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel data formats" 
},
+    "restConfiguration": { "index": 3, "kind": "element", "displayName": "Rest 
Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.rest.RestConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
Rest DSL Configuration" },
+    "rest": { "index": 4, "kind": "element", "displayName": "Rest", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.rest.RestDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel Rest DSL" },
+    "routeConfiguration": { "index": 5, "kind": "element", "displayName": 
"Route Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.RouteConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
route configurations" },
+    "routeTemplate": { "index": 6, "kind": "element", "displayName": "Route 
Template", "group": "common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteTemplateDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel route 
templates" },
+    "templatedRoute": { "index": 7, "kind": "element", "displayName": 
"Templated Route", "group": "common", "required": false, "type": "array", 
"javaType": "java.util.List<org.apache.camel.model.TemplatedRouteDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
routes to be created from template" },
+    "route": { "index": 8, "kind": "element", "displayName": "Route", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteDefinition>", "deprecated": false, 
"autowired": false, "secret": false, "description": "Camel routes" }
   }
 }
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/camel.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/camel.json
index 0e9631c8ed8..6d14ff17da6 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/camel.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models-app/camel.json
@@ -14,11 +14,12 @@
   "properties": {
     "component-scan": { "index": 0, "kind": "element", "displayName": 
"Component-scan", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.app.ComponentScanDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Component scanning that can auto-discover Camel route builders from the 
classpath." },
     "bean": { "index": 1, "kind": "element", "displayName": "Bean", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.BeanFactoryDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "List of bean" },
-    "restConfiguration": { "index": 2, "kind": "element", "displayName": "Rest 
Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.rest.RestConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
Rest DSL Configuration" },
-    "rest": { "index": 3, "kind": "element", "displayName": "Rest", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.rest.RestDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel Rest DSL" },
-    "routeConfiguration": { "index": 4, "kind": "element", "displayName": 
"Route Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.RouteConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
route configurations" },
-    "routeTemplate": { "index": 5, "kind": "element", "displayName": "Route 
Template", "group": "common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteTemplateDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel route 
templates" },
-    "templatedRoute": { "index": 6, "kind": "element", "displayName": 
"Templated Route", "group": "common", "required": false, "type": "array", 
"javaType": "java.util.List<org.apache.camel.model.TemplatedRouteDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
routes to be created from template" },
-    "route": { "index": 7, "kind": "element", "displayName": "Route", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteDefinition>", "deprecated": false, 
"autowired": false, "secret": false, "description": "Camel routes" }
+    "dataFormat": { "index": 2, "kind": "element", "displayName": "Data 
Format", "group": "common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.DataFormatDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel data formats" 
},
+    "restConfiguration": { "index": 3, "kind": "element", "displayName": "Rest 
Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.rest.RestConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
Rest DSL Configuration" },
+    "rest": { "index": 4, "kind": "element", "displayName": "Rest", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.rest.RestDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel Rest DSL" },
+    "routeConfiguration": { "index": 5, "kind": "element", "displayName": 
"Route Configuration", "group": "common", "required": false, "type": "array", 
"javaType": 
"java.util.List<org.apache.camel.model.RouteConfigurationDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
route configurations" },
+    "routeTemplate": { "index": 6, "kind": "element", "displayName": "Route 
Template", "group": "common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteTemplateDefinition>", "deprecated": 
false, "autowired": false, "secret": false, "description": "Camel route 
templates" },
+    "templatedRoute": { "index": 7, "kind": "element", "displayName": 
"Templated Route", "group": "common", "required": false, "type": "array", 
"javaType": "java.util.List<org.apache.camel.model.TemplatedRouteDefinition>", 
"deprecated": false, "autowired": false, "secret": false, "description": "Camel 
routes to be created from template" },
+    "route": { "index": 8, "kind": "element", "displayName": "Route", "group": 
"common", "required": false, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.RouteDefinition>", "deprecated": false, 
"autowired": false, "secret": false, "description": "Camel routes" }
   }
 }
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index 3879096bf10..2423d3cf879 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
@@ -14757,6 +14757,21 @@ List of bean.
       </xs:element>
       <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" 
processContents="skip"/>
       <xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" 
processContents="skip"/>
+      <xs:element minOccurs="0" name="dataFormats">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="dataFormat" 
type="tns:dataFormat">
+              <xs:annotation>
+                <xs:documentation xml:lang="en">
+<![CDATA[
+Camel data formats.
+]]>
+                </xs:documentation>
+              </xs:annotation>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
       <xs:element maxOccurs="unbounded" minOccurs="0" 
ref="tns:restConfiguration"/>
       <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:rest"/>
       <xs:element maxOccurs="unbounded" minOccurs="0" 
ref="tns:routeConfiguration"/>
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
index a3ccb36cfc2..5e135c1d0fe 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
@@ -82,6 +82,8 @@ public class CustomResolver implements 
YamlDeserializerResolver {
             //
             case "beans":
                 return beansDeserializer;
+            case "dataFormats":
+                return new DataFormatsDefinitionDeserializer();
             case "org.apache.camel.model.ErrorHandlerDefinition":
                 return new ErrorHandlerDeserializer();
             case "errorHandler":
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/DataFormatsDefinitionDeserializer.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/DataFormatsDefinitionDeserializer.java
new file mode 100644
index 00000000000..9cd417ede47
--- /dev/null
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/DataFormatsDefinitionDeserializer.java
@@ -0,0 +1,102 @@
+/*
+ * 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.dsl.yaml.deserializers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
+import org.apache.camel.dsl.yaml.common.exception.YamlDeserializationException;
+import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.model.Model;
+import org.apache.camel.model.dataformat.DataFormatsDefinition;
+import org.apache.camel.spi.CamelContextCustomizer;
+import org.apache.camel.spi.annotations.YamlIn;
+import org.apache.camel.spi.annotations.YamlProperty;
+import org.apache.camel.spi.annotations.YamlType;
+import org.snakeyaml.engine.v2.api.ConstructNode;
+import org.snakeyaml.engine.v2.nodes.MappingNode;
+import org.snakeyaml.engine.v2.nodes.Node;
+import org.snakeyaml.engine.v2.nodes.NodeTuple;
+import org.snakeyaml.engine.v2.nodes.SequenceNode;
+
+@YamlIn
+@YamlType(
+          nodes = "dataFormats",
+          order = YamlDeserializerResolver.ORDER_DEFAULT,
+          properties = {
+                  @YamlProperty(name = "__extends",
+                                type = 
"array:org.apache.camel.model.dataformat.DataFormatsDefinition")
+          })
+public class DataFormatsDefinitionDeserializer extends YamlDeserializerSupport 
implements ConstructNode {
+
+    @Override
+    public Object construct(Node node) {
+        final DataFormatsCustomizer customizer = new DataFormatsCustomizer();
+
+        final YamlDeserializationContext dc = getDeserializationContext(node);
+        final YamlDeserializationContext resolver
+                = (YamlDeserializationContext) 
node.getProperty(YamlDeserializationContext.class.getName());
+        if (resolver == null) {
+            throw new YamlDeserializationException(node, "Unable to find 
YamlConstructor");
+        }
+
+        final SequenceNode sn = asSequenceNode(node);
+        for (Node item : sn.getValue()) {
+            setDeserializationContext(item, dc);
+            MappingNode mn = asMappingNode(item);
+            for (NodeTuple nt : mn.getValue()) {
+                String name = asText(nt.getKeyNode());
+                ConstructNode cn = resolver.resolve(mn, name);
+                Object answer = cn.construct(nt.getValueNode());
+                if (answer instanceof DataFormatDefinition def) {
+                    if (dc != null) {
+                        def.setResource(dc.getResource());
+                    }
+                    customizer.addDataFormat(def);
+                }
+            }
+        }
+
+        return customizer;
+    }
+
+    private static class DataFormatsCustomizer implements 
CamelContextCustomizer {
+
+        private final List<DataFormatDefinition> list = new ArrayList<>();
+
+        void addDataFormat(DataFormatDefinition def) {
+            list.add(def);
+        }
+
+        @Override
+        public void configure(CamelContext camelContext) {
+            if (!list.isEmpty()) {
+                DataFormatsDefinition def = new DataFormatsDefinition();
+                def.setDataFormats(list);
+
+                // register data formats to model
+                Model model = 
camelContext.getCamelContextExtension().getContextPlugin(Model.class);
+                model.getDataFormats().putAll(def.asMap());
+            }
+        }
+    }
+
+}
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index 648c27fed13..cda288a2144 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -223,6 +223,13 @@
           "$ref" : 
"#/items/definitions/org.apache.camel.model.BeanFactoryDefinition"
         }
       },
+      
"org.apache.camel.dsl.yaml.deserializers.DataFormatsDefinitionDeserializer" : {
+        "type" : "array",
+        "additionalProperties" : false,
+        "items" : {
+          "$ref" : 
"#/items/definitions/org.apache.camel.model.dataformat.DataFormatsDefinition"
+        }
+      },
       "org.apache.camel.dsl.yaml.deserializers.ErrorHandlerDeserializer" : {
         "type" : "object",
         "additionalProperties" : false,
@@ -16657,6 +16664,9 @@
       "beans" : {
         "$ref" : 
"#/items/definitions/org.apache.camel.dsl.yaml.deserializers.BeansDeserializer"
       },
+      "dataFormats" : {
+        "$ref" : 
"#/items/definitions/org.apache.camel.dsl.yaml.deserializers.DataFormatsDefinitionDeserializer"
+      },
       "errorHandler" : {
         "$ref" : 
"#/items/definitions/org.apache.camel.dsl.yaml.deserializers.ErrorHandlerDeserializer"
       },
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/DataFormatsTest.groovy
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/DataFormatsTest.groovy
new file mode 100644
index 00000000000..8bc9cac0db3
--- /dev/null
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/DataFormatsTest.groovy
@@ -0,0 +1,49 @@
+/*
+ * 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.dsl.yaml
+
+import org.apache.camel.dsl.yaml.support.YamlTestSupport
+import org.apache.camel.model.DataFormatDefinition
+
+class DataFormatsTest extends YamlTestSupport {
+
+    def "dataFormats"() {
+        when:
+        loadRoutes """
+                - dataFormats:
+                  - base64:
+                      id: df1
+                      lineLength: 88
+                  - csv:
+                      id: df2
+                      headerDisabled: true
+                      ignoreEmptyLines: true
+      """
+
+        then:
+        with(context.dataFormats.get('df1'), DataFormatDefinition) {
+            it.id == 'df1'
+            it.lineLength == '88'
+        }
+        with(context.dataFormats.get('df2'), DataFormatDefinition) {
+            it.id == 'df2'
+            it.headerDisabled == 'true'
+            it.ignoreEmptyLines == 'true'
+        }
+    }
+
+}

Reply via email to