Explorar o código

loading resources requires exclusive access to ResourceSet

andreas muelder %!s(int64=7) %!d(string=hai) anos
pai
achega
c9ba2259d6

+ 32 - 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;
@@ -55,30 +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() {