libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/main/java/tech/libeufin/XMLManagement.java | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Msrc/main/kotlin/Main.kt | 12+++++++++++-
Msrc/test/java/XMLManagementTest.java | 20++++++++++++++++++++
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); } }