package org.eclipse.core.runtime;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

import org.eclipse.core.internal.runtime.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 string is not 
 * a valid local name.
 * <p>
 * This class is not intended to be subclassed by clients.
 * </p>
 */
public final class QualifiedName {

	/** Qualifier part (potentially <code>null</code>). */
	/*package*/ String qualifier = null;

	/** Local name part. */
	/*package*/ 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>.
 * <p>
 * Clients may instantiate.
 * </p>
 * @param qualifier the qualifier string, or <code>null</code>
 * @param localName the local name string
 */
public QualifiedName(String qualifier, String localName) {
	Assert.isLegal(localName != null && localName.length() != 0);
	this.qualifier = qualifier;
	this.localName = localName;
}
/**
 * Returns whether 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.
 * </p>
 *
 * @param obj the object to compare to
 * @return <code>true</code> if these are equivalent qualified
 *    names, and <code>false</code> otherwise
 */
public boolean equals(Object obj) {
	if (obj == this) {
		return true;
	}
	if (!(obj instanceof QualifiedName)) {
		return false;
	}
	QualifiedName qName = (QualifiedName) obj;
	/* There may or may not be a quailfier */
	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.
 *
 * @return the local name string
 */
public String getLocalName() {
	return localName;
}
/**
 * Returns the qualifier part for this qualifed name, or <code>null</code>
 * if none.
 *
 * @return the qualifier string, or <code>null</code>
 */
public String getQualifier() {
	return qualifier;
}
/* (Intentionally omitted from javadoc)
 * Implements the method <code>Object.hashCode</code>.
 * 
 * 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 
 * debug purposes only.
 */
public String toString() {
	return "QualifiedName(" + (getQualifier() == null ? "null" : getQualifier()) + "," + getLocalName() + ")";
}
}
