浏览代码

Unload invalid resources (#2132)

* this fixes that files are not updated after deletion / recreation

- If a proxy can not be resolved, the resource is loaded into the
resoure set with an error and loaded = true.

An new Workspace Listener is added that unloaded this stale resource.

- cache here is removed since the EObjectDescription Lookup has a cache
itself.

* unloading resources requires exclusive access to shared domain

* runexclusive instead of command

* Navigator content Provider uses the Shared Domain now.

* fixed unloading bug

* Fix deadlock problem and NPE

* added null check for event delta

* requires explicit domain access before unloading
Andreas Mülder 7 年之前
父节点
当前提交
4d718dcf0f

+ 76 - 30
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/document/TransactionalXtextDocument.java

@@ -15,6 +15,8 @@ import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.xtext.resource.XtextResource;
 import org.eclipse.xtext.ui.editor.model.DocumentTokenSource;
 import org.eclipse.xtext.ui.editor.model.edit.ITextEditComposer;
+import org.eclipse.xtext.util.CancelIndicator;
+import org.eclipse.xtext.util.concurrent.CancelableUnitOfWork;
 import org.eclipse.xtext.util.concurrent.IUnitOfWork;
 import org.yakindu.base.xtext.utils.jface.viewers.ParallelReadXtextDocument;
 
@@ -24,6 +26,71 @@ import com.google.inject.name.Named;
 @SuppressWarnings("unchecked")
 public class TransactionalXtextDocument extends ParallelReadXtextDocument {
 
+	
+	public class UnitOfWorkOnTransactionalEditingDomain<T> implements IUnitOfWork<T, XtextResource> {
+
+		private IUnitOfWork<T, XtextResource> delegate;
+
+		public UnitOfWorkOnTransactionalEditingDomain(IUnitOfWork<T, XtextResource> delegate) {
+			this.delegate = delegate;
+		}
+		
+		@Override
+		public T exec(XtextResource state) throws Exception {
+			try {
+				return (T) getDomain().runExclusive(new RunnableWithResult.Impl<T>() {
+					@Override
+					public void run() {
+						try {
+							T result = delegate.exec(state);
+							if (result != null) {
+								setResult(result);
+							}
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				});
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+				return null;
+			}
+		}
+		
+	}
+	
+	public class CancelableUnitOfWorkOnTransactionalEditingDomain<T> extends CancelableUnitOfWork<T, XtextResource> {
+
+		private CancelableUnitOfWork<T, XtextResource> delegate;
+
+		public CancelableUnitOfWorkOnTransactionalEditingDomain(CancelableUnitOfWork<T, XtextResource> delegate) {
+			this.delegate = delegate;
+		}
+
+		@Override
+		public T exec(XtextResource state, CancelIndicator cancelIndicator) throws Exception {
+			try {
+				return (T) getDomain().runExclusive(new RunnableWithResult.Impl<T>() {
+					@Override
+					public void run() {
+						try {
+							T result = delegate.exec(state, cancelIndicator);
+							if (result != null) {
+								setResult(result);
+							}
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				});
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+				return null;
+			}
+		}
+		
+	}
+	
 	@Inject
 	@Named("domain.id")
 	protected String domainId;
@@ -39,47 +106,26 @@ public class TransactionalXtextDocument extends ParallelReadXtextDocument {
 
 	@Override
 	public <T> T readOnly(IUnitOfWork<T, XtextResource> work) {
-		try {
-			return (T) getDomain().runExclusive(new RunnableWithResult.Impl<T>() {
-				@Override
-				public void run() {
-					setResult(TransactionalXtextDocument.super.readOnly(work));
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-			return null;
+		if (work instanceof CancelableUnitOfWork) {
+			return super.readOnly(new CancelableUnitOfWorkOnTransactionalEditingDomain<T>((CancelableUnitOfWork<T, XtextResource>) work));
 		}
+		return super.readOnly(new UnitOfWorkOnTransactionalEditingDomain<T>(work)); 
 	}
 
 	@Override
 	public <T> T priorityReadOnly(IUnitOfWork<T, XtextResource> work) {
-		try {
-			return (T) getDomain().runExclusive(new RunnableWithResult.Impl<T>() {
-				@Override
-				public void run() {
-					setResult(TransactionalXtextDocument.super.priorityReadOnly(work));
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-			return null;
+		if (work instanceof CancelableUnitOfWork) {
+			return super.priorityReadOnly(new CancelableUnitOfWorkOnTransactionalEditingDomain<T>((CancelableUnitOfWork<T, XtextResource>) work));
 		}
+		return super.priorityReadOnly(new UnitOfWorkOnTransactionalEditingDomain<T>(work)); 
 	}
 
 	@Override
 	public <T> T modify(IUnitOfWork<T, XtextResource> work) {
-		try {
-			return (T) getDomain().runExclusive(new RunnableWithResult.Impl<T>() {
-				@Override
-				public void run() {
-					setResult(TransactionalXtextDocument.super.modify(work));
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-			return null;
+		if (work instanceof CancelableUnitOfWork) {
+			return super.modify(new CancelableUnitOfWorkOnTransactionalEditingDomain<T>((CancelableUnitOfWork<T, XtextResource>) work));
 		}
+		return super.modify(new UnitOfWorkOnTransactionalEditingDomain<T>(work)); 
 	}
 
 }

+ 13 - 39
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/ImportedResourceCache.java

@@ -10,23 +10,18 @@
  */
 package org.yakindu.sct.model.stext.scoping;
 
-import java.util.Optional;
-
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.transaction.RunnableWithResult;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.eclipse.xtext.resource.IResourceDescription;
 import org.eclipse.xtext.resource.IResourceDescription.Manager;
 import org.eclipse.xtext.resource.IResourceServiceProvider;
-import org.eclipse.xtext.util.IResourceScopeCache;
 
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
+import static org.yakindu.sct.model.stext.scoping.SharedEditingDomainFactory.*;
 
 /**
  * 
@@ -36,22 +31,10 @@ import com.google.inject.Singleton;
 @Singleton
 public class ImportedResourceCache {
 
-	public static final String DOMAIN_ID = "org.yakindu.sct.domain.resources";
-
 	@Inject
 	private IResourceServiceProvider.Registry serviceProviderRegistry;
-	@Inject
-	private IResourceScopeCache cache;
 
-	protected static synchronized TransactionalEditingDomain getEditingDomain() {
-		TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE
-				.getEditingDomain(DOMAIN_ID);
-		if (editingDomain == null) {
-			TransactionalEditingDomain resourceDomain = WorkspaceEditingDomainFactory.INSTANCE.createEditingDomain();
-			resourceDomain.setID(DOMAIN_ID);
-			TransactionalEditingDomain.Registry.INSTANCE.add(DOMAIN_ID, resourceDomain);
-			new WorkspaceSynchronizer(resourceDomain);
-		}
+	protected TransactionalEditingDomain getEditingDomain() {
 		return TransactionalEditingDomain.Registry.INSTANCE.getEditingDomain(DOMAIN_ID);
 	}
 
@@ -64,26 +47,17 @@ public class ImportedResourceCache {
 							final ResourceSet set = getResourceSet();
 							final Resource resource = set.getResource(uri, true);
 							if (resource != null) {
-								Optional<IResourceDescription> optional = cache.get(ImportedResourceCache.class,
-										resource, new Provider<Optional<IResourceDescription>>() {
-											@Override
-											public Optional<IResourceDescription> get() {
-												IResourceServiceProvider serviceProvider = serviceProviderRegistry
-														.getResourceServiceProvider(uri);
-												if (serviceProvider == null)
-													return Optional.empty();
-												final Manager resourceDescriptionManager = serviceProvider
-														.getResourceDescriptionManager();
-												if (resourceDescriptionManager == null)
-													return Optional.empty();
-												IResourceDescription result = resourceDescriptionManager
-														.getResourceDescription(resource);
-												return Optional.of(result);
-											}
-										});
-								if (optional.isPresent()) {
-									setResult(optional.get());
-								}
+								IResourceServiceProvider serviceProvider = serviceProviderRegistry
+										.getResourceServiceProvider(uri);
+								if (serviceProvider == null)
+									return;
+								final Manager resourceDescriptionManager = serviceProvider
+										.getResourceDescriptionManager();
+								if (resourceDescriptionManager == null)
+									return;
+								IResourceDescription result = resourceDescriptionManager
+										.getResourceDescription(resource);
+								setResult(result);
 							}
 						}
 					});

+ 41 - 1
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/SharedEditingDomainFactory.java

@@ -12,6 +12,14 @@ package org.yakindu.sct.model.stext.scoping;
 
 import java.io.IOException;
 
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
@@ -58,6 +66,7 @@ public class SharedEditingDomainFactory extends DiagramEditingDomainFactory
 		editingDomain.setID(DOMAIN_ID);
 		replaceCrossReferenceAdapterWithNonResolvingAdapter(editingDomain);
 		new WorkspaceSynchronizer(editingDomain, new WorkspaceSynchronizer.Delegate() {
+
 			public boolean handleResourceDeleted(Resource resource) {
 				resource.unload();
 				return true;
@@ -87,13 +96,44 @@ public class SharedEditingDomainFactory extends DiagramEditingDomainFactory
 				// nothing to dispose (especially as I am shared)
 			}
 		});
+
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {
+			@Override
+			public void resourceChanged(IResourceChangeEvent event) {
+				IResourceDelta delta = event.getDelta();
+				try {
+					if (delta != null) {
+						delta.accept(new IResourceDeltaVisitor() {
+							@Override
+							public boolean visit(IResourceDelta delta) throws CoreException {
+								if (delta.getKind() == IResourceDelta.ADDED) {
+									IResource resource = delta.getResource();
+									if (resource instanceof IFile) {
+										URI uri = URI.createPlatformResourceURI(resource.getFullPath().toString(),
+												true);
+										Resource existingResource = editingDomain.getResourceSet().getResource(uri,
+												false);
+										if (existingResource != null
+												&& !(existingResource instanceof AbstractSCTResource))
+											existingResource.unload();
+
+									}
+								}
+								return true;
+							}
+						});
+					}
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+			}
+		});
 	}
 
 	protected void replaceCrossReferenceAdapterWithNonResolvingAdapter(final TransactionalEditingDomain domain) {
 		final CrossReferenceAdapter adapter = getCrossReferenceAdapter(domain);
 		if (null != adapter) {
 			adapter.unsetTarget(domain.getResourceSet());
-
 			domain.getResourceSet().eAdapters().remove(adapter);
 			domain.getResourceSet().eAdapters().add(new CrossReferenceAdapter(false));
 		}

+ 141 - 133
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/partitioning/DiagramPartitioningDocumentProvider.java

@@ -1,133 +1,141 @@
-/**
- * Copyright (c) 2013 committers of YAKINDU and others.
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- * Contributors:
- * 	committers of YAKINDU - initial API and implementation
- * 
- */
-package org.yakindu.sct.ui.editor.partitioning;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileEditorInputProxy;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-
-/**
- * Implementation of the {@link IDiagramDocumentProvider} interface that extends
- * a {@link FileDiagramDocumentProvider}.
- * 
- * In addition to the {@link FileDiagramDocumentProvider}, this implementation
- * acts on a shared editing domain and can handle custom
- * {@link DiagramEditorInput}. It also unloads non used resources with help of
- * the {@link ResourceUnloadingTool}
- * 
- * @author andreas muelder - Initial contribution and API
- * 
- */
-public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProvider {
-
-	/**
-	 * Extension of {@link DiagramFileInfo} that stores the given
-	 * {@link IEditorInput} which is required for the
-	 * {@link ResourceUnloadingTool}
-	 */
-	protected class InputDiagramFileInfo extends DiagramFileInfo {
-
-		private final IEditorInput editorInput;
-
-		public InputDiagramFileInfo(IDocument document, FileSynchronizer fileSynchronizer,
-				DiagramModificationListener listener, IEditorInput editorInput) {
-			super(document, fileSynchronizer, listener);
-			this.editorInput = editorInput;
-		}
-
-		public IEditorInput getEditorInput() {
-			return editorInput;
-		}
-	}
-
-	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput, TransactionalEditingDomain domain) {
-		if (editorInput instanceof DiagramEditorInput) {
-			return editorInput;
-		}
-		return super.createInputWithEditingDomain(editorInput, DiagramPartitioningUtil.getSharedDomain());
-	}
-
-	/**
-	 * Sets the {@link EditingDomain} to the shared instance
-	 */
-	@Override
-	protected IDocument createEmptyDocument() {
-		DiagramDocument diagramDocument = new DiagramDocument();
-		diagramDocument.setEditingDomain(DiagramPartitioningUtil.getSharedDomain());
-		return diagramDocument;
-	}
-
-	@Override
-	protected ElementInfo createElementInfo(Object element) throws CoreException {
-		ElementInfo info = super.createElementInfo(element);
-		if (element instanceof IDiagramEditorInput) {
-			Resource eResource = ((IDiagramEditorInput) element).getDiagram().eResource();
-			TransactionalEditingDomain sharedDomain = DiagramPartitioningUtil.getSharedDomain();
-			if (eResource.isLoaded() && !sharedDomain.isReadOnly(eResource) && eResource.isModified()) {
-				info.fCanBeSaved = true;
-			}
-		}
-		return info;
-	}
-
-	protected FileInfo createFileInfo(IDocument document, FileSynchronizer synchronizer, IFileEditorInput input) {
-		assert document instanceof DiagramDocument;
-
-		DiagramModificationListener diagramListener = null;
-		if (((DiagramDocument) document).getDiagram() != null) {
-			diagramListener = new FileDiagramModificationListener(this, (DiagramDocument) document, input);
-		}
-		InputDiagramFileInfo info = new InputDiagramFileInfo(document, synchronizer, diagramListener, input);
-		if (diagramListener != null)
-			diagramListener.startListening();
-		return info;
-	}
-
-	@Override
-	protected boolean setDocumentContent(IDocument document, IEditorInput editorInput) throws CoreException {
-		if (editorInput instanceof IDiagramEditorInput) {
-			Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
-			document.setContent(diagram);
-			return true;
-		} else if (editorInput instanceof FileEditorInputProxy) {
-			setDocumentContentFromStorage(document, ((FileEditorInputProxy) editorInput).getFile());
-			return true;
-		}
-		return super.setDocumentContent(document, editorInput);
-	}
-
-	@Override
-	protected void disposeElementInfo(Object element, ElementInfo info) {
-		Object content = info.fDocument.getContent();
-		info.fDocument.setContent(null);
-		// Unset the content first to avoid call to DiagramIOUtil.unload
-		super.disposeElementInfo(element, info);
-		info.fDocument.setContent(content);
-		if (content instanceof Diagram && info instanceof InputDiagramFileInfo) {
-			// Unload non needed resources
-			ResourceUnloadingTool.unloadEditorInput(DiagramPartitioningUtil.getSharedDomain().getResourceSet(),
-					((InputDiagramFileInfo) info).getEditorInput());
-		}
-	}
-
-}
+/**
+ * Copyright (c) 2013 committers of YAKINDU and others.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.ui.editor.partitioning;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramModificationListener;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileEditorInputProxy;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+
+/**
+ * Implementation of the {@link IDiagramDocumentProvider} interface that extends
+ * a {@link FileDiagramDocumentProvider}.
+ * 
+ * In addition to the {@link FileDiagramDocumentProvider}, this implementation
+ * acts on a shared editing domain and can handle custom
+ * {@link DiagramEditorInput}. It also unloads non used resources with help of
+ * the {@link ResourceUnloadingTool}
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProvider {
+
+	/**
+	 * Extension of {@link DiagramFileInfo} that stores the given
+	 * {@link IEditorInput} which is required for the {@link ResourceUnloadingTool}
+	 */
+	protected class InputDiagramFileInfo extends DiagramFileInfo {
+
+		private final IEditorInput editorInput;
+
+		public InputDiagramFileInfo(IDocument document, FileSynchronizer fileSynchronizer,
+				DiagramModificationListener listener, IEditorInput editorInput) {
+			super(document, fileSynchronizer, listener);
+			this.editorInput = editorInput;
+		}
+
+		public IEditorInput getEditorInput() {
+			return editorInput;
+		}
+	}
+
+	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput, TransactionalEditingDomain domain) {
+		if (editorInput instanceof DiagramEditorInput) {
+			return editorInput;
+		}
+		return super.createInputWithEditingDomain(editorInput, DiagramPartitioningUtil.getSharedDomain());
+	}
+
+	/**
+	 * Sets the {@link EditingDomain} to the shared instance
+	 */
+	@Override
+	protected IDocument createEmptyDocument() {
+		DiagramDocument diagramDocument = new DiagramDocument();
+		diagramDocument.setEditingDomain(DiagramPartitioningUtil.getSharedDomain());
+		return diagramDocument;
+	}
+
+	@Override
+	protected ElementInfo createElementInfo(Object element) throws CoreException {
+		ElementInfo info = super.createElementInfo(element);
+		if (element instanceof IDiagramEditorInput) {
+			Resource eResource = ((IDiagramEditorInput) element).getDiagram().eResource();
+			TransactionalEditingDomain sharedDomain = DiagramPartitioningUtil.getSharedDomain();
+			if (eResource.isLoaded() && !sharedDomain.isReadOnly(eResource) && eResource.isModified()) {
+				info.fCanBeSaved = true;
+			}
+		}
+		return info;
+	}
+
+	protected FileInfo createFileInfo(IDocument document, FileSynchronizer synchronizer, IFileEditorInput input) {
+		assert document instanceof DiagramDocument;
+
+		DiagramModificationListener diagramListener = null;
+		if (((DiagramDocument) document).getDiagram() != null) {
+			diagramListener = new FileDiagramModificationListener(this, (DiagramDocument) document, input);
+		}
+		InputDiagramFileInfo info = new InputDiagramFileInfo(document, synchronizer, diagramListener, input);
+		if (diagramListener != null)
+			diagramListener.startListening();
+		return info;
+	}
+
+	@Override
+	protected boolean setDocumentContent(IDocument document, IEditorInput editorInput) throws CoreException {
+		if (editorInput instanceof IDiagramEditorInput) {
+			Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
+			document.setContent(diagram);
+			return true;
+		} else if (editorInput instanceof FileEditorInputProxy) {
+			setDocumentContentFromStorage(document, ((FileEditorInputProxy) editorInput).getFile());
+			return true;
+		}
+		return super.setDocumentContent(document, editorInput);
+	}
+
+	@Override
+	protected void disposeElementInfo(Object element, ElementInfo info) {
+		Object content = info.fDocument.getContent();
+		info.fDocument.setContent(null);
+		// Unset the content first to avoid call to DiagramIOUtil.unload
+		super.disposeElementInfo(element, info);
+		info.fDocument.setContent(content);
+		if (content instanceof Diagram && info instanceof InputDiagramFileInfo) {
+			// Unload non needed resources
+			try {
+				DiagramPartitioningUtil.getSharedDomain().runExclusive(new Runnable() {
+					@Override
+					public void run() {
+						ResourceUnloadingTool.unloadEditorInput(
+								DiagramPartitioningUtil.getSharedDomain().getResourceSet(),
+								((InputDiagramFileInfo) info).getEditorInput());
+					}
+				});
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+}

+ 101 - 90
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/partitioning/ResourceUnloadingTool.java

@@ -1,90 +1,101 @@
-/*******************************************************************************
- * Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others.
- * 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
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.yakindu.sct.ui.editor.partitioning;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.ui.URIEditorInput;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
-import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PlatformUI;
-
-public class ResourceUnloadingTool {
-
-	public static void unloadEditorInput(ResourceSet resourceSet, IEditorInput editorInput) {
-		final EList<Resource> resources = resourceSet.getResources();
-		final List<Resource> resourcesToUnload = new ArrayList<Resource>(resources);
-		IEditorReference[] editorReferences;
-		try {
-			editorReferences = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
-					.getEditorReferences();
-		} catch (final NullPointerException exc) {
-			// Workbench is not yet created or being disposed, so do nothing
-			// see bug http://code.google.com/p/gmftools/issues/detail?id=9
-			return;
-		}
-		for (final IEditorReference openEditorReference : editorReferences) {
-			try {
-				final IEditorInput openEditorInput = openEditorReference.getEditorInput();
-				if (openEditorInput != editorInput) {
-					final IEditorPart openEditor = openEditorReference.getEditor(false);
-					if (openEditor instanceof IEditingDomainProvider) {
-						final IEditingDomainProvider openDiagramEditor = (IEditingDomainProvider) openEditor;
-						final ResourceSet diagramResourceSet = openDiagramEditor.getEditingDomain().getResourceSet();
-						if (diagramResourceSet == resourceSet) {
-							final Resource diagramResource = getDiagramResource(diagramResourceSet, openEditorInput);
-							resourcesToUnload.remove(diagramResource);
-							final Collection<?> imports = EMFCoreUtil.getImports(diagramResource);
-							resourcesToUnload.removeAll(imports);
-						}
-					}
-				}
-			} catch (final Exception exc) {
-				exc.printStackTrace();
-			}
-		}
-		for (final Resource resourceToUnload : resourcesToUnload) {
-			try {
-				resourceToUnload.unload();
-				resources.remove(resourceToUnload);
-			} catch (final Throwable t) {
-				t.printStackTrace();
-			}
-		}
-	}
-
-	private static Resource getDiagramResource(ResourceSet resourceSet, IEditorInput editorInput) {
-		Resource diagramResource = null;
-		if (editorInput instanceof URIEditorInput) {
-			final URI resourceURI = ((URIEditorInput) editorInput).getURI().trimFragment();
-			diagramResource = resourceSet.getResource(resourceURI, false);
-		} else if (editorInput instanceof IDiagramEditorInput) {
-			final Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
-			diagramResource = diagram.eResource();
-		} else if (editorInput instanceof IFileEditorInput) {
-			final URI resourceURI = URI.createPlatformResourceURI(((IFileEditorInput) editorInput).getFile()
-					.getFullPath().toString(), true);
-			diagramResource = resourceSet.getResource(resourceURI, false);
-		}
-		return diagramResource;
-	}
-
-}
+/*******************************************************************************
+ * Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.yakindu.sct.ui.editor.partitioning;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
+import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PlatformUI;
+
+public class ResourceUnloadingTool {
+
+	public static void unloadEditorInput(ResourceSet resourceSet, IEditorInput editorInput) {
+		final EList<Resource> resources = resourceSet.getResources();
+		final List<Resource> resourcesToUnload = new ArrayList<Resource>(resources);
+		IEditorReference[] editorReferences;
+		try {
+			editorReferences = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
+					.getEditorReferences();
+		} catch (final NullPointerException exc) {
+			// Workbench is not yet created or being disposed, so do nothing
+			// see bug http://code.google.com/p/gmftools/issues/detail?id=9
+			return;
+		}
+		for (final IEditorReference openEditorReference : editorReferences) {
+			try {
+				final IEditorInput openEditorInput = openEditorReference.getEditorInput();
+				if (openEditorInput != editorInput) {
+					final IEditorPart openEditor = openEditorReference.getEditor(false);
+					if (openEditor instanceof IEditingDomainProvider) {
+						final IEditingDomainProvider openDiagramEditor = (IEditingDomainProvider) openEditor;
+						final ResourceSet diagramResourceSet = openDiagramEditor.getEditingDomain().getResourceSet();
+						if (diagramResourceSet == resourceSet) {
+							final Resource diagramResource = getDiagramResource(diagramResourceSet, openEditorInput);
+							resourcesToUnload.remove(diagramResource);
+							final Collection<?> imports = EMFCoreUtil.getImports(diagramResource);
+							resourcesToUnload.removeAll(imports);
+						}
+					}
+				}
+			} catch (final Exception exc) {
+				exc.printStackTrace();
+			}
+		}
+		try {
+			TransactionUtil.getEditingDomain(resourceSet).runExclusive(new Runnable() {
+				@Override
+				public void run() {
+					for (final Resource resourceToUnload : resourcesToUnload) {
+						try {
+							resourceToUnload.unload();
+							resources.remove(resourceToUnload);
+						} catch (final Throwable t) {
+							t.printStackTrace();
+						}
+					}
+
+				}
+			});
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private static Resource getDiagramResource(ResourceSet resourceSet, IEditorInput editorInput) {
+		Resource diagramResource = null;
+		if (editorInput instanceof URIEditorInput) {
+			final URI resourceURI = ((URIEditorInput) editorInput).getURI().trimFragment();
+			diagramResource = resourceSet.getResource(resourceURI, false);
+		} else if (editorInput instanceof IDiagramEditorInput) {
+			final Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
+			diagramResource = diagram.eResource();
+		} else if (editorInput instanceof IFileEditorInput) {
+			final URI resourceURI = URI.createPlatformResourceURI(((IFileEditorInput) editorInput).getFile()
+					.getFullPath().toString(), true);
+			diagramResource = resourceSet.getResource(resourceURI, false);
+		}
+		return diagramResource;
+	}
+
+}

+ 21 - 19
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/policies/EnlargeContainerEditPolicy.java

@@ -67,26 +67,28 @@ public class EnlargeContainerEditPolicy extends AbstractEditPolicy {
 		ChangeBoundsRequest cbr = (ChangeBoundsRequest) request;
 		CompoundCommand result = new CompoundCommand();
 
-		// Update Bounds of the container hierachy
-		for (IGraphicalEditPart currentContainer : containerHierachy) {
-			IFigure figure = currentContainer.getFigure();
-			SetBoundsCommand boundsCommand = new SetBoundsCommand(getHost().getEditingDomain(),
-					DiagramUIMessages.SetLocationCommand_Label_Resize, new EObjectAdapter(
-							currentContainer.getNotationView()), figure.getBounds());
-			result.add(new ICommandProxy(boundsCommand));
-
-			// Update child bounds of elements that stand in the way...
-			List<IGraphicalEditPart> children = currentContainer.getParent().getChildren();
-			for (IGraphicalEditPart childPart : children) {
-				if (cbr.getEditParts().contains(childPart))
-					continue;
-				IFigure childFigure = childPart.getFigure();
-				if (childPart == currentContainer)
-					continue;
-				SetBoundsCommand childBoundsCommand = new SetBoundsCommand(getHost().getEditingDomain(),
+		// Update Bounds of the container hierarchy
+		if (containerHierachy != null) {
+			for (IGraphicalEditPart currentContainer : containerHierachy) {
+				IFigure figure = currentContainer.getFigure();
+				SetBoundsCommand boundsCommand = new SetBoundsCommand(getHost().getEditingDomain(),
 						DiagramUIMessages.SetLocationCommand_Label_Resize, new EObjectAdapter(
-								childPart.getNotationView()), childFigure.getBounds());
-				result.add(new ICommandProxy(childBoundsCommand));
+								currentContainer.getNotationView()), figure.getBounds());
+				result.add(new ICommandProxy(boundsCommand));
+				
+				// Update child bounds of elements that stand in the way...
+				List<IGraphicalEditPart> children = currentContainer.getParent().getChildren();
+				for (IGraphicalEditPart childPart : children) {
+					if (cbr.getEditParts().contains(childPart))
+						continue;
+					IFigure childFigure = childPart.getFigure();
+					if (childPart == currentContainer)
+						continue;
+					SetBoundsCommand childBoundsCommand = new SetBoundsCommand(getHost().getEditingDomain(),
+							DiagramUIMessages.SetLocationCommand_Label_Resize, new EObjectAdapter(
+									childPart.getNotationView()), childFigure.getBounds());
+					result.add(new ICommandProxy(childBoundsCommand));
+				}
 			}
 		}
 		return result;

+ 8 - 14
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/validation/ShadowModelValidationJob.java

@@ -17,7 +17,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -28,8 +27,6 @@ import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xmi.impl.XMIHelperImpl;
 import org.eclipse.emf.ecore.xmi.impl.XMISaveImpl;
 import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
 import org.eclipse.xtext.util.CancelIndicator;
 import org.eclipse.xtext.validation.CheckMode;
 import org.eclipse.xtext.validation.Issue;
@@ -85,22 +82,19 @@ public class ShadowModelValidationJob extends ValidationJob {
 	protected void cloneResource(final IProgressMonitor monitor, final Resource shadowResource)
 			throws ExecutionException {
 		final ByteArrayOutputStream bout = new ByteArrayOutputStream();
-		AbstractTransactionalCommand cmd = new AbstractTransactionalCommand(TransactionUtil.getEditingDomain(resource),
-				"", null) {
-			@Override
-			protected CommandResult doExecuteWithResult(final IProgressMonitor monitor, IAdaptable info)
-					throws ExecutionException {
+		try {
+			TransactionUtil.getEditingDomain(resource).runExclusive(() -> {
 				try {
 					XMISaveImpl saver = new XMISaveImpl(new XMIHelperImpl((XMLResource) resource));
 					saver.save((XMLResource) resource, bout, Collections.emptyMap());
 					bout.flush();
-				} catch (Throwable t) {
-					return CommandResult.newErrorCommandResult(t.getMessage());
+				} catch (Throwable tt) {
+					tt.printStackTrace();
 				}
-				return CommandResult.newOKCommandResult();
-			}
-		};
-		cmd.execute(monitor, null);
+			});
+		} catch (InterruptedException e1) {
+			e1.printStackTrace();
+		}
 		try {
 			shadowResource.load(new ByteArrayInputStream(bout.toByteArray()), Collections.emptyMap());
 		} catch (IOException e) {

+ 3 - 3
plugins/org.yakindu.sct.ui.navigator/src/org/yakindu/sct/ui/navigator/NavigatorLinkHelper.java

@@ -44,10 +44,10 @@ import org.yakindu.sct.ui.navigator.utils.ComposedAdapterFactoryUtil;
  */
 public class NavigatorLinkHelper implements ILinkHelper {
 
-	private AdapterFactoryContentProvider myAdapterFctoryContentProvier;
+	private AdapterFactoryContentProvider myAdapterFactoryContentProvier;
 
 	public NavigatorLinkHelper() {
-		myAdapterFctoryContentProvier = new AdapterFactoryContentProvider(
+		myAdapterFactoryContentProvier = new AdapterFactoryContentProvider(
 				ComposedAdapterFactoryUtil.FACTORY);
 	}
 
@@ -79,7 +79,7 @@ public class NavigatorLinkHelper implements ILinkHelper {
 			IFile file = WorkspaceSynchronizer.getFile(diagram.eResource());
 			if (file != null) {
 				DomainNavigatorItem item = new DomainNavigatorItem(diagram,
-						file, myAdapterFctoryContentProvier);
+						file, myAdapterFactoryContentProvier);
 				return new StructuredSelection(item);
 			}
 		}

+ 18 - 57
plugins/org.yakindu.sct.ui.navigator/src/org/yakindu/sct/ui/navigator/StatechartNavigatorContentProvider.java

@@ -12,20 +12,16 @@ package org.yakindu.sct.ui.navigator;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature.Setting;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
+import org.eclipse.gmf.runtime.emf.core.util.CrossReferenceAdapter;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.jface.viewers.Viewer;
@@ -33,6 +29,7 @@ import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.navigator.ICommonContentExtensionSite;
 import org.eclipse.ui.navigator.ICommonContentProvider;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.navigator.utils.ComposedAdapterFactoryUtil;
 
 /**
@@ -42,40 +39,24 @@ import org.yakindu.sct.ui.navigator.utils.ComposedAdapterFactoryUtil;
  */
 public class StatechartNavigatorContentProvider implements ICommonContentProvider {
 
-	private AdapterFactoryContentProvider myAdapterFctoryContentProvier;
+	private AdapterFactoryContentProvider myAdapterFactoryContentProvier;
 
 	private static final Object[] EMPTY_ARRAY = new Object[0];
 
 	private Viewer myViewer;
 
-	private AdapterFactoryEditingDomain myEditingDomain;
+	private TransactionalEditingDomain editingDomain;
 
 	private WorkspaceSynchronizer myWorkspaceSynchronizer;
 
 	private Runnable myViewerRefreshRunnable;
 
-	private ECrossReferenceAdapter myCrossReferenceAdapter;
-
 	private ViewerFilter viewerFilter;
 
 	public StatechartNavigatorContentProvider() {
-		myAdapterFctoryContentProvier = new AdapterFactoryContentProvider(ComposedAdapterFactoryUtil.FACTORY);
-
-		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain();
-		myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;
-		myEditingDomain.setResourceToReadOnlyMap(new HashMap<Resource, Boolean>() {
-			/**
-			* 
-			*/
-			private static final long serialVersionUID = -7623655803631543084L;
-
-			public Boolean get(Object key) {
-				if (!containsKey(key)) {
-					put((Resource) key, Boolean.TRUE);
-				}
-				return super.get(key);
-			}
-		});
+		myAdapterFactoryContentProvier = new AdapterFactoryContentProvider(ComposedAdapterFactoryUtil.FACTORY);
+		editingDomain = DiagramPartitioningUtil.getSharedDomain();
+
 		myViewerRefreshRunnable = new Runnable() {
 			public void run() {
 				if (myViewer != null && !myViewer.getControl().isDisposed()) {
@@ -88,11 +69,6 @@ public class StatechartNavigatorContentProvider implements ICommonContentProvide
 			}
 
 			public boolean handleResourceChanged(final Resource resource) {
-				for (Iterator<Resource> it = myEditingDomain.getResourceSet().getResources().iterator(); it
-						.hasNext();) {
-					Resource nextResource = (Resource) it.next();
-					nextResource.unload();
-				}
 				if (myViewer != null) {
 					myViewer.getControl().getDisplay().asyncExec(myViewerRefreshRunnable);
 				}
@@ -100,11 +76,6 @@ public class StatechartNavigatorContentProvider implements ICommonContentProvide
 			}
 
 			public boolean handleResourceDeleted(Resource resource) {
-				for (Iterator<Resource> it = myEditingDomain.getResourceSet().getResources().iterator(); it
-						.hasNext();) {
-					Resource nextResource = (Resource) it.next();
-					nextResource.unload();
-				}
 				if (myViewer != null) {
 					myViewer.getControl().getDisplay().asyncExec(myViewerRefreshRunnable);
 				}
@@ -112,33 +83,18 @@ public class StatechartNavigatorContentProvider implements ICommonContentProvide
 			}
 
 			public boolean handleResourceMoved(Resource resource, final URI newURI) {
-				for (Iterator<Resource> it = myEditingDomain.getResourceSet().getResources().iterator(); it
-						.hasNext();) {
-					Resource nextResource = (Resource) it.next();
-					nextResource.unload();
-				}
 				if (myViewer != null) {
 					myViewer.getControl().getDisplay().asyncExec(myViewerRefreshRunnable);
 				}
 				return true;
 			}
 		});
-
-		myCrossReferenceAdapter = new ECrossReferenceAdapter();
-		myEditingDomain.getResourceSet().eAdapters().add(myCrossReferenceAdapter);
 	}
 
 	public void dispose() {
 		myWorkspaceSynchronizer.dispose();
 		myWorkspaceSynchronizer = null;
 		myViewerRefreshRunnable = null;
-		for (Iterator<Resource> it = myEditingDomain.getResourceSet().getResources().iterator(); it.hasNext();) {
-			Resource resource = (Resource) it.next();
-			resource.unload();
-		}
-		myEditingDomain.getResourceSet().eAdapters().remove(myCrossReferenceAdapter);
-		((TransactionalEditingDomain) myEditingDomain).dispose();
-		myEditingDomain = null;
 	}
 
 	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
@@ -163,13 +119,13 @@ public class StatechartNavigatorContentProvider implements ICommonContentProvide
 		if (parentElement instanceof IFile) {
 			IFile file = (IFile) parentElement;
 			URI fileURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
-			Resource resource = myEditingDomain.getResourceSet().getResource(fileURI, true);
-			return wrapEObjects(myAdapterFctoryContentProvier.getChildren(resource), parentElement);
+			Resource resource = editingDomain.getResourceSet().getResource(fileURI, true);
+			return wrapEObjects(myAdapterFactoryContentProvier.getChildren(resource), parentElement);
 		}
 
 		if (parentElement instanceof DomainNavigatorItem) {
 			return wrapEObjects(
-					myAdapterFctoryContentProvier.getChildren(((DomainNavigatorItem) parentElement).getEObject()),
+					myAdapterFactoryContentProvier.getChildren(((DomainNavigatorItem) parentElement).getEObject()),
 					parentElement);
 		}
 		return EMPTY_ARRAY;
@@ -180,7 +136,7 @@ public class StatechartNavigatorContentProvider implements ICommonContentProvide
 		for (int i = 0; i < objects.length; i++) {
 			if (objects[i] instanceof EObject) {
 				DomainNavigatorItem navigatorItem = new DomainNavigatorItem((EObject) objects[i], parentElement,
-						myAdapterFctoryContentProvier);
+						myAdapterFactoryContentProvier);
 				// Check if object has a corresponding View
 				if (!(objects[i] instanceof View)) {
 					EObject eObject = (EObject) objects[i];
@@ -193,8 +149,13 @@ public class StatechartNavigatorContentProvider implements ICommonContentProvide
 	}
 
 	private View getReferencigView(EObject eObject) {
-
-		Collection<Setting> inverseReferences = myCrossReferenceAdapter.getInverseReferences(eObject, true);
+		
+		CrossReferenceAdapter refAdapter = (CrossReferenceAdapter) CrossReferenceAdapter
+				.getExistingCrossReferenceAdapter(eObject.eResource());
+		if(refAdapter == null)
+			return null;
+		@SuppressWarnings("unchecked")
+		Collection<Setting> inverseReferences = refAdapter.getInverseReferences(eObject, true);
 
 		for (Setting setting : inverseReferences) {
 			if (setting.getEObject() instanceof View