This is an automated email from the ASF dual-hosted git repository.

zregvart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ea84ffabb1053803edf213fd37419d1a4875dccd
Author: Zoran Regvart <[email protected]>
AuthorDate: Thu Aug 22 20:02:58 2019 +0200

    CAMEL-13893: use XML API to modify REST XML DSL
    
    This replaces the string manipulation of XML in Swagger REST DSL XML
    generator with using XML API to perform the needed manipulation.
---
 .../generator/swagger/RestDslXmlGenerator.java     | 74 ++++++++++++++++------
 .../generator/swagger/RestDslXmlGeneratorTest.java | 39 +++++++++---
 2 files changed, 87 insertions(+), 26 deletions(-)

diff --git 
a/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java
 
b/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java
index 2edf540..ecbb460 100644
--- 
a/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java
+++ 
b/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java
@@ -16,11 +16,26 @@
  */
 package org.apache.camel.generator.swagger;
 
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
 import io.swagger.models.Swagger;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.util.ObjectHelper;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
 
 public class RestDslXmlGenerator extends RestDslGenerator<RestDslXmlGenerator> 
{
 
@@ -30,40 +45,63 @@ public class RestDslXmlGenerator extends 
RestDslGenerator<RestDslXmlGenerator> {
         super(swagger);
     }
 
-    public RestDslXmlGenerator withBlueprint() {
-        this.blueprint = true;
-        return this;
-    }
-
     public String generate(final CamelContext context) throws Exception {
         final RestDefinitionEmitter emitter = new 
RestDefinitionEmitter(context);
 
-        final PathVisitor<RestsDefinition> restDslStatement = new 
PathVisitor<>(swagger.getBasePath(), emitter, filter, destinationGenerator());
+        final PathVisitor<RestsDefinition> restDslStatement = new 
PathVisitor<>(swagger.getBasePath(), emitter, filter,
+            destinationGenerator());
 
         swagger.getPaths().forEach(restDslStatement::visit);
 
-        RestsDefinition rests = emitter.result();
-        String xml = ModelHelper.dumpModelAsXml(context, rests);
+        final RestsDefinition rests = emitter.result();
+        final String xml = ModelHelper.dumpModelAsXml(context, rests);
+
+        final DocumentBuilderFactory builderFactory = 
DocumentBuilderFactory.newInstance();
+        builderFactory.setNamespaceAware(true);
+
+        final DocumentBuilder builder = builderFactory.newDocumentBuilder();
+
+        final Document document = builder.parse(new InputSource(new 
StringReader(xml)));
+
+        final Element root = document.getDocumentElement();
+
         if (blueprint) {
-            xml = xml.replace("http://camel.apache.org/schema/spring";, 
"http://camel.apache.org/schema/blueprint";);
+            document.renameNode(root, 
"http://camel.apache.org/schema/blueprint";, root.getTagName());
         }
+
         // remove all customId attributes as we do not want them in the output
-        xml = xml.replaceAll(" customId=\"true\"", "");
-        xml = xml.replaceAll(" customId=\"false\"", "");
+        final NodeList elements = document.getElementsByTagName("*");
+        for (int i = 0; i < elements.getLength(); i++) {
+            final Element element = (Element) elements.item(i);
+            element.removeAttribute("customId");
+        }
 
         if (restComponent != null) {
-            String extra = "<restConfiguration component=\"" + restComponent + 
"\"";
+            final Element configuration = 
document.createElement("restConfiguration");
+            configuration.setAttribute("component", restComponent);
+
             if (restContextPath != null) {
-                extra = extra.concat(" contextPath=\"" + restContextPath + 
"\"");
+                configuration.setAttribute("contextPath", restContextPath);
             }
+
             if (ObjectHelper.isNotEmpty(apiContextPath)) {
-                extra = extra.concat(" apiContextPath=\"" + apiContextPath + 
"\"");
+                configuration.setAttribute("apiContextPath", apiContextPath);
             }
-            extra = extra.concat("/>");
-            xml = xml.replaceFirst("<rest>", extra + "\n    <rest>");
-            xml = xml.replaceFirst("<rest ", extra + "\n    <rest ");
+
+            root.insertBefore(configuration, root.getFirstChild());
         }
 
-        return xml;
+        final TransformerFactory transformerFactory = 
TransformerFactory.newInstance();
+        final Transformer transformer = transformerFactory.newTransformer();
+
+        final StringWriter writer = new StringWriter();
+        transformer.transform(new DOMSource(document), new 
StreamResult(writer));
+
+        return writer.toString();
+    }
+
+    public RestDslXmlGenerator withBlueprint() {
+        blueprint = true;
+        return this;
     }
 }
