Consider namespace in namesakes 17/75717/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 5 Sep 2018 10:53:46 +0000 (12:53 +0200)
committerRobert Varga <nite@hq.sk>
Wed, 5 Sep 2018 11:21:54 +0000 (11:21 +0000)
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 <illoret@indra.es>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlToNormalizedNodesTest.java

index eba402eb8e862e4c4217b9b62d318e3f665318d5..5e4357cd30abf463a39b26a9e994f4eedf45c4f9 100644 (file)
@@ -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<String> namesakes = new HashSet<>();
+                // FIXME: why do we even need this tracker? either document it or remove it
+                final Set<Entry<String, String>> 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<DataSchemaNode> childDataSchemaNodes =
                             ParserStreamUtils.findSchemaNodeByNameAndNamespace(parentSchema, xmlElementName,
                                     new URI(xmlElementNamespace));
index 18927065b2785c5f4b8cffbaf1803c5a11a829a1..28d1cab4b86322b3a1eb00687d2fac87e4d27dea 100644 (file)
@@ -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());
         }
     }