package org.eclipse.stem.core.graph.impl;

/******************************************************************************* 
 * Copyright (c) 2011 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 
 *******************************************************************************/

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.stem.core.graph.Exchange;
import org.eclipse.stem.core.graph.ExchangeType;
import org.eclipse.stem.core.graph.GraphPackage;
import org.eclipse.stem.core.graph.Label;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Exchange</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * <ul>
 *   <li>{@link org.eclipse.stem.core.graph.impl.ExchangeImpl#getOtherLabel <em>Other Label</em>}</li>
 *   <li>{@link org.eclipse.stem.core.graph.impl.ExchangeImpl#getCount <em>Count</em>}</li>
 *   <li>{@link org.eclipse.stem.core.graph.impl.ExchangeImpl#getType <em>Type</em>}</li>
 * </ul>
 * </p>
 *
 * @generated
 */
public class ExchangeImpl extends EObjectImpl implements Exchange {
	/**
	 * The cached value of the '{@link #getOtherLabel() <em>Other Label</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOtherLabel()
	 * @generated
	 * @ordered
	 */
	protected Label otherLabel;

	/**
	 * The default value of the '{@link #getCount() <em>Count</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCount()
	 * @generated
	 * @ordered
	 */
	protected static final double COUNT_EDEFAULT = 0.0;

	/**
	 * The cached value of the '{@link #getCount() <em>Count</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCount()
	 * @generated
	 * @ordered
	 */
	protected double count = COUNT_EDEFAULT;

	/**
	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getType()
	 * @generated
	 * @ordered
	 */
	protected static final ExchangeType TYPE_EDEFAULT = ExchangeType.BIRTHS_AND_DEATHS;

	/**
	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getType()
	 * @generated
	 * @ordered
	 */
	protected ExchangeType type = TYPE_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ExchangeImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return GraphPackage.Literals.EXCHANGE;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Label getOtherLabel() {
		if (otherLabel != null && otherLabel.eIsProxy()) {
			InternalEObject oldOtherLabel = (InternalEObject)otherLabel;
			otherLabel = (Label)eResolveProxy(oldOtherLabel);
			if (otherLabel != oldOtherLabel) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, GraphPackage.EXCHANGE__OTHER_LABEL, oldOtherLabel, otherLabel));
			}
		}
		return otherLabel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Label basicGetOtherLabel() {
		return otherLabel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setOtherLabel(Label newOtherLabel) {
		Label oldOtherLabel = otherLabel;
		otherLabel = newOtherLabel;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, GraphPackage.EXCHANGE__OTHER_LABEL, oldOtherLabel, otherLabel));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public double getCount() {
		return count;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCount(double newCount) {
		double oldCount = count;
		count = newCount;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, GraphPackage.EXCHANGE__COUNT, oldCount, count));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ExchangeType getType() {
		return type;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setType(ExchangeType newType) {
		ExchangeType oldType = type;
		type = newType == null ? TYPE_EDEFAULT : newType;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, GraphPackage.EXCHANGE__TYPE, oldType, type));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case GraphPackage.EXCHANGE__OTHER_LABEL:
				if (resolve) return getOtherLabel();
				return basicGetOtherLabel();
			case GraphPackage.EXCHANGE__COUNT:
				return getCount();
			case GraphPackage.EXCHANGE__TYPE:
				return getType();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case GraphPackage.EXCHANGE__OTHER_LABEL:
				setOtherLabel((Label)newValue);
				return;
			case GraphPackage.EXCHANGE__COUNT:
				setCount((Double)newValue);
				return;
			case GraphPackage.EXCHANGE__TYPE:
				setType((ExchangeType)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case GraphPackage.EXCHANGE__OTHER_LABEL:
				setOtherLabel((Label)null);
				return;
			case GraphPackage.EXCHANGE__COUNT:
				setCount(COUNT_EDEFAULT);
				return;
			case GraphPackage.EXCHANGE__TYPE:
				setType(TYPE_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case GraphPackage.EXCHANGE__OTHER_LABEL:
				return otherLabel != null;
			case GraphPackage.EXCHANGE__COUNT:
				return count != COUNT_EDEFAULT;
			case GraphPackage.EXCHANGE__TYPE:
				return type != TYPE_EDEFAULT;
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (count: "); //$NON-NLS-1$
		result.append(count);
		result.append(", type: "); //$NON-NLS-1$
		result.append(type);
		result.append(')');
		return result.toString();
	}

	public int compareTo(Exchange o) {
		String thisIdentifier;
		String otherIdentifier;
		
		if (getType() == ExchangeType.BIRTHS_AND_DEATHS) {
			thisIdentifier = getType().getName(); 
		} else {
			thisIdentifier = getType().getName() + "," + getOtherLabel().getURI();
		}
		
		if (o.getType() == ExchangeType.BIRTHS_AND_DEATHS) {
			otherIdentifier = o.getType().getName();
		} else {
			otherIdentifier = o.getType().getName() + "," + o.getOtherLabel().getURI();
		}
		
		return thisIdentifier.compareTo(otherIdentifier);
	}

} //ExchangeImpl
