From 7b40388ea6bb96ab3adacf338b1bc30d06474df4 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Wed, 24 Jan 2018 11:42:29 +0100 Subject: Loading services --- .../execution/validation/MetamodelValidator.xtend | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/MetamodelValidator.xtend (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/MetamodelValidator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/MetamodelValidator.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/MetamodelValidator.xtend new file mode 100644 index 00000000..aae47c83 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/MetamodelValidator.xtend @@ -0,0 +1,76 @@ +package hu.bme.mit.inf.dslreasoner.application.execution.validation + +import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor +import java.util.LinkedList +import java.util.List +import org.eclipse.emf.ecore.EAttribute +import org.eclipse.emf.ecore.EClass +import org.eclipse.emf.ecore.EDataType +import org.eclipse.emf.ecore.EEnum +import org.eclipse.emf.ecore.EEnumLiteral +import org.eclipse.emf.ecore.EReference +import org.eclipse.emf.ecore.EcorePackage + +class MetamodelValidator { + def validateMetamodel(EcoreMetamodelDescriptor descriptor) { + val errors = new LinkedList + this.allSupertypesAreIncluded(descriptor.classes,errors) + this.allEnumTypesareIncluded(descriptor.enums,descriptor.literals,errors) + this.referenceEndpointsAreIncluded(descriptor.classes,descriptor.references,errors) + this.attributeSourcePontIsIncluded(descriptor.classes,descriptor.attributes,errors) + this.attributeTargetIsSupported(descriptor.attributes,errors) + return errors + } + + + private def supportedEDataType(EDataType dataType) { + val extension l = EcorePackage.eINSTANCE + return #[EInt, EBoolean, EString, EDouble, EFloat].contains(dataType) + } + + def allSupertypesAreIncluded(List classes, List errors) { + for(c : classes) { + for(s : c.ESuperTypes) { + if(!classes.contains(s)) { + errors.add('''Metamodel contains "«c.name»" but not contains its supertype "«s.name»"!''') + } + } + } + } + def allEnumTypesareIncluded(List enums, List literals, List errors) { + for(l: literals) { + if(!enums.contains(l.EEnum)) { + errors.add('''Metamodel contains literal "«l.name»" but does not contains enum "«l.EEnum.name»"!''') + } + } + } + def referenceEndpointsAreIncluded(List classes, List references, List errors) { + for(reference : references) { + val src = reference.EContainingClass + if(!classes.contains(src)) { + errors.add('''Metamodel contains reference "«reference.name»" but does not contains its source type "«src.name»"!''') + } + + val trg = reference.EReferenceType + if(!classes.contains(trg)) { + errors.add('''Metamodel contains reference "«reference.name»" but does not contains its target type "«trg.name»"!''') + } + } + } + def attributeSourcePontIsIncluded(List classes, List attributes, List errors) { + for(attribute : attributes) { + val src = attribute.containerClass + if(!classes.contains(src)) { + errors.add('''Metamodel contains attribute "«attribute.name»" but does not contains its source type "«src.name»"!''') + } + } + } + def attributeTargetIsSupported(List attributes, List errors) { + for(attribute: attributes) { + val trg = attribute.EAttributeType + if(!supportedEDataType(trg)) { + errors.add('''Metamodels contains attribute "«attribute.name»" with unsupported type "«trg.name»"!''') + } + } + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf