Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Redor2014-12-10 09:31:53 +0000
committerLaurent Redor2014-12-10 10:13:33 +0000
commit93e9745399afe74fe7f8e8c4313243df585a058a (patch)
tree3897b8f94419721839b9c710d1f46c9757c67d31
parent14436b7116abc103798cbe30b331d2ba0d1a3b68 (diff)
downloadorg.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>
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/RepresentationNameListener.java47
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/DAnalysisSessionImpl.java67
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/RepresentationsChangeAdapter.java20
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."));
+ }
+ }
+
}
}
}

Back to the top