diff --git a/plugins/org.etsi.mts.tdl.constraints/src/org/etsi/mts/tdl/constraints/evl/TDLDiagnostician.java b/plugins/org.etsi.mts.tdl.constraints/src/org/etsi/mts/tdl/constraints/evl/TDLDiagnostician.java new file mode 100644 index 0000000000000000000000000000000000000000..4d6acbb8a3bdfb771b2325ae223413bd914ff878 --- /dev/null +++ b/plugins/org.etsi.mts.tdl.constraints/src/org/etsi/mts/tdl/constraints/evl/TDLDiagnostician.java @@ -0,0 +1,35 @@ +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 createDefaultContext() { + Map 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 context = createDefaultContext(); + resource.getAllContents().forEachRemaining(e->validate(e, diagnostics, context)); +// for (EObject eObject : resource.getContents()) { +// validate(eObject, diagnostics, context); +// } + return diagnostics; + } +} diff --git a/plugins/org.etsi.mts.tdl.constraints/src/org/etsi/mts/tdl/constraints/evl/Validator.java b/plugins/org.etsi.mts.tdl.constraints/src/org/etsi/mts/tdl/constraints/evl/Validator.java index 0404b921f905377bca926700226ad6f9cbf04e34..7cfb6a75917eff99fa655ac36c796b53fb08bd12 100644 --- a/plugins/org.etsi.mts.tdl.constraints/src/org/etsi/mts/tdl/constraints/evl/Validator.java +++ b/plugins/org.etsi.mts.tdl.constraints/src/org/etsi/mts/tdl/constraints/evl/Validator.java @@ -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 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 validate(Resource r) throws Exception { List violations = new ArrayList<>(); String prefix = "tdl-generated-ETSI-ES-203-119-";