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 222d79d6f0d2e7bd406d8d1670e4d200205b9adc Author: Andreas Veithen <veit...@apache.org> AuthorDate: Sat Dec 5 10:30:33 2015 +0000 Finalize the implementation of XSQNameType. --- .../org/apache/axiom/core/ContextAccessorImpl.java | 5 +++ .../org/apache/axiom/datatype/ContextAccessor.java | 2 + .../datatype/helper/dom/DOMContextAccessor.java | 5 +++ .../apache/axiom/datatype/xsd/XSQNameTypeImpl.java | 17 +++++--- .../axiom/datatype/xsd/MapContextAccessor.java | 12 +++++- .../apache/axiom/datatype/xsd/XSQNameTypeTest.java | 45 ++++++++++++++++++++-- 6 files changed, 75 insertions(+), 11 deletions(-) diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java index d28636b..32e9353 100644 --- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java +++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java @@ -32,4 +32,9 @@ final class ContextAccessorImpl implements ContextAccessor<CoreElement,Semantics public String lookupPrefix(CoreElement element, Semantics semantics, String namespaceURI) { return element.coreLookupPrefix(namespaceURI, semantics); } + + public void declareNamespace(CoreElement element, Semantics semantics, String prefix, String namespaceURI) { + // TODO + throw new UnsupportedOperationException(); + } } diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java index 4abd1fc..f66619d 100644 --- a/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java +++ b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java @@ -39,4 +39,6 @@ public interface ContextAccessor<T,O> { String lookupNamespaceURI(T contextObject, O options, String prefix); String lookupPrefix(T contextObject, O options, String namespaceURI); + + void declareNamespace(T contextObject, O options, String prefix, String namespaceURI); } diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java index 6ce6156..9ca5d04 100644 --- a/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java +++ b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java @@ -36,4 +36,9 @@ final class DOMContextAccessor implements ContextAccessor<Element,Void> { public String lookupPrefix(Element element, Void options, String namespaceURI) { return element.lookupPrefix(namespaceURI.length() == 0 ? null : namespaceURI); } + + public void declareNamespace(Element element, Void options, String prefix, String namespaceURI) { + // TODO + throw new UnsupportedOperationException(); + } } 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 a192956..e896f97 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 @@ -26,6 +26,7 @@ import javax.xml.namespace.QName; import org.apache.axiom.datatype.ContextAccessor; import org.apache.axiom.datatype.TypeHelper; import org.apache.axiom.datatype.UnexpectedCharacterException; +import org.apache.axiom.util.xml.NSUtils; final class XSQNameTypeImpl implements XSQNameType { public <S,O> QName parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options) @@ -69,12 +70,18 @@ final class XSQNameTypeImpl implements XSQNameType { String prefix = value.getPrefix(); String namespaceURI = value.getNamespaceURI(); if (!namespaceURI.equals(contextAccessor.lookupNamespaceURI(contextObject, options, prefix))) { - String existingPrefix = contextAccessor.lookupPrefix(contextObject, options, namespaceURI); - if (existingPrefix != null) { - prefix = existingPrefix; + if (namespaceURI.length() == 0) { + contextAccessor.declareNamespace(contextObject, options, "", ""); } else { - // TODO - throw new RuntimeException(); + if (prefix.length() == 0) { + prefix = contextAccessor.lookupPrefix(contextObject, options, namespaceURI); + if (prefix == null) { + prefix = NSUtils.generatePrefix(namespaceURI); + contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);; + } + } else { + contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);; + } } } if (prefix.length() == 0) { diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java index a8c55bc..3b7a63b 100644 --- a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java +++ b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java @@ -36,7 +36,15 @@ public final class MapContextAccessor implements ContextAccessor<Map<String,Stri } public String lookupPrefix(Map<String,String> context, Void options, String namespaceURI) { - // TODO - throw new UnsupportedOperationException(); + for (Map.Entry<String,String> entry : context.entrySet()) { + if (entry.getValue().equals(namespaceURI)) { + return entry.getKey(); + } + } + return null; + } + + public void declareNamespace(Map<String,String> context, Void options, String prefix, String namespaceURI) { + context.put(prefix, namespaceURI); } } diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java index eb0ae7c..311b986 100644 --- a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java +++ b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java @@ -22,6 +22,8 @@ import static com.google.common.truth.Truth.assertThat; import java.text.ParseException; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import javax.xml.XMLConstants; import javax.xml.namespace.QName; @@ -30,7 +32,7 @@ import org.junit.Test; public class XSQNameTypeTest { @Test - public void testBoundPrefix() throws ParseException { + public void testParseWithBoundPrefix() throws ParseException { QName qname = XSQNameType.INSTANCE.parse("p:test", MapContextAccessor.INSTANCE, Collections.singletonMap("p", "urn:test"), null); assertThat(qname.getNamespaceURI()).isEqualTo("urn:test"); @@ -39,13 +41,13 @@ public class XSQNameTypeTest { } @Test(expected=ParseException.class) - public void testUnboundPrefix() throws ParseException { + public void testParseWithUnboundPrefix() throws ParseException { XSQNameType.INSTANCE.parse("ns:test", MapContextAccessor.INSTANCE, Collections.<String,String>emptyMap(), null); } @Test - public void testXmlPrefix() throws ParseException { + public void testParseWithXmlPrefix() throws ParseException { QName qname = XSQNameType.INSTANCE.parse("xml:value", MapContextAccessor.INSTANCE, Collections.<String,String>emptyMap(), null); assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XML_NS_URI); @@ -54,11 +56,46 @@ public class XSQNameTypeTest { } @Test - public void testXmlnsPrefix() throws ParseException { + public void testParseWithXmlnsPrefix() throws ParseException { QName qname = XSQNameType.INSTANCE.parse("xmlns:value", MapContextAccessor.INSTANCE, Collections.<String,String>emptyMap(), null); assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE_NS_URI); assertThat(qname.getLocalPart()).isEqualTo("value"); assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE); } + + @Test + public void testFormatWithUnboundPrefix() { + Map<String,String> context = new HashMap<String,String>(); + assertThat(XSQNameType.INSTANCE.format(new QName("urn:test", "test", "p"), + MapContextAccessor.INSTANCE, context, null)).isEqualTo("p:test"); + assertThat(context).hasSize(1); + assertThat(context).containsEntry("p", "urn:test"); + } + + @Test + public void testFormatWithExistingNamespace() { + assertThat(XSQNameType.INSTANCE.format(new QName("urn:test", "test"), + MapContextAccessor.INSTANCE, Collections.singletonMap("p", "urn:test"), + null)).isEqualTo("p:test"); + } + + @Test + public void testFormatWithGeneratedPrefix() { + Map<String,String> context = new HashMap<String,String>(); + String literal = XSQNameType.INSTANCE.format(new QName("urn:test", "test"), + MapContextAccessor.INSTANCE, context, null); + assertThat(context).hasSize(1); + Map.Entry<String,String> entry = context.entrySet().iterator().next(); + assertThat(entry.getValue()).isEqualTo("urn:test"); + assertThat(entry.getKey()).isNotEmpty(); + assertThat(literal).isEqualTo(entry.getKey() + ":test"); + } + + @Test + public void testFormatWithNoNamespace() { + assertThat(XSQNameType.INSTANCE.format(new QName("test"), + MapContextAccessor.INSTANCE, Collections.<String,String>emptyMap(), + null)).isEqualTo("test"); + } }