[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) {