From 2002dffe76957cbd1d45b7da5c678742053566bd Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Tue, 30 Jan 2018 01:29:00 +0100 Subject: Validators refactored --- .../validation/MetamodelValidator.xtend | 76 ++++++++++++++++++++++ .../validation/QueryAndMetamodelValidator.xtend | 52 +++++++++++++++ ...icationConfigurationValueConverterService.xtend | 14 ++++ 3 files changed, 142 insertions(+) create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend new file mode 100644 index 00000000..fccc433a --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend @@ -0,0 +1,76 @@ +package hu.bme.mit.inf.dslreasoner.application.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 diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend new file mode 100644 index 00000000..0efd522b --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend @@ -0,0 +1,52 @@ +package hu.bme.mit.inf.dslreasoner.application.validation + +import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor +import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor +import java.util.LinkedList +import java.util.List +import java.util.Set +import org.eclipse.emf.ecore.ENamedElement +import org.eclipse.viatra.query.patternlanguage.patternLanguage.Pattern + +class QueryAndMetamodelValidator { + + def public validateQueryAndMetamodel( + EcoreMetamodelDescriptor metamodel, + Pair> viatra) + { + val patterns = viatra.value + val elementsInMetamodel = + (metamodel.classes + + metamodel.enums + + metamodel.literals+ + metamodel.attributes + + metamodel.references) + .toSet + val errors = new LinkedList + for(pattern : patterns) { + val elements = getReferredNamedElements(pattern) + for(element : elements) { + if(!elementsInMetamodel.contains(element)) { + errors+='''Pattern "«pattern.name»" refers to an element "«element»" that is not included to the selected metamodel!''' + } + } + } + return errors + } + + def getReferredNamedElements(Pattern pattern) { + val elements = pattern.eAllContents.toList + return elements.map[element| + val references = element.eClass.EAllReferences + return references.map[r | + if(r.isMany) { + return (element.eGet(r) as List).filter(ENamedElement) + } else { + val value = element.eGet(r) + if(value instanceof ENamedElement) return #[value] + else return #[] + } + ].flatten.filter(ENamedElement) + ].flatten + } +} \ No newline at end of file diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend new file mode 100644 index 00000000..433f7148 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend @@ -0,0 +1,14 @@ +package hu.bme.mit.inf.dslreasoner.application.valueconverter + +import org.eclipse.xtext.common.services.DefaultTerminalConverters +import org.eclipse.xtext.conversion.IValueConverter +import org.eclipse.xtext.conversion.ValueConverter + +class ApplicationConfigurationValueConverterService extends DefaultTerminalConverters { + //val org.eclipse.xtext.conversion.impl.QualifiedNameValueConverter converter = new org.eclipse.xtext.conversion.impl.QualifiedNameValueConverter + val QualifiedNameValueConverter converter2 = new QualifiedNameValueConverter + @ValueConverter(rule="QualifiedName") + def IValueConverter QualifiedName() { + converter2 + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf