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' + } + } + +}