Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsmonnier2014-05-15 13:35:34 +0000
committerEsteban Dugueperoux2014-06-23 15:04:51 +0000
commit5b294ef32d426ab47c5339379f6a293a8d75044d (patch)
tree0ba1f186056621ce584f41b738c658d53d7fcc48
parent18983945d7999905fd9aca5e54fdaf04106bbe39 (diff)
downloadorg.eclipse.sirius-5b294ef32d426ab47c5339379f6a293a8d75044d.tar.gz
org.eclipse.sirius-5b294ef32d426ab47c5339379f6a293a8d75044d.tar.xz
org.eclipse.sirius-5b294ef32d426ab47c5339379f6a293a8d75044d.zip
[437646] Enhance AirDCrossReferenceAdapter installaton
Have AirDCrossReferenceAdapterImpl installed on ResourceSet and be adapted recursively only on aird resource, i.e. ResourceQuery.isRepresentationsResource(). Also remove it on session close as it is done for the semantic cross reference adapter. Move this specific code in other methods to avoid checkstyle error in DAnalysisSessionImpl.close() about number of lines. Bug: 437646 Signed-off-by: Esteban Dugueperoux <esteban.dugueperoux@obeo.fr> Change-Id: I16ec7b4e47d111c97f87c5df3d3ea55afa0a0aa5
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/query/ResourceQuery.java11
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDCrossReferenceAdapterImpl.java29
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDResourceFactory.java7
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/SessionFactoryImpl.java4
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java107
5 files changed, 83 insertions, 75 deletions
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/query/ResourceQuery.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/query/ResourceQuery.java
index 4a5c1569c9..779fbd48b1 100644
--- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/query/ResourceQuery.java
+++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/query/ResourceQuery.java
@@ -16,7 +16,7 @@ import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.sirius.business.api.session.resource.AirdResource;
-import org.eclipse.sirius.viewpoint.ViewpointPackage;
+import org.eclipse.sirius.viewpoint.DAnalysis;
import com.google.common.base.Preconditions;
import com.google.common.collect.Sets;
@@ -102,8 +102,13 @@ public class ResourceQuery {
}
isRepresentationsResource = isRepresentationsResource && new FileQuery(resource.getURI().fileExtension()).isSessionResourceFile();
isRepresentationsResource = isRepresentationsResource || resource instanceof AirdResource;
- if (!isRepresentationsResource && resource.getContents() != null && resource.getContents().size() == 1) {
- isRepresentationsResource = resource.getContents().get(0).eClass().equals(ViewpointPackage.eINSTANCE.getDAnalysis());
+ if (!isRepresentationsResource && !resource.getContents().isEmpty()) {
+ for (EObject contentEObject : resource.getContents()) {
+ if (contentEObject != null && contentEObject instanceof DAnalysis) {
+ isRepresentationsResource = true;
+ break;
+ }
+ }
}
return isRepresentationsResource;
}
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDCrossReferenceAdapterImpl.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDCrossReferenceAdapterImpl.java
index 879483dca6..dedf80fd94 100644
--- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDCrossReferenceAdapterImpl.java
+++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDCrossReferenceAdapterImpl.java
@@ -10,9 +10,10 @@
*******************************************************************************/
package org.eclipse.sirius.business.internal.resource.parser;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gmf.runtime.emf.core.util.CrossReferenceAdapter;
+import org.eclipse.sirius.business.api.query.ResourceQuery;
import org.eclipse.sirius.business.internal.resource.AirDCrossReferenceAdapter;
/**
@@ -20,23 +21,31 @@ import org.eclipse.sirius.business.internal.resource.AirDCrossReferenceAdapter;
* AirDResource.
*
* @author smonnier
- *
*/
public class AirDCrossReferenceAdapterImpl extends CrossReferenceAdapter implements AirDCrossReferenceAdapter {
boolean resolve = true;
/**
- * This method has been overridden to filter only the AirDResource and its
- * elements.
+ * Overridden to have this {@link AirDCrossReferenceAdapter} installed only
+ * on aird resource.
*
- * {@inheritDoc}
+ * @param notifier
+ * a model element of the ResourceSet
*/
@Override
- public void selfAdapt(Notification notification) {
- if (!notification.isTouch()
- && (notification.getNotifier() instanceof AirDResourceImpl || (notification.getNotifier() instanceof EObject && ((EObject) notification.getNotifier()).eResource() instanceof AirDResourceImpl))) {
- super.selfAdapt(notification);
+ protected void addAdapter(Notifier notifier) {
+ if (notifier instanceof Resource) {
+ Resource resource = (Resource) notifier;
+ if (!new ResourceQuery(resource).isRepresentationsResource()) {
+ return;
+ }
}
+ super.addAdapter(notifier);
+ }
+
+ @Override
+ public boolean isAdapterForType(Object type) {
+ return type == AirDCrossReferenceAdapter.class;
}
/**
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDResourceFactory.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDResourceFactory.java
index 81afa086a1..8f35025d9c 100644
--- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDResourceFactory.java
+++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/parser/AirDResourceFactory.java
@@ -27,11 +27,8 @@ import org.eclipse.sirius.business.internal.migration.RepresentationsFileExtende
import org.eclipse.sirius.business.internal.migration.RepresentationsFileMigrationService;
import org.eclipse.sirius.business.internal.migration.RepresentationsFileResourceHandler;
import org.eclipse.sirius.business.internal.migration.RepresentationsFileVersionSAXParser;
-import org.eclipse.sirius.business.internal.resource.AirDCrossReferenceAdapter;
import org.osgi.framework.Version;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
/**
@@ -117,10 +114,6 @@ public class AirDResourceFactory extends XMIResourceFactoryImpl {
resource.setEncoding(XMI_ENCODING);
}
- if (!Iterables.any(resource.eAdapters(), Predicates.instanceOf(AirDCrossReferenceAdapter.class))) {
- resource.eAdapters().add(new AirDCrossReferenceAdapterImpl());
- }
-
return resource;
}
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/SessionFactoryImpl.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/SessionFactoryImpl.java
index a4fa6dfdc8..fdc0308c9e 100644
--- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/SessionFactoryImpl.java
+++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/SessionFactoryImpl.java
@@ -31,6 +31,7 @@ import org.eclipse.sirius.business.api.session.factory.SessionFactory;
import org.eclipse.sirius.business.internal.movida.Movida;
import org.eclipse.sirius.business.internal.movida.registry.ViewpointRegistry;
import org.eclipse.sirius.business.internal.movida.registry.ViewpointURIConverter;
+import org.eclipse.sirius.business.internal.resource.parser.AirDCrossReferenceAdapterImpl;
import org.eclipse.sirius.business.internal.session.danalysis.DAnalysisSessionImpl;
import org.eclipse.sirius.common.tools.api.editing.EditingDomainFactoryService;
import org.eclipse.sirius.common.tools.api.resource.ResourceSetFactory;
@@ -75,7 +76,8 @@ public final class SessionFactoryImpl implements SessionFactory {
*/
public Session createSession(final URI sessionResourceURI, IProgressMonitor monitor) throws CoreException {
final ResourceSet set = ResourceSetFactory.createFactory().createResourceSet(sessionResourceURI);
-
+ set.eAdapters().add(new AirDCrossReferenceAdapterImpl());
+
final TransactionalEditingDomain transactionalEditingDomain = EditingDomainFactoryService.INSTANCE.getEditingDomainFactory().createEditingDomain(set);
if (Movida.isEnabled()) {
transactionalEditingDomain.getResourceSet()
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 57989dde76..6c42ada829 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
@@ -62,7 +62,6 @@ import org.eclipse.sirius.business.api.dialect.DialectManager;
import org.eclipse.sirius.business.api.extender.MetamodelDescriptorManager;
import org.eclipse.sirius.business.api.helper.SiriusResourceHelper;
import org.eclipse.sirius.business.api.helper.SiriusUtil;
-import org.eclipse.sirius.business.api.query.AirDResouceQuery;
import org.eclipse.sirius.business.api.query.DAnalysisQuery;
import org.eclipse.sirius.business.api.query.FileQuery;
import org.eclipse.sirius.business.api.query.ResourceQuery;
@@ -84,7 +83,6 @@ import org.eclipse.sirius.business.api.session.danalysis.DAnalysisSelectorServic
import org.eclipse.sirius.business.api.session.danalysis.DAnalysisSession;
import org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionHelper;
import org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionService;
-import org.eclipse.sirius.business.api.session.resource.AirdResource;
import org.eclipse.sirius.business.internal.metamodel.helper.ComponentizationHelper;
import org.eclipse.sirius.business.internal.migration.resource.ResourceFileExtensionPredicate;
import org.eclipse.sirius.business.internal.movida.Movida;
@@ -108,7 +106,6 @@ import org.eclipse.sirius.ecore.extender.business.api.accessor.exception.Illegal
import org.eclipse.sirius.ecore.extender.business.api.permission.IPermissionAuthority;
import org.eclipse.sirius.ecore.extender.business.api.permission.PermissionAuthorityRegistry;
import org.eclipse.sirius.ecore.extender.business.api.permission.exception.LockedInstanceException;
-import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.tools.api.command.semantic.RemoveSemanticResourceCommand;
import org.eclipse.sirius.tools.api.command.ui.NoUICallback;
import org.eclipse.sirius.tools.api.interpreter.InterpreterRegistry;
@@ -771,7 +768,6 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
registerResourceInCrossReferencer(newResource);
}
-
/**
* Add the cross referencer (if exists and is not present) to the eAdapters
* list of the given resource.
@@ -1360,7 +1356,6 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
set.getResources().remove(res);
}
-
@Override
public void statusChanged(final Resource resource, final ResourceStatus oldStatus, final ResourceStatus newStatus) {
// Do nothing while processing.
@@ -1695,12 +1690,8 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
ViewpointRegistry.getInstance().removeListener(this);
}
notifyListeners(SessionListener.CLOSING);
- // Disable resolution of proxy for all airdCrossReferenceAdapter of
- // session resources and for semanticCrossReferencer during the closing
- List<AirDCrossReferenceAdapter> airdCrossReferenceAdapters = disableCrossReferenceAdaptersResolution(Iterables.filter(getAllSessionResources(), AirdResource.class));
- if (getSemanticCrossReferencer() instanceof LazyCrossReferencer) {
- ((LazyCrossReferencer) getSemanticCrossReferencer()).disableResolve();
- }
+ disableAndRemoveECrossReferenceAdapters();
+
if (controlledResourcesDetector != null) {
controlledResourcesDetector.dispose();
}
@@ -1708,18 +1699,7 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
dAnalysisRefresher.dispose();
dAnalysisRefresher = null;
}
- // Let's clear the cross referencer if it's still there.
- for (final Resource res : getSemanticResources()) {
- unregisterResourceInCrossReferencer(res);
- }
- for (final DAnalysis analysis : Iterables.filter(allAnalyses(), Predicates.notNull())) {
- removeAdaptersOnAnalysis(analysis);
- Resource analysisResource = analysis.eResource();
- if (analysisResource != null) {
- unregisterResourceInCrossReferencer(analysisResource);
- }
- }
- ResourceSet resourceSet = transactionalEditingDomain.getResourceSet();
+
if (interpreter != null) {
interpreter.dispose();
}
@@ -1730,10 +1710,8 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
* Let's clear the cross referencer of the VSM resource if it's still
* there (added by the updateSelectedViewpointsData).
*/
- Iterable<Resource> resources = Lists.newArrayList(resourceSet.getResources());
- for (Resource resource : Iterables.filter(resources, new ResourceFileExtensionPredicate(SiriusUtil.DESCRIPTION_MODEL_EXTENSION, false))) {
- unregisterResourceInCrossReferencer(resource);
- }
+ ResourceSet resourceSet = getTransactionalEditingDomain().getResourceSet();
+
if (currentResourceCollector != null) {
currentResourceCollector.dispose();
currentResourceCollector = null;
@@ -1769,14 +1747,8 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
if (semanticResources != null) {
semanticResources.clear();
}
- // Enable resolution for all airdCrossReferenceAdapter of session
- // resources after the closing
- for (AirDCrossReferenceAdapter airDCrossReferenceAdapter : airdCrossReferenceAdapters) {
- airDCrossReferenceAdapter.enableResolve();
- }
- if (getSemanticCrossReferencer() instanceof LazyCrossReferencer) {
- ((LazyCrossReferencer) getSemanticCrossReferencer()).enableResolve();
- }
+ reenableECrossReferenceAdaptersBeforeEndOfClosing();
+
if (disposeEditingDomainOnClose) {
transactionalEditingDomain.dispose();
doDisposePermissionAuthority(resourceSet);
@@ -1784,6 +1756,52 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
mainDAnalysis = null;
}
+ private void disableAndRemoveECrossReferenceAdapters() {
+ ResourceSet resourceSet = getTransactionalEditingDomain().getResourceSet();
+ // Disable resolution of proxy for AirDCrossReferenceAdapter of
+ // session and for semanticCrossReferencer during the closing
+ Adapter existingAirDCrossReferenceAdapter = EcoreUtil.getExistingAdapter(resourceSet, AirDCrossReferenceAdapter.class);
+ AirDCrossReferenceAdapter airDCrossReferenceAdapter = null;
+ if (existingAirDCrossReferenceAdapter instanceof AirDCrossReferenceAdapter) {
+ airDCrossReferenceAdapter = (AirDCrossReferenceAdapter) existingAirDCrossReferenceAdapter;
+ airDCrossReferenceAdapter.disableResolve();
+ resourceSet.eAdapters().remove(airDCrossReferenceAdapter);
+ }
+ if (getSemanticCrossReferencer() instanceof LazyCrossReferencer) {
+ ((LazyCrossReferencer) getSemanticCrossReferencer()).disableResolve();
+ }
+ // Let's clear the cross referencer if it's still there.
+ for (final Resource res : getSemanticResources()) {
+ unregisterResourceInCrossReferencer(res);
+ }
+ for (final DAnalysis analysis : Iterables.filter(allAnalyses(), Predicates.notNull())) {
+ removeAdaptersOnAnalysis(analysis);
+ Resource analysisResource = analysis.eResource();
+ if (analysisResource != null) {
+ unregisterResourceInCrossReferencer(analysisResource);
+ }
+ }
+ Iterable<Resource> resources = Lists.newArrayList(resourceSet.getResources());
+ for (Resource resource : Iterables.filter(resources, new ResourceFileExtensionPredicate(SiriusUtil.DESCRIPTION_MODEL_EXTENSION, false))) {
+ unregisterResourceInCrossReferencer(resource);
+ }
+ }
+
+ private void reenableECrossReferenceAdaptersBeforeEndOfClosing() {
+ ResourceSet resourceSet = getTransactionalEditingDomain().getResourceSet();
+ // Enable resolution for AirdCrossReferenceAdapter of session at the end
+ // of closing
+ Adapter existingAirDCrossReferenceAdapter = EcoreUtil.getExistingAdapter(resourceSet, AirDCrossReferenceAdapter.class);
+ AirDCrossReferenceAdapter airDCrossReferenceAdapter = null;
+ if (existingAirDCrossReferenceAdapter instanceof AirDCrossReferenceAdapter) {
+ airDCrossReferenceAdapter = (AirDCrossReferenceAdapter) existingAirDCrossReferenceAdapter;
+ airDCrossReferenceAdapter.enableResolve();
+ }
+ if (getSemanticCrossReferencer() instanceof LazyCrossReferencer) {
+ ((LazyCrossReferencer) getSemanticCrossReferencer()).enableResolve();
+ }
+ }
+
private void flushOperations() {
CommandStack commandStack = transactionalEditingDomain.getCommandStack();
ResourceSet resourceSet = transactionalEditingDomain.getResourceSet();
@@ -1815,25 +1833,6 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements
}
/**
- * @param resources
- * List of resources that potentially having a
- * AirDCrossReferenceAdapter.
- * @return The list of airDCrossReferenceAdapter for which the resolution
- * has been disabled.
- */
- private List<AirDCrossReferenceAdapter> disableCrossReferenceAdaptersResolution(Iterable<AirdResource> resources) {
- List<AirDCrossReferenceAdapter> airdCrossReferenceAdapters = Lists.newArrayList();
- for (AirdResource representationsFileResource : resources) {
- Option<AirDCrossReferenceAdapter> optionalAirdCrossReferenceAdapter = new AirDResouceQuery(representationsFileResource).getAirDCrossReferenceAdapter();
- if (optionalAirdCrossReferenceAdapter.some()) {
- airdCrossReferenceAdapters.add(optionalAirdCrossReferenceAdapter.get());
- optionalAirdCrossReferenceAdapter.get().disableResolve();
- }
- }
- return airdCrossReferenceAdapters;
- }
-
- /**
* Method called at {@link Session#close(IProgressMonitor)} to unload all
* referenced {@link Resource}s.
*/

Back to the top