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


Reply via email to