Commit bc76dd2b authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ two failed attempts to integrate standalone ocl validation

parent 632a9ead
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.constraints.evl;

import java.util.Map;

import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EObjectValidator;
import org.eclipse.ocl.pivot.internal.labels.LabelSubstitutionLabelProvider;

public class TDLDiagnostician extends Diagnostician {
	@Override
	public Map<Object, Object> createDefaultContext() {
		Map<Object, Object> context = super.createDefaultContext();
		context.put(EValidator.SubstitutionLabelProvider.class, new LabelSubstitutionLabelProvider());
		return context;
	}

	public BasicDiagnostic createDefaultDiagnostic(Resource resource) {
		return new BasicDiagnostic(EObjectValidator.DIAGNOSTIC_SOURCE, 0, "Message", new Object[] { resource });
	}

	public Diagnostic validate(Resource resource) {
		BasicDiagnostic diagnostics = createDefaultDiagnostic(resource);
		Map<Object, Object> context = createDefaultContext();
		resource.getAllContents().forEachRemaining(e->validate(e, diagnostics, context));
//		for (EObject eObject : resource.getContents()) {
//			validate(eObject, diagnostics, context);
//		}
		return diagnostics;
	}
}
+74 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import java.util.stream.Collectors;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EValidator;
@@ -64,6 +65,11 @@ import org.eclipse.epsilon.evl.execute.UnsatisfiedConstraint;
import org.eclipse.epsilon.profiling.Profiler;
import org.eclipse.epsilon.profiling.ProfilerTargetSummary;
import org.eclipse.epsilon.profiling.ProfilingExecutionListener;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.pivot.utilities.OCL;
import org.eclipse.ocl.pivot.utilities.PivotUtil;
import org.eclipse.ocl.pivot.validation.ComposedEValidator;
import org.eclipse.ocl.xtext.completeocl.validation.CompleteOCLEObjectValidator;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.XtextResource;
@@ -78,6 +84,74 @@ public class Validator {
	
	private static final List<EPackage> packages = List.of(tdlPackage.eINSTANCE, StructuredObjectivesPackage.eINSTANCE, ExtendedConfigurationsPackage.eINSTANCE);
	
	private static void registerValidator(EPackage ePackage, EValidator validator) {
		EValidator existingValidator = EValidator.Registry.INSTANCE.getEValidator(ePackage);
		if (existingValidator instanceof CompositeEValidator) {
		    ((CompositeEValidator) existingValidator).getDelegates().add(validator);
		} else {
		    if (existingValidator == null) {
		        existingValidator = EObjectValidator.INSTANCE;
		    }
		    CompositeEValidator newValidator = new CompositeEValidator();
		    newValidator.getDelegates().add(existingValidator);
		    newValidator.getDelegates().add(validator);
		    EValidator.Registry.INSTANCE.put(ePackage, newValidator);
		}
	}

	public void validateOCL2(Resource r) {
		try {
			OCL ocl = OCL.newInstance(EPackage.Registry.INSTANCE);
			URI uri = getSourceUri("/ocl/tdl-constraints.ocl");
			org.eclipse.emf.common.util.URI oclURI = org.eclipse.emf.common.util.URI.createURI(uri.toString());
			Resource asResource = ocl.parse(oclURI);
			ComposedEValidator newEValidator = ComposedEValidator.install(tdlPackage.eINSTANCE);
			newEValidator.addChild(new CompleteOCLEObjectValidator(tdlPackage.eINSTANCE, oclURI));

			TDLDiagnostician diagnostician = new TDLDiagnostician();
			Diagnostic diagnostics = diagnostician.validate(r);
			System.out.println(diagnostics.getChildren().size());
			// Print the diagnostics
			if (diagnostics.getSeverity() != Diagnostic.OK) {
				String formattedDiagnostics = PivotUtil.formatDiagnostics(diagnostics, "In");
				System.out.println("Validation: "+formattedDiagnostics);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public void validateOCL(Resource r) {
		//TODO: does not quite work yet
		ComposedEValidator oclValidator = ComposedEValidator.install(tdlPackage.eINSTANCE);
		try {
			URI uri = getSourceUri("/ocl/tdl-constraints.ocl");
			org.eclipse.emf.common.util.URI oclURI = org.eclipse.emf.common.util.URI.createURI(uri.toString());
			
			CompleteOCLEObjectValidator validator = new CompleteOCLEObjectValidator(tdlPackage.eINSTANCE,
					oclURI);
			// Validate the entire Resource containing the library
			//TODO: overrides other validators
			registerValidator(tdlPackage.eINSTANCE, validator);
//			EValidator.Registry.INSTANCE.put(tdlPackage.eINSTANCE, validator);

			TDLDiagnostician diagnostician = new TDLDiagnostician();
			Diagnostic diagnostics = diagnostician.validate(r);
			System.out.println(diagnostics.getChildren().size());
			// Print the diagnostics
			if (diagnostics.getSeverity() != Diagnostic.OK) {
				String formattedDiagnostics = PivotUtil.formatDiagnostics(diagnostics, "In");
				System.out.println("Validation: "+formattedDiagnostics);
				System.out.printf("Validation: %s\n", formattedDiagnostics);
//				debugPrintf ("Validation: %\n", formattedDiagnostics);
			}
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public List<UnsatisfiedConstraint> validate(Resource r) throws Exception {
		List<UnsatisfiedConstraint> violations = new ArrayList<>();
		String prefix = "tdl-generated-ETSI-ES-203-119-";