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