This is an automated email from the ASF dual-hosted git repository. cdeppisch 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 45587d42dbe Improve data type resolving in YAML Pipe loader 45587d42dbe is described below commit 45587d42dbe6d2d14ce0f6e5603fb236f073f5d4 Author: Christoph Deppisch <cdeppi...@redhat.com> AuthorDate: Thu Jan 11 09:39:33 2024 +0100 Improve data type resolving in YAML Pipe loader - Support default data type prefix "camel:" when resolving transformers - Support for optional "scheme" property in YAML DSL on dataTypes/in and dataTypes/out nodes --- .../org/apache/camel/spi/TransformerResolver.java | 9 +- .../ByteArrayDataTypeTransformerTest.java | 6 ++ .../transformer/StringDataTypeTransformerTest.java | 6 ++ .../camel/dsl/yaml/YamlRoutesBuilderLoader.java | 26 +++++- .../apache/camel/dsl/yaml/PipeLoaderTest.groovy | 100 +++++++++++++++++++++ 5 files changed, 141 insertions(+), 6 deletions(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/TransformerResolver.java b/core/camel-api/src/main/java/org/apache/camel/spi/TransformerResolver.java index cf03dc13012..af75c26051b 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/TransformerResolver.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/TransformerResolver.java @@ -20,6 +20,7 @@ package org.apache.camel.spi; import java.util.Locale; import org.apache.camel.CamelContext; +import org.apache.camel.util.StringHelper; /** * Resolves data type transformers from given transformer key. This represents the opportunity to lazy load transformers @@ -42,13 +43,17 @@ public interface TransformerResolver<K> { /** * Normalize transformer key to conform with factory finder resource path. Replaces all non supported characters - * such as slashes and colons to dashes. + * such as slashes and colons to dashes. Automatically removes the default scheme prefix as it should not be part of + * the resource path. * * @param key the transformer key * @return normalized String representation of the key */ default String normalize(K key) { - return key.toString().replaceAll("[^A-Za-z0-9-]", "-").toLowerCase(Locale.US); + String keyString = key.toString(); + keyString = StringHelper.after(keyString, DataType.DEFAULT_SCHEME + ":", keyString); + + return StringHelper.sanitize(keyString).toLowerCase(Locale.US); } } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/transformer/ByteArrayDataTypeTransformerTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/transformer/ByteArrayDataTypeTransformerTest.java index 1f5f3011f24..5142440defc 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/transformer/ByteArrayDataTypeTransformerTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/transformer/ByteArrayDataTypeTransformerTest.java @@ -90,6 +90,12 @@ public class ByteArrayDataTypeTransformerTest { DefaultTransformerRegistry transformerRegistry = new DefaultTransformerRegistry(camelContext); Transformer transformer = transformerRegistry.resolveTransformer(new TransformerKey("application-octet-stream")); Assertions.assertNotNull(transformer); + + transformer = transformerRegistry.resolveTransformer(new TransformerKey("application/octet-stream")); + Assertions.assertNotNull(transformer); + + transformer = transformerRegistry.resolveTransformer(new TransformerKey("camel:application-octet-stream")); + Assertions.assertNotNull(transformer); } private static void assertBinaryBody(Exchange exchange, String key, String content) { diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/transformer/StringDataTypeTransformerTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/transformer/StringDataTypeTransformerTest.java index 76f44f16681..1befb255321 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/transformer/StringDataTypeTransformerTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/transformer/StringDataTypeTransformerTest.java @@ -78,6 +78,12 @@ public class StringDataTypeTransformerTest { DefaultTransformerRegistry dataTypeRegistry = new DefaultTransformerRegistry(camelContext); Transformer transformer = dataTypeRegistry.resolveTransformer(new TransformerKey("text-plain")); Assertions.assertNotNull(transformer); + + transformer = dataTypeRegistry.resolveTransformer(new TransformerKey("text/plain")); + Assertions.assertNotNull(transformer); + + transformer = dataTypeRegistry.resolveTransformer(new TransformerKey("camel:text-plain")); + Assertions.assertNotNull(transformer); } private static void assertStringBody(Exchange exchange, String key, String content) { diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java index 3b8bcd1b68b..2a9c7ffd224 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java @@ -722,12 +722,12 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { if (dataTypes != null) { MappingNode in = asMappingNode(nodeAt(dataTypes, "/in")); if (in != null) { - route.inputType(extractTupleValue(in.getValue(), "format")); + route.inputType(extractDataType(in)); } MappingNode out = asMappingNode(nodeAt(dataTypes, "/out")); if (out != null) { - route.transform(new DataType(extractTupleValue(out.getValue(), "format"))); + route.transform(new DataType(extractDataType(out))); } } @@ -770,12 +770,12 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { if (dataTypes != null) { MappingNode in = asMappingNode(nodeAt(dataTypes, "/in")); if (in != null) { - route.transform(new DataType(extractTupleValue(in.getValue(), "format"))); + route.transform(new DataType(extractDataType(in))); } MappingNode out = asMappingNode(nodeAt(dataTypes, "/out")); if (out != null) { - route.outputType(extractTupleValue(out.getValue(), "format")); + route.outputType(extractDataType(out)); } } @@ -845,6 +845,24 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport { return answer; } + /** + * Extracts the data type transformer name information form nodes dataTypes/in or dataTypes/out. When scheme is set + * construct the transformer name with a prefix like scheme:format. Otherwise, just use the given format as a data + * type transformer name. + * + * @param node + * @return + */ + private String extractDataType(MappingNode node) { + String scheme = extractTupleValue(node.getValue(), "scheme"); + String format = extractTupleValue(node.getValue(), "format"); + if (scheme != null) { + return scheme + ":" + format; + } + + return format; + } + private String extractCamelEndpointUri(MappingNode node) { MappingNode mn = null; Node ref = nodeAt(node, "/ref"); diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy index f2581179ce1..da3cbd39252 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy @@ -702,6 +702,52 @@ class PipeLoaderTest extends YamlTestSupport { } } + def "Pipe with input/output data types and schemes"() { + when: + loadBindings(''' + apiVersion: camel.apache.org/v1 + kind: Pipe + metadata: + name: timer-event-source + spec: + source: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: timer-source + dataTypes: + in: + scheme: camel + format: plain/text + properties: + message: "Hello world!" + sink: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: log-sink + dataTypes: + out: + scheme: camel + format: application/octet-stream + ''') + then: + context.routeDefinitions.size() == 3 + + with (context.routeDefinitions[0]) { + routeId == 'timer-event-source' + input.endpointUri == 'kamelet:timer-source?message=Hello+world%21' + input.lineNumber == 7 + inputType.urn == 'camel:plain/text' + outputType.urn == 'camel:application/octet-stream' + outputs.size() == 1 + with (outputs[0], ToDefinition) { + endpointUri == 'kamelet:log-sink' + lineNumber == 18 + } + } + } + def "Pipe with data type transformation"() { when: loadBindings(''' @@ -754,4 +800,58 @@ class PipeLoaderTest extends YamlTestSupport { } } + def "Pipe with data type scheme transformation"() { + when: + loadBindings(''' + apiVersion: camel.apache.org/v1 + kind: Pipe + metadata: + name: timer-event-source + spec: + source: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: timer-source + dataTypes: + out: + scheme: camel + format: application/octet-stream + properties: + message: "Hello world!" + sink: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: log-sink + dataTypes: + in: + scheme: camel + format: plain/text + ''') + then: + context.routeDefinitions.size() == 3 + + with (context.routeDefinitions[0]) { + routeId == 'timer-event-source' + input.endpointUri == 'kamelet:timer-source?message=Hello+world%21' + input.lineNumber == 7 + outputs.size() == 3 + with (outputs[0], TransformDefinition) { + fromType == 'camel:any' + toType == 'camel:application/octet-stream' + lineNumber == -1 + } + with (outputs[1], TransformDefinition) { + fromType == 'camel:any' + toType == 'camel:plain/text' + lineNumber == -1 + } + with (outputs[2], ToDefinition) { + endpointUri == 'kamelet:log-sink' + lineNumber == 18 + } + } + } + }