Merge branch 'master' of ../controller
[yangtools.git] / yang / yang-data-codec-xml / src / test / java / org / opendaylight / yangtools / yang / data / codec / xml / AbstractAnydataTest.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.data.codec.xml;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.io.ByteArrayInputStream;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.io.StringWriter;
16 import java.nio.charset.StandardCharsets;
17 import javax.xml.transform.OutputKeys;
18 import javax.xml.transform.Transformer;
19 import javax.xml.transform.TransformerException;
20 import javax.xml.transform.TransformerFactory;
21 import javax.xml.transform.TransformerFactoryConfigurationError;
22 import javax.xml.transform.dom.DOMSource;
23 import javax.xml.transform.stream.StreamResult;
24 import org.junit.AfterClass;
25 import org.junit.BeforeClass;
26 import org.opendaylight.yangtools.util.xml.UntrustedXML;
27 import org.opendaylight.yangtools.yang.common.QName;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
30 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
31 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
32 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
33 import org.w3c.dom.Document;
34 import org.w3c.dom.Node;
35 import org.xml.sax.SAXException;
36
37 public abstract class AbstractAnydataTest {
38     static final QName FOO_QNAME = QName.create("test-anydata", "foo");
39     static final QName CONT_QNAME = QName.create(FOO_QNAME, "cont");
40     static final QName CONT_ANY_QNAME = QName.create(FOO_QNAME, "cont-any");
41     static final QName CONT_LEAF_QNAME = QName.create(FOO_QNAME, "cont-leaf");
42
43     static final NodeIdentifier FOO_NODEID = NodeIdentifier.create(FOO_QNAME);
44     static final NodeIdentifier CONT_NODEID = NodeIdentifier.create(CONT_QNAME);
45     static final NodeIdentifier CONT_ANY_NODEID = NodeIdentifier.create(CONT_ANY_QNAME);
46     static final NodeIdentifier CONT_LEAF_NODEID = NodeIdentifier.create(CONT_LEAF_QNAME);
47
48     static final LeafNode<?> CONT_LEAF = ImmutableLeafNodeBuilder.create().withNodeIdentifier(CONT_LEAF_NODEID)
49             .withValue("abc").build();
50
51     static SchemaContext SCHEMA_CONTEXT;
52
53     @BeforeClass
54     public static void beforeClass() throws Exception {
55         SCHEMA_CONTEXT = YangParserTestUtils.parseYangResource("/test-anydata.yang");
56     }
57
58     @AfterClass
59     public static void afterClass() {
60         SCHEMA_CONTEXT = null;
61     }
62
63     static DOMSourceAnydata toDOMSource(final String str) {
64         try {
65             return new DOMSourceAnydata(new DOMSource(
66                 // DOMSource must have a single document element, which we are ignoring
67                 readXmlToDocument(toInputStream("<IGNORED>" + str + "</IGNORED>")).getDocumentElement()));
68         } catch (IOException | SAXException e) {
69             throw new IllegalStateException(e);
70         }
71     }
72
73     static InputStream toInputStream(final String str) {
74         return new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
75     }
76
77     static Document readXmlToDocument(final InputStream xmlContent) throws IOException, SAXException {
78         final Document doc = UntrustedXML.newDocumentBuilder().parse(xmlContent);
79         doc.getDocumentElement().normalize();
80         return doc;
81     }
82
83     /**
84      * Load external XML resources.
85      * @param xmlPath {@link String} path to source
86      * @return {@link Document}
87      * @throws IOException Exception in Loading file
88      * @throws SAXException XML parse exception
89      */
90     static Document loadXmlDocument(final String xmlPath) throws IOException, SAXException {
91         return requireNonNull(readXmlToDocument(loadResourcesAsInputStream(xmlPath)));
92     }
93
94     /**
95      * Load external resources as {@link InputStream}.
96      * @param xmlPath {@link String} Path to file
97      * @return {@link InputStream}
98      */
99     static InputStream loadResourcesAsInputStream(final String xmlPath) {
100         return SchemalessXMLStreamNormalizedNodeStreamWriterTest.class
101                 .getResourceAsStream(xmlPath);
102     }
103
104     /**
105      * Transform Node object to formatted XML string.
106      * @param xml {@link Node}
107      * @return {@link String}
108      */
109     static String toString(final Node xml) {
110         try {
111             final Transformer transformer = TransformerFactory.newInstance().newTransformer();
112             transformer.setOutputProperty(OutputKeys.INDENT, "yes");
113             transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
114
115             final StreamResult result = new StreamResult(new StringWriter());
116             final DOMSource source = new DOMSource(xml);
117             transformer.transform(source, result);
118
119             return result.getWriter().toString();
120         } catch (IllegalArgumentException | TransformerFactoryConfigurationError | TransformerException e) {
121             throw new RuntimeException("Unable to serialize xml element " + xml, e);
122         }
123     }
124
125     /**
126      * Transform DomSource object to formatted XML string.
127      * @param node {@link DOMSource}
128      * @return {@link String}
129      * @throws TransformerException Internal {@link Transformer} exception
130      */
131     static String getXmlFromDOMSource(final DOMSource node) throws TransformerException {
132         StringWriter writer = new StringWriter();
133         Transformer transformer = TransformerFactory.newInstance().newTransformer();
134         transformer.transform(node, new StreamResult(writer));
135         return writer.toString();
136     }
137 }