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