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

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.pdp4engReqGDPRPackage
 * @generated
 */
public interface pdp4engReqGDPRFactory extends EFactory {
	/**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	pdp4engReqGDPRFactory eINSTANCE = org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.impl.pdp4engReqGDPRFactoryImpl.init();

	/**
	 * Returns a new object of class '<em>Process Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Process Requirement</em>'.
	 * @generated
	 */
	ProcessRequirement createProcessRequirement();

	/**
	 * Returns a new object of class '<em>Stakeholder</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Stakeholder</em>'.
	 * @generated
	 */
	Stakeholder createStakeholder();

	/**
	 * Returns a new object of class '<em>Personal Data Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Personal Data Requirement</em>'.
	 * @generated
	 */
	PersonalDataRequirement createPersonalDataRequirement();

	/**
	 * Returns a new object of class '<em>GDPR Principle</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>GDPR Principle</em>'.
	 * @generated
	 */
	GDPRPrinciple createGDPRPrinciple();

	/**
	 * Returns a new object of class '<em>Process Principle</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Process Principle</em>'.
	 * @generated
	 */
	ProcessPrinciple createProcessPrinciple();

	/**
	 * Returns a new object of class '<em>Purpose Personal Data Principle</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Purpose Personal Data Principle</em>'.
	 * @generated
	 */
	PurposePersonalDataPrinciple createPurposePersonalDataPrinciple();

	/**
	 * Returns a new object of class '<em>Data Minimisation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Minimisation</em>'.
	 * @generated
	 */
	DataMinimisation createDataMinimisation();

	/**
	 * Returns a new object of class '<em>Purpose Limitation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Purpose Limitation</em>'.
	 * @generated
	 */
	PurposeLimitation createPurposeLimitation();

	/**
	 * Returns a new object of class '<em>Accuracy</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Accuracy</em>'.
	 * @generated
	 */
	Accuracy createAccuracy();

	/**
	 * Returns a new object of class '<em>Storage Limitation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Storage Limitation</em>'.
	 * @generated
	 */
	StorageLimitation createStorageLimitation();

	/**
	 * Returns a new object of class '<em>Lawful</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lawful</em>'.
	 * @generated
	 */
	Lawful createLawful();

	/**
	 * Returns a new object of class '<em>Fairly</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Fairly</em>'.
	 * @generated
	 */
	Fairly createFairly();

	/**
	 * Returns a new object of class '<em>Transparency</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Transparency</em>'.
	 * @generated
	 */
	Transparency createTransparency();

	/**
	 * Returns a new object of class '<em>Security Safety</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Security Safety</em>'.
	 * @generated
	 */
	SecuritySafety createSecuritySafety();

	/**
	 * Returns a new object of class '<em>Related To</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Related To</em>'.
	 * @generated
	 */
	RelatedTo createRelatedTo();

	/**
	 * Returns a new object of class '<em>Available At</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Available At</em>'.
	 * @generated
	 */
	AvailableAt createAvailableAt();

	/**
	 * Returns a new object of class '<em>Derived From</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Derived From</em>'.
	 * @generated
	 */
	DerivedFrom createDerivedFrom();

	/**
	 * Returns a new object of class '<em>Data Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Requirement</em>'.
	 * @generated
	 */
	DataRequirement createDataRequirement();

	/**
	 * Returns a new object of class '<em>Linkable</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Linkable</em>'.
	 * @generated
	 */
	Linkable createLinkable();

	/**
	 * Returns a new object of class '<em>Generated Requirements</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Generated Requirements</em>'.
	 * @generated
	 */
	GeneratedRequirements createGeneratedRequirements();

	/**
	 * Returns a new object of class '<em>Data Flow Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Flow Requirement</em>'.
	 * @generated
	 */
	DataFlowRequirement createDataFlowRequirement();

	/**
	 * Returns a new object of class '<em>Data Subjects</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Subjects</em>'.
	 * @generated
	 */
	DataSubjects createDataSubjects();

	/**
	 * Returns a new object of class '<em>Data Requirements</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Requirements</em>'.
	 * @generated
	 */
	DataRequirements createDataRequirements();

