/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  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 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.entitymock.impl;

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.MinimalEObjectImpl;

import org.eclipse.osbp.xtext.datainterchange.DataInterchange;

import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
import org.eclipse.osbp.xtext.entitymock.RunningDataInterchange;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Running Data Interchange</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl#getDatainterchangeRef <em>Datainterchange Ref</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl#getFileURL <em>File URL</em>}</li>
 * </ul>
 *
 * @generated
 */
public class RunningDataInterchangeImpl extends MinimalEObjectImpl.Container implements RunningDataInterchange {
	/**
	 * The cached value of the '{@link #getDatainterchangeRef() <em>Datainterchange Ref</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getDatainterchangeRef()
	 * @generated
	 * @ordered
	 */
	protected DataInterchange datainterchangeRef;

	/**
	 * The default value of the '{@link #getFileURL() <em>File URL</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getFileURL()
	 * @generated
	 * @ordered
	 */
	protected static final String FILE_URL_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getFileURL() <em>File URL</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getFileURL()
	 * @generated
	 * @ordered
	 */
	protected String fileURL = FILE_URL_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected RunningDataInterchangeImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DataInterchange getDatainterchangeRef() {
		if (datainterchangeRef != null && datainterchangeRef.eIsProxy()) {
			InternalEObject oldDatainterchangeRef = (InternalEObject)datainterchangeRef;
			datainterchangeRef = (DataInterchange)eResolveProxy(oldDatainterchangeRef);
			if (datainterchangeRef != oldDatainterchangeRef) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF, oldDatainterchangeRef, datainterchangeRef));
			}
		}
		return datainterchangeRef;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DataInterchange basicGetDatainterchangeRef() {
		return datainterchangeRef;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setDatainterchangeRef(DataInterchange newDatainterchangeRef) {
		DataInterchange oldDatainterchangeRef = datainterchangeRef;
		datainterchangeRef = newDatainterchangeRef;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF, oldDatainterchangeRef, datainterchangeRef));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getFileURL() {
		return fileURL;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setFileURL(String newFileURL) {
		String oldFileURL = fileURL;
		fileURL = newFileURL;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__FILE_URL, oldFileURL, fileURL));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF:
				if (resolve) return getDatainterchangeRef();
				return basicGetDatainterchangeRef();
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__FILE_URL:
				return getFileURL();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF:
				setDatainterchangeRef((DataInterchange)newValue);
				return;
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__FILE_URL:
				setFileURL((String)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF:
				setDatainterchangeRef((DataInterchange)null);
				return;
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__FILE_URL:
				setFileURL(FILE_URL_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF:
				return datainterchangeRef != null;
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE__FILE_URL:
				return FILE_URL_EDEFAULT == null ? fileURL != null : !FILE_URL_EDEFAULT.equals(fileURL);
		}
		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(" (fileURL: ");
		result.append(fileURL);
		result.append(')');
		return result.toString();
	}

} //RunningDataInterchangeImpl
