[571621] Make CompleteOCLEObjectValidator stateless
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src/org/eclipse/ocl/xtext/completeocl/validation/CompleteOCLEObjectValidator.java b/plugins/org.eclipse.ocl.xtext.completeocl/src/org/eclipse/ocl/xtext/completeocl/validation/CompleteOCLEObjectValidator.java
index 90dbb13..8f1389e 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src/org/eclipse/ocl/xtext/completeocl/validation/CompleteOCLEObjectValidator.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src/org/eclipse/ocl/xtext/completeocl/validation/CompleteOCLEObjectValidator.java
@@ -14,7 +14,6 @@
 import java.util.Map;
 
 import org.apache.log4j.Logger;
-import org.eclipse.emf.common.EMFPlugin;
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EClassifier;
@@ -22,18 +21,16 @@
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
 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.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.pivot.Model;
 import org.eclipse.ocl.pivot.internal.ecore.es2as.Ecore2AS;
 import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager;
 import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
+import org.eclipse.ocl.pivot.internal.utilities.PivotUtilInternal;
 import org.eclipse.ocl.pivot.internal.validation.PivotEObjectValidator;
 import org.eclipse.ocl.pivot.resource.CSResource;
 import org.eclipse.ocl.pivot.utilities.EnvironmentFactory;
-import org.eclipse.ocl.pivot.utilities.OCL;
 import org.eclipse.ocl.pivot.utilities.PivotUtil;
 
 /**
@@ -47,44 +44,28 @@
 {
 	private static final Logger logger = Logger.getLogger(CompleteOCLEObjectValidator.class);
 
-	protected final @NonNull EnvironmentFactoryInternal environmentFactory;
 	protected final @NonNull EPackage ePackage;
 	protected final @NonNull URI oclURI;
-	private Ecore2AS ecore2as = null;
 
 	/**
 	 * Construct a validator to apply the CompleteOCL invariants from oclURI to ePackage
 	 * for the meta-models managed by a newly created environmentFactory.
-	 *
-	 * @deprecated Use the three argument constructor
 	 */
-	@Deprecated
+	@SuppressWarnings("deprecation")
 	public CompleteOCLEObjectValidator(@NonNull EPackage ePackage, @NonNull URI oclURI) {
-		this(ePackage, oclURI, OCL.newInstance().getEnvironmentFactory());
+		this.ePackage = ePackage;
+		this.oclURI = oclURI;
 	}
 
 	/**
 	 * Construct a validator to apply the CompleteOCL invariants from oclURI to ePackage
 	 * for the meta-models managed by environmentFactory.
+	 *
+	 * @deprecated environmentFactory is not used. Use ThreadLocalExecutor.getEnvironmentFactory()
 	 */
+	@Deprecated
 	public CompleteOCLEObjectValidator(@NonNull EPackage ePackage, @NonNull URI oclURI, @NonNull EnvironmentFactory environmentFactory) {
-		super(null);
-		this.environmentFactory = (EnvironmentFactoryInternal) environmentFactory;
-		this.ePackage = ePackage;
-		if (EMFPlugin.IS_ECLIPSE_RUNNING) {
-			URIConverter uriConverter = this.environmentFactory.getResourceSet().getURIConverter();
-			this.oclURI = uriConverter.normalize(oclURI);	// Convert platform:/resource to platform:/plugin if no project
-		}
-		else {
-			this.oclURI = oclURI;
-		}
-		ResourceSet resourceSet = ePackage.eResource().getResourceSet();
-		if (resourceSet != null) {
-			install(resourceSet, this.environmentFactory);
-		}
-		else {
-			this.environmentFactory.loadEPackage(ePackage);
-		}
+		this(ePackage, oclURI);
 	}
 
 	//	@Override
@@ -92,21 +73,25 @@
 		return ePackage;
 	}
 
+	@Deprecated
 	public @NonNull PivotMetamodelManager getMetamodelManager() {
-		return environmentFactory.getMetamodelManager();
+		return PivotUtilInternal.getEnvironmentFactory(null).getMetamodelManager();	// Better than nothing compatibility
 	}
 
 	/**
 	 * Perform the loading and installation of the Complete OCL, returning true if successful.
 	 */
-	public boolean initialize() {
+	public boolean initialize(@NonNull EnvironmentFactoryInternal environmentFactory) {
 		Resource ecoreResource = ePackage.eResource();
 		if (ecoreResource == null) {
 			return false;
 		}
+		Ecore2AS ecore2as = Ecore2AS.basicGetAdapter(ecoreResource, environmentFactory);
+		if (ecore2as != null) {
+			return true;
+		}
 		ecore2as = Ecore2AS.getAdapter(ecoreResource, environmentFactory);
-		ResourceSet resourceSet = new ResourceSetImpl();
-		environmentFactory.adapt(resourceSet);
+		ResourceSet resourceSet = environmentFactory.getResourceSet(); // new ResourceSetImpl();
 		List<Diagnostic> errors = ecoreResource.getErrors();
 		assert errors != null;
 		String message = PivotUtil.formatResourceDiagnostics(errors, "", "\n");
@@ -143,17 +128,12 @@
 
 	@Override
 	protected boolean validatePivot(@NonNull EClassifier eClassifier, @Nullable Object object,
-			@Nullable DiagnosticChain diagnostics, Map<Object, Object> context) {
-		if (ecore2as == null) {
-			initialize();
-		}
+			@Nullable DiagnosticChain diagnostics, Map<Object, Object> validationContext) {
+		EnvironmentFactoryInternal environmentFactory = PivotUtilInternal.getEnvironmentFactory(object);
+		initialize(environmentFactory);
 		ResourceSet resourceSet = getResourceSet(eClassifier, object, diagnostics);
 		if (resourceSet != null) {
-			ValidationAdapter validationAdapter = ValidationAdapter.findAdapter(resourceSet);
-			if (validationAdapter == null) {
-				validationAdapter = install(resourceSet, environmentFactory);
-			}
-			boolean allOk = validationAdapter.validate(eClassifier, object, complementingModels, diagnostics, context);
+			boolean allOk = validate(environmentFactory, eClassifier, object, complementingModels, diagnostics, validationContext);
 			return allOk || (diagnostics != null);
 		}
 		return true;