From 51bad1cd7cb970da22f56c6c228a98365cf09427 Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Tue, 24 Oct 2023 12:01:56 +0200
Subject: [PATCH] Avoid ConcurrentModificationException in MarkerService::UIJob

Issue-Ref: 4339
Issue-Url: https://git.fortiss.org/af3/af3/-/issues/4339

Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../src/org/fortiss/tooling/kernel/ui/internal/.ratings       | 2 +-
 .../org/fortiss/tooling/kernel/ui/internal/MarkerService.java | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
index 3815c093e..35a940aa5 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
@@ -1,6 +1,6 @@
 ActionService.java e29126b5947c9fd2f1d82bb87001b9d0ead50c3b GREEN
 ContextMenuService.java 752ecb95721c4ff31583095bdb06b71ef28c4dcf GREEN
-MarkerService.java 5cc84f9c1e9811100fad92c0abfa934613173c06 GREEN
+MarkerService.java 9715b5ef55ba8c81759dbb914d99a018fcdd2429 GREEN
 ModelEditorBindingService.java f304addb514cd2de443997e0b52cef7a3a9897bf GREEN
 ModelElementHandlerService.java 34adeef844bf98c69f1b9a7252f34d0a2b741b54 GREEN
 NavigatorService.java 1d773dde3791ddf7051616fe249558e7e307757d GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java
index 5cc84f9c1..9715b5ef5 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java
@@ -265,7 +265,9 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene
 			public IStatus runInUIThread(IProgressMonitor monitor) {
 				for(EObject eo : violationsMap.keySet()) {
 					postRefreshNotification(eo);
-					for(IConstraintViolation<? extends EObject> viol : violationsMap.get(eo)) {
+					// Create copy of list since it might be updated in parallel to the UI update.
+					for(IConstraintViolation<? extends EObject> viol : new ArrayList<>(
+							getCachedList(eo))) {
 						postRefreshNotification(viol.getSource());
 					}
 				}
-- 
GitLab