aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend
blob: f736f6ba38f3e5f91e00220095c9abdff7639873 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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<EClass> classes, List<String> 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<EEnum> enums, List<EEnumLiteral> literals, List<String> 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<EClass> classes, List<EReference> references, List<String> 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<EClass> classes, List<EAttribute> attributes, List<String> 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<EAttribute> attributes, List<String> errors) {
		for(attribute: attributes) {
			val trg = attribute.EAttributeType
			if(!supportedEDataType(trg)) {
				errors.add('''Metamodels contains attribute "«attribute.name»" with unsupported type "«trg.name»"!''')
			}
		}
	}
}