This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-3.20.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-3.20.x by this push: new 0866d354585 CAMEL-19111: camel-yaml-dsl - Does not work with xtokenize language 0866d354585 is described below commit 0866d3545859b87c5ad5088febdb9a9f40a6d88a 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 +-- .../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 ++++++++++++++++++++++ 12 files changed, 90 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 efffecc358f..2642a78d858 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/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 efffecc358f..2642a78d858 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 c0c445c6725..bbeae35a56b 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 javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.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 73b4db4be8e..9737129b67d 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 @@ -18531,6 +18531,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"), @@ -18559,6 +18560,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 0759ffe4a24..994ded21218 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 @@ -599,7 +599,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 a180c1bc4de..bd25c2b4db5 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml @@ -125,6 +125,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 372cfbbc35d..af19612c5ab 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 @@ -6822,6 +6822,9 @@ }, { "type" : "object", "properties" : { + "expression" : { + "type" : "string" + }, "group" : { "type" : "number" }, @@ -6848,7 +6851,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 5630156c0cd..846bbb1ff81 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 @@ -6723,6 +6723,9 @@ }, { "type" : "object", "properties" : { + "expression" : { + "type" : "string" + }, "group" : { "type" : "number" }, @@ -6749,7 +6752,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 817f2b48c84..34414be4070 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 @@ -100,4 +100,45 @@ class SplitTest extends YamlTestSupport { def ex = thrown(FailedToCreateRouteException) ex.message.contains('Failed to create route') } + + 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(); + } + }