diff --git a/src/main/java/starter/Server.kt b/src/main/java/starter/Server.kt index 5b7350e..41c20ab 100644 --- a/src/main/java/starter/Server.kt +++ b/src/main/java/starter/Server.kt @@ -23,7 +23,8 @@ class Server(private val views: Views, private val conf: StarterConfig) { ctx.formParam(it.name) != null } - ctx.result(views.pom(deps, name, basePackage)) + val generatedPom = views.pom(deps, name, basePackage) + ctx.result(prettyPrintXml(generatedPom)) ctx.contentType("text/xml") } } diff --git a/src/main/java/starter/Utils.kt b/src/main/java/starter/Utils.kt new file mode 100644 index 0000000..9048e2c --- /dev/null +++ b/src/main/java/starter/Utils.kt @@ -0,0 +1,49 @@ +package starter + +import org.w3c.dom.Document +import org.w3c.dom.NodeList +import org.xml.sax.InputSource +import java.io.ByteArrayInputStream +import java.io.StringWriter +import javax.xml.parsers.DocumentBuilderFactory +import javax.xml.transform.OutputKeys +import javax.xml.transform.TransformerFactory +import javax.xml.transform.dom.DOMSource +import javax.xml.transform.stream.StreamResult +import javax.xml.xpath.XPathConstants +import javax.xml.xpath.XPathFactory + + +/* + @see https://stackoverflow.com/a/33541820 + */ +fun prettyPrintXml(xml: String, indent: Int = 4): String { + // Turn xml string into a document + val document: Document = DocumentBuilderFactory.newInstance() + .newDocumentBuilder() + .parse(InputSource(ByteArrayInputStream(xml.encodeToByteArray()))) + + // Remove whitespaces outside tags + document.normalize() + val xPath = XPathFactory.newInstance().newXPath() + val nodeList = xPath.evaluate("//text()[normalize-space()='']", + document, + XPathConstants.NODESET) as NodeList + for (i in 0 until nodeList.length) { + val node = nodeList.item(i) + node.parentNode.removeChild(node) + } + + // Setup pretty print options + val transformerFactory = TransformerFactory.newInstance() + transformerFactory.setAttribute("indent-number", indent) + val transformer = transformerFactory.newTransformer() + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8") + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes") + transformer.setOutputProperty(OutputKeys.INDENT, "yes") + + // Return pretty print xml string + val stringWriter = StringWriter() + transformer.transform(DOMSource(document), StreamResult(stringWriter)) + return stringWriter.toString() +} \ No newline at end of file