Fix default namespace emission 50/79550/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 15 Jan 2019 18:19:08 +0000 (19:19 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 16 Jan 2019 02:38:57 +0000 (03:38 +0100)
When we are emitting opening a new element, we need to consult
XMLStreamWriter before we emit the element, otherwise its state
already reflects the newly-started element.

In non-repairing mode the JDK writer will accept our invocation
and update the namespace mapping, which will lead us to erroneously
assume we do not need to emit the declaration.

Since it is non-repairing, it will not emit the declaration itself,
leading to a blank document -- something for which we are actually
testing in one of our tests.

In order to improve the confidence in results, also update tests
which used only repairing factories to use both repairing and
non-repairing ones.

JIRA: YANGTOOLS-801
Change-Id: I6975cf21121f7a8f92056b5b49b31d53b685dc0f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 706aaed3e21eb3c5d080ee974f27b9348c3d2e92)

12 files changed:
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug5446Test.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8745Test.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug8803Test.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceXMLStreamReaderTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodeXmlTranslationTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/NormalizedNodesToXmlTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaOrderedNormalizedNodeWriterTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemalessXMLStreamNormalizedNodeStreamWriterTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/TestFactories.java [new file with mode: 0644]
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStreamUtilsTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/YangModeledAnyXMLSerializationTest.java

index 0f5ab226661650ab659bdf483da3b459f50f0a86..44c1fd216ccc26157609c4d8c25eb16df7a21b21 100644 (file)
@@ -161,13 +161,19 @@ public abstract class XMLStreamNormalizedNodeStreamWriter<T> implements Normaliz
     }
 
     private void writeStartElement(final QName qname) throws XMLStreamException {
-        String ns = qname.getNamespace().toString();
+        final String ns = qname.getNamespace().toString();
+        final NamespaceContext context = writer.getNamespaceContext();
+        final boolean needDefaultNs;
+        if (context != null) {
+            final String parentNs = context.getNamespaceURI(XMLConstants.DEFAULT_NS_PREFIX);
+            needDefaultNs = !ns.equals(parentNs);
+        } else {
+            needDefaultNs = false;
+        }
+
         writer.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, qname.getLocalName(), ns);
-        if (writer.getNamespaceContext() != null) {
-            String parentNs = writer.getNamespaceContext().getNamespaceURI(XMLConstants.DEFAULT_NS_PREFIX);
-            if (!ns.equals(parentNs)) {
-                writer.writeDefaultNamespace(ns);
-            }
+        if (needDefaultNs) {
+            writer.writeDefaultNamespace(ns);
         }
     }
 
index d297f8e84b8b396942c2fc24fb64d5b6aed070a5..3fe82d80cdbc1aeac47968aae13565bef178cdb1 100644 (file)
@@ -15,7 +15,6 @@ import java.io.InputStream;
 import java.io.StringWriter;
 import java.net.URI;
 import java.util.Optional;
-import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.OutputKeys;
@@ -50,13 +49,6 @@ import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
 public class Bug5446Test extends XMLTestCase {
-    private static final XMLOutputFactory XML_FACTORY;
-
-    static {
-        XML_FACTORY = XMLOutputFactory.newFactory();
-        XML_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.FALSE);
-    }
-
     private static final QNameModule FOO_MODULE = QNameModule.create(URI.create("foo"), Revision.of("2015-11-05"));
     private static final QName ROOT_QNAME = QName.create(FOO_MODULE, "root");
     private static final QName IP_ADDRESS_QNAME = QName.create(FOO_MODULE, "ip-address");
