/*
 * 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.om;

/**
 * A namespace binding specifying a namespace prefix and a namespace URI.
 * <p>
 * Implementations of this interface must be immutable or behave as if they were immutable,
 * i.e. {@link #getPrefix()} and {@link #getNamespaceURI()} must always return the same
 * values when invoked on the same instance.
 * <p>
 * Implementations must override {@link Object#equals(Object)} and {@link Object#hashCode()}. Two
 * {@link OMNamespace} instances are considered equal if their namespace URIs and prefixes are
 * equal.
 */
public interface OMNamespace {
    /**
     * Method equals.
     *
     * @param uri
     * @param prefix
     * @return Returns boolean.
     */
    boolean equals(String uri, String prefix);

    /**
     * Get the namespace prefix. This method may return <code>null</code> for instances returned by
     * {@link OMFactory#createOMNamespace(String, String)}. This indicates that Axiom should
     * generate a namespace prefix when this instance is passed to one of the factory methods in
     * {@link OMFactory}. In all other cases the return value is not null. In particular, an empty
     * string indicates that no prefix is used, i.e. that the namespace is used as default
     * namespace.
     * 
     * @return the namespace prefix
     */
    String getPrefix();

    /**
     * Method getName.
     *
     * @return Returns String.
     * @deprecated This method is deprecated. Please use getNamespaceURI() method instead.
     */
    String getName();

    /**
     * Get the namespace URI. This method never returns <code>null</code>. It may return an empty
     * string if this instance represents a namespace declaration of type {@code xmlns=""}. This
     * may be the case for instances returned by {@link OMElement#getAllDeclaredNamespaces()}. On
     * the other hand, methods such as {@link OMNamedInformationItem#getNamespace()} will return
     * <code>null</code> for information items that have no namespace. In that case the returned
     * string is never empty.
     * 
     * @return the namespace URI
     */
    String getNamespaceURI();
}
