From 82af5b2da754e81dff3555804356ed5a3774b651 Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Tue, 24 May 2011 15:49:07 +0000
Subject: [PATCH] Removed concurrent modification bug.

---
 .../kernel/internal/PersistencyService.java   | 13 ++++++--
 .../internal/navigator/NavigatorViewPart.java | 16 +++++++++-
 .../EclipseResourceStorageProvider.java       | 32 +++++++++++--------
 3 files changed, 44 insertions(+), 17 deletions(-)

diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/PersistencyService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/PersistencyService.java
index 0e4c389ae..a0600e968 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/PersistencyService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/PersistencyService.java
@@ -19,6 +19,7 @@ package org.fortiss.tooling.kernel.internal;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -51,7 +52,9 @@ public class PersistencyService implements IPersistencyService {
 	public PersistencyService() {
 		// TODO (FH): replace with extension mechanism
 		IStorageProvider provider = new EclipseResourceStorageProvider();
-		storageProviderCache.put(provider, provider.getTopLevelElements());
+		storageProviderCache.put(provider, new LinkedList<EObject>());
+		storageProviderCache.get(provider).addAll(
+				provider.getTopLevelElements());
 
 		refreshAllProviderElements();
 	}
@@ -74,10 +77,10 @@ public class PersistencyService implements IPersistencyService {
 		}
 		List<EObject> elementCache = storageProviderCache.get(provider);
 		List<EObject> providedElements = provider.getTopLevelElements();
+		List<EObject> removedCacheElements = new LinkedList<EObject>();
 		for (EObject top : elementCache) {
 			if (!providedElements.contains(top)) {
-				elementCache.remove(top);
-				notifyListenersAboutRemove(top);
+				removedCacheElements.add(top);
 			}
 		}
 		for (EObject top : providedElements) {
@@ -86,6 +89,10 @@ public class PersistencyService implements IPersistencyService {
 				notifyListenersAboutAdd(top);
 			}
 		}
+		for (EObject top : removedCacheElements) {
+			elementCache.remove(top);
+			notifyListenersAboutRemove(top);
+		}
 	}
 
 	/** Refreshes all providers' top-level elements. */
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java
index b1d43b138..77998a6ee 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java
@@ -47,6 +47,7 @@ import org.eclipse.ui.views.properties.IPropertySheetPage;
 import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
 import org.fortiss.tooling.kernel.interfaces.ICustomMenuContributor;
+import org.fortiss.tooling.kernel.interfaces.ITopLevelElementChangeListener;
 import org.fortiss.tooling.kernel.internal.NavigatorService;
 import org.fortiss.tooling.kernel.services.IActionService;
 import org.fortiss.tooling.kernel.services.IContextMenuService;
@@ -66,7 +67,8 @@ import org.fortiss.tooling.kernel.util.EObjectSelectionUtils;
  */
 public final class NavigatorViewPart extends ViewPart implements
 		ISelectionListener, ISelectionChangedListener, IDoubleClickListener,
-		ITabbedPropertySheetPageContributor, ICustomMenuContributor {
+		ITabbedPropertySheetPageContributor, ICustomMenuContributor,
+		ITopLevelElementChangeListener {
 
 	/** Stores the TreeViewer. */
 	private TreeViewer viewer;
@@ -209,4 +211,16 @@ public final class NavigatorViewPart extends ViewPart implements
 		result.add(new NewMenu());
 		return result;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void topLevelElementAdded(EObject topLevelElement) {
+		updateUI.schedule();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void topLevelElementRemoved(EObject topLevelElement) {
+		updateUI.schedule();
+	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/storage/eclipse/EclipseResourceStorageProvider.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/storage/eclipse/EclipseResourceStorageProvider.java
index 992b4aa09..57cce8c47 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/storage/eclipse/EclipseResourceStorageProvider.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/storage/eclipse/EclipseResourceStorageProvider.java
@@ -102,21 +102,30 @@ public class EclipseResourceStorageProvider implements IStorageProvider,
 				event.getDelta().accept(new IResourceDeltaVisitor() {
 					@Override
 					public boolean visit(IResourceDelta delta) {
-						if ((delta.getFlags() & IResourceDelta.CONTENT) == 0) {
-							return true;
-						}
-
 						if (delta.getResource() instanceof IFile
-								&& isLoaded((IFile) delta.getResource())) {
-							if (delta.getKind() == IResourceDelta.REMOVED) {
+								&& delta.getResource().getParent() instanceof IProject
+								&& delta.getResource().getFileExtension()
+										.equals("af3_20")) {
+							IFile file = (IFile) delta.getResource();
+							if (delta.getKind() == IResourceDelta.ADDED) {
+								try {
+									loadContext(file);
+								} catch (IOException ioex) {
+									LoggingUtils.error(
+											ToolingKernelActivator.getDefault(),
+											"Had an error during reloading the file!",
+											ioex);
+								}
+							} else if (delta.getKind() == IResourceDelta.REMOVED
+									&& isLoaded(file)) {
 								unloadContext((IFile) delta.getResource());
-								// Refresh the top-level elements
-								IPersistencyService.INSTANCE
-										.refreshTopLevelElements(EclipseResourceStorageProvider.this);
 							} else if (delta.getKind() == IResourceDelta.CHANGED) {
-								// this also refreshes top-level elements
 								handleChange((IFile) delta.getResource());
 							}
+
+							// Refresh the top-level elements
+							IPersistencyService.INSTANCE
+									.refreshTopLevelElements(EclipseResourceStorageProvider.this);
 						}
 						return true;
 					}
@@ -163,9 +172,6 @@ public class EclipseResourceStorageProvider implements IStorageProvider,
 						}
 					}
 
-					// Refresh the top-level elements
-					IPersistencyService.INSTANCE
-							.refreshTopLevelElements(EclipseResourceStorageProvider.this);
 				}
 			});
 		}
-- 
GitLab