@@ -111,7 +103,7 @@ public class Bug5446Test extends XMLTestCase {
         NormalizedNodeStreamWriter normalizedNodeStreamWriter = null;
         XMLStreamWriter writer = null;
         try {
-            writer = XML_FACTORY.createXMLStreamWriter(result);
+            writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(result);
             normalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(writer, context);
             normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(normalizedNodeStreamWriter);
 
index 6661c09806627e8e07a1cdedf1e6be863c411940..64dde90e8d10cb50591b791d6b2aa74892939860 100644 (file)
@@ -5,7 +5,6 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import static java.util.Objects.requireNonNull;
@@ -13,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
+import java.util.Collection;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
@@ -27,7 +27,11 @@ import javax.xml.transform.stream.StreamResult;
 import org.custommonkey.xmlunit.Diff;
 import org.custommonkey.xmlunit.XMLAssert;
 import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
@@ -40,33 +44,52 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
+@RunWith(Parameterized.class)
 public class Bug8745Test {
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        return TestFactories.junitParameters();
+    }
+
+    private static SchemaContext SCHEMA_CONTEXT;
+
+    private final XMLOutputFactory factory;
+
+    public Bug8745Test(final String factoryMode, final XMLOutputFactory factory) {
+        this.factory = factory;
+    }
+
+    @BeforeClass
+    public static void beforeClass() {
+        SCHEMA_CONTEXT = YangParserTestUtils.parseYangResource("/bug8745/foo.yang");
+    }
+
+    @AfterClass
+    public static void afterClass() {
+        SCHEMA_CONTEXT = null;
+    }
 
     @Test
     public void testParsingAttributes() throws Exception {
-        final SchemaContext schemaContext = YangParserTestUtils.parseYangResource("/bug8745/foo.yang");
         final QName contWithAttributes = QName.create("foo", "cont-with-attributes");
         final ContainerSchemaNode contWithAttr = (ContainerSchemaNode) SchemaContextUtil.findDataSchemaNode(
-                schemaContext, SchemaPath.create(true, contWithAttributes));
+            SCHEMA_CONTEXT, SchemaPath.create(true, contWithAttributes));
 
         final Document doc = loadDocument("/bug8745/foo.xml");
         final DOMSource domSource = new DOMSource(doc.getDocumentElement());
 
         final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
 
-        final XMLOutputFactory outputfactory = XMLOutputFactory.newInstance();
-        outputfactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-
-        final XMLStreamWriter xmlStreamWriter = outputfactory.createXMLStreamWriter(domResult);
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult);
 
         final NormalizedNodeStreamWriter streamWriter = XMLStreamNormalizedNodeStreamWriter.create(
-                xmlStreamWriter, schemaContext);
+                xmlStreamWriter, SCHEMA_CONTEXT);
 
         final InputStream resourceAsStream = Bug8745Test.class.getResourceAsStream("/bug8745/foo.xml");
 //        final XMLStreamReader reader = inputFactory.createXMLStreamReader(resourceAsStream);
         final XMLStreamReader reader = new DOMSourceXMLStreamReader(domSource);
 
-        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, contWithAttr);
+        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, contWithAttr);
         xmlParser.parse(reader);
 
         XMLUnit.setIgnoreWhitespace(true);
index 97e9d80c5e5f95aeddf3d9484593bdb61445f643..ea1a026e2d17fe27f83d938ee26cc2550f150502 100644 (file)
@@ -13,10 +13,15 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.InputStream;
 import java.io.StringWriter;
+import java.util.Collection;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -31,13 +36,35 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
+@RunWith(Parameterized.class)
 public class Bug8803Test {
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        return TestFactories.junitParameters();
+    }
+
+    private static SchemaContext SCHEMA_CONTEXT;
+
+    private final XMLOutputFactory factory;
+
+    public Bug8803Test(final String factoryMode, final XMLOutputFactory factory) {
+        this.factory = factory;
+    }
+
+    @BeforeClass
+    public static void beforeClass() {
+        SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/bug8803");
+    }
+
+    @AfterClass
+    public static void afterClass() {
+        SCHEMA_CONTEXT = null;
+    }
 
     @Test
     public void test() throws Exception {
-        final SchemaContext schemaContext = YangParserTestUtils.parseYangResourceDirectory("/bug8803");
         final SchemaPath topContPath = SchemaPath.create(true, QName.create("foo-ns", "top-cont"));
-        final SchemaNode dataSchemaNode = SchemaContextUtil.findDataSchemaNode(schemaContext, topContPath);
+        final SchemaNode dataSchemaNode = SchemaContextUtil.findDataSchemaNode(SCHEMA_CONTEXT, topContPath);
         assertTrue(dataSchemaNode instanceof ContainerSchemaNode);
         final ContainerSchemaNode topContSchema = (ContainerSchemaNode) dataSchemaNode;
 
@@ -48,20 +75,17 @@ public class Bug8803Test {
 
         final NormalizedNodeResult result = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, topContSchema);
+        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, topContSchema);
         xmlParser.parse(reader);
         final NormalizedNode<?, ?> transformedInput = result.getResult();
         assertNotNull(transformedInput);
 
         // serialization
         final StringWriter writer = new StringWriter();
