org.openmrs.projectbuendia.webservices.rest.XmlTestUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.projectbuendia.webservices.rest.XmlTestUtil.java

Source

// Copyright 2015 The Project Buendia Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License.  You may obtain a copy
// of the License at: http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distrib-
// uted under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
// OR CONDITIONS OF ANY KIND, either express or implied.  See the License for
// specific language governing permissions and limitations under the License.

package org.openmrs.projectbuendia.webservices.rest;

import org.apache.commons.io.IOUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import static org.junit.Assert.assertEquals;
import static org.openmrs.projectbuendia.webservices.rest.XmlUtil.toElementIterable;
import static org.openmrs.projectbuendia.webservices.rest.XmlUtil.toIterable;

public class XmlTestUtil {
    static String readResourceAsString(Class<?> clazz, String file) throws IOException {
        return IOUtils.toString(clazz.getResourceAsStream(file), "utf-8");
    }

    /**
     * Normalizes XML by parsing and reformatting, then asserts that the two documents
     * are equal.
     */
    static void assertXmlEqual(String expected, String actual)
            throws TransformerException, SAXException, IOException, ParserConfigurationException {
        Document expectedDoc = XmlUtil.parse(expected);
        Document actualDoc = XmlUtil.parse(actual);
        expected = toIndentedString(expectedDoc);
        actual = toIndentedString(actualDoc);

        assertEquals(expected, actual);
    }

    /**
     * Converts an XML document into a string, applying indentation. First all elements have
     * their text
     * content trimmed, just for simplicity.
     */
    static String toIndentedString(Document doc) throws TransformerException {
        for (Element element : toElementIterable(doc.getElementsByTagName("*"))) {
            for (Node node : toIterable(element.getChildNodes())) {
                if (node.getNodeType() == Node.TEXT_NODE) {
                    node.setNodeValue(node.getNodeValue().trim());
                }
            }
        }
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

        StringWriter outStream = new StringWriter();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(outStream);
        transformer.transform(source, result);
        return outStream.toString();
    }
}