/*******************************************************************************
 * Copyright (c) 2005 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.core.commands.common;

import java.util.Comparator;

import org.eclipse.core.internal.commands.util.Util;

/**
 * Comparator for instances of <code>NamedHandleObject</code> for display to
 * an end user. The comparison is based on the name of the instances.
 * 
 * @since 3.2
 */
public class NamedHandleObjectComparator implements Comparator {

	/**
	 * Compares to instances of NamedHandleObject based on their names. This is
	 * useful is they are display to an end user.
	 * 
	 * @param left
	 *            The first obect to compare; may be <code>null</code>.
	 * @param right
	 *            The second object to compare; may be <code>null</code>.
	 * @return <code>-1</code> if <code>left</code> is <code>null</code>
	 *         and <code>right</code> is not <code>null</code>;
	 *         <code>0</code> if they are both <code>null</code>;
	 *         <code>1</code> if <code>left</code> is not <code>null</code>
	 *         and <code>right</code> is <code>null</code>. Otherwise, the
	 *         result of <code>left.compareTo(right)</code>.
	 */
	public final int compare(final Object left, final Object right) {
		final NamedHandleObject a = (NamedHandleObject) left;
		final NamedHandleObject b = (NamedHandleObject) right;

		String aName = null;
		try {
			aName = a.getName();
		} catch (final NotDefinedException e) {
			// Leave aName as null.
		}
		String bName = null;
		try {
			bName = b.getName();
		} catch (final NotDefinedException e) {
			// Leave bName as null.
		}

		return Util.compare(aName, bName);
	}
}
