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