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