/*
 * Copyright 2015 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * 
 *      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.eclipse.webdav.internal.kernel;

import org.eclipse.webdav.dom.QualifiedName;
import org.eclipse.webdav.internal.kernel.utils.Assert;

/**
 * Qualified names are two-part names: qualifier and local name.
 * The qualifier must be in URI form (see RFC2396).  
 * Note however that the qualifier may be <code>null</code> if
 * the default name space is being used.  The empty space is
 * not a valid qualifier.
 */
public class QualifiedNameImpl implements QualifiedName {

    /** Qualifier part (potentially <code>null</code>). */
    protected String qualifier = null;

    /** Local name part. */
    protected String localName = null;

    /**
     * Creates and returns a new qualified name with the given qualifier
     * and local name.  The local name must not be the empty string.
     * The qualifier may be <code>null</code>.
     */
    public QualifiedNameImpl(String qualifier, String localName) {
        Assert.isLegal(localName != null && localName.length() != 0);
        this.qualifier = qualifier;
        this.localName = localName;
    }

    /**
     * Returns <code>true</code> if this qualified name is equivalent to the given object.
     * <p>
     * Qualified names are equal if and only if they have the same
     * qualified parts and local parts.
     * Qualified names are not equal to objects other than qualified names.
     */
    public boolean equals(Object obj) {
        if (obj == this)
            return true;
        if (!(obj instanceof QualifiedName))
            return false;
        // There may or may not be a qualifier.
        QualifiedName qName = (QualifiedName) obj;
        if (qualifier == null && qName.getQualifier() != null)
            return false;
        if (qualifier != null && !qualifier.equals(qName.getQualifier()))
            return false;
        return localName.equals(qName.getLocalName());
    }

    /**
     * Returns the local part of this name.
     */
    public String getLocalName() {
        return localName;
    }

    /**
     * Returns the qualifier part for this qualifed name, or <code>null</code>
     * if none.
     */
    public String getQualifier() {
        return qualifier;
    }

    /**
     * Returns the hash code for this qualified name.
     */
    public int hashCode() {
        return (qualifier == null ? 0 : qualifier.hashCode()) + localName.hashCode();
    }

    /**
     * Converts this qualified name into a string, suitable for
     * display (unsuitable for parsing back to a qualified name!).
     */
    public String toString() {
        return "Namespace: \"" + //$NON-NLS-1$
                (getQualifier() == null ? "null" : getQualifier()) + //$NON-NLS-1$
                "\", Local part: \"" + //$NON-NLS-1$ //$NON-NLS-2$
                getLocalName() + "\""; //$NON-NLS-1$
    }
}
