diff options
9 files changed, 819 insertions, 15 deletions
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java index 5b268da..22149cf 100644 --- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java @@ -83,5 +83,13 @@ public interface IModelTransfo { * @return
*/
public Command getInstantiateGDPRConsentPatternCommand(TransactionalEditingDomain domain, Activity process);
+
+ /**
+ * Instantiate a GDPR pattern to notify the data subject in case of personal data breach
+ * @param domain
+ * @param process
+ * @return
+ */
+ public Command getInstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity process);
}
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java index b9747af..39c62f2 100644 --- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java @@ -69,5 +69,11 @@ public class ModelTransfoFactory implements IModelTransfo{ // TODO Auto-generated method stub
return factoryImpl.getInstantiateGDPRConsentPatternCommand(domain, process);
}
+
+ @Override
+ public Command getInstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity process) {
+ // TODO Auto-generated method stub
+ return factoryImpl.getInstantiateGDPRNotificationsPatternCommand(domain, process);
+ }
}
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/InstantiateGDPRNotificationsPatternCommand.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/InstantiateGDPRNotificationsPatternCommand.java new file mode 100644 index 0000000..86bc88e --- /dev/null +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/InstantiateGDPRNotificationsPatternCommand.java @@ -0,0 +1,39 @@ +/** + * 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 + * Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr + * + */ +package org.eclipse.papyrus.pdp4eng.designer.controller.internal; + +import org.eclipse.emf.transaction.RecordingCommand; +import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.papyrus.uml.properties.profile.ui.dialogs.ChooseSetStereotypeDialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.uml2.uml.Activity; + +public class InstantiateGDPRNotificationsPatternCommand extends RecordingCommand { + + protected Activity Process; + + public InstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity Process) { + super(domain, "Instantiate a Notifications Pattern based upon the information provided by the engineer"); + this.Process = Process; + } + + @Override + protected void doExecute() { + ChooseSetStereotypeDialog dialog = new ChooseSetStereotypeDialog(Display.getCurrent().getActiveShell(), Process); + dialog.open(); + System.out.printf("==>>"+Process.toString()); + } +} diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java index a55cdd4..0fb1a69 100644 --- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java @@ -81,4 +81,9 @@ public class ModelTransfoFactoryImpl implements IModelTransfo{ return new InstantiateGDPRConsentPatternCommand(domain, process);
}
+ @Override
+ public Command getInstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity process) {
+ return new InstantiateGDPRNotificationsPatternCommand(domain, process);
+ }
+
}
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java index a160208..a18cdf6 100644 --- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java @@ -40,6 +40,7 @@ public class Activator extends AbstractUIPlugin implements IStartup{ CatalogFactory catalogFactory= new CatalogFactory();
IStrategyCatalog catalog=catalogFactory.createCatalog("Process-oriented Strategies");
catalog.addStrategy(new InstantiateGDPRConsentPatternStrategy());
+ catalog.addStrategy(new InstantiateGDPRNotificationsPatternStrategy());
engineFactory.getCurrentEngine().connectACatalog(catalog);
}
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/InstantiateGDPRNotificationsPatternStrategy.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/InstantiateGDPRNotificationsPatternStrategy.java new file mode 100644 index 0000000..863294e --- /dev/null +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/InstantiateGDPRNotificationsPatternStrategy.java @@ -0,0 +1,51 @@ +/** + * 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 + * Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr + * + */ +package org.eclipse.papyrus.pdp4eng.designer.processstrategies; + +import org.eclipse.emf.common.command.Command; +import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.papyrus.pdp4eng.designer.engine.api.IStrategy; +import org.eclipse.uml2.uml.Activity; +import org.eclipse.uml2.uml.Element; +import org.eclipse.papyrus.pdp4eng.designer.processstrategies.command.InstantiateGDPRNotificationsPatternCommand; + +public class InstantiateGDPRNotificationsPatternStrategy implements IStrategy { + + @Override + public String getName() { + return "GDPRNotificationsPatternStrategy"; + } + + @Override + public String getGoal() { + return "Instantiate GDPR Notifications Pattern Strategy"; + } + + @Override + public boolean canBeApplied(Element element) { + if( element instanceof org.eclipse.uml2.uml.Activity) {return true;} + return false; + } + + @Override + public Command getCommand(Element element, TransactionalEditingDomain domain) { + // TODO Auto-generated method stub + return new InstantiateGDPRNotificationsPatternCommand(domain, (Activity) element); + + } + +} + diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java index ed39108..a8a9fed 100644 --- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java @@ -24,15 +24,11 @@ import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; -import org.eclipse.papyrus.pdp4eng.designer.controller.api.*; -import org.eclipse.papyrus.pdp4eng.designer.controller.internal.processcreation.ProcessBuilder; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.uml2.uml.Action; import org.eclipse.uml2.uml.Activity; -import org.eclipse.uml2.uml.ActivityEdge; -import org.eclipse.uml2.uml.ActivityNode; import org.eclipse.uml2.uml.ActivityParameterNode; import org.eclipse.uml2.uml.CallBehaviorAction; import org.eclipse.uml2.uml.Classifier; @@ -81,34 +77,39 @@ public class InstantiateGDPRConsentPatternCommand extends RecordingCommand { String title = "1. Consent Pattern - Select the Controller"; String message = "1. Select the Controller responsible for processing Personal Data"; ExternalEntity selectedController = selectExternalEntityFromActivityDFD(title,message); - Entity controllerEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()); - Entity processorEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Processor"); + Entity controllerEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Controller"); applyStereotypeToNamedElement(controllerEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Controller); - applyStereotypeToNamedElement(processorEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Processor); selectedController.setEntity(controllerEntity); + + title = "2. Consent Pattern - Select the Processor"; + message = "2. Select the Processor managing and processing the Personal Data"; + ExternalEntity selectedProcessor = selectExternalEntityFromActivityDFD(title,message); + Entity processorEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Processor"); + applyStereotypeToNamedElement(processorEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Processor); + selectedProcessor.setEntity(processorEntity); - title = "2. Consent Pattern - Select the Data Subject"; - message = "2. Select the Data Subject to ask for Consent"; + title = "3. Consent Pattern - Select the Data Subject"; + message = "3. Select the Data Subject to ask for Consent"; ExternalEntity selectedDataSubject = selectExternalEntityFromActivityDFD(title, message); Entity dataSubjectEntity = createEntity(selectedDataSubject.getBase_ActivityParameterNode().getName()); applyStereotypeToNamedElement(dataSubjectEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_DataSubject); selectedDataSubject.setEntity(dataSubjectEntity); - title = "3. Consent Pattern - Select the Process"; - message = "3. Select the Process concerned by the Consent"; + title = "4. Consent Pattern - Select the Process"; + message = "4. Select the Process concerned by the Consent"; CallProcess selectedCallProcess = selectCallProcessFromActivityDFD(title, message); applyStereotypeToAction(selectedCallProcess.getBase_CallBehaviorAction(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Process); - title = "4. Consent Pattern - Declare the Purpose"; - message = "4. Declare the Purpose for which Data is processed"; + title = "5. Consent Pattern - Declare the Purpose"; + message = "5. Declare the Purpose for which Data is processed"; InputDialog dialog = new InputDialog(Display.getCurrent().getActiveShell(), title, message, "", null); dialog.open(); String purposeTxt = dialog.getValue(); Purpose purpose = createPurpose(purposeTxt); - title = "5. Consent Pattern - Select the Personal Data"; - message = "5. Select the Personal Data involved in "+ selectedCallProcess.getBase_CallBehaviorAction().getName(); + title = "6. Consent Pattern - Select the Personal Data"; + message = "6. Select the Personal Data involved in "+ selectedCallProcess.getBase_CallBehaviorAction().getName(); PersonalData selectedPersonalData = selectPersonalDataFromActivityDFD(title, message); /** Start to instantiate the Consent Pattern by completing and filling the model **/ @@ -691,6 +692,12 @@ public class InstantiateGDPRConsentPatternCommand extends RecordingCommand { } } + /** + * Apply the a stereotype to Pin + * @param pin + * @param profileName + * @param stereotypeName + */ public void applyStereotypeToPin(Pin pin, String profileName, String stereotypeName) { EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); EList<Stereotype> appliedStypes = pin.getAppliedStereotypes(); diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRNotificationsPatternCommand.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRNotificationsPatternCommand.java new file mode 100644 index 0000000..e047b7c --- /dev/null +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRNotificationsPatternCommand.java @@ -0,0 +1,685 @@ +/** + * 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 + * Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr + * + */ +package org.eclipse.papyrus.pdp4eng.designer.processstrategies.command; + +import java.util.Iterator; + +import org.eclipse.emf.common.util.BasicEList; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.transaction.RecordingCommand; +import org.eclipse.emf.transaction.TransactionalEditingDomain; + +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.window.Window; +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.swt.widgets.Display; + +import org.eclipse.uml2.uml.Action; +import org.eclipse.uml2.uml.Activity; +import org.eclipse.uml2.uml.ActivityParameterNode; +import org.eclipse.uml2.uml.CallBehaviorAction; +import org.eclipse.uml2.uml.Classifier; +import org.eclipse.uml2.uml.Element; +import org.eclipse.uml2.uml.InputPin; +import org.eclipse.uml2.uml.NamedElement; +import org.eclipse.uml2.uml.ObjectFlow; +import org.eclipse.uml2.uml.OutputPin; +import org.eclipse.uml2.uml.Package; +import org.eclipse.uml2.uml.PackageableElement; +import org.eclipse.uml2.uml.Pin; +import org.eclipse.uml2.uml.Profile; +import org.eclipse.uml2.uml.ProfileApplication; +import org.eclipse.uml2.uml.Stereotype; +import org.eclipse.uml2.uml.Type; +import org.eclipse.uml2.uml.UMLFactory; +import org.eclipse.uml2.uml.UMLPackage; +import org.eclipse.uml2.uml.util.UMLUtil; +import org.eclipse.ui.dialogs.ElementListSelectionDialog; + +import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.CallProcess; +import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.Entity; +import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.ExternalEntity; +import org.eclipse.papyrus.pdp4eng.designer.utils.ModelPackageNames; +import org.eclipse.papyrus.pdp4eng.designer.utils.ModelProfileNames; +import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Controller; +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.PersonalDataBreach; +import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Processor; +import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Process; + +public class InstantiateGDPRNotificationsPatternCommand extends RecordingCommand { + + protected Activity activityDFD; + + public InstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity activityDFD) { + super(domain, "Instantiate a Notifications Pattern based upon the information provided by the engineer"); + this.activityDFD = activityDFD; + } + + @Override + protected void doExecute() { + + String title = "1. Notifications Pattern - Select the Controller"; + String message = "1. Select the Controller responsible for processing Personal Data"; + ExternalEntity selectedController = selectExternalEntityFromActivityDFD(title,message); + Entity controllerEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Controller"); + applyStereotypeToNamedElement(controllerEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Controller); + selectedController.setEntity(controllerEntity); + + title = "2. Notifications Pattern - Select the Processor"; + message = "2. Select the Processor managing and processing the Personal Data"; + ExternalEntity selectedProcessor = selectExternalEntityFromActivityDFD(title,message); + Entity processorEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Processor"); + applyStereotypeToNamedElement(processorEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Processor); + selectedProcessor.setEntity(processorEntity); + + title = "3. Notifications Pattern - Select the Data Subject"; + message = "3. Select the Data Subject concerned by the Personal Data breach"; + ExternalEntity selectedDataSubject = selectExternalEntityFromActivityDFD(title, message); + Entity dataSubjectEntity = createEntity(selectedDataSubject.getBase_ActivityParameterNode().getName()); + applyStereotypeToNamedElement(dataSubjectEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_DataSubject); + selectedDataSubject.setEntity(dataSubjectEntity); + + title = "4. Notifications Pattern - Select the Process"; + message = "4. Select the Process concerned by the Personal Data breach"; + CallProcess selectedCallProcess = selectCallProcessFromActivityDFD(title, message); + applyStereotypeToAction(selectedCallProcess.getBase_CallBehaviorAction(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Process); + + + title = "5. Notifications Pattern - Select the Personal Data"; + message = "5. Select the Personal Data involved in "+ selectedCallProcess.getBase_CallBehaviorAction().getName(); + PersonalData selectedPersonalData = selectPersonalDataFromActivityDFD(title, message); + + title = "6. Notifications Pattern - Declare the Breach"; + message = "6. Declare the impact of the Breach on Personal Data"; + InputDialog dialog = new InputDialog(Display.getCurrent().getActiveShell(), + title, message, "", null); + dialog.open(); + String databreachTxt = dialog.getValue(); + PersonalDataBreach personalDataBreach = createPersonalDataBreach(databreachTxt, selectedPersonalData); + + /** Start to instantiate the Notifications Pattern by completing and filling the model **/ + + /** 1st. Controller (and Processor) **/ + Controller controller = getController(controllerEntity.getBase_NamedElement()); + Processor processor = getProcessor(processorEntity.getBase_NamedElement()); + + if ((controller!=null) && (processor!=null) && (selectedPersonalData!=null)) { + controller.getPersonalData().add(selectedPersonalData); + controller.getProcessor().add(processor); + } + + /** 2nd. Data Subject **/ + DataSubject dataSubject = getDataSubject(dataSubjectEntity.getBase_NamedElement()); + if (dataSubject!=null && selectedPersonalData!=null) { + dataSubject.getPersonalData().add(selectedPersonalData); + } + + /** 3rd. Process **/ + Process process = getProcess(selectedCallProcess.getBase_CallBehaviorAction()); + if (process!=null) { + processor.getProcess().add(process); + process.getPersonaldata().add(selectedPersonalData); + } + + /** INSTANTIATE THE NOTIFICATIONS PATTERN **/ + + /** Create a CallProcess **/ + Activity newProcess= UMLFactory.eINSTANCE.createActivity(); + String notificationsName = "GDPRNotifications_"+process.getBase_NamedElement().getName(); + newProcess.setName(notificationsName); + Package DFDL1_Pkg = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.DFD_L1_PackageName); + if (DFDL1_Pkg!=null && newProcess!=null) { + //System.err.printf(DFDL1_Pkg.toString()+"\n\n\n"); + //System.err.printf(newProcess.toString()+"\n\n\n"); + DFDL1_Pkg.getPackagedElements().add(newProcess); + CallBehaviorAction notificationsCallBehaviorAction=UMLFactory.eINSTANCE.createCallBehaviorAction(); + activityDFD.getOwnedNodes().add(notificationsCallBehaviorAction); + notificationsCallBehaviorAction.setName("GDPRNotifications_"+process.getBase_NamedElement().getName()); + notificationsCallBehaviorAction.setBehavior(newProcess); + applyStereotypeToAction(notificationsCallBehaviorAction, ModelProfileNames.PDPbDProfileName, ModelProfileNames.PDPbD_CallProcess); + + /** Add DataInput and DataOutput pins **/ + InputPin inPin = UMLFactory.eINSTANCE.createInputPin(); + OutputPin outPin = UMLFactory.eINSTANCE.createOutputPin(); + if (inPin != null && outPin!=null) { + inPin.setType((Type) personalDataBreach.getBase_NamedElement()); + outPin.setType((Type) personalDataBreach.getBase_NamedElement()); + inPin.setName("InputPin1"); + outPin.setName("OutputPin2"); + notificationsCallBehaviorAction.getArguments().add(inPin); + notificationsCallBehaviorAction.getResults().add(outPin); + applyStereotypeToPin(inPin, ModelProfileNames.PDPbDProfileName, ModelProfileNames.PDPbD_DataInput); + applyStereotypeToPin(outPin, ModelProfileNames.PDPbDProfileName, ModelProfileNames.PDPbD_DataOutput); + + /** Connect Controller entity to the DataInput pin **/ + ObjectFlow dataFlowEdge1 = UMLFactory.eINSTANCE.createObjectFlow(); + if (dataFlowEdge1 !=null) { + dataFlowEdge1.setName("Notifications_"+selectedController.getBase_ActivityParameterNode().getName()); + dataFlowEdge1.setSource(selectedController.getBase_ActivityParameterNode()); + dataFlowEdge1.setTarget(inPin); + activityDFD.getEdges().add(dataFlowEdge1); + + /** Connect DataOutput pin to Data Subject entity **/ + ObjectFlow dataFlowEdge2 = UMLFactory.eINSTANCE.createObjectFlow(); + if (dataFlowEdge2!=null) { + dataFlowEdge2.setName("Notifications_"+selectedDataSubject.getBase_ActivityParameterNode().getName()); + dataFlowEdge2.setSource(outPin); + dataFlowEdge2.setTarget(selectedDataSubject.getBase_ActivityParameterNode()); + activityDFD.getEdges().add(dataFlowEdge2); + + /** Completing Behavior Process **/ + ActivityParameterNode parameterIn=UMLFactory.eINSTANCE.createActivityParameterNode(); + if (parameterIn!=null) { + parameterIn.setName(inPin.getName()); + parameterIn.setType(inPin.getType()); + newProcess.getOwnedNodes().add(parameterIn); + } + + ActivityParameterNode parameterOut=UMLFactory.eINSTANCE.createActivityParameterNode(); + if (parameterOut!=null) { + parameterOut.setName(outPin.getName()); + parameterOut.setType(outPin.getType()); + newProcess.getOwnedNodes().add(parameterOut); + } + } + } + } + } + } + + + /** + * Verify whether the needed profiles have been already loaded in the model + * @param profileList + * @return + */ + public boolean verifyProfilesApplied(EList<Profile> profileList) { + boolean found = false; + int noProfiles = 0; + for (Iterator<Profile> profileListIt = profileList.iterator(); profileListIt.hasNext() && noProfiles!=2;) { + Profile profile = profileListIt.next(); + if (profile!=null) { + String profileName = profile.getName(); + switch (profileName) { + case "pdp4engDesign": + noProfiles++; + break; + + case "pdp4engCommonGDPR": + noProfiles++; + break; + + } + } + } + if (noProfiles==2) { + found=true; + } + return found; + } + + /** + * Return the profile with the given name or null elsewhere + * @param profileName + * @return + */ + public Profile getProfile(String profileName) { + Profile profile = null; + for (ProfileApplication profileApplication : this.activityDFD.getModel().getProfileApplications()) { + profile = profileApplication.getAppliedProfile(); + if (profile.getName().equals(profileName)){ + return profile; + } + } + return profile; + } + + /** + * Create a Package with the given name. + * @param packageName + */ + public void createIfMissingPackage(String packageName){ + PackageableElement targetPackage = this.activityDFD.getModel().getPackagedElement(packageName); + if (targetPackage==null || !targetPackage.getName().equals(packageName)){ + this.activityDFD.getModel().createPackagedElement(packageName, UMLPackage.eINSTANCE.getPackage()); + } + } + + + /** + * Shows all the Call Process associated to an Activity DFD. Returns the CallProcess selected by the user. + * @return + */ + CallProcess selectCallProcessFromActivityDFD(String title, String message) { + CallProcess selectedCallProcess = null; + EList<Action> selectedCallProcList = new BasicEList<Action>(); + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile PDPbDprofile = getProfile(ModelProfileNames.PDPbDProfileName); + EList<Element> elementList = this.activityDFD.getNearestPackage().allOwnedElements(); + if (elementList!=null && PDPbDprofile!=null) { + for (Iterator<Element> elementListIt = elementList.iterator(); elementListIt.hasNext();) { + Element element = elementListIt.next(); + EList<Stereotype> elementStypesList = element.getAppliedStereotypes(); + for (Iterator<Stereotype> elementStypeListIt = elementStypesList.iterator(); elementStypeListIt.hasNext();) { + Stereotype stype = elementStypeListIt.next(); + if (stype!=null && stype.getName().equals(ModelProfileNames.PDPbD_CallProcess)) { + if (element instanceof org.eclipse.uml2.uml.Action) { + Action actionElmt = (Action) element; + System.out.printf("CallProcess Name: "+actionElmt.getName()+"\n"); + if (!selectedCallProcList.contains(actionElmt)) { + selectedCallProcList.add(actionElmt); + } + } + } + } + } + } + } + + Object[] objList = new Object[selectedCallProcList.size()]; + Iterator<Action> selectedElementListIt = selectedCallProcList.iterator(); + for (int i=0; selectedElementListIt.hasNext()&& i<objList.length; i++) { + Action callProc = selectedElementListIt.next(); + objList[i] = callProc.getName(); + } + + ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getCurrent().getActiveShell(), new LabelProvider()); + dialog.setElements(objList); + dialog.setTitle(title); + dialog.setMessage(message); + dialog.setHelpAvailable(true); + + if (dialog.open() != Window.OK) { + System.out.printf(">> A problem opening the CallProcess Window"); + } + + Object[] resultList = dialog.getResult(); + if (resultList!=null && resultList.length>0) { + Object result = resultList[0]; + for (Iterator<Action> selectedElementListIt1 = selectedCallProcList.iterator(); selectedElementListIt1.hasNext();) { + Action callProc = selectedElementListIt1.next(); + if (callProc.getName().equals(result)){ + selectedCallProcess = UMLUtil.getStereotypeApplication(callProc,CallProcess.class) ; + } + } + } + return selectedCallProcess; + } + + /** + * Shows all the External Entities associated to an Activity DFD. Returns the ExternalEntity selected by the user. + * @return + */ + ExternalEntity selectExternalEntityFromActivityDFD(String title, String message) { + ExternalEntity selectedEEntity = null; + EList<ActivityParameterNode> selectedEEntityList = new BasicEList<ActivityParameterNode>(); + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile PDPbDprofile = getProfile(ModelProfileNames.PDPbDProfileName); + EList<Element> elementList = this.activityDFD.getNearestPackage().allOwnedElements(); + if (elementList!=null && PDPbDprofile!=null) { + for (Iterator<Element> elementListIt = elementList.iterator(); elementListIt.hasNext();) { + Element element = elementListIt.next(); + EList<Stereotype> elementStypesList = element.getAppliedStereotypes(); + for (Iterator<Stereotype> elementStypeListIt = elementStypesList.iterator(); elementStypeListIt.hasNext();) { + Stereotype stype = elementStypeListIt.next(); + if (stype!=null && stype.getName().equals(ModelProfileNames.PDPbD_ExternalEntity)) { + if (element instanceof org.eclipse.uml2.uml.ActivityParameterNode) { + ActivityParameterNode activityParameterNodeElmt = (ActivityParameterNode) element; + System.out.printf("ExternalEntity Name: "+activityParameterNodeElmt.getName()+"\n"); + if (!selectedEEntityList.contains(activityParameterNodeElmt)) { + selectedEEntityList.add(activityParameterNodeElmt); + } + } + } + } + } + } + } + + Object[] objList = new Object[selectedEEntityList.size()]; + Iterator<ActivityParameterNode> selectedEEntityListIt = selectedEEntityList.iterator(); + for (int i=0; selectedEEntityListIt.hasNext()&& i<objList.length; i++) { + ActivityParameterNode extEntity = selectedEEntityListIt.next(); + objList[i] = extEntity.getName(); + } + + ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getCurrent().getActiveShell(), new LabelProvider()); + dialog.setElements(objList); + dialog.setTitle(title); + dialog.setMessage(message); + dialog.setHelpAvailable(true); + + if (dialog.open() != Window.OK) { + System.out.printf(">> A problem opening the ExternalEntity Window"); + } + + Object[] resultList = dialog.getResult(); + if (resultList!=null && resultList.length>0) { + Object result = resultList[0]; + for (Iterator<ActivityParameterNode> selectedEEntityListIt1 = selectedEEntityList.iterator(); selectedEEntityListIt1.hasNext();) { + ActivityParameterNode activityParamNode = selectedEEntityListIt1.next(); + if (activityParamNode.getName().equals(result)){ + selectedEEntity = UMLUtil.getStereotypeApplication(activityParamNode,ExternalEntity.class); + } + } + } + return selectedEEntity; + } + + /** + * hows all the Data associated to an Activity DFD. Stereotypes the selected Data as Personal and returns them. + * @param title + * @param message + * @return + */ + PersonalData selectPersonalDataFromActivityDFD(String title, String message) { + PersonalData selectedPersonalData = null; + EList<Classifier> selectedPersonalDataList = new BasicEList<Classifier>(); + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile PDPbDprofile = getProfile(ModelProfileNames.PDPbDProfileName); + EList<Element> elementList = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.Data_PackageName).allOwnedElements(); + if (elementList!=null && PDPbDprofile!=null) { + for (Iterator<Element> elementListIt = elementList.iterator(); elementListIt.hasNext();) { + Element element = elementListIt.next(); + EList<Stereotype> elementStypesList = element.getAppliedStereotypes(); + for (Iterator<Stereotype> elementStypeListIt = elementStypesList.iterator(); elementStypeListIt.hasNext();) { + Stereotype stype = elementStypeListIt.next(); + if (stype!=null && stype.getName().equals(ModelProfileNames.commonGDPR_PersonalData)) { + if (element instanceof org.eclipse.uml2.uml.Classifier) { + Classifier classElmt = (Classifier) element; + System.out.printf("PersonalData Name: "+classElmt.getName()+"\n"); + if (!selectedPersonalDataList.contains(classElmt)) { + selectedPersonalDataList.add(classElmt); + } + } + } + } + } + } + } + + Object[] objList = new Object[selectedPersonalDataList.size()]; + Iterator<Classifier> selectedPersonalDataListIt = selectedPersonalDataList.iterator(); + for (int i=0; selectedPersonalDataListIt.hasNext()&& i<objList.length; i++) { + Classifier extEntity = selectedPersonalDataListIt.next(); + objList[i] = extEntity.getName(); + } + + ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getCurrent().getActiveShell(), new LabelProvider()); + dialog.setElements(objList); + dialog.setTitle(title); + dialog.setMessage(message); + dialog.setHelpAvailable(true); + + if (dialog.open() != Window.OK) { + System.out.printf(">> A problem opening the PersonalData Window"); + } + + Object[] resultList = dialog.getResult(); + if (resultList!=null && resultList.length>0) { + Object result = resultList[0]; + for (Iterator<Classifier> selectedPersonalDataListIt1 = selectedPersonalDataList.iterator(); selectedPersonalDataListIt1.hasNext();) { + Classifier activityParamNode = selectedPersonalDataListIt1.next(); + if (activityParamNode.getName().equals(result)){ + selectedPersonalData = UMLUtil.getStereotypeApplication(activityParamNode,PersonalData.class); + } + } + } + return selectedPersonalData; + } + + /** + * Create a PersonalDataBreach element with the given impact description within the Data package + * @param name + * @return + */ + PersonalDataBreach createPersonalDataBreach(String dataBreach, PersonalData breachedData) { + PersonalDataBreach personalDataBreach = null; + createIfMissingPackage(ModelPackageNames.Data_PackageName ); + Classifier personalDataBreachCls = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.Data_PackageName). + createOwnedClass("DataBreach_"+dataBreach+"_"+breachedData.getBase_NamedElement().getName(), false); + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName); + if (commonProfile!=null){ + Stereotype personalDataBreachStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_PersonalDataBreach); + if (personalDataBreachStype!=null){ + UMLUtil.safeApplyStereotype(personalDataBreachCls, personalDataBreachStype); + personalDataBreach = UMLUtil.getStereotypeApplication(personalDataBreachCls, PersonalDataBreach.class); + if (dataBreach!=null && dataBreach.length()>0) { + personalDataBreach.setBreachImpact(dataBreach); + } + if (breachedData!=null && !personalDataBreach.getConcernedPersonalData().contains(breachedData)) { + personalDataBreach.getConcernedPersonalData().add(breachedData); + } + } + } + } + return personalDataBreach; + } + + /** + * Create an Entity with the given name within the Stakeholders package + * @param name + * @return + */ + Entity createEntity(String name) { + Entity entity = null; + createIfMissingPackage(ModelPackageNames.Stakeholder_PackageName); + Classifier entityCls = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.Stakeholder_PackageName). + createOwnedClass(name, false); + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile commonProfile = getProfile(ModelProfileNames.PDPbDProfileName); + if (commonProfile!=null){ + Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.PDPbD_Entity); + if (entityStype!=null){ + UMLUtil.safeApplyStereotype(entityCls, entityStype); + entity = UMLUtil.getStereotypeApplication(entityCls, Entity.class); + } + } + } + return entity; + } + + /** + * Get the controller of an Entity + * @param entityCls + * @return + */ + Controller getController(NamedElement entityCls) { + Controller controller = null; + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName); + if (commonProfile!=null){ + Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_Controller); + if (entityStype!=null){ + UMLUtil.safeApplyStereotype(entityCls, entityStype); + controller = UMLUtil.getStereotypeApplication(entityCls, Controller.class); + } + } + } + return controller; + } + + /** + * Get the processor of an Entity + * @param entityCls + * @return + */ + Processor getProcessor(NamedElement entityCls) { + Processor processor = null; + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName); + if (commonProfile!=null){ + Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_Processor); + if (entityStype!=null){ + UMLUtil.safeApplyStereotype(entityCls, entityStype); + processor = UMLUtil.getStereotypeApplication(entityCls, Processor.class); + } + } + } + return processor; + } + + /** + * Get the Data Subject of an Entity + * @param entityCls + * @return + */ + DataSubject getDataSubject(NamedElement entityCls) { + DataSubject dataSubject = null; + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName); + if (commonProfile!=null){ + Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_DataSubject); + if (entityStype!=null){ + UMLUtil.safeApplyStereotype(entityCls, entityStype); + dataSubject = UMLUtil.getStereotypeApplication(entityCls, DataSubject.class); + } + } + } + return dataSubject; + } + + /** + * Get the process of a CallBehaviorAction + * @param entityCls + * @return + */ + Process getProcess(CallBehaviorAction callBehaviorAction) { + Process process = null; + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + if (verifyProfilesApplied(profileList)) { + Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName); + if (commonProfile!=null){ + Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_Process); + if (entityStype!=null){ + UMLUtil.safeApplyStereotype(callBehaviorAction, entityStype); + process = UMLUtil.getStereotypeApplication(callBehaviorAction, Process.class); + } + } + } + return process; + } + + /** + * Safely apply the a stereotype to an ActivityParameterNode + * @param classifier + * @param stereotype + */ + public void applyStereotypeToActivityParameterNode(ActivityParameterNode activityPNode, String profileName, String stereotypeName) { + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + EList<Stereotype> appliedStypes = activityPNode.getAppliedStereotypes(); + if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && activityPNode!=null) { + Profile profile = getProfile(profileName); + if (profile!=null){ + Stereotype stereotype = profile.getOwnedStereotype(stereotypeName); + if (stereotype!=null && !appliedStypes.contains(stereotype)){ + UMLUtil.safeApplyStereotype(activityPNode, stereotype); + } + } + } + } + + /** + * Safely apply the a stereotype to a Classifier + * @param classifier + * @param profileName + * @param stereotypeName + */ + public void applyStereotypeToClassifier(Classifier classifier, String profileName, String stereotypeName) { + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + EList<Stereotype> appliedStypes = classifier.getAppliedStereotypes(); + if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && classifier!=null) { + Profile profile = getProfile(profileName); + if (profile!=null){ + Stereotype stereotype = profile.getOwnedStereotype(stereotypeName); + if (stereotype!=null && !appliedStypes.contains(stereotype)){ + UMLUtil.safeApplyStereotype(classifier, stereotype); + } + } + } + } + + /** + * Safely apply the a stereotype to a NamedElement + * @param namedElement + * @param profileName + * @param stereotypeName + */ + public void applyStereotypeToNamedElement(NamedElement namedElement, String profileName, String stereotypeName) { + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + EList<Stereotype> appliedStypes = namedElement.getAppliedStereotypes(); + if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && namedElement!=null) { + Profile profile = getProfile(profileName); + if (profile!=null){ + Stereotype stereotype = profile.getOwnedStereotype(stereotypeName); + if (stereotype!=null && !appliedStypes.contains(stereotype)){ + UMLUtil.safeApplyStereotype(namedElement, stereotype); + } + } + } + } + + /** + * Safely apply the a stereotype to an Action node + * @param action + * @param profileName + * @param stereotypeName + */ + public void applyStereotypeToAction(Action action, String profileName, String stereotypeName) { + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + EList<Stereotype> appliedStypes = action.getAppliedStereotypes(); + if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && action!=null) { + Profile profile = getProfile(profileName); + if (profile!=null){ + Stereotype stereotype = profile.getOwnedStereotype(stereotypeName); + if (stereotype!=null && !appliedStypes.contains(stereotype)){ + UMLUtil.safeApplyStereotype(action, stereotype); + } + } + } + } + + /** + * Apply the a stereotype to Pin + * @param pin + * @param profileName + * @param stereotypeName + */ + public void applyStereotypeToPin(Pin pin, String profileName, String stereotypeName) { + EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles(); + EList<Stereotype> appliedStypes = pin.getAppliedStereotypes(); + if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && pin!=null) { + Profile profile = getProfile(profileName); + if (profile!=null){ + Stereotype stereotype = profile.getOwnedStereotype(stereotypeName); + if (stereotype!=null && !appliedStypes.contains(stereotype)){ + UMLUtil.safeApplyStereotype(pin, stereotype); + } + } + } + } +} diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java index 2e7be81..151971d 100644 --- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java +++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java @@ -48,4 +48,6 @@ public class ModelProfileNames { public static String commonGDPR_PersonalData = "PersonalData"; public static String commonGDPR_Consent = "Consent"; + + public static String commonGDPR_PersonalDataBreach = "PersonalDataBreach"; } |