You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/03/03 07:26:29 UTC

[camel] branch main updated: CAMEL-19111: camel-yaml-dsl - Does not work with xtokenize language

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 <cl...@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();
+    }
+
+
 }