/*******************************************************************************
 * Copyright (c) 2004, 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/

package org.eclipse.wst.common.core.search.pattern;

/**
 * This data class represents a qualified name, consisting of a local name and a
 * qualifier
 * 
 * <p>
 * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
 * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
 * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
 * (repeatedly) as the API evolves.
 * </p>
 */
// issue (cs) should this go in the 'matching' package (BTW... rename
// matching->pattern)
public class QualifiedName
{

	private String qualifier;

	private String name;

	private static final String NS_DELIM_1 = "{"; //$NON-NLS-1$

	private static final String NS_DELIM_2 = "}"; //$NON-NLS-1$

	/**
	 * Constructor Creates a qualified name from a namespace and local name.
	 * 
	 * @param namespace
	 * @param localName
	 */
	public QualifiedName(String namespace, String localName)
	{

		super();

		this.qualifier = namespace;
		if (namespace != null && namespace.length() == 0)
		{
			this.qualifier = null;
		}
		if (this.qualifier != null && this.qualifier.length() == 0)
		{
			this.qualifier = null;
		}

		this.name = localName;
		if (localName != null && localName.length() == 0)
		{
			this.name = null;
		}

	}

	/**
	 * Returns the namespace component of the qualified name.
	 * 
	 * @return The namespace; <code>null</code> if none is specified
	 */
	public String getNamespace()
	{
		return this.qualifier;
	}

	/**
	 * Returns the local name component of the qualified name.
	 * 
	 * @return The local name; <code>null</code> if none is specified
	 */
	public String getLocalName()
	{
		return this.name;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	public boolean equals(Object obj)
	{
		boolean isEqual = false;
		if (this == obj)
		{
		  isEqual = true;
		}
		else
		{	
		  if (obj instanceof QualifiedName)
		  {
			QualifiedName that = (QualifiedName) obj;
		    isEqual = isMatch(this.getNamespace(), that.getNamespace()) &&
		              isMatch(this.getLocalName(), that.getLocalName());	
		  }  
		}
		return isEqual;
	}
	
	protected boolean isMatch(String a, String b)
	{
	  return a != null ? a.equals(b) : a == b;
	}	

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode()
	{
		int hash = 0;
		if (this.qualifier != null)
		{
			hash += this.qualifier.hashCode();
		}
		if (this.name != null)
		{
			hash += this.name.hashCode();
		}
		return hash;
	}

	/**
	 * Returns a string representation of the qualified name, of the form:
	 * {namespace}localname. If no namespace is specified, the string has the
	 * form: {}localname. Note that the string format may change in the future.
	 * 
	 * @return The string value
	 */
	public String toString()
	{

		return appendStrings(new String[]
		{ NS_DELIM_1, // {
				this.qualifier, NS_DELIM_2, // }
				this.name });

	}

	/**
	 * Factory-like method to create a QName object from the string form of a
	 * QName. The string must have the same format as returned by
	 * QName.toString().
	 * 
	 * @param qnameString -
	 *            String form of a QName
	 * @return The created QName object created from the specified string
	 * @throws IllegalArgumentException -
	 *             Missing namespace delimiters
	 */
	public static QualifiedName valueOf(String qnameString)
			throws IllegalArgumentException
	{

		String namespace = null;
		String localName = null;
		if (qnameString == null || qnameString.length() == 0)
		{
			// Both namespace and local name are null.
		} else if (qnameString.startsWith(NS_DELIM_1))
		{
			// The QName has the notation specifying a namespace.
			int index = qnameString.indexOf(NS_DELIM_2);
			if (index == -1)
			{
				// The end delimiter for the namespace was not found. The QName
				// string
				// is malformed.
				throw new IllegalArgumentException(
						"qnameString = " + qnameString); //$NON-NLS-1$
			}
			namespace = qnameString.substring(1, index);
			localName = qnameString.substring(index + 1);
		} else
		{
			// Assume no namespace is specified and the string is a local name.
			localName = qnameString;
		}
		return new QualifiedName(namespace, localName);

	}

	/**
	 * Creates a single string by appending together an array of strings,
	 * skipping null strings.
	 * 
	 * @param strings -
	 *            Strings to be appended together
	 * @return Resulting string
	 */
	public static String appendStrings(String[] strings)
	{

		String result = null;
		if (strings != null)
		{
			StringBuffer tokenBuffer = new StringBuffer();
			int maxCount = strings.length;
			String string;
			for (int i = 0; i < maxCount; i++)
			{
				string = strings[i];
				if (string != null && string.length() > 0)
				{
					tokenBuffer.append(string);
				}// if
			}// for
			result = tokenBuffer.toString();
		}// if
		return result;

	}// appendStrings()

}// class QName
