| /***************************************************************************** |
| * 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.pdp4eng.req.gdprananalysis.internal; |
| |
| import java.util.Iterator; |
| |
| import org.eclipse.emf.common.command.Command; |
| import org.eclipse.emf.common.util.TreeIterator; |
| import org.eclipse.emf.ecore.EObject; |
| /** |
| * Copyright (c) 2019 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are the property of the CEA. |
| * Any use is subject to specific agreement with the CEA. |
| * Contributors: |
| * |
| * Patrick Tessier (CEA LIST) - Initial API and implementation |
| * |
| */ |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.papyrus.sysml14.requirements.Requirement; |
| import org.eclipse.uml2.uml.Class; |
| import org.eclipse.uml2.uml.Element; |
| import org.eclipse.uml2.uml.Package; |
| import org.eclipse.uml2.uml.UMLFactory; |
| import org.eclipse.uml2.uml.UMLPackage; |
| import org.eclipse.uml2.uml.util.UMLUtil; |
| import org.eclipse.uml2.uml.util.UMLUtil.StereotypeApplicationHelper; |
| |
| import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Consent; |
| import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Contract; |
| import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.DataSubject; |
| import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.PersonalData; |
| import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Purpose; |
| import org.eclipse.papyrus.pdp4eng.req.metareq.GDPRRequirements; |
| import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.pdp4engReqGDPRPackage; |
| import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PersonalDataRequirement; |
| import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.ProcessRequirement; |
| |
| public class LawfulRequirementByContractCreateCommand extends BasicGDPRRequirementCreateCommand { |
| |
| private DataSubject dataSubject; |
| public LawfulRequirementByContractCreateCommand(TransactionalEditingDomain domain, Element owner, String id, String text,ProcessRequirement processRequirement, DataSubject dataSubject) { |
| super(domain, owner, id, text,processRequirement); |
| this.dataSubject= dataSubject; |
| } |
| |
| @Override |
| protected void createRequirement(Package owner, String id, String text) { |
| StereotypeApplicationHelper stereotypeApplicationHelper = StereotypeApplicationHelper.getInstance(null); |
| GDPRRequirements gdprRrequiement= new GDPRRequirements(); |
| |
| Class lawfullReq =null; |
| //1. look for LawfulRequirement |
| lawfullReq = lookForLawFullRequirement(owner, lawfullReq); |
| |
| |
| //2. create the sub requirement |
| for (Iterator<Consent> iteratorConsent = dataSubject.getGivenConsent().iterator(); iteratorConsent.hasNext();) { |
| Contract aContract =this.processRequirement.getPerformAContract(); |
| if( aContract!=null) { |
| |
| //1.1 create the class |
| Class requirementClass =UMLFactory.eINSTANCE.createClass(); |
| |
| //2.1 set the owner |
| setTheOwner(owner, lawfullReq, requirementClass); |
| //3. apply the stereotype |
| stereotypeApplicationHelper.applyStereotype(requirementClass,org.eclipse.papyrus.sysml14.requirements.RequirementsPackage.eINSTANCE.getRequirement(),null ); |
| Requirement reqStereotype= (Requirement)UMLUtil.getStereotypeApplication(requirementClass, Requirement.class); |
| stereotypeApplicationHelper.applyStereotype(requirementClass,pdp4engReqGDPRPackage.eINSTANCE.getLawfulByConsent(),null ); |
| org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract lawfulRbyContract= (org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract)UMLUtil.getStereotypeApplication(requirementClass, org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract.class); |
| //4. set attribute of the applied stereotype |
| setAttributeAppliedStereotype(gdprRrequiement, aContract, reqStereotype, lawfulRbyContract); |
| //5.set the ID |
| setTheID(id, lawfullReq, requirementClass, reqStereotype); |
| } |
| } |
| |
| } |
| |
| private void setAttributeAppliedStereotype(GDPRRequirements gdprRrequiement, Contract aContract, Requirement reqStereotype, org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract lawfulByContract) { |
| lawfulByContract.setContract(aContract); |
| lawfulByContract.setDataSubject(dataSubject); |
| for (PersonalData personalData : processRequirement.getPersonaldata()) { |
| lawfulByContract.getPersonalData().add((PersonalDataRequirement) personalData); |
| } |
| lawfulByContract.setProcess(this.processRequirement); |
| reqStereotype.setText(""+gdprRrequiement.getDescriptionForLawfulByConsent(lawfulByContract)); |
| } |
| |
| /** |
| * set the id of the requirement |
| * @param id |
| * @param lawfullReq |
| * @param requirementClass |
| * @param reqStereotype |
| */ |
| private void setTheID(String id, Class lawfullReq, Class requirementClass, Requirement reqStereotype) { |
| if(lawfullReq==null) { |
| reqStereotype.setId(id); |
| requirementClass.setName(id); |
| } |
| else { |
| reqStereotype.setId(lawfullReq.getName()+"."+lawfullReq.getNestedClassifiers().size()); |
| requirementClass.setName(lawfullReq.getName()+"."+lawfullReq.getNestedClassifiers().size()); |
| } |
| } |
| |
| /** tSet the owner the of the requirement |
| * |
| * @param owner |
| * @param lawfullReq |
| * @param requirementClass |
| */ |
| private void setTheOwner(Package owner, Class lawfullReq, Class requirementClass) { |
| if(lawfullReq==null) { |
| owner.getPackagedElements().add(requirementClass); |
| } |
| else { |
| lawfullReq.getNestedClassifiers().add(requirementClass); |
| |
| } |
| } |
| |
| /** |
| * look for lawfull requirement that could be the owner |
| * @param owner |
| * @param lawfullReq |
| * @return |
| */ |
| private Class lookForLawFullRequirement(Package owner, Class lawfullReq) { |
| TreeIterator<EObject> iterator= owner.eAllContents(); |
| while (iterator.hasNext()) { |
| EObject eObject = (EObject) iterator.next(); |
| //test if is is a class |
| if (eObject instanceof Class) { |
| Class aclass=(Class)eObject; |
| org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful lawful= (org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful)UMLUtil.getStereotypeApplication(aclass, org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful.class); |
| // test if this is a lawfull req. |
| if( lawful!=null) { |
| //test attributes |
| if(lawful.getProcess().equals(this.processRequirement) && lawful.getDataSubject().equals(this.dataSubject)) { |
| lawfullReq=(Class)lawful.getBase_NamedElement(); |
| return lawfullReq; |
| } |
| } |
| } |
| |
| } |
| return lawfullReq; |
| } |
| |
| } |