	/**
	 * Returns a new object of class '<em>Available Information</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Available Information</em>'.
	 * @generated
	 */
	AvailableInformation createAvailableInformation();

	/**
	 * Returns a new object of class '<em>Personal Information</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Personal Information</em>'.
	 * @generated
	 */
	PersonalInformation createPersonalInformation();

	/**
	 * Returns a new object of class '<em>Available Information Container</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Available Information Container</em>'.
	 * @generated
	 */
	AvailableInformationContainer createAvailableInformationContainer();

	/**
	 * Returns a new object of class '<em>Personal Information Container</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Personal Information Container</em>'.
	 * @generated
	 */
	PersonalInformationContainer createPersonalInformationContainer();

	/**
	 * Returns a new object of class '<em>Unlinkability Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Unlinkability Requirement</em>'.
	 * @generated
	 */
	UnlinkabilityRequirement createUnlinkabilityRequirement();

	/**
	 * Returns a new object of class '<em>Privacy Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Privacy Requirement</em>'.
	 * @generated
	 */
	PrivacyRequirement createPrivacyRequirement();

	/**
	 * Returns a new object of class '<em>Data Unlinkability Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Unlinkability Requirement</em>'.
	 * @generated
	 */
	DataUnlinkabilityRequirement createDataUnlinkabilityRequirement();

	/**
	 * Returns a new object of class '<em>Controlers</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Controlers</em>'.
	 * @generated
	 */
	Controlers createControlers();

	/**
	 * Returns a new object of class '<em>Link</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Link</em>'.
	 * @generated
	 */
	Link createLink();

	/**
	 * Returns a new object of class '<em>Undectability Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Undectability Requirement</em>'.
	 * @generated
	 */
	UndectabilityRequirement createUndectabilityRequirement();

	/**
	 * Returns a new object of class '<em>Pseudonimity Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Pseudonimity Requirement</em>'.
	 * @generated
	 */
	PseudonimityRequirement createPseudonimityRequirement();

	/**
	 * Returns a new object of class '<em>Ananomity Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Ananomity Requirement</em>'.
	 * @generated
	 */
	AnanomityRequirement createAnanomityRequirement();

	/**
	 * Returns a new object of class '<em>Data Record Requirement</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Record Requirement</em>'.
	 * @generated
	 */
	DataRecordRequirement createDataRecordRequirement();

	/**
	 * Returns a new object of class '<em>Functional Requirements</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Functional Requirements</em>'.
	 * @generated
	 */
	FunctionalRequirements createFunctionalRequirements();

	/**
	 * Returns a new object of class '<em>Non Functional Requirements</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Non Functional Requirements</em>'.
	 * @generated
	 */
	NonFunctionalRequirements createNonFunctionalRequirements();

	/**
	 * Returns a new object of class '<em>Lawful By Consent</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lawful By Consent</em>'.
	 * @generated
	 */
	LawfulByConsent createLawfulByConsent();

	/**
	 * Returns a new object of class '<em>Lawful By Contract</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lawful By Contract</em>'.
	 * @generated
	 */
	LawfulByContract createLawfulByContract();

	/**
	 * Returns a new object of class '<em>Lawful By Public Interest</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lawful By Public Interest</em>'.
	 * @generated
	 */
	LawfulByPublicInterest createLawfulByPublicInterest();

	/**
	 * Returns a new object of class '<em>Lawful By Legitimate Interest</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lawful By Legitimate Interest</em>'.
	 * @generated
	 */
	LawfulByLegitimateInterest createLawfulByLegitimateInterest();

	/**
	 * Returns a new object of class '<em>Lawful By Legal Obligation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lawful By Legal Obligation</em>'.
	 * @generated
	 */
	LawfulByLegalObligation createLawfulByLegalObligation();

	/**
	 * Returns a new object of class '<em>Lawful By Vital Interest</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lawful By Vital Interest</em>'.
	 * @generated
	 */
	LawfulByVitalInterest createLawfulByVitalInterest();

	/**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
	pdp4engReqGDPRPackage getpdp4engReqGDPRPackage();

} //pdp4engReqGDPRFactory
