From 5c623d6de870d20c4dd9d3990cfe77245e2fdb0f Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 5 Sep 2018 12:53:46 +0200 Subject: [PATCH] Consider namespace in namesakes XML (unlike JSON) has explicit namespaces which we need to take into consideration when determining whether two elements have the same name. JIRA: YANGTOOLS-900 Change-Id: I0d53bee5d18d211343c094941985bd3f0b6a8776 Signed-off-by: Isabel Lloret Signed-off-by: Robert Varga --- .../yang/data/codec/xml/XmlParserStream.java | 13 ++++++++----- .../data/codec/xml/XmlToNormalizedNodesTest.java | 10 ++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java index eba402eb8e..5e4357cd30 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java @@ -20,10 +20,12 @@ import java.io.IOException; import java.io.StringReader; import java.net.URI; import java.net.URISyntaxException; +import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Deque; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import javax.annotation.concurrent.NotThreadSafe; import javax.xml.XMLConstants; @@ -318,7 +320,8 @@ public final class XmlParserStream implements Closeable, Flushable { switch (in.nextTag()) { case XMLStreamConstants.START_ELEMENT: - final Set namesakes = new HashSet<>(); + // FIXME: why do we even need this tracker? either document it or remove it + final Set> namesakes = new HashSet<>(); while (in.hasNext()) { final String xmlElementName = in.getLocalName(); @@ -345,14 +348,14 @@ public final class XmlParserStream implements Closeable, Flushable { parentSchema = ((YangModeledAnyXmlSchemaNode) parentSchema).getSchemaOfAnyXmlData(); } - if (!namesakes.add(xmlElementName)) { + final String xmlElementNamespace = in.getNamespaceURI(); + if (!namesakes.add(new SimpleImmutableEntry<>(xmlElementNamespace, xmlElementName))) { final Location loc = in.getLocation(); throw new IllegalStateException(String.format( - "Duplicate element \"%s\" in XML input at: line %s column %s", xmlElementName, - loc.getLineNumber(), loc.getColumnNumber())); + "Duplicate namespace \"%s\" element \"%s\" in XML input at: line %s column %s", + xmlElementNamespace, xmlElementName, loc.getLineNumber(), loc.getColumnNumber())); } - final String xmlElementNamespace = in.getNamespaceURI(); final Deque childDataSchemaNodes = ParserStreamUtils.findSchemaNodeByNameAndNamespace(parentSchema, xmlElementName, new URI(xmlElementNamespace)); diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlToNormalizedNodesTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlToNormalizedNodesTest.java index 18927065b2..28d1cab4b8 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlToNormalizedNodesTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlToNormalizedNodesTest.java @@ -157,9 +157,9 @@ public class XmlToNormalizedNodesTest { xmlParser.parse(reader); fail("IllegalStateException should have been thrown because of duplicate leaf."); } catch (IllegalStateException ex) { - assertTrue(ex.getMessage().contains("Duplicate element \"decimal64-leaf\" in XML input")); + assertEquals("Duplicate namespace \"foo-namespace\" element \"decimal64-leaf\" in XML input at: line 7 " + + "column 25", ex.getMessage()); } - } @Test @@ -177,7 +177,8 @@ public class XmlToNormalizedNodesTest { xmlParser.parse(reader); fail("IllegalStateException should have been thrown because of duplicate anyxml"); } catch (IllegalStateException ex) { - assertTrue(ex.getMessage().contains("Duplicate element \"my-anyxml\" in XML input")); + assertEquals("Duplicate namespace \"foo-namespace\" element \"my-anyxml\" in XML input at: line 19 " + + "column 20", ex.getMessage()); } } @@ -196,7 +197,8 @@ public class XmlToNormalizedNodesTest { xmlParser.parse(reader); fail("IllegalStateException should have been thrown because of duplicate container"); } catch (IllegalStateException ex) { - assertTrue(ex.getMessage().contains("Duplicate element \"leaf-container\" in XML input")); + assertEquals("Duplicate namespace \"foo-namespace\" element \"leaf-container\" in XML input at: line 13 " + + "column 21", ex.getMessage()); } } -- 2.36.6