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 99989cbb938 CAMEL-19111: camel-yaml-dsl - Does not work with xtokenize language 99989cbb938 is described below commit 99989cbb9381aa48f127cfb1b7f92862a73fca80 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Mar 3 08:26:11 2023 +0100 CAMEL-19111: camel-yaml-dsl - Does not work with xtokenize language --- .../apache/camel/catalog/languages/xtokenize.json | 4 +-- .../org/apache/camel/catalog/models/xtokenize.json | 4 +-- .../apache/camel/catalog/schemas/camel-spring.xsd | 1 + .../camel/language/xtokenizer/xtokenize.json | 4 +-- .../language/xtokenizer/XMLTokenizeLanguage.java | 19 +++++----- .../org/apache/camel/model/language/xtokenize.json | 4 +-- .../model/language/XMLTokenizerExpression.java | 10 ++++-- .../dsl/yaml/deserializers/ModelDeserializers.java | 6 ++++ .../dsl/yaml/GenerateYamlDeserializersMojo.java | 2 +- dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml | 5 +++ .../generated/resources/schema/camel-yaml-dsl.json | 6 +++- .../generated/resources/schema/camelYamlDsl.json | 6 +++- .../org/apache/camel/dsl/yaml/SplitTest.groovy | 41 ++++++++++++++++++++++ 13 files changed, 91 insertions(+), 21 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json index a28a493533e..a92d36d7676 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json @@ -16,8 +16,8 @@ "modelJavaType": "org.apache.camel.model.language.XMLTokenizerExpression" }, "properties": { - "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] - "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, + "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "i", "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] + "group": { "kind": "attribute", "displayName": "Group", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" }, "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." }, "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json index 61172988455..78e250f97d9 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json @@ -13,8 +13,8 @@ "output": false }, "properties": { - "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] - "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, + "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "i", "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] + "group": { "kind": "attribute", "displayName": "Group", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" }, "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." }, "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." }, 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 204855e2afb..4aba8de70d2 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 @@ -18369,6 +18369,7 @@ The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its child content t - extracting the text content of the specified element. +Default value: i ]]></xs:documentation> </xs:annotation> </xs:attribute> diff --git a/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json b/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json index a28a493533e..a92d36d7676 100644 --- a/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json +++ b/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json @@ -16,8 +16,8 @@ "modelJavaType": "org.apache.camel.model.language.XMLTokenizerExpression" }, "properties": { - "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] - "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, + "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "i", "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] + "group": { "kind": "attribute", "displayName": "Group", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" }, "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." }, "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." }, diff --git a/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java b/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java index b39163510bc..8b54ce97b01 100644 --- a/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java +++ b/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java @@ -109,14 +109,17 @@ public class XMLTokenizeLanguage extends SingleInputLanguageSupport implements P answer.setMode(property(Character.class, properties, 1, "i")); answer.setGroup(property(Integer.class, properties, 2, group)); Object obj = properties[3]; - if (obj instanceof Namespaces) { - answer.setNamespaces((Namespaces) obj); - } else if (obj instanceof Map) { - Namespaces ns = new Namespaces(); - ((Map<String, String>) obj).forEach(ns::add); - answer.setNamespaces(ns); - } else { - throw new IllegalArgumentException("Namespaces is not instance of java.util.Map or " + Namespaces.class.getName()); + if (obj != null) { + if (obj instanceof Namespaces) { + answer.setNamespaces((Namespaces) obj); + } else if (obj instanceof Map) { + Namespaces ns = new Namespaces(); + ((Map<String, String>) obj).forEach(ns::add); + answer.setNamespaces(ns); + } else { + throw new IllegalArgumentException( + "Namespaces is not instance of java.util.Map or " + Namespaces.class.getName()); + } } String path = expression != null ? expression : this.path; answer.setPropertyName(property(String.class, properties, 4, getPropertyName())); diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json index 61172988455..78e250f97d9 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json @@ -13,8 +13,8 @@ "output": false }, "properties": { - "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] - "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, + "mode": { "kind": "attribute", "displayName": "Mode", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "i", "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...] + "group": { "kind": "attribute", "displayName": "Group", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" }, "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" }, "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." }, "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." }, diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java index 7411e2fcad2..1c5f74c3683 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java @@ -22,6 +22,7 @@ import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.XmlTransient; +import org.apache.camel.Expression; import org.apache.camel.spi.Metadata; /** @@ -33,10 +34,10 @@ import org.apache.camel.spi.Metadata; public class XMLTokenizerExpression extends NamespaceAwareExpression { @XmlAttribute - @Metadata(label = "advanced", enums = "i,w,u,t") + @Metadata(defaultValue = "i", enums = "i,w,u,t") private String mode; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Integer") + @Metadata(javaType = "java.lang.Integer") private String group; public XMLTokenizerExpression() { @@ -46,6 +47,11 @@ public class XMLTokenizerExpression extends NamespaceAwareExpression { super(expression); } + public XMLTokenizerExpression(Expression expression) { + setExpressionValue(expression); + } + + private XMLTokenizerExpression(Builder builder) { super(builder); this.mode = builder.mode; diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java index bcc32bbd66f..dc297390c55 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java @@ -18248,6 +18248,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { types = org.apache.camel.model.language.XMLTokenizerExpression.class, order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, properties = { + @YamlProperty(name = "expression", type = "string", required = true), @YamlProperty(name = "group", type = "number"), @YamlProperty(name = "header-name", type = "string"), @YamlProperty(name = "id", type = "string"), @@ -18276,6 +18277,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport { protected boolean setProperty(XMLTokenizerExpression target, String propertyKey, String propertyName, Node node) { switch(propertyKey) { + case "expression": { + String val = asText(node); + target.setExpression(val); + break; + } case "group": { String val = asText(node); target.setGroup(val); diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java index 02d83e54eb1..7f1b64acd12 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java @@ -609,7 +609,7 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo { } private boolean expressionRequired(String modelName) { - if ("method".equals(modelName) || "tokenize".equals(modelName) || "xtokenize".equals(modelName)) { + if ("method".equals(modelName) || "tokenize".equals(modelName)) { // skip expression attribute on these three languages as they are // solely configured using attributes return false; diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml b/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml index 38788fcf192..a80f63e6dbb 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml @@ -127,6 +127,11 @@ <artifactId>camel-stub</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-stax</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-log</artifactId> diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json index f8f568989cb..8ac3947b7ba 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json @@ -6647,6 +6647,9 @@ }, { "type" : "object", "properties" : { + "expression" : { + "type" : "string" + }, "group" : { "type" : "number" }, @@ -6673,7 +6676,8 @@ "type" : "boolean" } } - } ] + } ], + "required" : [ "expression" ] }, "org.apache.camel.model.language.XPathExpression" : { "oneOf" : [ { 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 c99b8cb8cfb..b6e5127f94e 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 @@ -6554,6 +6554,9 @@ }, { "type" : "object", "properties" : { + "expression" : { + "type" : "string" + }, "group" : { "type" : "number" }, @@ -6580,7 +6583,8 @@ "type" : "boolean" } } - } ] + } ], + "required" : [ "expression" ] }, "org.apache.camel.model.language.XPathExpression" : { "oneOf" : [ { diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SplitTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SplitTest.groovy index 030d4e3a82d..2e4c2d0a234 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SplitTest.groovy +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SplitTest.groovy @@ -84,4 +84,45 @@ class SplitTest extends YamlTestSupport { MockEndpoint.assertIsSatisfied(context) } + def "split xtokenize"() { + setup: + loadRoutes ''' + - from: + uri: "direct:route" + steps: + - split: + expression: + xtokenize: + mode: i + expression: /orders/order + steps: + - to: "mock:split" + - to: "mock:route" + ''' + + withMock('mock:split') { + expectedMessageCount 3 + expectedBodiesReceived '<order>Camel in Action</order>', '<order>ActiveMQ in Action</order>', '<order>DSL in Action</order>' + } + + when: + withTemplate { + to('direct:route').withBody(createBody()).send() + } + + then: + MockEndpoint.assertIsSatisfied(context) + } + + protected String createBody() { + StringBuilder sb = new StringBuilder("<?xml version=\"1.0\"?>\n"); + sb.append("<orders>\n"); + sb.append(" <order>Camel in Action</order>\n"); + sb.append(" <order>ActiveMQ in Action</order>\n"); + sb.append(" <order>DSL in Action</order>\n"); + sb.append("</orders>"); + return sb.toString(); + } + + }