From 3dbfb0d2173be7d86f5ac447e574a659767c5dc9 Mon Sep 17 00:00:00 2001 From: Simon Barner <barner@fortiss.org> Date: Tue, 2 Sep 2014 12:45:09 +0000 Subject: [PATCH] Fix NPE when deleting components while the Annotation view is visible: - Ignore update requests for elements that are not hook to a top-level element, e.g. SET events that are fired when a component is removed (before the actual REMOVE event). - Otherwise, the AnnotationValueService would create an NPE during the preparation of the context via KernelModelElementUtils.runAsCommand() refs 1841 --- .../annotation/view/AnnotationViewPartBase.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java index 3cd49b114..434d89be0 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationViewPartBase.java @@ -38,6 +38,7 @@ import org.fortiss.tooling.base.ui.annotation.IAnnotationValueService; import org.fortiss.tooling.base.ui.editpart.DiagramEditPartBase; import org.fortiss.tooling.base.ui.editpart.ElementEditPartBase; import org.fortiss.tooling.kernel.model.IProjectRootElement; +import org.fortiss.tooling.kernel.service.IPersistencyService; import org.fortiss.tooling.kernel.ui.util.SelectionUtils; import org.fortiss.tooling.kernel.utils.EcoreUtils; @@ -71,12 +72,19 @@ public abstract class AnnotationViewPartBase extends ViewPart implements ISelect private final Adapter changeListener = new AdapterImpl() { @Override public void notifyChanged(Notification notification) { - if((notification.getEventType() == Notification.ADD) || - (notification.getEventType() == Notification.REMOVE || (notification - .getEventType() == Notification.SET))) { + if(notification.getEventType() == Notification.ADD || + notification.getEventType() == Notification.REMOVE || + notification.getEventType() == Notification.SET) { Object notifier = notification.getNotifier(); - if(notifier instanceof IModelElement) { + if((notifier instanceof IModelElement) && + (IPersistencyService.INSTANCE + .getTopLevelElementFor((IModelElement)notifier) != null)) { + // Ignore update requests for elements that are not hook to a top-level element, + // e.g. SET events that are fired when a component is removed (before the actual + // REMOVE event). Otherwise, the AnnotationValueService would create a NPE + // during the preparation of the context via + // KernelModelElementUtils.runAsCommand(). update((IModelElement)notifier); } } -- GitLab