/**
 * 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
 *  
 *  Contributors:                                                      
 *     Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *  
 *  generated from AuthoritarionDSL.xcore
 * 
 *  
 */
package org.eclipse.osbp.xtext.authorizationdsl.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.LBeanFeature;

import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBeanFeature;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Role Bean Feature</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.authorizationdsl.impl.RoleBeanFeatureImpl#getBeanAttriCol <em>Bean Attri Col</em>}</li>
 * </ul>
 *
 * @generated
 */
public class RoleBeanFeatureImpl extends AuthorizationLazyResolverImpl implements RoleBeanFeature {
	/**
	 * The cached value of the '{@link #getBeanAttriCol() <em>Bean Attri Col</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBeanAttriCol()
	 * @generated
	 * @ordered
	 */
	protected LBeanFeature beanAttriCol;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LBeanFeature getBeanAttriCol() {
		if (beanAttriCol != null && beanAttriCol.eIsProxy()) {
			InternalEObject oldBeanAttriCol = (InternalEObject)beanAttriCol;
			beanAttriCol = (LBeanFeature)eResolveProxy(oldBeanAttriCol);
			if (beanAttriCol != oldBeanAttriCol) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, AuthorizationDSLPackage.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL, oldBeanAttriCol, beanAttriCol));
			}
		}
		return beanAttriCol;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LBeanFeature basicGetBeanAttriCol() {
		return beanAttriCol;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setBeanAttriCol(LBeanFeature newBeanAttriCol) {
		LBeanFeature oldBeanAttriCol = beanAttriCol;
		beanAttriCol = newBeanAttriCol;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, AuthorizationDSLPackage.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL, oldBeanAttriCol, beanAttriCol));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case AuthorizationDSLPackage.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL:
				if (resolve) return getBeanAttriCol();
				return basicGetBeanAttriCol();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case AuthorizationDSLPackage.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL:
				setBeanAttriCol((LBeanFeature)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case AuthorizationDSLPackage.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL:
				setBeanAttriCol((LBeanFeature)null);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case AuthorizationDSLPackage.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL:
				return beanAttriCol != null;
		}
		return super.eIsSet(featureID);
	}

} //RoleBeanFeatureImpl
