/**
 * 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
