/**
 * 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.LEntityAttribute;

import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangePredefinedExpression;
import org.eclipse.osbp.xtext.datainterchange.PredefinedBeanEnum;
import org.eclipse.osbp.xtext.datainterchange.PredefinedBeanTypeEnum;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Data Interchange Predefined Expression</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangePredefinedExpressionImpl#getTargetProperty <em>Target Property</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangePredefinedExpressionImpl#getBean <em>Bean</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangePredefinedExpressionImpl#getBeanType <em>Bean Type</em>}</li>
 * </ul>
 *
 * @generated
 */
public class DataInterchangePredefinedExpressionImpl extends DataInterchangeLazyResolverImpl implements DataInterchangePredefinedExpression {
	/**
	 * The cached value of the '{@link #getTargetProperty() <em>Target Property</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getTargetProperty()
	 * @generated
	 * @ordered
	 */
	protected LEntityAttribute targetProperty;

	/**
	 * The default value of the '{@link #getBean() <em>Bean</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBean()
	 * @generated
	 * @ordered
	 */
	protected static final PredefinedBeanEnum BEAN_EDEFAULT = PredefinedBeanEnum.NOW;

	/**
	 * The cached value of the '{@link #getBean() <em>Bean</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBean()
	 * @generated
	 * @ordered
	 */
	protected PredefinedBeanEnum bean = BEAN_EDEFAULT;

	/**
	 * The default value of the '{@link #getBeanType() <em>Bean Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBeanType()
	 * @generated
	 * @ordered
	 */
	protected static final PredefinedBeanTypeEnum BEAN_TYPE_EDEFAULT = PredefinedBeanTypeEnum.DATE;

	/**
	 * The cached value of the '{@link #getBeanType() <em>Bean Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBeanType()
	 * @generated
	 * @ordered
	 */
	protected PredefinedBeanTypeEnum beanType = BEAN_TYPE_EDEFAULT;

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setTargetProperty(LEntityAttribute newTargetProperty) {
		LEntityAttribute oldTargetProperty = targetProperty;
		targetProperty = newTargetProperty;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__TARGET_PROPERTY, oldTargetProperty, targetProperty));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PredefinedBeanEnum getBean() {
		return bean;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setBean(PredefinedBeanEnum newBean) {
		PredefinedBeanEnum oldBean = bean;
		bean = newBean == null ? BEAN_EDEFAULT : newBean;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN, oldBean, bean));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PredefinedBeanTypeEnum getBeanType() {
		return beanType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setBeanType(PredefinedBeanTypeEnum newBeanType) {
		PredefinedBeanTypeEnum oldBeanType = beanType;
		beanType = newBeanType == null ? BEAN_TYPE_EDEFAULT : newBeanType;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN_TYPE, oldBeanType, beanType));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__TARGET_PROPERTY:
				if (resolve) return getTargetProperty();
				return basicGetTargetProperty();
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN:
				return getBean();
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN_TYPE:
				return getBeanType();
		}
		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_PREDEFINED_EXPRESSION__TARGET_PROPERTY:
				setTargetProperty((LEntityAttribute)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN:
				setBean((PredefinedBeanEnum)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN_TYPE:
				setBeanType((PredefinedBeanTypeEnum)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_PREDEFINED_EXPRESSION__TARGET_PROPERTY:
				setTargetProperty((LEntityAttribute)null);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN:
				setBean(BEAN_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN_TYPE:
				setBeanType(BEAN_TYPE_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__TARGET_PROPERTY:
				return targetProperty != null;
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN:
				return bean != BEAN_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN_TYPE:
				return beanType != BEAN_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(" (bean: ");
		result.append(bean);
		result.append(", beanType: ");
		result.append(beanType);
		result.append(')');
		return result.toString();
	}

} //DataInterchangePredefinedExpressionImpl
