/**
 *  Copyright (c)2020 CEA LIST, Committer Name, and others.
 * 
 *  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:
 *  CEA LIST - Initial API and implementation
 *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr 
 *  Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr 
 * 
 */
package org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.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.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.PublicInterest;

import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByPublicInterest;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.pdp4engReqGDPRPackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Lawful By Public Interest</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.impl.LawfulByPublicInterestImpl#getPublicInterest <em>Public Interest</em>}</li>
 * </ul>
 *
 * @generated
 */
public class LawfulByPublicInterestImpl extends LawfulImpl implements LawfulByPublicInterest {
	/**
	 * The cached value of the '{@link #getPublicInterest() <em>Public Interest</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPublicInterest()
	 * @generated
	 * @ordered
	 */
	protected PublicInterest publicInterest;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PublicInterest getPublicInterest() {
		if (publicInterest != null && publicInterest.eIsProxy()) {
			InternalEObject oldPublicInterest = (InternalEObject)publicInterest;
			publicInterest = (PublicInterest)eResolveProxy(oldPublicInterest);
			if (publicInterest != oldPublicInterest) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, pdp4engReqGDPRPackage.LAWFUL_BY_PUBLIC_INTEREST__PUBLIC_INTEREST, oldPublicInterest, publicInterest));
			}
		}
		return publicInterest;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PublicInterest basicGetPublicInterest() {
		return publicInterest;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setPublicInterest(PublicInterest newPublicInterest) {
		PublicInterest oldPublicInterest = publicInterest;
		publicInterest = newPublicInterest;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engReqGDPRPackage.LAWFUL_BY_PUBLIC_INTEREST__PUBLIC_INTEREST, oldPublicInterest, publicInterest));
	}

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case pdp4engReqGDPRPackage.LAWFUL_BY_PUBLIC_INTEREST__PUBLIC_INTEREST:
				setPublicInterest((PublicInterest)null);
				return;
		}
		super.eUnset(featureID);
	}

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

} //LawfulByPublicInterestImpl
