diff options
| author | Laurent Fasani | 2015-03-16 15:32:51 +0000 |
|---|---|---|
| committer | Laurent Fasani | 2015-03-19 16:35:28 +0000 |
| commit | 06869d533750ac258d9a673cbb5a263ba532aef7 (patch) | |
| tree | edbe198492e04b0552b916e8006b5679bbbbddad | |
| parent | 5970f86a46468f349f844dd9a4d691c0239b447d (diff) | |
| download | org.eclipse.sirius-06869d533750ac258d9a673cbb5a263ba532aef7.tar.gz org.eclipse.sirius-06869d533750ac258d9a673cbb5a263ba532aef7.tar.xz org.eclipse.sirius-06869d533750ac258d9a673cbb5a263ba532aef7.zip | |
[462213] Better update DAnalysisSessionImpl semantic resources
Correctly update controlled resource at semantic resource removal.
Make Session.getSemanticResources coherent following controlled
resources update.
Bug: 462213
Change-Id: Ib25cb9e54e10df360ddeb3b4928251bb4a607afc
Signed-off-by: Laurent Fasani <laurent.fasani@obeo.fr>
3 files changed, 41 insertions, 11 deletions
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ControlledResourcesDetector.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ControlledResourcesDetector.java index 965e6927a3..4354dba9d6 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ControlledResourcesDetector.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ControlledResourcesDetector.java @@ -12,7 +12,8 @@ package org.eclipse.sirius.business.internal.session.danalysis; import java.util.ArrayList; import java.util.Collection; -import java.util.LinkedHashSet; +import java.util.List; +import java.util.ListIterator; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.notify.Notification; @@ -86,21 +87,31 @@ public class ControlledResourcesDetector extends ResourceSetListenerImpl { * Detects controlled resources and update controlledResourcesList in * {@link DAnalysisSessionImpl}. */ - public void detectControlledResources() { + void detectControlledResources() { final Collection<Resource> semantics = session.getSemanticResources(); final Collection<Resource> resourcesToCheck = new ArrayList<Resource>(session.getTransactionalEditingDomain().getResourceSet().getResources()); - Collection<Resource> newControlledResources = new LinkedHashSet<Resource>(); - Collection<Resource> controlledResources = new ArrayList<Resource>(session.getControlledResources()); + List<Resource> controlledResources = session.getControlledResources(); + List<Resource> controlledResourcesBefore = new ArrayList<Resource>(session.getControlledResources()); + + // add controlled resource for (final Resource resource : Iterables.filter(resourcesToCheck, Predicates.not(Predicates.in(controlledResources)))) { - if (hasControlledRootInSemantics(resource, semantics) && !controlledResources.contains(resource)) { - newControlledResources.add(resource); + if (hasControlledRootInSemantics(resource, semantics)) { + controlledResources.add(resource); session.registerResourceInCrossReferencer(resource); } } - if (!newControlledResources.isEmpty()) { - session.getControlledResources().addAll(newControlledResources); + // remove controlled resource if it is not in the resourceSet anymore + ListIterator<Resource> listIterator = controlledResources.listIterator(); + while (listIterator.hasNext()) { + Resource resource = listIterator.next(); + if (!resourcesToCheck.contains(resource)) + listIterator.remove(); + } + + if (!controlledResourcesBefore.equals(controlledResources)) { session.notifyListeners(SessionListener.SEMANTIC_CHANGE); + session.setSemanticResourcesNotUptodate(); } } diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java index 48176e54c1..d5f307b7c6 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java @@ -691,6 +691,14 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements return result; } + /** + * Allow semanticResources to be recomputed when calling + * <code>getSemanticResources()</code>. + */ + void setSemanticResourcesNotUptodate() { + tracker.setSemanticResourcesNotUptodate(); + } + @Override public Collection<Resource> getSemanticResources() { if (tracker != null) { @@ -738,6 +746,8 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements res.unload(); enableCrossReferencerResolve(res); } + + tracker.detectControlledResources(); } void discoverAutomaticallyLoadedSemanticResources(List<Resource> allResources) { @@ -1324,7 +1334,7 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements } flushOperations(transactionalEditingDomain); // Unload all referenced resources - unloadResources(); + unloadAllResources(); if (disposeEditingDomainOnClose) { // To remove remaining resource like environment:/viewpoint for (Resource resource : new ArrayList<Resource>(resourceSet.getResources())) { @@ -1423,7 +1433,7 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements * Method called at {@link Session#close(IProgressMonitor)} to unload all * referenced {@link Resource}s. */ - private void unloadResources() { + private void unloadAllResources() { ResourceSet rs = transactionalEditingDomain.getResourceSet(); for (Resource resource : getAllSessionResources()) { resource.unload(); diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesTracker.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesTracker.java index 017d1aeea8..46d988ea5c 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesTracker.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesTracker.java @@ -138,6 +138,15 @@ class SessionResourcesTracker { } /** + * Allow semanticResources to be recomputed when calling + * <code>getSemanticResources()</code>. + */ + void setSemanticResourcesNotUptodate() { + semanticResources.clear(); + semanticResources = null; + } + + /** * Return the root EObject associated to the resource. The root EObject is * part of {@link DAnalysis.getModels} * @@ -145,7 +154,7 @@ class SessionResourcesTracker { * the URI of the resource * @return the eObject */ - public EObject getRootObjectFromResourceURI(String resourceURI) { + EObject getRootObjectFromResourceURI(String resourceURI) { return semanticResourcesUpdater.getRootObjectFromResourceURI(resourceURI); } |
