/**
 *  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();
			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
	 */
	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
