Bug 569548 - [PrivacyDesigner] add a view to see related requirements
Change-Id: Ibda243fd3ba823173bd04e2d8adba49dff581793
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java
new file mode 100644
index 0000000..47bba3f
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java
@@ -0,0 +1,40 @@
+package org.eclipse.papyrus.pdp4eng.req.profile.constraints;
+
+import java.util.Iterator;
+
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Stereotype;
+
+public class GDPRRequiementHelper {
+
+ public static boolean isGDPR_Requirement(Element element) {
+
+ for (Iterator<Stereotype> iterator = element.getAppliedStereotypes().iterator(); iterator.hasNext();) {
+ Stereotype type = (Stereotype) iterator.next();
+ if(isGDPRRequirementStereotype(type)) {
+ return true;
+ }
+
+ }
+ return false;
+ }
+
+ /**
+ * test if the stereotype is a SysML Requirement Stereotype
+ * @param stereotype a given stereotype
+ * @return return true if this is a SysML stereotype or inherits directly or indirectly from requirement
+ */
+ public static boolean isGDPRRequirementStereotype(Stereotype stereotype) {
+ if( "GDPRPrinciple".equals(stereotype.getName())){
+ return true;
+ }
+ for(org.eclipse.uml2.uml.Class superStereotype : stereotype.getSuperClasses()) {
+ if( superStereotype instanceof Stereotype){
+ if(isGDPRRequirementStereotype((Stereotype)superStereotype)){
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
index c1dede8..f84a6e0 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
@@ -23,13 +23,17 @@
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
import org.eclipse.uml2.uml.DirectedRelationship;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.resource.UMLResource;
+import org.eclipse.uml2.uml.util.UMLUtil;
public class TraceabilityIndexer {
private HashMap<Element,ArrayList<DirectedRelationship> > upwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
private HashMap<Element,ArrayList<DirectedRelationship> > downwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
+ private HashMap<Element,Element > ownerRequirement= new HashMap<Element, Element>();
+ private HashMap<Element,ArrayList<Element> > subRequirements= new HashMap<Element, ArrayList<Element>>();
private static TraceabilityIndexer instance=null;
public static TraceabilityIndexer getInstance() {
if( instance==null) {
@@ -43,14 +47,16 @@
public void loadTraceability(Element context) {
upwardTraceability.clear();
downwardTraceability.clear();
+ ownerRequirement.clear();
+ subRequirements.clear();
ResourceSet resourceSet=context.eResource().getResourceSet();
for(int i=0; i< resourceSet.getResources().size();i++) {
Resource resource = (Resource) resourceSet.getResources().get(i);
if( resource instanceof UMLResource) {
for (Iterator<EObject> iteratorObject = resource.getAllContents(); iteratorObject.hasNext();) {
- EObject ownedElement = (EObject) iteratorObject.next();
- if(ownedElement instanceof DirectedRelationship) {
- DirectedRelationship directedRelationship= (DirectedRelationship)ownedElement;
+ EObject currentEobject = (EObject) iteratorObject.next();
+ if(currentEobject instanceof DirectedRelationship) {
+ DirectedRelationship directedRelationship= (DirectedRelationship)currentEobject;
for (Iterator<Element> iterator = directedRelationship.getSources().iterator(); iterator.hasNext();) {
Element currentSource = (Element) iterator.next();
if( upwardTraceability.get(currentSource)!=null) {
@@ -74,11 +80,30 @@
}
}
}
+
+ // add also Owner and composed Requirements
+ if( currentEobject instanceof org.eclipse.uml2.uml.Class) {
+ if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentEobject, Requirement.class)!=null) {
+ org.eclipse.uml2.uml.Class currentReq=(org.eclipse.uml2.uml.Class)currentEobject;
+ if( currentReq.eContainer() instanceof org.eclipse.uml2.uml.Class) {
+ if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentReq.eContainer(), Requirement.class)!=null) {
+ org.eclipse.uml2.uml.Class parentReq=(org.eclipse.uml2.uml.Class)currentReq.eContainer();
+ ownerRequirement.put(currentReq, (org.eclipse.uml2.uml.Class)currentEobject.eContainer());
+
+ if( subRequirements.get(parentReq)==null) {
+ ArrayList<Element> subElements= new ArrayList<Element>();
+ subRequirements.put(parentReq, subElements);
+ }
+ subRequirements.get(parentReq).add(currentReq);
+ }
+ }
+ }
+ }
}
}
}
}
-
+
public ArrayList<DirectedRelationship> getUpwardTraceabiltiy(Element context){
return upwardTraceability.get(context);
}
@@ -86,4 +111,11 @@
public ArrayList<DirectedRelationship> getDownwardTraceabiltiy(Element context){
return downwardTraceability.get(context);
}
+ public Element getParentRequirement(Element currentElement) {
+ return ownerRequirement.get(currentElement);
+ }
+
+ public ArrayList<Element> getsubRequirements(Element currentElement) {
+ return subRequirements.get(currentElement);
+ }
}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
index 8e8f087..87e6ba4 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
@@ -14,7 +14,8 @@
org.eclipse.papyrus.pdp4eng.req.gdprananalysis;bundle-version="[1.0.0,2.0.0)",
org.eclipse.ui.workbench;bundle-version="[3.119.0,4.0.0)",
org.eclipse.papyrus.infra.gmfdiag.css;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.papyrus.pdp4eng.req.profile
+ org.eclipse.papyrus.pdp4eng.req.profile;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.papyrus.sysml14;bundle-version="[1.3.0,2.0.0)"
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.papyrus.pdp4eng.req.ui
Bundle-Activator: org.eclipse.papyrus.pdp4eng.req.ui.Activator
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
index 0795287..279f196 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
@@ -84,6 +84,18 @@
stylesheetPath="styles/RequirementsModel.css">
</stylesheet>
</extension>
+ <extension
+ point="org.eclipse.ui.views">
+ <view
+ allowMultiple="false"
+ category="org.eclipse.papyrus.views.category"
+ class="org.eclipse.papyrus.pdp4eng.req.ui.view.RequirementView"
+ icon="icons/working.png"
+ id="org.eclipse.papyrus.pdp4eng.req.ui.RequirementView"
+ name="Requirements View"
+ restorable="true">
+ </view>
+ </extension>
</plugin>
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java
new file mode 100644
index 0000000..d0b0f30
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java
@@ -0,0 +1,47 @@
+/**
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+/** this class is used to display as a menu if the stereotype shall filtered **/
+
+public class RequirementAction extends Action {
+
+ private Class<?> stereotype;
+ ArrayList<Class<?>> steretotypeFilter;
+
+ public RequirementAction(Class<?> stereotype, ArrayList<Class<?>> steretotypeFilter) {
+ super(stereotype.getSimpleName(), IAction.AS_CHECK_BOX);
+ this.setChecked(true);
+ this.stereotype = stereotype;
+ this.steretotypeFilter = steretotypeFilter;
+ }
+
+ @Override
+ public void run() {
+ if (this.isChecked()) {
+ if (!steretotypeFilter.contains(stereotype)) {
+ steretotypeFilter.add(stereotype);
+ }
+ } else {
+ steretotypeFilter.remove(stereotype);
+ }
+ System.out.println(steretotypeFilter);
+ }
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java
new file mode 100644
index 0000000..291e447
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java
@@ -0,0 +1,227 @@
+/**
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.papyrus.infra.ui.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Accuracy;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataMinimisation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Fairly;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByConsent;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByLegalObligation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByPublicInterest;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByVitalInterest;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PurposeLimitation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.SecuritySafety;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.StorageLimitation;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+/**
+ * This class is the requirements view that displays requirements that are associated to the selected element.
+ *
+ */
+public class RequirementView extends ViewPart implements ITabbedPropertySheetPageContributor {
+
+ private TreeViewer viewer;
+ // list of stereotype to filter
+ private ArrayList<Class<?>> steretotypeFilter = new ArrayList<>();
+ private List<IPropertySheetPage> propertySheetPages = new ArrayList<>();
+
+ private static FontData[] getModifiedFontData(FontData[] originalData, int additionalStyle) {
+ FontData[] styleData = new FontData[originalData.length];
+ for (int i = 0; i < styleData.length; i++) {
+ FontData base = originalData[i];
+ styleData[i] = new FontData(base.getName(), base.getHeight(), base.getStyle() | additionalStyle);
+ }
+ return styleData;
+ }
+
+ public RequirementView() {
+ steretotypeFilter.add(Requirement.class);
+ steretotypeFilter.add(Lawful.class);
+ steretotypeFilter.add(LawfulByConsent.class);
+ steretotypeFilter.add(LawfulByContract.class);
+ steretotypeFilter.add(LawfulByLegalObligation.class);
+ steretotypeFilter.add(LawfulByPublicInterest.class);
+ steretotypeFilter.add(LawfulByVitalInterest.class);
+ steretotypeFilter.add(Fairly.class);
+ steretotypeFilter.add(org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Transparency.class);
+ steretotypeFilter.add(Accuracy.class);
+ steretotypeFilter.add(DataMinimisation.class);
+ steretotypeFilter.add(PurposeLimitation.class);
+ steretotypeFilter.add(StorageLimitation.class);
+ steretotypeFilter.add(SecuritySafety.class);
+
+
+ }
+
+ /**
+ * create action in the view in order to filter stereotypes
+ */
+ public void createActions() {
+ IMenuManager mainMenu = getViewSite().getActionBars().getMenuManager();
+ MenuManager GDPRmenu = new MenuManager("GDPR requirement", "GDPR.requirement.menu"); //$NON-NLS-1$ //$NON-NLS-2$
+ for (int i = 0; i < steretotypeFilter.size(); i++) {
+ GDPRmenu.add(new RequirementAction(steretotypeFilter.get(i), steretotypeFilter));
+ mainMenu.add(GDPRmenu);
+ }
+ }
+
+
+
+ @Override
+ public void createPartControl(Composite parent) {
+ viewer = new TreeViewer(parent, SWT.MULTI | SWT.FULL_SELECTION);
+ viewer.setContentProvider(new ReviewsTreeContentProvider(steretotypeFilter));
+
+ // useful for the label provider
+ FontData[] boldFontData = getModifiedFontData(viewer.getTree().getFont().getFontData(), SWT.BOLD);
+ FontData[] italicFontData = getModifiedFontData(viewer.getTree().getFont().getFontData(), SWT.ITALIC);
+ Font boldFont = new Font(Display.getCurrent(), boldFontData);
+ Font italicFont = new Font(Display.getCurrent(), italicFontData);
+ // set label provider
+ viewer.setLabelProvider(new ReviewsTreeLabelProvider(boldFont, italicFont));
+ createActions();
+
+ Listener paintListener = makeTreeItemMultiline();
+ viewer.getTree().addListener(SWT.MeasureItem, paintListener);
+ viewer.getTree().addListener(SWT.EraseItem, paintListener);
+
+ // used to synchronize the selection on this view
+ getSite().setSelectionProvider(viewer);
+ ISelectionListener mylistener = new ISelectionListener() {
+ @Override
+ public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) {
+ if (sourcepart != RequirementView.this && selection instanceof IStructuredSelection) {
+ viewer.setInput(((IStructuredSelection) selection).getFirstElement());
+ }
+ }
+ };
+ getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(mylistener);
+
+ }
+
+ private Listener makeTreeItemMultiline() {
+ // this code comes from eclipse in oder to display multi line in a tree
+ Listener paintListener = new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ switch (event.type) {
+ case SWT.MeasureItem: {
+ TreeItem item = (TreeItem) event.item;
+ String text = item.getText();
+ Point size = event.gc.textExtent(text);
+ event.width = size.x + 20;
+ event.height = Math.max(event.height, size.y);
+ break;
+ }
+ case SWT.PaintItem: {
+ TreeItem item = (TreeItem) event.item;
+ String text = item.getText();
+ Point size = event.gc.textExtent(text);
+ int offset2 = event.index == 0 ? Math.max(0, (event.height - size.y) / 2) : 0;
+ event.gc.drawText(text, event.x, event.y + offset2, true);
+ break;
+ }
+ case SWT.EraseItem: {
+ event.detail &= ~SWT.FOREGROUND;
+ break;
+ }
+ }
+ }
+ };
+ return paintListener;
+ }
+
+ @Override
+ public String getContributorId() {
+ return "org.eclipse.papyrus.pdp4eng.req.ui.RequirementView"; //$NON-NLS-1$
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ @Override
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public Object getAdapter(Class adapter) {
+ if ((IPropertySheetPage.class.equals(adapter))) {
+ return getPropertySheetPage();
+ }
+
+ else {
+ return super.getAdapter(adapter);
+ }
+ }
+
+ /**
+ * Retrieves the {@link IPropertySheetPage} that his Model Explorer uses.
+ *
+ * @return
+ */
+ private IPropertySheetPage getPropertySheetPage() {
+ IWorkbenchPart part = null;
+ try {
+ IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (activeWorkbenchWindow != null) {
+ IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+ if (activePage != null) {
+ part = activePage.getActiveEditor();
+ }
+ }
+ } catch (NullPointerException e) {
+ // An element is not active yet
+ return null;
+ }
+
+
+ if (part instanceof IMultiDiagramEditor) {
+ if (part instanceof ITabbedPropertySheetPageContributor) {
+ ITabbedPropertySheetPageContributor contributor = (ITabbedPropertySheetPageContributor) part;
+ IPropertySheetPage propertySheetPage = new TabbedPropertySheetPage(contributor);
+ this.propertySheetPages.add(propertySheetPage);
+ return propertySheetPage;
+ }
+ }
+ return null;
+ }
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java
new file mode 100644
index 0000000..a31c46f
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java
@@ -0,0 +1,133 @@
+/**
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.pdp4eng.req.profile.constraints.TraceabilityIndexer;
+import org.eclipse.uml2.uml.DirectedRelationship;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ * This is the content provider to display reviews in the review editor
+ *
+ */
+public class ReviewsTreeContentProvider implements ITreeContentProvider {
+
+ private static Object[] EMPTY = {};
+ private ArrayList<Class<?>> stereotypeFilter;
+
+ public ReviewsTreeContentProvider(ArrayList<Class<?>> stereotypeFilter) {
+ this.stereotypeFilter = stereotypeFilter;
+ }
+
+ @Override
+ public void dispose() {
+
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+
+ EObject eobject = EMFHelper.getEObject(inputElement);
+
+ if (eobject instanceof Element) {
+ TraceabilityIndexer.getInstance().loadTraceability((Element) eobject);
+ ArrayList<Element> result = new ArrayList<>();
+ if (TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) eobject) != null) {
+
+ ArrayList<DirectedRelationship> links = TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) eobject);
+ for (Iterator<DirectedRelationship> iterator = links.iterator(); iterator.hasNext();) {
+ DirectedRelationship directedRelationship = iterator.next();
+ result.addAll(directedRelationship.getTargets());
+ }
+ }
+ if (TraceabilityIndexer.getInstance().getParentRequirement((Element) eobject) != null) {
+ result.add(TraceabilityIndexer.getInstance().getParentRequirement((Element) eobject));
+ }
+ // return result.toArray();
+ return filter(result).toArray();
+
+ }
+
+ return EMPTY;
+ }
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ return computeChildreen(parentElement);
+ }
+
+ private Object[] computeChildreen(Object parentElement) {
+ ArrayList<Element> result = new ArrayList<>();
+ if (parentElement instanceof Element) {
+ if (TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) parentElement) != null) {
+ ArrayList<DirectedRelationship> links = TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) parentElement);
+ for (Iterator<DirectedRelationship> iterator = links.iterator(); iterator.hasNext();) {
+ DirectedRelationship directedRelationship = iterator.next();
+ result.addAll(directedRelationship.getTargets());
+
+ }
+ }
+ if (TraceabilityIndexer.getInstance().getParentRequirement((Element) parentElement) != null) {
+ result.add(TraceabilityIndexer.getInstance().getParentRequirement((Element) parentElement));
+ }
+ }
+ // return result.toArray();
+ return filter(result).toArray();
+ }
+
+ @Override
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+
+ return computeChildreen(element).length > 0;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected HashSet<Element> filter(Collection<Element> collection) {
+ HashSet<Element> result = new HashSet<>();
+ for (Iterator<Element> iterElement = collection.iterator(); iterElement.hasNext();) {
+ Element currentElement = iterElement.next();
+ for (Iterator<Class<?>> iterator = stereotypeFilter.iterator(); iterator.hasNext();) {
+ Class<?> stereoClass = iterator.next();
+ if (UMLUtil.getStereotypeApplication(currentElement, (Class) stereoClass) != null) {
+ result.add(currentElement);
+ }
+
+ }
+
+ }
+ return result;
+ }
+
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java
new file mode 100644
index 0000000..6bb7ef4
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java
@@ -0,0 +1,106 @@
+/**
+ * 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.papyrus.pdp4eng.req.profile.constraints.GDPRRequiementHelper;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.TextStyle;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ *
+ * This is the label provider to display requirements in the view
+ */
+public class ReviewsTreeLabelProvider extends StyledCellLabelProvider {
+ protected Font italicFont;
+ protected Font boldFont;
+ private Styler fBoldStyler;
+ private Styler fItalicStyler;
+
+ /**
+ * constructor
+ *
+ * @param boldFont
+ * @param italicFont
+ */
+ public ReviewsTreeLabelProvider(final Font boldFont, final Font italicFont) {
+ this.boldFont = boldFont;
+ this.italicFont = italicFont;
+ // Multi-font support only works in JFace 3.5 and above (specifically, 3.5 M4 and above).
+ // With JFace 3.4, the font information (bold in this example) will be ignored.
+
+ fBoldStyler = new Styler() {
+
+ @Override
+ public void applyStyles(TextStyle textStyle) {
+ textStyle.font = boldFont;
+
+ }
+ };
+ fItalicStyler = new Styler() {
+
+ @Override
+ public void applyStyles(TextStyle textStyle) {
+ textStyle.font = italicFont;
+
+ }
+ };
+ }
+
+
+ /**
+ * update visual appearance of a cell
+ */
+ @Override
+ public void update(ViewerCell cell) {
+ Object obj = cell.getElement();
+
+ if (obj instanceof org.eclipse.uml2.uml.NamedElement) {
+ NamedElement namedElement = (NamedElement) obj;
+ StyledString styledString = new StyledString(""); //$NON-NLS-1$
+ // if no name
+ if (((org.eclipse.uml2.uml.NamedElement) obj).getName() == null) {
+ styledString.append("###"); //$NON-NLS-1$
+
+ } else {
+ // it has a name
+ styledString.append(((org.eclipse.uml2.uml.NamedElement) obj).getName() + ": ", fBoldStyler); //$NON-NLS-1$
+ Requirement reqStereotypeAppli = UMLUtil.getStereotypeApplication(namedElement, Requirement.class);
+ // this is a stereotype
+ if (reqStereotypeAppli != null) {
+ styledString.append(reqStereotypeAppli.getText(), fItalicStyler);
+ }
+ }
+
+ cell.setBackground(new Color(Display.getCurrent(), 255, 255, 200));
+ cell.setText(styledString.toString());
+ cell.setStyleRanges(styledString.getStyleRanges());
+ // this is a GDPR requirement
+ if (GDPRRequiementHelper.isGDPR_Requirement(namedElement)) {
+ cell.setBackground(new Color(Display.getCurrent(), 51, 204, 255));
+ }
+ }
+ super.update(cell);
+ }
+
+}