// ---------------------------------------------------------------------------------------------
 // Namespace Functions
 /// <seealso cref="Com.Adobe.Xmp.XMPSchemaRegistry.RegisterNamespace(string, string)"/>
 /// <exception cref="Com.Adobe.Xmp.XMPException"/>
 public string RegisterNamespace(string namespaceURI, string suggestedPrefix)
 {
     lock (this)
     {
         ParameterAsserts.AssertSchemaNS(namespaceURI);
         ParameterAsserts.AssertPrefix(suggestedPrefix);
         if (suggestedPrefix[suggestedPrefix.Length - 1] != ':')
         {
             suggestedPrefix += ':';
         }
         if (!Utils.IsXMLNameNS(Sharpen.Runtime.Substring(suggestedPrefix, 0, suggestedPrefix.Length - 1)))
         {
             throw new XMPException("The prefix is a bad XML name", XMPErrorConstants.Badxml);
         }
         string registeredPrefix = (string)namespaceToPrefixMap.Get(namespaceURI);
         string registeredNS     = (string)prefixToNamespaceMap.Get(suggestedPrefix);
         if (registeredPrefix != null)
         {
             // Return the actual prefix
             return(registeredPrefix);
         }
         else
         {
             if (registeredNS != null)
             {
                 // the namespace is new, but the prefix is already engaged,
                 // we generate a new prefix out of the suggested
                 string generatedPrefix = suggestedPrefix;
                 for (int i = 1; prefixToNamespaceMap.ContainsKey(generatedPrefix); i++)
                 {
                     generatedPrefix = Sharpen.Runtime.Substring(suggestedPrefix, 0, suggestedPrefix.Length - 1) + "_" + i + "_:";
                 }
                 suggestedPrefix = generatedPrefix;
             }
             prefixToNamespaceMap.Put(suggestedPrefix, namespaceURI);
             namespaceToPrefixMap.Put(namespaceURI, suggestedPrefix);
             // Return the suggested prefix
             return(suggestedPrefix);
         }
     }
 }