This is an automated email from the ASF dual-hosted git repository. dkulp pushed a commit to branch datatypes in repository https://gitbox.apache.org/repos/asf/ws-axiom.git
commit 843e7c5c6909d3a3b694c1a0e1f2c8e37c2c7636 Author: Andreas Veithen <veit...@apache.org> AuthorDate: Wed Dec 2 23:39:16 2015 +0000 Correctly support xs:QName values with prefixes xml and xmlns. --- .../apache/axiom/datatype/xsd/XSQNameTypeImpl.java | 14 ++++++++++--- .../axiom/datatype/helper/dom/DOMHelperTest.java | 23 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java index 3da9d38..a192956 100644 --- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java +++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java @@ -20,6 +20,7 @@ package org.apache.axiom.datatype.xsd; import java.text.ParseException; +import javax.xml.XMLConstants; import javax.xml.namespace.QName; import org.apache.axiom.datatype.ContextAccessor; @@ -50,9 +51,16 @@ final class XSQNameTypeImpl implements XSQNameType { prefix = literal.substring(start, colonIndex); localPart = literal.substring(colonIndex+1, end); } - String namespaceURI = contextAccessor.lookupNamespaceURI(contextObject, options, prefix); - if (namespaceURI == null) { - throw new ParseException("Unbound namespace prefix \"" + prefix + "\"", 0); + String namespaceURI; + if (prefix.equals(XMLConstants.XML_NS_PREFIX)) { + namespaceURI = XMLConstants.XML_NS_URI; + } else if (prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) { + namespaceURI = XMLConstants.XMLNS_ATTRIBUTE_NS_URI; + } else { + namespaceURI = contextAccessor.lookupNamespaceURI(contextObject, options, prefix); + if (namespaceURI == null) { + throw new ParseException("Unbound namespace prefix \"" + prefix + "\"", 0); + } } return new QName(namespaceURI, localPart, prefix); } diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java index 00e994d..61311e7 100644 --- a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java +++ b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java @@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertThat; import java.text.ParseException; +import javax.xml.XMLConstants; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; @@ -64,4 +65,26 @@ public class DOMHelperTest { assertThat(qname.getLocalPart()).isEqualTo("value"); assertThat(qname.getPrefix()).isEmpty(); } + + @Test + public void testGetQNameFromElementXmlPrefix() throws Exception { + Document document = newDocument(); + Element element = document.createElementNS(null, "test"); + element.setTextContent("xml:value"); + QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE); + assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XML_NS_URI); + assertThat(qname.getLocalPart()).isEqualTo("value"); + assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XML_NS_PREFIX); + } + + @Test + public void testGetQNameFromElementXmlnsPrefix() throws Exception { + Document document = newDocument(); + Element element = document.createElementNS(null, "test"); + element.setTextContent("xmlns:value"); + QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE); + assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE_NS_URI); + assertThat(qname.getLocalPart()).isEqualTo("value"); + assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE); + } }