[573982] Avoid Xtext concurrency for changed input
diff --git a/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseCSorASDocumentProvider.java b/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseCSorASDocumentProvider.java
index 2c8c7fc..de68b1e 100644
--- a/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseCSorASDocumentProvider.java
+++ b/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseCSorASDocumentProvider.java
@@ -49,6 +49,7 @@
import org.eclipse.ocl.pivot.PivotPackage;
import org.eclipse.ocl.pivot.internal.resource.OCLASResourceFactory;
import org.eclipse.ocl.pivot.internal.resource.StandaloneProjectMap;
+import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
import org.eclipse.ocl.pivot.internal.utilities.PivotConstantsInternal;
import org.eclipse.ocl.pivot.resource.ASResource;
import org.eclipse.ocl.pivot.resource.CSResource;
@@ -550,8 +551,28 @@
@Override
protected void setDocumentResource(XtextDocument xtextDocument, IEditorInput editorInput, String encoding) throws CoreException {
- super.setDocumentResource(xtextDocument, editorInput, encoding);
String loadedAs = loadedAsMap.get(xtextDocument);
+ boolean needModify = false;
+ if (!isText(loadedAs) && (xtextDocument instanceof BaseDocument)) {
+ EnvironmentFactoryInternal environmentFactory = ((BaseDocument)xtextDocument).basicGetEnvironmentFactory();
+ if (environmentFactory != null) {
+ needModify = true;
+ }
+ }
+ if (!needModify) {
+ super.setDocumentResource(xtextDocument, editorInput, encoding);
+ }
+ else { // Fix Bug 573982 avoid concurrent load / reconcile
+ xtextDocument.modify(new IUnitOfWork<Object, XtextResource>()
+ {
+ @Override
+ public Object exec(XtextResource state) throws Exception {
+ BaseCSorASDocumentProvider.super.setDocumentResource(xtextDocument, editorInput, encoding);
+ return null;
+ }
+ });
+ }
+ assert loadedAs == loadedAsMap.get(xtextDocument);
if (!isText(loadedAs)) {
xtextDocument.readOnly(new IUnitOfWork<Object, XtextResource>()
{
diff --git a/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseDocument.java b/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseDocument.java
index 7240f24..86ddbec 100644
--- a/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseDocument.java
+++ b/plugins/org.eclipse.ocl.xtext.base.ui/src/org/eclipse/ocl/xtext/base/ui/model/BaseDocument.java
@@ -61,6 +61,10 @@
super();
}
+ public @Nullable EnvironmentFactoryInternal basicGetEnvironmentFactory() {
+ return environmentFactory;
+ }
+
public void initEnvironmentFactory(@Nullable EnvironmentFactoryInternal environmentFactory) {
this.environmentFactory = environmentFactory;
}
@@ -121,6 +125,10 @@
super(tokenSource, composer);
}
+ public @Nullable EnvironmentFactoryInternal basicGetEnvironmentFactory() {
+ return baseStateAccess != null ? baseStateAccess.basicGetEnvironmentFactory() : null;
+ }
+
protected void checkForErrors(Resource resource) throws CoreException {
List<Resource.Diagnostic> errors = resource.getErrors();
if (errors.size() > 0) {