Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxime Porhel2015-06-12 12:44:19 +0000
committerMaxime Porhel2015-06-15 15:10:17 +0000
commitd785f7cfa96e16b46f1aaea6c6e2723abdf534e6 (patch)
tree49052a8c5a427b2865c101407d160a80cc0c0f6f
parentb81d0ff6d39daabdbef6e19ac8323219a38ee698 (diff)
downloadorg.eclipse.sirius-d785f7cfa96e16b46f1aaea6c6e2723abdf534e6.tar.gz
org.eclipse.sirius-d785f7cfa96e16b46f1aaea6c6e2723abdf534e6.tar.xz
org.eclipse.sirius-d785f7cfa96e16b46f1aaea6c6e2723abdf534e6.zip
[470083] Add adapters on new referenced analysis after reload
And also control the order of the workspace impacting notifications to place the representation files changes after the semantic files changes. The previous order was the folder/project children resources order (by name), it used to forbid the controlled resource detection after an external control. Bug: 470083 Change-Id: Ide94d65d6338f1636690e5d47875c96710285c4c Signed-off-by: Maxime Porhel <maxime.porhel@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java4
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/RepresentationsChangeAdapter.java10
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesSynchronizer.java21
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesTracker.java38
4 files changed, 57 insertions, 16 deletions
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 537bf2bab9..54810475ae 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
@@ -684,8 +684,8 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
ControlledResourcesDetector.refreshControlledResources(this);
}
- void discoverAutomaticallyLoadedSemanticResources(List<Resource> allResources) {
- SessionResourcesTracker.addAutomaticallyLoadedResourcesToSemanticResources(this, allResources);
+ void discoverAutomaticallyLoadedResources(List<Resource> allResources) {
+ SessionResourcesTracker.manageAutomaticallyLoadedResources(this, allResources);
}
// *******************
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/RepresentationsChangeAdapter.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/RepresentationsChangeAdapter.java
index 200e8df85d..e5156c3de4 100644
--- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/RepresentationsChangeAdapter.java
+++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/RepresentationsChangeAdapter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010 THALES GLOBAL SERVICES.
+ * Copyright (c) 2010, 2015 THALES GLOBAL SERVICES.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -99,7 +99,9 @@ public class RepresentationsChangeAdapter extends AdapterImpl {
* the analysis
*/
public void registerAnalysis(final DAnalysis analysis) {
- analysis.eAdapters().add(this);
+ if (!analysis.eAdapters().contains(this)) {
+ analysis.eAdapters().add(this);
+ }
for (final DView view : analysis.getOwnedViews()) {
registerView(view);
}
@@ -127,7 +129,9 @@ public class RepresentationsChangeAdapter extends AdapterImpl {
* the editor
*/
private void registerView(final DView view) {
- view.eAdapters().add(this);
+ if (!view.eAdapters().contains(this)) {
+ view.eAdapters().add(this);
+ }
}
/**
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesSynchronizer.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesSynchronizer.java
index 1ce3c1f67a..6d641bb70b 100644
--- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesSynchronizer.java
+++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/SessionResourcesSynchronizer.java
@@ -14,6 +14,7 @@ import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@@ -215,9 +216,9 @@ public class SessionResourcesSynchronizer implements ResourceSyncClient {
session.sessionResourceReloaded(resource);
}
}
- // Add the unknown resources to the semantic resources of this
- // session.
- session.discoverAutomaticallyLoadedSemanticResources(resourcesBeforeReload);
+ // Analyze the unknown resources to detect new semantic or
+ // session resources.
+ session.discoverAutomaticallyLoadedResources(resourcesBeforeReload);
session.notifyListeners(SessionListener.REPLACED);
}
} catch (InterruptedException e) {
@@ -288,12 +289,18 @@ public class SessionResourcesSynchronizer implements ResourceSyncClient {
private Multimap<ResourceStatus, Resource> getImpactingNewStatuses(Collection<ResourceStatusChange> changes) {
Multimap<ResourceStatus, Resource> impactingNewStatuses = LinkedHashMultimap.create();
- Iterable<Resource> resources = getAllSessionResources();
+ Multimap<ResourceStatus, Resource> representationResourcesNewStatuses = LinkedHashMultimap.create();
+ Iterable<Resource> semanticOrControlledresources = getAllSemanticResources();
+ Set<Resource> representationResources = session.getAllSessionResources();
for (ResourceStatusChange change : changes) {
- if (session.isResourceOfSession(change.getResource(), resources)) {
+ if (session.isResourceOfSession(change.getResource(), semanticOrControlledresources)) {
impactingNewStatuses.put(change.getNewStatus(), change.getResource());
+ } else if (session.isResourceOfSession(change.getResource(), representationResources)) {
+ representationResourcesNewStatuses.put(change.getNewStatus(), change.getResource());
}
}
+ // Add session resource impacting status after semantic ones.
+ impactingNewStatuses.putAll(representationResourcesNewStatuses);
return impactingNewStatuses;
}
@@ -301,4 +308,8 @@ public class SessionResourcesSynchronizer implements ResourceSyncClient {
return Iterables.concat(session.getSemanticResources(), session.getAllSessionResources(), session.getControlledResources());
}
+ private Iterable<Resource> getAllSemanticResources() {
+ return Iterables.concat(session.getSemanticResources(), session.getControlledResources());
+ }
+
}
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 eb388cb2f1..c1fa77e0b3 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
@@ -13,6 +13,7 @@ package org.eclipse.sirius.business.internal.session.danalysis;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -38,6 +39,7 @@ import org.eclipse.sirius.viewpoint.SiriusPlugin;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
@@ -94,7 +96,7 @@ class SessionResourcesTracker {
// Add the unknown resources to the semantic resources of this
// session.
- addAutomaticallyLoadedResourcesToSemanticResources(session, resourcesBeforeLoadOfSession);
+ manageAutomaticallyLoadedResources(session, resourcesBeforeLoadOfSession);
monitor.worked(1);
DslCommonPlugin.PROFILER.stopWork(SiriusTasksKey.RESOLVE_ALL_KEY);
@@ -217,8 +219,10 @@ class SessionResourcesTracker {
}
/**
- * Check the resources in the resourceSet and add all new resources as
- * semantic resources of this session. New resources are :
+ * Check the resources in the resourceSet. Detect new resources and add them
+ * to the session as new semantic resources or referenced session resources.<BR>
+ * <BR>
+ * New semantic resources are :
* <UL>
* <LI>Resources that are not in the <code>knownResources</code> list</LI>
* <LI>Resources that are not in the semantic resources of this session</LI>
@@ -226,23 +230,45 @@ class SessionResourcesTracker {
* resources of this session</LI>
* <LI>Resources that are not the Sirius environment resource</LI>
* </UL>
+ * <BR>
+ * New referenced session resources are :
+ * <UL>
+ * <LI>Resources that are not in the <code>knownResources</code> list</LI>
+ * <LI>Resources that are in the referenced representations files resources
+ * of this session (the list is computed from the allAnalyses() result)</LI>
+ * </UL>
*
* @param knownResources
* List of resources that is already loaded before the resolveAll
* of the representations file load.
*/
- static void addAutomaticallyLoadedResourcesToSemanticResources(final DAnalysisSessionImpl session, List<Resource> knownResources) {
+ static void manageAutomaticallyLoadedResources(final DAnalysisSessionImpl session, List<Resource> knownResources) {
TransactionalEditingDomain domain = session.getTransactionalEditingDomain();
List<Resource> resourcesAfterLoadOfSession = Lists.newArrayList(domain.getResourceSet().getResources());
// Remove the known resources
Iterators.removeAll(resourcesAfterLoadOfSession.iterator(), knownResources);
+
+ if (resourcesAfterLoadOfSession.isEmpty()) {
+ return;
+ }
+
+ Set<Resource> referencedSessionResources = session.getReferencedSessionResources();
+ Collection<Resource> newReferencedSessionResources = Lists.newArrayList(Iterables.filter(resourcesAfterLoadOfSession, Predicates.in(referencedSessionResources)));
+ if (!newReferencedSessionResources.isEmpty()) {
+ for (Resource newReferencedSessionResource : newReferencedSessionResources) {
+ session.registerResourceInCrossReferencer(newReferencedSessionResource);
+ for (DAnalysis refAnalysis : Iterables.filter(newReferencedSessionResource.getContents(), DAnalysis.class)) {
+ session.addAdaptersOnAnalysis(refAnalysis);
+ }
+ }
+ }
+
// Remove the known semantic resources
Iterators.removeAll(resourcesAfterLoadOfSession.iterator(), session.getSemanticResources());
// Remove the known referenced representations file resources
- Iterators.removeAll(resourcesAfterLoadOfSession.iterator(), session.getReferencedSessionResources());
+ Iterators.removeAll(resourcesAfterLoadOfSession.iterator(), referencedSessionResources);
final Iterable<Resource> newSemanticResourcesIterator = Iterables.filter(resourcesAfterLoadOfSession, new Predicate<Resource>() {
- @Override
public boolean apply(Resource resource) {
// Remove empty resource and the Sirius environment
return !resource.getContents().isEmpty() && !(new URIQuery(resource.getURI()).isEnvironmentURI());

Back to the top