/*******************************************************************************
 * Copyright (c) 2007, 2010 BMW Car IT, Technische Universitaet Muenchen, and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * BMW Car IT - Initial API and implementation
 * Technische Universitaet Muenchen - Major refactoring and extension
 *******************************************************************************/
package org.eclipse.emf.edapt.history.reconstruction;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edapt.internal.common.ReversableMap;
import org.eclipse.emf.edapt.internal.common.TwoWayIdentityHashMap;

/**
 * Mapping between elements of two metamodel versions
 *
 * @author herrmama
 * @author $Author$
 * @version $Rev$
 * @levd.rating RED Rev:
 */
public class Mapping extends MappingBase {

	/**
	 * Bidirectional mapping
	 */
	private final ReversableMap<EObject, EObject> mapping;

	/**
	 * Constructor
	 *
	 */
	public Mapping() {
		mapping = new TwoWayIdentityHashMap<EObject, EObject>();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public EObject getTarget(EObject source) {
		return mapping.get(source);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public EObject getSource(EObject target) {
		return mapping.reverseGet(target);
	}

	/**
	 * Add bidirectional relationship between source and target element
	 */
	public void map(EObject source, EObject target) {
		if (getTarget(source) != null && getTarget(source) != target) {
			throw new IllegalArgumentException("Source element already mapped to different target element"); //$NON-NLS-1$
		}
		if (getSource(target) != null && getSource(target) != source) {
			throw new IllegalArgumentException("Target element already mapped to different source element"); //$NON-NLS-1$
		}
		mapping.put(source, target);
	}

	/**
	 * Remove bidirectional relationship between source and target element
	 */
	public void unmap(EObject source) {
		mapping.remove(source);
	}

	/**
	 * Decide whether there is a bidirectional relationship between source and
	 * target element
	 *
	 * @return true whether there is a bidirectional relationship, false
	 *         otherwise
	 */
	public boolean isMapped(EObject source, EObject target) {
		return getTarget(source) == target && getSource(target) == source;
	}

	@Override
	public String toString() {
		final StringBuffer sb = new StringBuffer();
		for (final EObject key : mapping.keySet()) {
			final EObject target = mapping.get(key);
			sb.append("map " + key + " to:" + target + "\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		}
		return sb.toString();
	}
}
