/**
 *  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.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;

import org.eclipse.emf.ecore.impl.EFactoryImpl;

import org.eclipse.emf.ecore.plugin.EcorePlugin;

import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.*;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class pdp4engReqGDPRFactoryImpl extends EFactoryImpl implements pdp4engReqGDPRFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static pdp4engReqGDPRFactory init() {
		try {
			pdp4engReqGDPRFactory thepdp4engReqGDPRFactory = (pdp4engReqGDPRFactory)EPackage.Registry.INSTANCE.getEFactory(pdp4engReqGDPRPackage.eNS_URI);
			if (thepdp4engReqGDPRFactory != null) {
				return thepdp4engReqGDPRFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new pdp4engReqGDPRFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public pdp4engReqGDPRFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case pdp4engReqGDPRPackage.PROCESS_REQUIREMENT: return createProcessRequirement();
			case pdp4engReqGDPRPackage.STAKEHOLDER: return createStakeholder();
			case pdp4engReqGDPRPackage.PERSONAL_DATA_REQUIREMENT: return createPersonalDataRequirement();
			case pdp4engReqGDPRPackage.GDPR_PRINCIPLE: return createGDPRPrinciple();
			case pdp4engReqGDPRPackage.PROCESS_PRINCIPLE: return createProcessPrinciple();
			case pdp4engReqGDPRPackage.PURPOSE_PERSONAL_DATA_PRINCIPLE: return createPurposePersonalDataPrinciple();
			case pdp4engReqGDPRPackage.DATA_MINIMISATION: return createDataMinimisation();
			case pdp4engReqGDPRPackage.PURPOSE_LIMITATION: return createPurposeLimitation();
			case pdp4engReqGDPRPackage.ACCURACY: return createAccuracy();
			case pdp4engReqGDPRPackage.STORAGE_LIMITATION: return createStorageLimitation();
			case pdp4engReqGDPRPackage.LAWFUL: return createLawful();
			case pdp4engReqGDPRPackage.FAIRLY: return createFairly();
			case pdp4engReqGDPRPackage.TRANSPARENCY: return createTransparency();
			case pdp4engReqGDPRPackage.SECURITY_SAFETY: return createSecuritySafety();
			case pdp4engReqGDPRPackage.RELATED_TO: return createRelatedTo();
			case pdp4engReqGDPRPackage.AVAILABLE_AT: return createAvailableAt();
			case pdp4engReqGDPRPackage.DERIVED_FROM: return createDerivedFrom();
			case pdp4engReqGDPRPackage.DATA_REQUIREMENT: return createDataRequirement();
			case pdp4engReqGDPRPackage.LINKABLE: return createLinkable();
			case pdp4engReqGDPRPackage.GENERATED_REQUIREMENTS: return createGeneratedRequirements();
			case pdp4engReqGDPRPackage.DATA_FLOW_REQUIREMENT: return createDataFlowRequirement();
			case pdp4engReqGDPRPackage.DATA_SUBJECTS: return createDataSubjects();
			case pdp4engReqGDPRPackage.DATA_REQUIREMENTS: return createDataRequirements();
			case pdp4engReqGDPRPackage.AVAILABLE_INFORMATION: return createAvailableInformation();
			case pdp4engReqGDPRPackage.PERSONAL_INFORMATION: return createPersonalInformation();
			case pdp4engReqGDPRPackage.AVAILABLE_INFORMATION_CONTAINER: return createAvailableInformationContainer();
			case pdp4engReqGDPRPackage.PERSONAL_INFORMATION_CONTAINER: return createPersonalInformationContainer();
			case pdp4engReqGDPRPackage.UNLINKABILITY_REQUIREMENT: return createUnlinkabilityRequirement();
			case pdp4engReqGDPRPackage.PRIVACY_REQUIREMENT: return createPrivacyRequirement();
			case pdp4engReqGDPRPackage.DATA_UNLINKABILITY_REQUIREMENT: return createDataUnlinkabilityRequirement();
			case pdp4engReqGDPRPackage.CONTROLERS: return createControlers();
			case pdp4engReqGDPRPackage.LINK: return createLink();
			case pdp4engReqGDPRPackage.UNDECTABILITY_REQUIREMENT: return createUndectabilityRequirement();
			case pdp4engReqGDPRPackage.PSEUDONIMITY_REQUIREMENT: return createPseudonimityRequirement();
			case pdp4engReqGDPRPackage.ANANOMITY_REQUIREMENT: return createAnanomityRequirement();
			case pdp4engReqGDPRPackage.DATA_RECORD_REQUIREMENT: return createDataRecordRequirement();
			case pdp4engReqGDPRPackage.FUNCTIONAL_REQUIREMENTS: return createFunctionalRequirements();
			case pdp4engReqGDPRPackage.NON_FUNCTIONAL_REQUIREMENTS: return createNonFunctionalRequirements();
			case pdp4engReqGDPRPackage.LAWFUL_BY_CONSENT: return createLawfulByConsent();
			case pdp4engReqGDPRPackage.LAWFUL_BY_CONTRACT: return createLawfulByContract();
			case pdp4engReqGDPRPackage.LAWFUL_BY_PUBLIC_INTEREST: return createLawfulByPublicInterest();
			case pdp4engReqGDPRPackage.LAWFUL_BY_LEGITIMATE_INTEREST: return createLawfulByLegitimateInterest();
			case pdp4engReqGDPRPackage.LAWFUL_BY_LEGAL_OBLIGATION: return createLawfulByLegalObligation();
			case pdp4engReqGDPRPackage.LAWFUL_BY_VITAL_INTEREST: return createLawfulByVitalInterest();
			case pdp4engReqGDPRPackage.LAWFULL_BY_SAFE_GUARD: return createLawfullBySafeGuard();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object createFromString(EDataType eDataType, String initialValue) {
		switch (eDataType.getClassifierID()) {
			case pdp4engReqGDPRPackage.LINKABILITY:
				return createLinkabilityFromString(eDataType, initialValue);
			case pdp4engReqGDPRPackage.COLLECTION_METHOD:
				return createCollectionMethodFromString(eDataType, initialValue);
			case pdp4engReqGDPRPackage.DURATION:
				return createDurationFromString(eDataType, initialValue);
			case pdp4engReqGDPRPackage.PSEUDONYM_KIND:
				return createPseudonymKindFromString(eDataType, initialValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String convertToString(EDataType eDataType, Object instanceValue) {
		switch (eDataType.getClassifierID()) {
			case pdp4engReqGDPRPackage.LINKABILITY:
				return convertLinkabilityToString(eDataType, instanceValue);
			case pdp4engReqGDPRPackage.COLLECTION_METHOD:
				return convertCollectionMethodToString(eDataType, instanceValue);
			case pdp4engReqGDPRPackage.DURATION:
				return convertDurationToString(eDataType, instanceValue);
			case pdp4engReqGDPRPackage.PSEUDONYM_KIND:
				return convertPseudonymKindToString(eDataType, instanceValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public ProcessRequirement createProcessRequirement() {
		ProcessRequirementImpl processRequirement = new ProcessRequirementImpl();
		return processRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Stakeholder createStakeholder() {
		StakeholderImpl stakeholder = new StakeholderImpl();
		return stakeholder;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PersonalDataRequirement createPersonalDataRequirement() {
		PersonalDataRequirementImpl personalDataRequirement = new PersonalDataRequirementImpl();
		return personalDataRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public GDPRPrinciple createGDPRPrinciple() {
		GDPRPrincipleImpl gdprPrinciple = new GDPRPrincipleImpl();
		return gdprPrinciple;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public ProcessPrinciple createProcessPrinciple() {
		ProcessPrincipleImpl processPrinciple = new ProcessPrincipleImpl();
		return processPrinciple;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PurposePersonalDataPrinciple createPurposePersonalDataPrinciple() {
		PurposePersonalDataPrincipleImpl purposePersonalDataPrinciple = new PurposePersonalDataPrincipleImpl();
		return purposePersonalDataPrinciple;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataMinimisation createDataMinimisation() {
		DataMinimisationImpl dataMinimisation = new DataMinimisationImpl();
		return dataMinimisation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PurposeLimitation createPurposeLimitation() {
		PurposeLimitationImpl purposeLimitation = new PurposeLimitationImpl();
		return purposeLimitation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Accuracy createAccuracy() {
		AccuracyImpl accuracy = new AccuracyImpl();
		return accuracy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public StorageLimitation createStorageLimitation() {
		StorageLimitationImpl storageLimitation = new StorageLimitationImpl();
		return storageLimitation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Lawful createLawful() {
		LawfulImpl lawful = new LawfulImpl();
		return lawful;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Fairly createFairly() {
		FairlyImpl fairly = new FairlyImpl();
		return fairly;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Transparency createTransparency() {
		TransparencyImpl transparency = new TransparencyImpl();
		return transparency;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public SecuritySafety createSecuritySafety() {
		SecuritySafetyImpl securitySafety = new SecuritySafetyImpl();
		return securitySafety;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public RelatedTo createRelatedTo() {
		RelatedToImpl relatedTo = new RelatedToImpl();
		return relatedTo;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public AvailableAt createAvailableAt() {
		AvailableAtImpl availableAt = new AvailableAtImpl();
		return availableAt;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DerivedFrom createDerivedFrom() {
		DerivedFromImpl derivedFrom = new DerivedFromImpl();
		return derivedFrom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataRequirement createDataRequirement() {
		DataRequirementImpl dataRequirement = new DataRequirementImpl();
		return dataRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Linkable createLinkable() {
		LinkableImpl linkable = new LinkableImpl();
		return linkable;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public GeneratedRequirements createGeneratedRequirements() {
		GeneratedRequirementsImpl generatedRequirements = new GeneratedRequirementsImpl();
		return generatedRequirements;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataFlowRequirement createDataFlowRequirement() {
		DataFlowRequirementImpl dataFlowRequirement = new DataFlowRequirementImpl();
		return dataFlowRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataSubjects createDataSubjects() {
		DataSubjectsImpl dataSubjects = new DataSubjectsImpl();
		return dataSubjects;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataRequirements createDataRequirements() {
		DataRequirementsImpl dataRequirements = new DataRequirementsImpl();
		return dataRequirements;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public AvailableInformation createAvailableInformation() {
		AvailableInformationImpl availableInformation = new AvailableInformationImpl();
		return availableInformation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PersonalInformation createPersonalInformation() {
		PersonalInformationImpl personalInformation = new PersonalInformationImpl();
		return personalInformation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public AvailableInformationContainer createAvailableInformationContainer() {
		AvailableInformationContainerImpl availableInformationContainer = new AvailableInformationContainerImpl();
		return availableInformationContainer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PersonalInformationContainer createPersonalInformationContainer() {
		PersonalInformationContainerImpl personalInformationContainer = new PersonalInformationContainerImpl();
		return personalInformationContainer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public UnlinkabilityRequirement createUnlinkabilityRequirement() {
		UnlinkabilityRequirementImpl unlinkabilityRequirement = new UnlinkabilityRequirementImpl();
		return unlinkabilityRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PrivacyRequirement createPrivacyRequirement() {
		PrivacyRequirementImpl privacyRequirement = new PrivacyRequirementImpl();
		return privacyRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataUnlinkabilityRequirement createDataUnlinkabilityRequirement() {
		DataUnlinkabilityRequirementImpl dataUnlinkabilityRequirement = new DataUnlinkabilityRequirementImpl();
		return dataUnlinkabilityRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Controlers createControlers() {
		ControlersImpl controlers = new ControlersImpl();
		return controlers;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Link createLink() {
		LinkImpl link = new LinkImpl();
		return link;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public UndectabilityRequirement createUndectabilityRequirement() {
		UndectabilityRequirementImpl undectabilityRequirement = new UndectabilityRequirementImpl();
		return undectabilityRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public PseudonimityRequirement createPseudonimityRequirement() {
		PseudonimityRequirementImpl pseudonimityRequirement = new PseudonimityRequirementImpl();
		return pseudonimityRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public AnanomityRequirement createAnanomityRequirement() {
		AnanomityRequirementImpl ananomityRequirement = new AnanomityRequirementImpl();
		return ananomityRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public DataRecordRequirement createDataRecordRequirement() {
		DataRecordRequirementImpl dataRecordRequirement = new DataRecordRequirementImpl();
		return dataRecordRequirement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public FunctionalRequirements createFunctionalRequirements() {
		FunctionalRequirementsImpl functionalRequirements = new FunctionalRequirementsImpl();
		return functionalRequirements;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NonFunctionalRequirements createNonFunctionalRequirements() {
		NonFunctionalRequirementsImpl nonFunctionalRequirements = new NonFunctionalRequirementsImpl();
		return nonFunctionalRequirements;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public LawfulByConsent createLawfulByConsent() {
		LawfulByConsentImpl lawfulByConsent = new LawfulByConsentImpl();
		return lawfulByConsent;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public LawfulByContract createLawfulByContract() {
		LawfulByContractImpl lawfulByContract = new LawfulByContractImpl();
		return lawfulByContract;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public LawfulByPublicInterest createLawfulByPublicInterest() {
		LawfulByPublicInterestImpl lawfulByPublicInterest = new LawfulByPublicInterestImpl();
		return lawfulByPublicInterest;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public LawfulByLegitimateInterest createLawfulByLegitimateInterest() {
		LawfulByLegitimateInterestImpl lawfulByLegitimateInterest = new LawfulByLegitimateInterestImpl();
		return lawfulByLegitimateInterest;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public LawfulByLegalObligation createLawfulByLegalObligation() {
		LawfulByLegalObligationImpl lawfulByLegalObligation = new LawfulByLegalObligationImpl();
		return lawfulByLegalObligation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public LawfulByVitalInterest createLawfulByVitalInterest() {
		LawfulByVitalInterestImpl lawfulByVitalInterest = new LawfulByVitalInterestImpl();
		return lawfulByVitalInterest;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public LawfullBySafeGuard createLawfullBySafeGuard() {
		LawfullBySafeGuardImpl lawfullBySafeGuard = new LawfullBySafeGuardImpl();
		return lawfullBySafeGuard;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Linkability createLinkabilityFromString(EDataType eDataType, String initialValue) {
		Linkability result = Linkability.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertLinkabilityToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CollectionMethod createCollectionMethodFromString(EDataType eDataType, String initialValue) {
		CollectionMethod result = CollectionMethod.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertCollectionMethodToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Duration createDurationFromString(EDataType eDataType, String initialValue) {
		Duration result = Duration.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertDurationToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PseudonymKind createPseudonymKindFromString(EDataType eDataType, String initialValue) {
		PseudonymKind result = PseudonymKind.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertPseudonymKindToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public pdp4engReqGDPRPackage getpdp4engReqGDPRPackage() {
		return (pdp4engReqGDPRPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	@Deprecated
	public static pdp4engReqGDPRPackage getPackage() {
		return pdp4engReqGDPRPackage.eINSTANCE;
	}

} //pdp4engReqGDPRFactoryImpl
