Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Fasani2015-03-16 15:32:51 +0000
committerLaurent Fasani2015-03-19 16:35:28 +0000
commit06869d533750ac258d9a673cbb5a263ba532aef7 (patch)
treeedbe198492e04b0552b916e8006b5679bbbbddad
parent5970f86a46468f349f844dd9a4d691c0239b447d (diff)
downloadorg.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>
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ControlledResourcesDetector.java27
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java14
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesTracker.java11
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);
}

Back to the top