Author: veithen
Date: Mon Nov 23 20:18:38 2015
New Revision: 1715941
URL: http://svn.apache.org/viewvc?rev=1715941&view=rev
Log:
Use a hash based approach to choose prefixes, instead of generating a new one
every time.
Added:
webservices/axiom/trunk/components/xml-utils/src/main/java/org/apache/axiom/util/xml/NSUtils.java
(with props)
webservices/axiom/trunk/components/xml-utils/src/test/
webservices/axiom/trunk/components/xml-utils/src/test/java/
webservices/axiom/trunk/components/xml-utils/src/test/java/org/
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/xml/
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/xml/NSUtilsTest.java
(with props)
webservices/axiom/trunk/components/xml-utils/src/test/resources/
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/util/
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/util/xml/
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/util/xml/namespaces.txt
Modified:
webservices/axiom/trunk/aspects/om-aspects/pom.xml
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/NSUtil.java
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/util/OMSerializerUtil.java
webservices/axiom/trunk/components/xml-utils/pom.xml
Modified: webservices/axiom/trunk/aspects/om-aspects/pom.xml
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/pom.xml?rev=1715941&r1=1715940&r2=1715941&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/pom.xml (original)
+++ webservices/axiom/trunk/aspects/om-aspects/pom.xml Mon Nov 23 20:18:38 2015
@@ -57,6 +57,11 @@
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>xml-utils</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
Modified:
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj?rev=1715941&r1=1715940&r2=1715941&view=diff
==============================================================================
---
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj
(original)
+++
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj
Mon Nov 23 20:18:38 2015
@@ -18,6 +18,8 @@
*/
package org.apache.axiom.om.impl.common;
+import static org.apache.axiom.util.xml.NSUtils.generatePrefix;
+
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
@@ -53,7 +55,6 @@ import org.apache.axiom.om.impl.intf.Axi
import org.apache.axiom.om.impl.intf.AxiomContainer;
import org.apache.axiom.om.impl.intf.AxiomElement;
import org.apache.axiom.om.impl.intf.AxiomNamespaceDeclaration;
-import org.apache.axiom.om.impl.util.OMSerializerUtil;
import org.apache.axiom.util.namespace.MapBasedNamespaceContext;
import org.apache.axiom.util.stax.XMLStreamReaderUtils;
import org.apache.commons.logging.Log;
@@ -304,7 +305,7 @@ public aspect AxiomElementSupport {
if (namespaceURI.length() > 0 || prefix != null) {
namespace = findNamespace(namespaceURI, prefix);
if (namespace == null || prefix == null &&
namespace.getPrefix().length() == 0) {
- namespace = new OMNamespaceImpl(namespaceURI, prefix !=
null ? prefix : OMSerializerUtil.getNextNSPrefix());
+ namespace = new OMNamespaceImpl(namespaceURI, prefix !=
null ? prefix : generatePrefix(namespaceURI));
}
}
}
@@ -366,11 +367,12 @@ public aspect AxiomElementSupport {
public final OMNamespace AxiomElement.declareNamespace(OMNamespace
namespace) {
String prefix = namespace.getPrefix();
+ String namespaceURI = namespace.getNamespaceURI();
if (prefix == null) {
- prefix = OMSerializerUtil.getNextNSPrefix();
- namespace = new OMNamespaceImpl(namespace.getNamespaceURI(),
prefix);
+ prefix = generatePrefix(namespaceURI);
+ namespace = new OMNamespaceImpl(namespaceURI, prefix);
}
- if (prefix.length() > 0 && namespace.getNamespaceURI().length() == 0) {
+ if (prefix.length() > 0 && namespaceURI.length() == 0) {
throw new IllegalArgumentException("Cannot bind a prefix to the
empty namespace name");
}
addNamespaceDeclaration(namespace);
@@ -380,7 +382,7 @@ public aspect AxiomElementSupport {
public final OMNamespace AxiomElement.declareNamespace(String uri, String
prefix) {
if ("".equals(prefix)) {
log.warn("Deprecated usage of
OMElement#declareNamespace(String,String) with empty prefix");
- prefix = OMSerializerUtil.getNextNSPrefix();
+ prefix = generatePrefix(uri);
}
OMNamespaceImpl ns = new OMNamespaceImpl(uri, prefix);
return declareNamespace(ns);
Modified:
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/NSUtil.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/NSUtil.java?rev=1715941&r1=1715940&r2=1715941&view=diff
==============================================================================
---
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/NSUtil.java
(original)
+++
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/NSUtil.java
Mon Nov 23 20:18:38 2015
@@ -18,9 +18,10 @@
*/
package org.apache.axiom.om.impl.common;
+import static org.apache.axiom.util.xml.NSUtils.generatePrefix;
+
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.impl.intf.AxiomElement;
-import org.apache.axiom.om.impl.util.OMSerializerUtil;
public final class NSUtil {
private NSUtil() {}
@@ -58,7 +59,7 @@ public final class NSUtil {
}
}
if (prefix == null) {
- prefix = OMSerializerUtil.getNextNSPrefix();
+ prefix = generatePrefix(namespaceURI);
ns = new OMNamespaceImpl(namespaceURI, prefix);
}
if (addNSDecl) {
Modified:
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java?rev=1715941&r1=1715940&r2=1715941&view=diff
==============================================================================
---
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
(original)
+++
webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
Mon Nov 23 20:18:38 2015
@@ -18,6 +18,8 @@
*/
package org.apache.axiom.om.impl.common.factory;
+import static org.apache.axiom.util.xml.NSUtils.generatePrefix;
+
import javax.xml.namespace.QName;
import org.apache.axiom.core.CoreNode;
@@ -57,7 +59,6 @@ import org.apache.axiom.om.impl.intf.Axi
import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
import org.apache.axiom.om.impl.intf.AxiomText;
import org.apache.axiom.om.impl.intf.TextContent;
-import org.apache.axiom.om.impl.util.OMSerializerUtil;
public class OMFactoryImpl implements OMFactoryEx {
private final OMMetaFactory metaFactory;
@@ -284,7 +285,7 @@ public class OMFactoryImpl implements OM
OMNamespace ns = element.findNamespace(namespaceURI,
prefix.length() == 0 ? null : prefix);
if (ns == null) {
if ("".equals(prefix)) {
- prefix = OMSerializerUtil.getNextNSPrefix();
+ prefix = generatePrefix(namespaceURI);
}
ns = element.declareNamespace(namespaceURI, prefix);
}
@@ -341,7 +342,7 @@ public class OMFactoryImpl implements OM
if (namespaceURI.length() == 0) {
ns = null;
} else {
- ns = new OMNamespaceImpl(namespaceURI,
OMSerializerUtil.getNextNSPrefix());
+ ns = new OMNamespaceImpl(namespaceURI,
generatePrefix(namespaceURI));
}
}
if (ns != null) {
Modified:
webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/util/OMSerializerUtil.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/util/OMSerializerUtil.java?rev=1715941&r1=1715940&r2=1715941&view=diff
==============================================================================
---
webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/util/OMSerializerUtil.java
(original)
+++
webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/util/OMSerializerUtil.java
Mon Nov 23 20:18:38 2015
@@ -564,6 +564,7 @@ public class OMSerializerUtil {
/**
* Get the next prefix name
* @return next prefix name
+ * @deprecated
*/
public static String getNextNSPrefix() {
Modified: webservices/axiom/trunk/components/xml-utils/pom.xml
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/components/xml-utils/pom.xml?rev=1715941&r1=1715940&r2=1715941&view=diff
==============================================================================
--- webservices/axiom/trunk/components/xml-utils/pom.xml (original)
+++ webservices/axiom/trunk/components/xml-utils/pom.xml Mon Nov 23 20:18:38
2015
@@ -29,6 +29,14 @@
<artifactId>xml-utils</artifactId>
<packaging>bundle</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>com.google.truth</groupId>
+ <artifactId>truth</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
<build>
<plugins>
<plugin>
Added:
webservices/axiom/trunk/components/xml-utils/src/main/java/org/apache/axiom/util/xml/NSUtils.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/components/xml-utils/src/main/java/org/apache/axiom/util/xml/NSUtils.java?rev=1715941&view=auto
==============================================================================
---
webservices/axiom/trunk/components/xml-utils/src/main/java/org/apache/axiom/util/xml/NSUtils.java
(added)
+++
webservices/axiom/trunk/components/xml-utils/src/main/java/org/apache/axiom/util/xml/NSUtils.java
Mon Nov 23 20:18:38 2015
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.util.xml;
+
+/**
+ * Contains utility methods to work with XML namespaces.
+ */
+public final class NSUtils {
+ private static final char[] prefixChars = new char[62];
+
+ static {
+ for (int i = 0; i < 10; i++) {
+ prefixChars[i] = (char)('0' + i);
+ }
+ for (int i = 0; i < 26; i++) {
+ prefixChars[i+10] = (char)('a' + i);
+ }
+ for (int i = 0; i < 26; i++) {
+ prefixChars[i+36] = (char)('A' + i);
+ }
+ }
+
+ private NSUtils() {}
+
+ /**
+ * Generate a namespace prefix for the given namespace URI. The generated
prefix is based on a
+ * hash of the namespace URI. This implies that a given namespace URI is
always mapped to the
+ * same prefix and that there is no guarantee that the generated prefixes
are unique. However,
+ * the likelihood of a (accidental) collisions is very small.
+ * <p>
+ * Using hash based prefixes has the advantage of reducing the number of
entries created in the
+ * symbol table of the parser on the receiving side, assuming that the
symbol table is reused to
+ * parse multiple documents (which is a common optimization).
+ *
+ * @param namespaceURI
+ * the namespace URI to generate a prefix for; must not be
{@code null}
+ * @return the generated prefix
+ */
+ public static String generatePrefix(String namespaceURI) {
+ char[] prefix = new char[7];
+ prefix[0] = 'n';
+ prefix[1] = 's';
+ int hash = namespaceURI.hashCode() & 0x7FFFFFFF;
+ for (int i = prefix.length-1; i >= 2; i--) {
+ prefix[i] = prefixChars[hash % 62];
+ hash /= 62;
+ }
+ return new String(prefix);
+ }
+}
Propchange:
webservices/axiom/trunk/components/xml-utils/src/main/java/org/apache/axiom/util/xml/NSUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/xml/NSUtilsTest.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/xml/NSUtilsTest.java?rev=1715941&view=auto
==============================================================================
---
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/xml/NSUtilsTest.java
(added)
+++
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/xml/NSUtilsTest.java
Mon Nov 23 20:18:38 2015
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.util.xml;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+
+import com.google.common.base.Charsets;
+
+public class NSUtilsTest {
+ /**
+ * Test that the generated prefixes are unique for a sample of namespace
URIs collected from the
+ * Axiom source tree.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testUniqueness() throws Exception {
+ Set<String> prefixes = new HashSet<String>();
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ NSUtilsTest.class.getResourceAsStream("namespaces.txt"),
Charsets.UTF_8));
+ try {
+ String uri;
+ while ((uri = in.readLine()) != null) {
+ assertThat(prefixes.add(NSUtils.generatePrefix(uri))).isTrue();
+ }
+ } finally {
+ in.close();
+ }
+ }
+}
Propchange:
webservices/axiom/trunk/components/xml-utils/src/test/java/org/apache/axiom/util/xml/NSUtilsTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/util/xml/namespaces.txt
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/util/xml/namespaces.txt?rev=1715941&view=auto
==============================================================================
---
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/util/xml/namespaces.txt
(added)
+++
webservices/axiom/trunk/components/xml-utils/src/test/resources/org/apache/axiom/util/xml/namespaces.txt
Mon Nov 23 20:18:38 2015
@@ -0,0 +1,177 @@
+http://maven.apache.org/POM/4.0.0
+http://www.w3.org/2001/XMLSchema-instance
+http://www.w3.org/2003/05/soap-envelope
+http://example2.org/ts-tests
+http://ws.apache.org/axis2
+http://ws.apache.org/axis2/user
+http://www.w3.org/2001/XMLSchema
+http://schemas.xmlsoap.org/soap/envelope/
+http://schemas.xmlsoap.org/ws/2004/03/addressing
+http://www.w3.org/2000/09/xmldsig#
+http://schemas.xmlsoap.org/ws/2002/04/secext
+http://schemas.xmlsoap.org/rp
+http://www.w3.org/2001/04/xmlenc#
+http://fabrikam123.com/payloads
+urn:test
+http://example.org/ts-tests
+http://www.sample.org
+urn:comprehensive-types.types.wsdl.test
+http://echo.services-impl
+http://types.echo.services
+http://echo.services
+http://schemas.xmlsoap.org/soap/encoding/
+http://schemas.xmlsoap.org/wsdl/
+urn:comprehensive-service.types.wsdl.test
+http://www.w3.org/1999/XMLSchema
+urn:comprehensive-types2.types.wsdl.test
+http://schemas.xmlsoap.org/wsdl/soap/
+http://www.w3.org/2005/08/addressing
+http://localhost:8081/axis/services/BankPort
+tempUri
+http:www.sample.org
+http://example1.org/ts-tests
+urn://sample
+http://example.org
+http://www.nonamespace.com
+http://www.blankns.com
+http://www.w3.org
+http://www.ietf.org
+http://ws.apache.org/axiom/
+http://www.w3.org/2005/Atom
+http://purl.org/syndication/history/1.0
+http://www.w3.org/1999/xhtml
+http://www.w3.org/2005/atom
+http://www.w3.org/1998/Math/MathML
+http://www.w3.org/2000/svg
+http://example.com/bogus
+http://www.w3.org/2007/app
+http://www.w3.org/1999/xlink
+http://backend.userland.com/creativeCommonsRssModule
+http://www.w3.org/1999/02/22-rdf-syntax-ns#
+http://purl.org/dc/terms/
+http://madskills.com/public/xml/rss/module/trackback/
+http://www.example.com/value
+http://purl.org/dc/elements/1.1/
+http://www.example.com/extension-a
+http://web.resource.org/cc/
+http://xmlns.com/foaf/0.1/
+http://example.com/newformat#
+http://purl.org/echo/ns#
+http://purl.org/atom/ns#
+http://purl.org/rss/1.0/modules/syndication/
+http://example.com/marks_made_up_namespace/
+http://purl.org/atom/app#
+tag:example.org,2006:foo
+urn:foo
+http://example.org/quote
+urn:jboss:domain:transactions:2.0
+urn:jboss:domain:jmx:1.3
+urn:jboss:domain:sar:1.0
+urn:jboss:domain:jca:2.0
+urn:jboss:domain:ee:2.0
+urn:jboss:domain:naming:2.0
+urn:jboss:domain:batch:1.0
+urn:jboss:domain:remoting:2.0
+urn:jboss:domain:logging:2.0
+urn:jboss:domain:resource-adapters:2.0
+urn:jboss:domain:webservices:1.2
+urn:jboss:domain:mail:2.0
+urn:jboss:domain:undertow:1.2
+urn:jboss:domain:io:1.1
+urn:jboss:domain:weld:2.0
+urn:jboss:domain:jpa:1.1
+urn:jboss:domain:jsf:1.0
+urn:jboss:domain:ejb3:2.0
+urn:jboss:domain:jdr:1.0
+urn:jboss:domain:pojo:1.0
+urn:jboss:domain:2.2
+urn:jboss:domain:deployment-scanner:2.0
+urn:jboss:domain:jaxrs:1.0
+urn:jboss:domain:infinispan:2.0
+urn:jboss:domain:security:1.2
+http://jboss.org/schema/arquillian
+http://www.opensource.lk
+http://www.whatever.com
+http://www.apache.org
+http://www.springframework.org/schema/beans
+http://www.springframework.org/schema/util
+urn:ns1
+urn:ns2
+http://schemas.xmlsoap.org/badsoap/envelope/
+urn:common
+http://apache.org
+urn:ns3
+urn:test2
+urn:test1
+urn:test4
+urn:test3
+http://openuri.org/easypo
+urn:some:namespace
+http://geronimo.apache.org/xml/ns/deployment-1.1
+http://geronimo.apache.org/xml/ns/j2ee/connector-1.1
+http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd
+http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
+http://www.example.com/IPO
+http://www.example.org/webservices/
+http://www.xmldb.org/xupdate
+http://www.jaxen.org/private
+http://www.oreilly.com/catalog/javaxml/
+http://www.oreilly.com/topics
+http://www.unused.com
+http://www.oreilly.com
+http://dummyNamespace/
+http://fooNamespace/
+http://barNamespace/
+http://www.xxxx.com/
+http://somethingElse/
+http://jaxen.org/test-harness/var
+http://www.acme.co.uk/postcode-lookup
+http://www.example.org/cache-policy
+http://www.example.org/addnumbershandler
+urn:trade
+urn:tx
+http://example.org/RoleTest
+http://example.org/system
+http://example.com/fabrikam
+http://www.springframework.org/schema/oxm
+http://www.springframework.org/schema/context
+http://www.springframework.org/schema/web-services
+urn:calculator
+http://example.com/ns
+http://opensource.lk
+http://opensource.lk/ns1
+urn:mycolor
+http://www.w3.org/TR/REC-html40
+urn:ns30
+urn:ns11
+urn:ns12
+urn:ns31
+urn:ns10
+urn:ns32
+urn:ns15
+urn:ns16
+urn:ns13
+urn:ns14
+urn:ns19
+urn:ns17
+urn:ns18
+urn:ns22
+urn:ns01
+urn:ns23
+urn:ns20
+urn:ns21
+urn:ns04
+urn:ns26
+urn:ns05
+urn:ns27
+urn:ns02
+urn:ns24
+urn:ns03
+urn:ns25
+urn:ns08
+urn:ns09
+urn:ns06
+urn:ns28
+urn:ns07
+urn:ns29
+urn:ns