-        final XMLOutputFactory outputFactory = XMLOutputFactory.newFactory();
-        // switching NS repairing to false does not help
-        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-        final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(writer);
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(writer);
 
         final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(
-                xmlStreamWriter, schemaContext);
+                xmlStreamWriter, SCHEMA_CONTEXT);
 
         final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(
                 xmlNormalizedNodeStreamWriter);
index 6606a44e0137cb535c86513b7a25698d3c83b65f..d76283b49ba40bd532374373105ed79e73f9c41d 100644 (file)
@@ -15,6 +15,7 @@ import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
+import java.util.Collection;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
@@ -26,7 +27,11 @@ import javax.xml.transform.TransformerFactoryConfigurationError;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -42,13 +47,35 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
+@RunWith(Parameterized.class)
 public class DOMSourceXMLStreamReaderTest {
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        return TestFactories.junitParameters();
+    }
+
+    private static SchemaContext SCHEMA_CONTEXT;
+
+    private final XMLOutputFactory factory;
+
+    public DOMSourceXMLStreamReaderTest(final String factoryMode, final XMLOutputFactory factory) {
+        this.factory = factory;
+    }
+
+    @BeforeClass
+    public static void beforeClass() {
+        SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/dom-reader-test");
+    }
+
+    @AfterClass
+    public static void afterClass() {
+        SCHEMA_CONTEXT = null;
+    }
 
     @Test
     public void test() throws Exception {
-        final SchemaContext schemaContext = YangParserTestUtils.parseYangResourceDirectory("/dom-reader-test");
         final ContainerSchemaNode outerContainerSchema = (ContainerSchemaNode) SchemaContextUtil
-                .findNodeInSchemaContext(schemaContext, ImmutableList.of(QName.create("foo-ns", "top-cont")));
+                .findNodeInSchemaContext(SCHEMA_CONTEXT, ImmutableList.of(QName.create("foo-ns", "top-cont")));
         assertNotNull(outerContainerSchema);
 
         // deserialization
@@ -58,7 +85,7 @@ public class DOMSourceXMLStreamReaderTest {
 
         final NormalizedNodeResult result = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, outerContainerSchema);
+        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, outerContainerSchema);
         xmlParser.parse(domXMLReader);
         final NormalizedNode<?, ?> transformedInput = result.getResult();
         assertNotNull(transformedInput);
@@ -66,12 +93,10 @@ public class DOMSourceXMLStreamReaderTest {
         // serialization
         //final StringWriter writer = new StringWriter();
         final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
-        final XMLOutputFactory outputFactory = XMLOutputFactory.newFactory();
-        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-        final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(domResult);
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult);
 
         final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(
-                xmlStreamWriter, schemaContext);
+                xmlStreamWriter, SCHEMA_CONTEXT);
 
         final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(
                 xmlNormalizedNodeStreamWriter);
