aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend')
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/validation/QueryAndMetamodelValidator.xtend53
1 files changed, 53 insertions, 0 deletions
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 @@
1package hu.bme.mit.inf.dslreasoner.application.execution.validation
2
3import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor
4import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor
5import java.util.List
6import java.util.Set
7import org.eclipse.emf.ecore.ENamedElement
8import org.eclipse.viatra.query.patternlanguage.patternLanguage.Pattern
9import org.eclipse.viatra.query.runtime.api.IQuerySpecification
10import java.util.LinkedList
11
12class QueryAndMetamodelValidator {
13
14 def public validateQueryAndMetamodel(
15 EcoreMetamodelDescriptor metamodel,
16 Pair<ViatraQuerySetDescriptor, Set<Pattern>> viatra)
17 {
18 val patterns = viatra.value
19 val elementsInMetamodel =
20 (metamodel.classes +
21 metamodel.enums +
22 metamodel.literals+
23 metamodel.attributes +
24 metamodel.references)
25 .toSet
26 val errors = new LinkedList
27 for(pattern : patterns) {
28 val elements = getReferredNamedElements(pattern)
29 for(element : elements) {
30 if(!elementsInMetamodel.contains(element)) {
31 errors+='''Pattern "«pattern.name»" refers to an element "«element»" that is not included to the selected metamodel!'''
32 }
33 }
34 }
35 return errors
36 }
37
38 def getReferredNamedElements(Pattern pattern) {
39 val elements = pattern.eAllContents.toList
40 return elements.map[element|
41 val references = element.eClass.EAllReferences
42 return references.map[r |
43 if(r.isMany) {
44 return (element.eGet(r) as List<?>).filter(ENamedElement)
45 } else {
46 val value = element.eGet(r)
47 if(value instanceof ENamedElement) return #[value]
48 else return #[]
49 }
50 ].flatten.filter(ENamedElement)
51 ].flatten
52 }
53} \ No newline at end of file