commit a321e4373781d35427bf25b99a00dda64fefe04b
parent 1c021799a1c1803fc17bbcc2d247099b0a7dae5b
Author: Marcello Stanisci <stanisci.m@gmail.com>
Date: Tue, 17 Sep 2019 17:22:20 +0200
Introducing the converters:
DOM -> String
String -> DOM
Java Object -> DOM
Diffstat:
3 files changed, 137 insertions(+), 6 deletions(-)
diff --git a/src/main/java/tech/libeufin/XMLManagement.java b/src/main/java/tech/libeufin/XMLManagement.java
@@ -1,14 +1,22 @@
package tech.libeufin;
+import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
-import java.io.IOException;
+
+import java.io.*;
import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.Source;
import javax.xml.validation.*; // has SchemaFactory
-import java.io.File;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
/**
* This class takes care of importing XSDs and validate
@@ -44,6 +52,36 @@ public class XMLManagement {
}
/**
+ * Parse string into XML DOM.
+ * @param xmlString the string to parse.
+ * @return the DOM representing @a xmlString
+ */
+ static public Document parseStringIntoDOM(String xmlString) {
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ try {
+
+ InputStream xmlInputStream = new ByteArrayInputStream(xmlString.getBytes());
+ // Source xmlSource = new StreamSource(xmlInputStream);
+
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.parse(new InputSource(xmlInputStream));
+
+ return document;
+
+ } catch (ParserConfigurationException e) {
+ System.out.println("Could not parse string into DOM: " + e);
+ } catch (SAXException e) {
+ System.out.println("Could not parse string into DOM: " + e);
+ } catch (IOException e) {
+ System.out.println("Could not parse string into DOM: " + e);
+ }
+
+ return null;
+ }
+
+ /**
*
* @param xmlDoc the XML document to validate
* @return true when validation passes, false otherwise
@@ -72,4 +110,67 @@ public class XMLManagement {
return this.validate(xmlSource);
}
+ /**
+ * Return the DOM representation of the Java object, using the JAXB
+ * interface.
+ *
+ * @param object to be transformed into DOM. Typically, the object
+ * has already got its setters called.
+ * @return the DOM Document, or null (if errors occur).
+ */
+ static public Document parseObjectIntoDocument(Object object) {
+
+ try {
+ JAXBContext jc = JAXBContext.newInstance(object.getClass());
+
+ /* Make the target document. */
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.newDocument();
+
+ /* Marshalling the object into the document. */
+ Marshaller m = jc.createMarshaller();
+ m.marshal(object, document); // document absorbed XML!
+ return document;
+
+ } catch (JAXBException e) {
+ System.out.println(e);
+ } catch (ParserConfigurationException e) {
+ System.out.println(e);
+ }
+
+ return null;
+ }
+
+ /**
+ * Extract String from DOM.
+ * @param document the DOM to extract the string from.
+ * @return the final String, or null if errors occur.
+ */
+ static public String getStringFromDocument(Document document){
+
+ try {
+ /* Make Transformer. */
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer t = tf.newTransformer();
+ t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ t.setOutputProperty(OutputKeys.INDENT, "no");
+
+ /* Make string writer. */
+ StringWriter sw = new StringWriter();
+
+ /* Extract string. */
+ t.transform(new DOMSource(document), new StreamResult(sw));
+ String output = sw.toString();
+
+ return output;
+
+ } catch (TransformerConfigurationException e) {
+ System.out.println(e);
+ } catch (TransformerException e) {
+ System.out.println(e);
+ }
+
+ return null;
+ }
};
\ No newline at end of file
diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt
@@ -43,12 +43,22 @@ fun main(args: Array<String>) {
println("Body: $body")
val isValid = xmlProcess.validate(body)
call.response.header("Content-Type", "application/xml")
+
+ /*if (!isValid) {
+ /* Return "invalid request" */
+ }
+
+ if (!knownType) {
+
+ /* Log to console and return "unknown type" */
+ }
+
if (isValid){
call.respond(HttpStatusCode.OK, xmlResponseObject)
}
else {
call.respond(HttpStatusCode.BadRequest, xmlResponseObject)
- }
+ }*/
}
}
}
diff --git a/src/test/java/XMLManagementTest.java b/src/test/java/XMLManagementTest.java
@@ -1,12 +1,18 @@
import org.junit.Test;
+import org.w3c.dom.Element;
import tech.libeufin.XMLManagement;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
+import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import static org.junit.Assert.*;
+import org.w3c.dom.Document;
+
+@XmlRootElement(name="SimpleJAXBTest")
+class SimpleJAXBTest {}
public class XMLManagementTest {
@@ -25,5 +31,19 @@ public class XMLManagementTest {
assertFalse(xm.validate(ebics_from_string));
assertFalse(xm.validate("<moreInvalidXML>"));
+
+ /* Parse XML string into DOM */
+ Document document = xm.parseStringIntoDOM("<root></root>");
+ Element documentElement = document.getDocumentElement();
+ assertTrue("root" == documentElement.getTagName());
+
+ /* Make XML DOM from Java object (JAXB) */
+ Document simpleRoot = xm.parseObjectIntoDocument(new SimpleJAXBTest());
+ Element simpleRootDocumentElement = simpleRoot.getDocumentElement();
+ assertTrue("SimpleJAXBTest" == simpleRootDocumentElement.getTagName());
+
+ /* Serialize the DOM into string. */
+ String simpleRootString = XMLManagement.getStringFromDocument(simpleRoot);
+ System.out.println(simpleRootString);
}
}