diff options
| author | smonnier | 2014-05-15 13:35:34 +0000 |
|---|---|---|
| committer | Esteban Dugueperoux | 2014-06-23 15:04:51 +0000 |
| commit | 5b294ef32d426ab47c5339379f6a293a8d75044d (patch) | |
| tree | 0ba1f186056621ce584f41b738c658d53d7fcc48 | |
| parent | 18983945d7999905fd9aca5e54fdaf04106bbe39 (diff) | |
| download | org.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
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. */ |
