/**
 *  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 java.util.Collection;

import org.eclipse.emf.common.notify.Notification;

import org.eclipse.emf.common.util.EList;

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.emf.ecore.util.EObjectResolvingEList;

import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.DataSubject;
import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.PersonalData;

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

import org.eclipse.uml2.uml.NamedElement;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Privacy Requirement</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.impl.PrivacyRequirementImpl#getBase_NamedElement <em>Base Named Element</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.impl.PrivacyRequirementImpl#getDataSubject <em>Data Subject</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.impl.PrivacyRequirementImpl#getCounterstakeholders <em>Counterstakeholders</em>}</li>
 *   <li>{@link org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.impl.PrivacyRequirementImpl#getPersonalData <em>Personal Data</em>}</li>
 * </ul>
 *
 * @generated
 */
public class PrivacyRequirementImpl extends MinimalEObjectImpl.Container implements PrivacyRequirement {
	/**
	 * The cached value of the '{@link #getBase_NamedElement() <em>Base Named Element</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBase_NamedElement()
	 * @generated
	 * @ordered
	 */
	protected NamedElement base_NamedElement;

	/**
	 * The cached value of the '{@link #getDataSubject() <em>Data Subject</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getDataSubject()
	 * @generated
	 * @ordered
	 */
	protected DataSubject dataSubject;

	/**
	 * The cached value of the '{@link #getCounterstakeholders() <em>Counterstakeholders</em>}' reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCounterstakeholders()
	 * @generated
	 * @ordered
	 */
	protected EList<NamedElement> counterstakeholders;

	/**
	 * The cached value of the '{@link #getPersonalData() <em>Personal Data</em>}' reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPersonalData()
	 * @generated
	 * @ordered
	 */
	protected EList<PersonalData> personalData;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NamedElement getBase_NamedElement() {
		if (base_NamedElement != null && base_NamedElement.eIsProxy()) {
			InternalEObject oldBase_NamedElement = (InternalEObject)base_NamedElement;
			base_NamedElement = (NamedElement)eResolveProxy(oldBase_NamedElement);
			if (base_NamedElement != oldBase_NamedElement) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__BASE_NAMED_ELEMENT, oldBase_NamedElement, base_NamedElement));
			}
		}
		return base_NamedElement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NamedElement basicGetBase_NamedElement() {
		return base_NamedElement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setBase_NamedElement(NamedElement newBase_NamedElement) {
		NamedElement oldBase_NamedElement = base_NamedElement;
		base_NamedElement = newBase_NamedElement;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__BASE_NAMED_ELEMENT, oldBase_NamedElement, base_NamedElement));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataSubject getDataSubject() {
		if (dataSubject != null && dataSubject.eIsProxy()) {
			InternalEObject oldDataSubject = (InternalEObject)dataSubject;
			dataSubject = (DataSubject)eResolveProxy(oldDataSubject);
			if (dataSubject != oldDataSubject) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__DATA_SUBJECT, oldDataSubject, dataSubject));
			}
		}
		return dataSubject;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DataSubject basicGetDataSubject() {
		return dataSubject;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setDataSubject(DataSubject newDataSubject) {
		DataSubject oldDataSubject = dataSubject;
		dataSubject = newDataSubject;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__DATA_SUBJECT, oldDataSubject, dataSubject));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EList<NamedElement> getCounterstakeholders() {
		if (counterstakeholders == null) {
			counterstakeholders = new EObjectResolvingEList<NamedElement>(NamedElement.class, this, pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__COUNTERSTAKEHOLDERS);
		}
		return counterstakeholders;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NamedElement getCounterstakeholders(String name) {
		return getCounterstakeholders(name, false, null);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NamedElement getCounterstakeholders(String name, boolean ignoreCase, EClass eClass) {
		counterstakeholdersLoop: for (NamedElement counterstakeholders : getCounterstakeholders()) {
			if (eClass != null && !eClass.isInstance(counterstakeholders))
				continue counterstakeholdersLoop;
			if (name != null && !(ignoreCase ? name.equalsIgnoreCase(counterstakeholders.getName()) : name.equals(counterstakeholders.getName())))
				continue counterstakeholdersLoop;
			return counterstakeholders;
		}
		return null;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EList<PersonalData> getPersonalData() {
		if (personalData == null) {
			personalData = new EObjectResolvingEList<PersonalData>(PersonalData.class, this, pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__PERSONAL_DATA);
		}
		return personalData;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__BASE_NAMED_ELEMENT:
				if (resolve) return getBase_NamedElement();
				return basicGetBase_NamedElement();
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__DATA_SUBJECT:
				if (resolve) return getDataSubject();
				return basicGetDataSubject();
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__COUNTERSTAKEHOLDERS:
				return getCounterstakeholders();
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__PERSONAL_DATA:
				return getPersonalData();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__BASE_NAMED_ELEMENT:
				setBase_NamedElement((NamedElement)newValue);
				return;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__DATA_SUBJECT:
				setDataSubject((DataSubject)newValue);
				return;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__COUNTERSTAKEHOLDERS:
				getCounterstakeholders().clear();
				getCounterstakeholders().addAll((Collection<? extends NamedElement>)newValue);
				return;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__PERSONAL_DATA:
				getPersonalData().clear();
				getPersonalData().addAll((Collection<? extends PersonalData>)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__BASE_NAMED_ELEMENT:
				setBase_NamedElement((NamedElement)null);
				return;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__DATA_SUBJECT:
				setDataSubject((DataSubject)null);
				return;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__COUNTERSTAKEHOLDERS:
				getCounterstakeholders().clear();
				return;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__PERSONAL_DATA:
				getPersonalData().clear();
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__BASE_NAMED_ELEMENT:
				return base_NamedElement != null;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__DATA_SUBJECT:
				return dataSubject != null;
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__COUNTERSTAKEHOLDERS:
				return counterstakeholders != null && !counterstakeholders.isEmpty();
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT__PERSONAL_DATA:
				return personalData != null && !personalData.isEmpty();
		}
		return super.eIsSet(featureID);
	}

} //PrivacyRequirementImpl