diff --git 
a/tooling/swagger-rest-dsl-generator/src/test/java/org/apache/camel/generator/swagger/RestDslXmlGeneratorTest.java
 
b/tooling/swagger-rest-dsl-generator/src/test/java/org/apache/camel/generator/swagger/RestDslXmlGeneratorTest.java
index c64a506..c07143d 100644
--- 
a/tooling/swagger-rest-dsl-generator/src/test/java/org/apache/camel/generator/swagger/RestDslXmlGeneratorTest.java
+++ 
b/tooling/swagger-rest-dsl-generator/src/test/java/org/apache/camel/generator/swagger/RestDslXmlGeneratorTest.java
@@ -16,16 +16,23 @@
  */
 package org.apache.camel.generator.swagger;
 
+import java.io.StringReader;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
 import io.swagger.models.Swagger;
 import io.swagger.parser.SwaggerParser;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.junit.Test;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -34,6 +41,15 @@ public class RestDslXmlGeneratorTest {
     final Swagger swagger = new SwaggerParser().read("petstore.json");
 
     @Test
+    public void shouldGenerateBlueprintXml() throws Exception {
+        final CamelContext context = new DefaultCamelContext();
+
+        final String xml = 
RestDslGenerator.toXml(swagger).withBlueprint().generate(context);
+        assertThat(xml).isNotEmpty();
+        assertThat(xml.contains("http://camel.apache.org/schema/blueprint";));
+    }
+
+    @Test
     public void shouldGenerateXml() throws Exception {
         final CamelContext context = new DefaultCamelContext();
 
@@ -43,12 +59,19 @@ public class RestDslXmlGeneratorTest {
     }
 
     @Test
-    public void shouldGenerateBlueprintXml() throws Exception {
+    public void shouldGenerateXmlWithDefaultnamespace() throws Exception {
         final CamelContext context = new DefaultCamelContext();
 
-        final String xml = 
RestDslGenerator.toXml(swagger).withBlueprint().generate(context);
-        assertThat(xml).isNotEmpty();
-        assertThat(xml.contains("http://camel.apache.org/schema/blueprint";));
+        final String xml = RestDslGenerator.toXml(swagger).generate(context);
+
+        final DocumentBuilderFactory builderFactory = 
DocumentBuilderFactory.newInstance();
+        builderFactory.setNamespaceAware(true);
+
+        final DocumentBuilder builder = builderFactory.newDocumentBuilder();
+
+        final Document document = builder.parse(new InputSource(new 
StringReader(xml)));
+
+        
assertThat(document.isDefaultNamespace("http://camel.apache.org/schema/spring";)).isTrue();
     }
 
     @Test
@@ -60,20 +83,20 @@ public class RestDslXmlGeneratorTest {
         final URI file = 
RestDslGeneratorTest.class.getResource("/SwaggerPetstoreXml.txt").toURI();
         final String expectedContent = new 
String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8);
 
-        assertThat(xml).isEqualToIgnoringWhitespace(expectedContent);
+        assertThat(xml).isXmlEqualTo(expectedContent);
     }
 
     @Test
     public void shouldGenerateXmlWithRestComponent() throws Exception {
         final CamelContext context = new DefaultCamelContext();
 
-        final String xml = 
RestDslGenerator.toXml(swagger).withRestComponent("servlet").withRestContextPath("/foo").generate(context);
+        final String xml = 
RestDslGenerator.toXml(swagger).withRestComponent("servlet").withRestContextPath("/foo")
+            .generate(context);
 
         final URI file = 
RestDslGeneratorTest.class.getResource("/SwaggerPetstoreWithRestComponentXml.txt").toURI();
         final String expectedContent = new 
String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8);
 
-        assertThat(xml).isEqualToIgnoringWhitespace(expectedContent);
+        assertThat(xml).isXmlEqualTo(expectedContent);
     }
 
-
 }

Reply via email to