/*******************************************************************************
 * Copyright (c) 2000, 2015 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.tests.internal.watson;

import org.eclipse.core.internal.dtree.NodeComparison;
import org.eclipse.core.internal.watson.IElementComparator;

/**
 * This is what you would expect for an element tree comparator.
 * Clients of the element tree that want specific comparison behaviour
 * must define their own element comparator (without subclassing or
 * otherwise extending this comparator).  Internal element tree operations
 * rely on the behaviour of this type, and the ElementTree maintainer
 * reserves the right to change its behaviour as necessary.
 */
public class TestElementComparator implements IElementComparator {
	private static IElementComparator fSingleton;

	static final int ADDED = NodeComparison.K_ADDED;
	static final int REMOVED = NodeComparison.K_REMOVED;
	static final int CHANGED = NodeComparison.K_CHANGED;

	/**
	 * Force clients to use the singleton
	 */
	protected TestElementComparator() {
		super();
	}

	/**
	 * Returns the type of change.
	 */
	@Override
	public int compare(Object oldInfo, Object newInfo) {
		if (oldInfo == null) {
			if (newInfo == null) {
				return CHANGED;
			}
			return ADDED;
		}
		if (newInfo == null) {
			return REMOVED;
		}
		return testEquality(oldInfo, newInfo) ? K_NO_CHANGE : CHANGED;
	}

	/**
	 * Returns the singleton instance
	 */
	public static IElementComparator getComparator() {
		if (fSingleton == null) {
			fSingleton = new TestElementComparator();
		}
		return fSingleton;
	}

	/**
	 * Makes a comparison based on equality
	 */
	protected boolean testEquality(Object oldInfo, Object newInfo) {
		if (oldInfo == null && newInfo == null) {
			return true;
		}
		if (oldInfo == null || newInfo == null) {
			return false;
		}

		return oldInfo.equals(newInfo);
	}
}
