[Privacy Designer][Design] design strategies update - GDPR notifications
strategy
- New strategy to implement GDPR notifications (Art. 34) in case of
personal data breach.
Change-Id: Ib6317a6dd2a20b30a9807a44f3266af732333451
Signed-off-by: Gabriel Pedroza <gabriel.pedroza@cea.fr>
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 @@
* @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 @@
// 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 @@
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 @@
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.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 @@
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 @@
}
}
+ /**
+ * 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 static String commonGDPR_PersonalData = "PersonalData";
public static String commonGDPR_Consent = "Consent";
+
+ public static String commonGDPR_PersonalDataBreach = "PersonalDataBreach";
}