From 84d73e962385cdf12cf2cc239189eda8e6a771bf Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sun, 24 Jan 2021 19:23:18 +0100 Subject: [PATCH] [core] Fix XmlEnvironment namespace: Use default namespace (not element's) Assume the element then the element's namespace is 'foo-namespace', but the default namespace is 'namespace'. And this is the namespace that scopes into inner elements. --- .../smack/packet/XmlEnvironment.java | 4 +-- .../smack/xml/XmlPullParserTest.java | 33 ++++++++++++++++++- .../jivesoftware/smack/xml/XmlPullParser.java | 6 +++- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java index cf4e8f9fd..4b6f76b8b 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java @@ -1,6 +1,6 @@ /** * - * Copyright 2019 Florian Schmaus + * Copyright 2019-2021 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -133,7 +133,7 @@ public class XmlEnvironment { } public static XmlEnvironment from(XmlPullParser parser, XmlEnvironment outerXmlEnvironment) { - String namespace = parser.getNamespace(); + String namespace = parser.getDefaultNamespace(); String xmlLang = ParserUtils.getXmlLang(parser); return new XmlEnvironment(namespace, xmlLang, outerXmlEnvironment); } diff --git a/smack-core/src/test/java/org/jivesoftware/smack/xml/XmlPullParserTest.java b/smack-core/src/test/java/org/jivesoftware/smack/xml/XmlPullParserTest.java index ff82064c9..e78962ac2 100644 --- a/smack-core/src/test/java/org/jivesoftware/smack/xml/XmlPullParserTest.java +++ b/smack-core/src/test/java/org/jivesoftware/smack/xml/XmlPullParserTest.java @@ -1,6 +1,6 @@ /** * - * Copyright 2019 Florian Schmaus + * Copyright 2019-2021 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,9 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.IOException; import java.io.Reader; import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; import java.util.stream.Stream; import javax.xml.XMLConstants; @@ -207,6 +210,34 @@ public class XmlPullParserTest { } } + @ParameterizedTest + @EnumSource(SmackTestUtil.XmlPullParserKind.class) + public void testGetNamespace(SmackTestUtil.XmlPullParserKind parserKind) + throws XmlPullParserException, IOException { + String xml = ""; + XmlPullParser parser = SmackTestUtil.getParserFor(xml, parserKind); + + String parsedName = parser.getName(); + assertEquals("bar", parsedName); + + String parsedPrefix = parser.getPrefix(); + assertEquals("foo", parsedPrefix); + + String parsedPrefixNamespace = parser.getNamespace(parsedPrefix); + assertEquals("foo-namespace", parsedPrefixNamespace); + + String parsedNamespace = parser.getNamespace(); + assertEquals("foo-namespace", parsedNamespace); + + List> defaultNamespaceRetrievers = new ArrayList<>(); + defaultNamespaceRetrievers.add(p -> p.getNamespace(null)); + defaultNamespaceRetrievers.add(p -> p.getDefaultNamespace()); + for (Function defaultNamespaceRetriever : defaultNamespaceRetrievers) { + String defaultNamespace = defaultNamespaceRetriever.apply(parser); + assertEquals("namespace", defaultNamespace); + } + } + private static void assertAttributeHolds(XmlPullParser parser, int attributeIndex, String expectedLocalpart, String expectedPrefix, String expectedNamespace) { QName qname = parser.getAttributeQName(attributeIndex); diff --git a/smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/XmlPullParser.java b/smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/XmlPullParser.java index ebb8f07e9..c49ac66ae 100644 --- a/smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/XmlPullParser.java +++ b/smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/XmlPullParser.java @@ -1,6 +1,6 @@ /** * - * Copyright 2019 Florian Schmaus. + * Copyright 2019-2021 Florian Schmaus. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,6 +75,10 @@ public interface XmlPullParser { String getNamespace(String prefix); + default String getDefaultNamespace() { + return getNamespace(null); + } + int getDepth(); String getPositionDescription();