Commit 419a0ca6 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ refactoring and fix for validation freezes, #157

parent c9207b6a
Loading
Loading
Loading
Loading
+59 −32
Original line number Diff line number Diff line
@@ -22,23 +22,52 @@ import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
import org.eclipse.ocl.pivot.resource.CSResource;
import org.eclipse.ocl.pivot.utilities.PivotUtil;
import org.eclipse.ocl.pivot.validation.ValidationRegistryAdapter;
import org.eclipse.ocl.xtext.completeocl.validation.CompleteOCLEObjectValidator;
import org.eclipse.ocl.xtext.completeocl.validation.CompleteOCLValidator;
import org.eclipse.xtext.validation.EValidatorRegistrar;
import org.osgi.framework.BundleContext;

public class Validator {
	static CompleteOCLEObjectValidator validator;
	
	public static void registerValidator(String path, EPackage ePakcage, BundleContext context) {

	public static void removeValidator(EPackage ePackage, ResourceSet rs){
		ValidationRegistryAdapter.getAdapter(rs).remove(ePackage);
	}

	public static void removeValidator(EPackage ePackage){
		EValidator.Registry.INSTANCE.remove(ePackage);
//		validator = null;
	}

	
	public static void registerValidator(String path, EPackage ePakcage, BundleContext context) {
		Path oclPath = new Path(path);
		URL oclURL = FileLocator.find(context.getBundle(), oclPath);

		URI oclURI;
		try {
			oclURI = URI.createURI(oclURL.toURI().toString());
			CompleteOCLEObjectValidator validator = new CompleteOCLEObjectValidator(ePakcage, oclURI) {
			CompleteOCLEObjectValidator validator = createValidator(ePakcage, oclURI);
			
			EValidator.Registry.INSTANCE.put(tdlPackage.eINSTANCE, validator);
		} catch (URISyntaxException e) {
			throw new RuntimeException(e);
		}
	}

	private static CompleteOCLEObjectValidator createValidator(EPackage ePakcage, URI oclURI) {
		if (validator != null) {
			return validator;
		}
		validator = new CompleteOCLEObjectValidator(ePakcage, oclURI) {
			private boolean initialised = false;
			
			@Override
			public boolean initialize(@NonNull EnvironmentFactoryInternal environmentFactory) {
				boolean success = super.initialize(environmentFactory);
				if (initialised) return success;
				if (success) {
					// This should happen in super.initialize(..) but under certain conditions it returns early
					ResourceSet resourceSet = environmentFactory.getResourceSet();
@@ -51,6 +80,7 @@ public class Validator {
						return false;
					}
				}
				initialised = true;
				return success;
			}
			@Override
@@ -66,10 +96,7 @@ public class Validator {
				return super.validatePivot(eClassifier, object, diagnostics, validationContext);
			}
		};
			EValidator.Registry.INSTANCE.put(tdlPackage.eINSTANCE, validator);
		} catch (URISyntaxException e) {
			throw new RuntimeException(e);
		}
		return validator;
	}

}
+2 −1
Original line number Diff line number Diff line
@@ -51,7 +51,8 @@ public class ToggleHandler implements IStartup {
    }
    
    static void disablePlugin() {
		EValidator.Registry.INSTANCE.remove(tdlPackage.eINSTANCE);
//		EValidator.Registry.INSTANCE.remove(tdlPackage.eINSTANCE);
		Validator.removeValidator(tdlPackage.eINSTANCE);
    }

}