소스 검색

Avoid creation of duplicate EditingDomains (#2035)

Andreas Mülder 7 년 전
부모
커밋
fa36d318a3

+ 2 - 1
plugins/org.yakindu.base.expressions/src/org/yakindu/base/expressions/scoping/AbstractLibraryGlobalScopeProvider.java

@@ -20,6 +20,7 @@ import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.resource.IResourceDescription;
 import org.eclipse.xtext.resource.IResourceServiceProvider;
@@ -87,7 +88,7 @@ public abstract class AbstractLibraryGlobalScopeProvider extends AbstractGlobalS
 
 	protected Iterable<IEObjectDescription> getDescriptions(Resource context, URI uri) {
 		List<IEObjectDescription> result = Lists.newArrayList();
-		ResourceSet set = context.getResourceSet();
+		ResourceSet set = new ResourceSetImpl();
 		Resource resource = set.getResource(uri, true);
 		IResourceServiceProvider resourceServiceProvider = serviceProviderRegistry.getResourceServiceProvider(uri);
 		if (resourceServiceProvider == null) {

+ 33 - 20
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/ImportedResourceCache.java

@@ -15,6 +15,7 @@ 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;
@@ -42,7 +43,7 @@ public class ImportedResourceCache {
 	@Inject
 	private IResourceScopeCache cache;
 
-	protected TransactionalEditingDomain getEditingDomain() {
+	protected static synchronized TransactionalEditingDomain getEditingDomain() {
 		TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE
 				.getEditingDomain(DOMAIN_ID);
 		if (editingDomain == null) {
@@ -55,29 +56,41 @@ public class ImportedResourceCache {
 	}
 
 	public IResourceDescription get(final URI uri) {
-		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>>() {
+		try {
+			return (IResourceDescription) getEditingDomain()
+					.runExclusive(new RunnableWithResult.Impl<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);
+						public void run() {
+							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());
+								}
+							}
 						}
 					});
-			if (optional.isPresent()) {
-				return optional.get();
-			}
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+			return null;
 		}
-		return null;
 	}
 
 	protected ResourceSet getResourceSet() {