From 7b40388ea6bb96ab3adacf338b1bc30d06474df4 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Wed, 24 Jan 2018 11:42:29 +0100 Subject: Loading services --- .../validation/QueryAndMetamodelValidator.xtend | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend new file mode 100644 index 00000000..e1a20ffd --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend @@ -0,0 +1,53 @@ +package hu.bme.mit.inf.dslreasoner.application.execution.validation + +import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor +import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor +import java.util.List +import java.util.Set +import org.eclipse.emf.ecore.ENamedElement +import org.eclipse.viatra.query.patternlanguage.patternLanguage.Pattern +import org.eclipse.viatra.query.runtime.api.IQuerySpecification +import java.util.LinkedList + +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 -- cgit v1.2.3-70-g09d2