diff options
| author | Laurent Redor | 2014-12-10 09:31:53 +0000 |
|---|---|---|
| committer | Laurent Redor | 2014-12-10 10:13:33 +0000 |
| commit | 93e9745399afe74fe7f8e8c4313243df585a058a (patch) | |
| tree | 3897b8f94419721839b9c710d1f46c9757c67d31 | |
| parent | 14436b7116abc103798cbe30b331d2ba0d1a3b68 (diff) | |
| download | org.eclipse.sirius-93e9745399afe74fe7f8e8c4313243df585a058a.tar.gz org.eclipse.sirius-93e9745399afe74fe7f8e8c4313243df585a058a.tar.xz org.eclipse.sirius-93e9745399afe74fe7f8e8c4313243df585a058a.zip | |
Revert "[452962] Improve Session resources cleanup on close - clear
DAnlysisSessionEObject.activatedViewpoints to avoid potential Viewpoint
reloading on proxy resolution. - Give Session in constructor of
RepresentationNameListener to avoid get Session from SessionManager. -
Remove useless try/catch NPE in RepresentationsChangeAdapter as it was
for a CDO bug which is now fixed. - Have DAnalysisSessionImpl.Saver
registration/unregistration for both ResourceSetListener and Lifecycle
in constructor/dispose(). - Have
DAnalysisSessionImpl.removeAdaptersOnAnalysis() remove
SemanticResourcesUpdater as it is added in
DAnalysisSessionImpl.addAdaptersOnAnalysis()"
This reverts commit 29322aa34cf733e96ea27364c38f8686dd66c43c. This
commit causes regression on JUnit tests. It is reverted while waiting to
find a solution.
Bug: 452962
Change-Id: I0c90cfb16c9b208506fc8964b9c79667f5aada9c
Signed-off-by: Laurent Redor <laurent.redor@obeo.fr>
3 files changed, 70 insertions, 64 deletions
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/RepresentationNameListener.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/RepresentationNameListener.java index a720b6b9d3..984e493283 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/RepresentationNameListener.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/RepresentationNameListener.java @@ -11,11 +11,15 @@ package org.eclipse.sirius.business.internal.session; import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.transaction.ResourceSetChangeEvent; import org.eclipse.emf.transaction.ResourceSetListenerImpl; import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.business.api.session.SessionManager; +import org.eclipse.sirius.ext.base.Option; +import org.eclipse.sirius.ext.base.Options; import org.eclipse.sirius.viewpoint.DRepresentation; +import org.eclipse.sirius.viewpoint.DSemanticDecorator; import org.eclipse.sirius.viewpoint.ViewpointPackage; import com.google.common.collect.Iterables; @@ -27,43 +31,44 @@ import com.google.common.collect.Iterables; * @author pcdavid */ public class RepresentationNameListener extends ResourceSetListenerImpl { - - private Session session; - /** - * Default constructor. - * - * @param session - * the {@link Session} + * {@inheritDoc} */ - public RepresentationNameListener(Session session) { - this.session = session; - session.getTransactionalEditingDomain().addResourceSetListener(this); - } - @Override public boolean isPostcommitOnly() { return true; } + /** + * {@inheritDoc} + */ @Override public void resourceSetChanged(ResourceSetChangeEvent event) { for (Notification notif : Iterables.filter(event.getNotifications(), Notification.class)) { if (isRepresentationNameChange(notif)) { - SessionManager.INSTANCE.notifyRepresentationRenamed(session); + Option<Session> session = getSessionFromRepresentation((DRepresentation) notif.getNotifier()); + if (session.some()) { + SessionManager.INSTANCE.notifyRepresentationRenamed(session.get()); + } } } } - private boolean isRepresentationNameChange(Notification notif) { - return notif.getNotifier() instanceof DRepresentation && notif.getFeatureID(DRepresentation.class) == ViewpointPackage.DREPRESENTATION__NAME; + private Option<Session> getSessionFromRepresentation(DRepresentation representation) { + EObject semanticElement = null; + if (representation instanceof DSemanticDecorator) { + semanticElement = ((DSemanticDecorator) representation).getTarget(); + } + if (semanticElement != null) { + Session session = SessionManager.INSTANCE.getSession(semanticElement); + if (session != null) { + return Options.newSome(session); + } + } + return Options.newNone(); } - /** - * Dispose this resource. - */ - public void dispose() { - getTarget().removeResourceSetListener(this); - session = null; + private boolean isRepresentationNameChange(Notification notif) { + return notif.getNotifier() instanceof DRepresentation && notif.getFeatureID(DRepresentation.class) == ViewpointPackage.DREPRESENTATION__NAME; } } 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 447ccdf6ff..eb34aa1669 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 @@ -52,11 +52,11 @@ import org.eclipse.emf.ecore.resource.impl.ResourceImpl; import org.eclipse.emf.ecore.util.ECrossReferenceAdapter; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.transaction.ResourceSetChangeEvent; +import org.eclipse.emf.transaction.ResourceSetListener; import org.eclipse.emf.transaction.ResourceSetListenerImpl; import org.eclipse.emf.transaction.RunnableWithResult; import org.eclipse.emf.transaction.Transaction; import org.eclipse.emf.transaction.TransactionalEditingDomain; -import org.eclipse.emf.transaction.TransactionalEditingDomain.Lifecycle; import org.eclipse.emf.transaction.TransactionalEditingDomainEvent; import org.eclipse.emf.transaction.TransactionalEditingDomainListener; import org.eclipse.emf.transaction.TransactionalEditingDomainListenerImpl; @@ -195,26 +195,20 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements } }; - /** - * Default constructor. - * - * @param domain - * the {@link TransactionalEditingDomain} - */ - public Saver(TransactionalEditingDomain domain) { - domain.addResourceSetListener(this); - Lifecycle lifecycle = TransactionUtil.getAdapter(getTarget(), Lifecycle.class); - if (lifecycle != null) { - lifecycle.addTransactionalEditingDomainListener(domainListener); + public void initialize() { + TransactionalEditingDomain ted = getTransactionalEditingDomain(); + if (ted instanceof TransactionalEditingDomain.Lifecycle) { + TransactionalEditingDomain.Lifecycle lc = (TransactionalEditingDomain.Lifecycle) ted; + lc.addTransactionalEditingDomainListener(domainListener); } } public void dispose() { - Lifecycle lifecycle = TransactionUtil.getAdapter(getTarget(), Lifecycle.class); - if (lifecycle != null) { - lifecycle.removeTransactionalEditingDomainListener(domainListener); + TransactionalEditingDomain ted = getTransactionalEditingDomain(); + if (ted instanceof TransactionalEditingDomain.Lifecycle) { + TransactionalEditingDomain.Lifecycle lc = (TransactionalEditingDomain.Lifecycle) ted; + lc.removeTransactionalEditingDomainListener(domainListener); } - getTarget().removeResourceSetListener(this); disarm(); } @@ -277,7 +271,7 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements } /** The {@link TransactionalEditingDomain} associated to this Session. */ - private TransactionalEditingDomain transactionalEditingDomain; + protected final TransactionalEditingDomain transactionalEditingDomain; // Session's state and helpers for its maintenance. // See also the following fields inherited from DAnalysisSessionEObject: @@ -298,7 +292,7 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements /** The semantic resources collection updater. */ protected SemanticResourcesUpdater semanticResourcesUpdater; - private ControlledResourcesDetector controlledResourcesDetector; + private final ControlledResourcesDetector controlledResourcesDetector; private DAnalysisRefresher dAnalysisRefresher; @@ -307,7 +301,7 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements /** The custom saving policy the session should use. */ protected SavingPolicy savingPolicy; - private Saver saver; + private final Saver saver = new Saver(); private ReloadingPolicy reloadingPolicy; @@ -339,9 +333,9 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements /** The listener suitable for refresh the opened viewpoint editors. */ protected RefreshEditorsPrecommitListener refreshEditorsListeners; - private RepresentationsChangeAdapter representationsChangeAdapter; + private final RepresentationsChangeAdapter representationsChangeAdapter; - private RepresentationNameListener representationNameListener; + private final ResourceSetListener representationNameListener; /** * Create a new session. @@ -355,10 +349,11 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements Preconditions.checkNotNull(this.sessionResource, "A session must be inside a resource."); this.transactionalEditingDomain = Preconditions.checkNotNull(TransactionUtil.getEditingDomain(mainDAnalysis), "A session must be associated to an EditingDomain"); this.mainDAnalysis = mainDAnalysis; + this.interpreter = new ODesignGenericInterpreter(); this.representationsChangeAdapter = new RepresentationsChangeAdapter(this); + this.representationNameListener = new RepresentationNameListener(); this.controlledResourcesDetector = new ControlledResourcesDetector(this); - saver = new Saver(getTransactionalEditingDomain()); super.getAnalyses().add(mainDAnalysis); super.getResources().add(sessionResource); setAnalysisSelector(DAnalysisSelectorService.getSelector(this)); @@ -512,8 +507,9 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements ResourceSetSync.getOrInstallResourceSetSync(transactionalEditingDomain).registerClient(this); monitor.worked(1); - this.representationNameListener = new RepresentationNameListener(this); + transactionalEditingDomain.addResourceSetListener(representationNameListener); monitor.worked(1); + saver.initialize(); final Collection<DAnalysis> allAnalyses = allAnalyses(); if (allAnalyses.isEmpty()) { @@ -1442,9 +1438,6 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements if (this.representationsChangeAdapter != null) { this.representationsChangeAdapter.unregisterAnalysis(analysis); } - if (semanticResourcesUpdater != null && analysis.eAdapters().contains(semanticResourcesUpdater)) { - analysis.eAdapters().remove(semanticResourcesUpdater); - } } @Override @@ -1882,6 +1875,9 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements if (!isOpen()) { return; } + if (saver != null && getTransactionalEditingDomain() != null) { + getTransactionalEditingDomain().removeResourceSetListener(saver); + } if (Movida.isEnabled()) { org.eclipse.sirius.business.internal.movida.registry.ViewpointRegistry registry = (org.eclipse.sirius.business.internal.movida.registry.ViewpointRegistry) ViewpointRegistry.getInstance(); registry.removeListener((ViewpointRegistryListener) this); @@ -1893,16 +1889,12 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements if (controlledResourcesDetector != null) { controlledResourcesDetector.dispose(); - controlledResourcesDetector = null; } if (dAnalysisRefresher != null) { dAnalysisRefresher.dispose(); dAnalysisRefresher = null; } - removeListener(getRefreshEditorsListener()); - refreshEditorsListeners = null; - reloadingPolicy = null; - savingPolicy = null; + if (interpreter != null) { interpreter.dispose(); } @@ -1920,9 +1912,8 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements currentResourceCollector = null; } interpreter = null; - representationNameListener.dispose(); - representationNameListener = null; - representationsChangeAdapter = null; + crossReferencer = null; + transactionalEditingDomain.removeResourceSetListener(representationNameListener); // dispose the SessionEventBroker if (broker != null) { broker.dispose(); @@ -1949,18 +1940,12 @@ public class DAnalysisSessionImpl extends DAnalysisSessionEObjectImpl implements semanticResources.clear(); } reenableECrossReferenceAdaptersBeforeEndOfClosing(); - crossReferencer = null; saver.dispose(); - saver = null; + if (disposeEditingDomainOnClose) { transactionalEditingDomain.dispose(); doDisposePermissionAuthority(resourceSet); - transactionalEditingDomain = null; } - getActivatedViewpoints().clear(); - movidaSupport = null; - services = null; - sessionResource = null; mainDAnalysis = null; } 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..d6ae272830 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 @@ -12,12 +12,15 @@ package org.eclipse.sirius.business.internal.session.danalysis; import java.util.Collection; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.business.api.session.SessionManager; import org.eclipse.sirius.viewpoint.DAnalysis; import org.eclipse.sirius.viewpoint.DView; +import org.eclipse.sirius.viewpoint.SiriusPlugin; import org.eclipse.sirius.viewpoint.ViewpointPackage; import com.google.common.collect.Iterables; @@ -113,7 +116,12 @@ public class RepresentationsChangeAdapter extends AdapterImpl { */ public void unregisterAnalysis(final DAnalysis analysis) { if (analysis.eAdapters().contains(this)) { - analysis.eAdapters().remove(this); + // TODO remove this try/catch once the offline mode will be supported + try { + analysis.eAdapters().remove(this); + } catch (NullPointerException e) { + SiriusPlugin.getDefault().getLog().log(new Status(IStatus.WARNING, SiriusPlugin.ID, "Error while closing the representation, the remote server may be unreachable.")); + } } for (final DView view : analysis.getOwnedViews()) { unregisterView(view); @@ -138,7 +146,15 @@ public class RepresentationsChangeAdapter extends AdapterImpl { */ private void unregisterView(final DView view) { if (view.eAdapters().contains(this)) { - view.eAdapters().remove(this); + // TODO remove this try/catch once the offline mode will be supported + try { + view.eAdapters().remove(this); + } catch (NullPointerException e) { + if (SiriusPlugin.getDefault().isDebugging()) { + SiriusPlugin.getDefault().getLog().log(new Status(IStatus.WARNING, SiriusPlugin.ID, "Error while closing the representation, the remote server may be unreachable.")); + } + } + } } } |