index 70b4a5e3e9e0638cfb337a516d1b1b188324c2f0..6d36877c5d2e9e82a40db43a64b15087cbcc2eda 100644 (file)
@@ -99,13 +99,6 @@ public class NormalizedNodeXmlTranslationTest {
     private static final String NAMESPACE = "urn:opendaylight:params:xml:ns:yang:controller:test";
     private static final Revision REVISION = Revision.of("2014-03-13");
 
-    static final XMLOutputFactory XML_FACTORY;
-
-    static {
-        XML_FACTORY = XMLOutputFactory.newFactory();
-        XML_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.FALSE);
-    }
-
     private static ContainerNode augmentChoiceHell2() {
         final NodeIdentifier container = getNodeIdentifier("container");
         final QName augmentChoice1QName = QName.create(container.getNodeType(), "augment-choice1");
@@ -260,8 +253,17 @@ public class NormalizedNodeXmlTranslationTest {
     private final ContainerSchemaNode containerNode;
     private final String xmlPath;
 
+    @Test
+    public void testTranslationRepairing() throws Exception {
+        testTranslation(TestFactories.REPAIRING_OUTPUT_FACTORY);
+    }
+
     @Test
     public void testTranslation() throws Exception {
+        testTranslation(TestFactories.DEFAULT_OUTPUT_FACTORY);
+    }
+
+    private void testTranslation(final XMLOutputFactory factory) throws Exception {
         final InputStream resourceAsStream = XmlToNormalizedNodesTest.class.getResourceAsStream(xmlPath);
 
         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
@@ -282,10 +284,7 @@ public class NormalizedNodeXmlTranslationTest {
         final Document document = UntrustedXML.newDocumentBuilder().newDocument();
         final DOMResult domResult = new DOMResult(document);
 
-        final XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
-        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-
-        final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(domResult);
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult);
 
         final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter
                 .create(xmlStreamWriter, schema);
index f7f4e97adb9cb4716721f5fa34bb5639b02955b3..6188148f0ed00495e1ed08baf49f2d2ea83c38b2 100644 (file)
@@ -14,6 +14,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
 import java.net.URI;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -33,8 +34,12 @@ import org.custommonkey.xmlunit.DifferenceListener;
 import org.custommonkey.xmlunit.IgnoreTextAndAttributeValuesDifferenceListener;
 import org.custommonkey.xmlunit.XMLTestCase;
 import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
@@ -58,7 +63,12 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
+@RunWith(Parameterized.class)
 public class NormalizedNodesToXmlTest {
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        return TestFactories.junitParameters();
+    }
 
     private QNameModule bazModule;
 
@@ -85,6 +95,24 @@ public class NormalizedNodesToXmlTest {
     private QName mySecondKeyLeaf;
     private QName myLeafInList3;
 
+    private static SchemaContext SCHEMA_CONTEXT;
+
+    private final XMLOutputFactory factory;
+
+    public NormalizedNodesToXmlTest(final String factoryMode, final XMLOutputFactory factory) {
+        this.factory = factory;
+    }
+
+    @BeforeClass
+    public static void beforeClass() {
+        SCHEMA_CONTEXT = YangParserTestUtils.parseYangResource("/baz.yang");
+    }
+
+    @AfterClass
+    public static void afterClass() {
+        SCHEMA_CONTEXT = null;
+    }
+
     @Before
     public void setup() {
         bazModule = QNameModule.create(URI.create("baz-namespace"));
@@ -115,19 +143,14 @@ public class NormalizedNodesToXmlTest {
 
     @Test
     public void testNormalizedNodeToXmlSerialization() throws XMLStreamException, IOException, SAXException {
-        final SchemaContext schemaContext = YangParserTestUtils.parseYangResource("/baz.yang");
-
         final Document doc = loadDocument("/baz.xml");
 
         final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
 
-        final XMLOutputFactory factory = XMLOutputFactory.newInstance();
-        factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-
         final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult);
 
         final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(
-                xmlStreamWriter, schemaContext);
+                xmlStreamWriter, SCHEMA_CONTEXT);
 
         final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(
                 xmlNormalizedNodeStreamWriter);
index b2cfba716e6fddcfd54668e1b3fe4ed57f4cfc18..0e63b5e2158edbaffa240f68b779a299121a0343 100644 (file)
@@ -10,16 +10,17 @@ package org.opendaylight.yangtools.yang.data.codec.xml;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import javax.xml.stream.FactoryConfigurationError;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import org.custommonkey.xmlunit.Diff;
 import org.custommonkey.xmlunit.XMLAssert;
 import org.custommonkey.xmlunit.XMLUnit;
-import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
@@ -35,10 +36,15 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.xml.sax.SAXException;
 
+@RunWith(Parameterized.class)
 public class SchemaOrderedNormalizedNodeWriterTest {
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        return TestFactories.junitParameters();
+    }
 
     private static final String EXPECTED_1 = ""
-        + "<root>\n"
+        + "<root xmlns=\"foo\">\n"
         + "    <policy>\n"
         + "        <name>policy1</name>\n"
         + "        <rule>\n"
@@ -61,7 +67,7 @@ public class SchemaOrderedNormalizedNodeWriterTest {
 
 
     private static final String EXPECTED_2 = ""
-        + "<root>\n"
+        + "<root xmlns=\"order\">\n"
         + "    <id>id1</id>\n"
         + "    <cont>\n"
         + "        <content>content1</content>\n"
@@ -74,16 +80,17 @@ public class SchemaOrderedNormalizedNodeWriterTest {
     private static final String POLICY_NODE = "policy";
     private static final String ORDER_NAMESPACE = "order";
 
+    private final XMLOutputFactory factory;
 
-    @Before
-    public void setUp() {
+    public SchemaOrderedNormalizedNodeWriterTest(final String factoryMode, final XMLOutputFactory factory) {
+        this.factory = factory;
         XMLUnit.setIgnoreWhitespace(true);
     }
 
     @Test
-    public void testWrite() throws XMLStreamException, FactoryConfigurationError, IOException, SAXException {
+    public void testWrite() throws XMLStreamException, IOException, SAXException {
         final StringWriter stringWriter = new StringWriter();
-        final XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newFactory().createXMLStreamWriter(stringWriter);
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(stringWriter);
 
         SchemaContext schemaContext = getSchemaContext("/bug1848/foo.yang");
         NormalizedNodeStreamWriter writer = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, schemaContext);
@@ -142,9 +149,9 @@ public class SchemaOrderedNormalizedNodeWriterTest {
     }
 
     @Test
-    public void testWriteOrder() throws Exception {
+    public void testWriteOrder() throws XMLStreamException, IOException, SAXException {
         final StringWriter stringWriter = new StringWriter();
-        final XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newFactory().createXMLStreamWriter(stringWriter);
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(stringWriter);
         SchemaContext schemaContext = getSchemaContext("/bug1848/order.yang");
         NormalizedNodeStreamWriter writer = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, schemaContext);
 
index 9a736274107dc2aba620bf69403af6e1043d8ba8..26bcce19716973e142df5493e15c66ac4b63fd4d 100644 (file)
@@ -15,6 +15,7 @@ import java.io.InputStream;
 import java.io.StringWriter;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -37,6 +38,8 @@ import org.custommonkey.xmlunit.XMLAssert;
 import org.custommonkey.xmlunit.XMLUnit;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
@@ -64,7 +67,14 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
+@RunWith(Parameterized.class)
 public class SchemalessXMLStreamNormalizedNodeStreamWriterTest {
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        return TestFactories.junitParameters();
+    }
+
+    private final XMLOutputFactory factory;
 
     private QNameModule foobarModule;
 
@@ -101,6 +111,10 @@ public class SchemalessXMLStreamNormalizedNodeStreamWriterTest {
 
     private DOMSource anyxmlDomSource;
 
+    public SchemalessXMLStreamNormalizedNodeStreamWriterTest(final String factoryMode, final XMLOutputFactory factory) {
+        this.factory = factory;
+    }
+
     @Before
     public void setup() {
         foobarModule = QNameModule.create(URI.create("foobar-namespace"), Revision.of("2016-09-19"));
@@ -145,9 +159,6 @@ public class SchemalessXMLStreamNormalizedNodeStreamWriterTest {
 
         final DOMResult domResult = new DOMResult(UntrustedXML.newDocumentBuilder().newDocument());
 
-        final XMLOutputFactory factory = XMLOutputFactory.newInstance();
-        factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-
         final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult);
 
         final NormalizedNodeStreamWriter schemalessXmlNormalizedNodeStreamWriter =
diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/TestFactories.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/TestFactories.java
new file mode 100644 (file)
index 0000000..da595c9
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2019 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.codec.xml;
+
+import java.util.Arrays;
+import java.util.Collection;
+import javax.xml.stream.XMLOutputFactory;
+
+final class TestFactories {
+    /**
+     * Non-repairing XMLOutputFactory.
+     */
+    static final XMLOutputFactory DEFAULT_OUTPUT_FACTORY = XMLOutputFactory.newFactory();
+
+    /**
+     * Repairing XMLOuputFactory.
+     */
+    static final XMLOutputFactory REPAIRING_OUTPUT_FACTORY;
+
+    static {
+        REPAIRING_OUTPUT_FACTORY = XMLOutputFactory.newFactory();
+        REPAIRING_OUTPUT_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
+    }
+
+    static Collection<Object[]> junitParameters() {
+        return Arrays.asList(new Object[][] {
+            { "default", DEFAULT_OUTPUT_FACTORY },
+            { "repairing", REPAIRING_OUTPUT_FACTORY },
+        });
+    }
+
+    private TestFactories() {
+
+    }
+}
index c8365dd132ec457055973b11ffc602c4d3140c6b..881e566a22f8a98852c597a0750db37a1ab4c960 100644 (file)
@@ -5,7 +5,6 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
 import static org.hamcrest.CoreMatchers.containsString;
@@ -23,7 +22,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import org.custommonkey.xmlunit.Diff;
@@ -54,8 +52,6 @@ public class XmlStreamUtilsTest {
         void accept(XMLStreamWriter writer) throws XMLStreamException;
     }
 
-    public static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newFactory();
-
     private static SchemaContext schemaContext;
     private static Module leafRefModule;
 
@@ -77,7 +73,7 @@ public class XmlStreamUtilsTest {
     @Test
     public void testWriteAttribute() throws Exception {
         final ByteArrayOutputStream out = new ByteArrayOutputStream();
-        final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
+        final XMLStreamWriter writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(out);
         writer.writeStartElement("element");
 
         QName name = getAttrQName("namespace", "2012-12-12", "attr", Optional.of("prefix"));
@@ -138,7 +134,7 @@ public class XmlStreamUtilsTest {
 
     private static String createXml(XMLStreamWriterConsumer consumer) throws XMLStreamException, IOException {
         final ByteArrayOutputStream out = new ByteArrayOutputStream();
-        final XMLStreamWriter writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out);
+        final XMLStreamWriter writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(out);
 
         consumer.accept(writer);
 
index fb3c35dca322e23176f43a045641ef513774642e..777013880603b3649d6b281b215a9aa9ae60dd21 100644 (file)
@@ -14,6 +14,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
 import java.net.URI;
+import java.util.Collection;
 import java.util.Optional;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamReader;
@@ -28,7 +29,11 @@ import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import org.custommonkey.xmlunit.XMLTestCase;
 import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
@@ -54,23 +59,41 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
+@RunWith(Parameterized.class)
 public class YangModeledAnyXMLSerializationTest extends XMLTestCase {
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> data() {
+        return TestFactories.junitParameters();
+    }
 
     private final QNameModule bazModuleQName = QNameModule.create(URI.create("baz"));
     private final QName myAnyXMLDataBaz = QName.create(bazModuleQName, "my-anyxml-data");
     private final QName bazQName = QName.create(bazModuleQName, "baz");
     private final QName myContainer2QName = QName.create(bazModuleQName, "my-container-2");
-    private final SchemaContext schemaContext;
 
-    public YangModeledAnyXMLSerializationTest() {
-        schemaContext = YangParserTestUtils.parseYangResourceDirectory("/anyxml-support/serialization");
+    private static SchemaContext SCHEMA_CONTEXT;
+
+    private final XMLOutputFactory factory;
+
+    public YangModeledAnyXMLSerializationTest(final String factoryMode, final XMLOutputFactory factory) {
+        this.factory = factory;
+    }
+
+    @BeforeClass
+    public static void beforeClass() {
+        SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/anyxml-support/serialization");
+    }
+
+    @AfterClass
+    public static void afterClass() {
+        SCHEMA_CONTEXT = null;
     }
 
     @Test
     public void testSerializationOfBaz() throws Exception {
         final InputStream resourceAsStream = XmlToNormalizedNodesTest.class.getResourceAsStream(
                 "/anyxml-support/serialization/baz.xml");
-        final Module bazModule = schemaContext.findModules("baz").iterator().next();
+        final Module bazModule = SCHEMA_CONTEXT.findModules("baz").iterator().next();
         final ContainerSchemaNode bazCont = (ContainerSchemaNode) bazModule.getDataChildByName(
                 QName.create(bazModule.getQNameModule(), "baz"));
         assertNotNull(bazCont);
@@ -81,7 +104,7 @@ public class YangModeledAnyXMLSerializationTest extends XMLTestCase {
 
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
 
-        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, bazCont);
+        final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, bazCont);
         xmlParser.parse(reader);
 
         final NormalizedNode<?, ?> transformedInput = result.getResult();
@@ -97,7 +120,7 @@ public class YangModeledAnyXMLSerializationTest extends XMLTestCase {
         YangModeledAnyXmlNode yangModeledAnyXmlNode = (YangModeledAnyXmlNode) bazContainerChild.get();
 
         DataSchemaNode schemaOfAnyXmlData = yangModeledAnyXmlNode.getSchemaOfAnyXmlData();
-        SchemaNode myContainer2SchemaNode = SchemaContextUtil.findDataSchemaNode(schemaContext,
+        SchemaNode myContainer2SchemaNode = SchemaContextUtil.findDataSchemaNode(SCHEMA_CONTEXT,
                 SchemaPath.create(true, bazQName, myContainer2QName));
         assertTrue(myContainer2SchemaNode instanceof ContainerSchemaNode);
         assertEquals(myContainer2SchemaNode, schemaOfAnyXmlData);
@@ -105,13 +128,10 @@ public class YangModeledAnyXMLSerializationTest extends XMLTestCase {
         final Document document = UntrustedXML.newDocumentBuilder().newDocument();
         final DOMResult domResult = new DOMResult(document);
 
-        final XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
-        outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
-
-        final XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(domResult);
+        final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult);
 
         final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter
-                .create(xmlStreamWriter, schemaContext);
+                .create(xmlStreamWriter, SCHEMA_CONTEXT);
 
         final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(
                 xmlNormalizedNodeStreamWriter);