/**
 * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
 *  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:  
 *  		Joerg Riegel - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.datainterchange.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.osbp.dsl.semantic.entity.LEntity;
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;

import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerEntity;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Data Interchange Marker Entity</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeMarkerEntityImpl#isMarkLatest <em>Mark Latest</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeMarkerEntityImpl#getMarkerEntity <em>Marker Entity</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeMarkerEntityImpl#getMarkerProperty <em>Marker Property</em>}</li>
 * </ul>
 *
 * @generated
 */
public class DataInterchangeMarkerEntityImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeMarkerEntity {
	/**
	 * The default value of the '{@link #isMarkLatest() <em>Mark Latest</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isMarkLatest()
	 * @generated
	 * @ordered
	 */
	protected static final boolean MARK_LATEST_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isMarkLatest() <em>Mark Latest</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isMarkLatest()
	 * @generated
	 * @ordered
	 */
	protected boolean markLatest = MARK_LATEST_EDEFAULT;

	/**
	 * The cached value of the '{@link #getMarkerEntity() <em>Marker Entity</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getMarkerEntity()
	 * @generated
	 * @ordered
	 */
	protected LEntity markerEntity;

	/**
	 * The cached value of the '{@link #getMarkerProperty() <em>Marker Property</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getMarkerProperty()
	 * @generated
	 * @ordered
	 */
	protected LEntityAttribute markerProperty;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isMarkLatest() {
		return markLatest;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setMarkLatest(boolean newMarkLatest) {
		boolean oldMarkLatest = markLatest;
		markLatest = newMarkLatest;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARK_LATEST, oldMarkLatest, markLatest));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LEntity getMarkerEntity() {
		if (markerEntity != null && markerEntity.eIsProxy()) {
			InternalEObject oldMarkerEntity = (InternalEObject)markerEntity;
			markerEntity = (LEntity)eResolveProxy(oldMarkerEntity);
			if (markerEntity != oldMarkerEntity) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY, oldMarkerEntity, markerEntity));
			}
		}
		return markerEntity;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LEntity basicGetMarkerEntity() {
		return markerEntity;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setMarkerEntity(LEntity newMarkerEntity) {
		LEntity oldMarkerEntity = markerEntity;
		markerEntity = newMarkerEntity;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY, oldMarkerEntity, markerEntity));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LEntityAttribute getMarkerProperty() {
		if (markerProperty != null && markerProperty.eIsProxy()) {
			InternalEObject oldMarkerProperty = (InternalEObject)markerProperty;
			markerProperty = (LEntityAttribute)eResolveProxy(oldMarkerProperty);
			if (markerProperty != oldMarkerProperty) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY, oldMarkerProperty, markerProperty));
			}
		}
		return markerProperty;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LEntityAttribute basicGetMarkerProperty() {
		return markerProperty;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setMarkerProperty(LEntityAttribute newMarkerProperty) {
		LEntityAttribute oldMarkerProperty = markerProperty;
		markerProperty = newMarkerProperty;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY, oldMarkerProperty, markerProperty));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARK_LATEST:
				return isMarkLatest();
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY:
				if (resolve) return getMarkerEntity();
				return basicGetMarkerEntity();
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY:
				if (resolve) return getMarkerProperty();
				return basicGetMarkerProperty();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARK_LATEST:
				setMarkLatest((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY:
				setMarkerEntity((LEntity)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY:
				setMarkerProperty((LEntityAttribute)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARK_LATEST:
				setMarkLatest(MARK_LATEST_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY:
				setMarkerEntity((LEntity)null);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY:
				setMarkerProperty((LEntityAttribute)null);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARK_LATEST:
				return markLatest != MARK_LATEST_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY:
				return markerEntity != null;
			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY:
				return markerProperty != null;
		}
		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(" (markLatest: ");
		result.append(markLatest);
		result.append(')');
		return result.toString();
	}

} //DataInterchangeMarkerEntityImpl
