diff options
Diffstat (limited to 'Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend')
-rw-r--r-- | Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend new file mode 100644 index 00000000..3da6305d --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.run/src/hu/bme/mit/inf/dslreasoner/run/MetamodelLoader.xtend | |||
@@ -0,0 +1,132 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.run | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasomer.domains.transima.fam.FunctionalArchitecture.FunctionalArchitecturePackage | ||
4 | import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor | ||
5 | import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor | ||
6 | import java.util.LinkedHashMap | ||
7 | import java.util.List | ||
8 | import org.eclipse.emf.ecore.EAttribute | ||
9 | import org.eclipse.emf.ecore.EClass | ||
10 | import org.eclipse.emf.ecore.EEnum | ||
11 | import org.eclipse.emf.ecore.EEnumLiteral | ||
12 | import org.eclipse.emf.ecore.EReference | ||
13 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage | ||
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ModelGenerationMethodBasedGlobalConstraint | ||
15 | import org.eclipse.xtext.xbase.lib.Functions.Function1 | ||
16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethod | ||
17 | import org.eclipse.emf.ecore.EObject | ||
18 | import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace | ||
19 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor | ||
20 | import java.util.Collection | ||
21 | import java.util.Set | ||
22 | import java.util.Collections | ||
23 | |||
24 | abstract class MetamodelLoader { | ||
25 | protected val ReasonerWorkspace workspace | ||
26 | public new(ReasonerWorkspace workspace) { | ||
27 | this.workspace = workspace | ||
28 | } | ||
29 | def EcoreMetamodelDescriptor loadMetamodel() | ||
30 | def Set<EClass> getRelevantTypes(EcoreMetamodelDescriptor descriptor) | ||
31 | def Set<EReference> getRelevantReferences(EcoreMetamodelDescriptor descriptor) | ||
32 | def ViatraQuerySetDescriptor loadQueries(EcoreMetamodelDescriptor metamodel) | ||
33 | def List<EObject> loadPartialModel() | ||
34 | |||
35 | def List<Function1<ModelGenerationMethod,ModelGenerationMethodBasedGlobalConstraint>> additionalConstraints() | ||
36 | |||
37 | def <T> filterByNames(Iterable<T> collection, Function1<T,String> nameExtractor, Collection<String> requiredNames) { | ||
38 | val res = collection.filter[requiredNames.contains(nameExtractor.apply(it))] | ||
39 | if(res.size != requiredNames.size) throw new IllegalArgumentException | ||
40 | return res.toSet | ||
41 | } | ||
42 | } | ||
43 | |||
44 | class FAMLoader extends MetamodelLoader{ | ||
45 | |||
46 | new(ReasonerWorkspace workspace) { | ||
47 | super(workspace) | ||
48 | } | ||
49 | |||
50 | override loadMetamodel() { | ||
51 | val package = FunctionalArchitecturePackage.eINSTANCE | ||
52 | val List<EClass> classes = package.EClassifiers.filter(EClass).toList | ||
53 | val List<EEnum> enums = package.EClassifiers.filter(EEnum).toList | ||
54 | val List<EEnumLiteral> literals = enums.map[ELiterals].flatten.toList | ||
55 | val List<EReference> references = classes.map[EReferences].flatten.toList | ||
56 | val List<EAttribute> attributes = classes.map[EAttributes].flatten.toList | ||
57 | return new EcoreMetamodelDescriptor(classes,#{},false,enums,literals,references,attributes) | ||
58 | } | ||
59 | |||
60 | override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { | ||
61 | return descriptor.classes.filterByNames([it.name],#["FunctionalElement"]) | ||
62 | } | ||
63 | override getRelevantReferences(EcoreMetamodelDescriptor descriptor) { | ||
64 | return descriptor.references.filterByNames([it.name],#["subElements"]) | ||
65 | } | ||
66 | |||
67 | override loadQueries(EcoreMetamodelDescriptor metamodel) { | ||
68 | val i = hu.bme.mit.inf.dslreasoner.domains.transima.fam.patterns.Pattern.instance | ||
69 | val patterns = i.specifications.toList | ||
70 | val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name== "Constraint"]].toSet | ||
71 | val derivedFeatures = new LinkedHashMap | ||
72 | derivedFeatures.put(i.type.internalQueryRepresentation,metamodel.attributes.filter[it.name == "type"].head) | ||
73 | derivedFeatures.put(i.model.internalQueryRepresentation,metamodel.references.filter[it.name == "model"].head) | ||
74 | val res = new ViatraQuerySetDescriptor( | ||
75 | patterns, | ||
76 | wfPatterns, | ||
77 | derivedFeatures | ||
78 | ) | ||
79 | return res | ||
80 | } | ||
81 | override loadPartialModel() { | ||
82 | this.workspace.readModel(EObject,"FAM.xmi").eResource.allContents.toList | ||
83 | } | ||
84 | |||
85 | override additionalConstraints() { #[] } | ||
86 | } | ||
87 | |||
88 | class YakinduLoader extends MetamodelLoader{ | ||
89 | |||
90 | new(ReasonerWorkspace workspace) { | ||
91 | super(workspace) | ||
92 | } | ||
93 | |||
94 | override loadMetamodel() { | ||
95 | val package = YakindummPackage.eINSTANCE | ||
96 | val List<EClass> classes = package.EClassifiers.filter(EClass).toList | ||
97 | val List<EEnum> enums = package.EClassifiers.filter(EEnum).toList | ||
98 | val List<EEnumLiteral> literals = enums.map[ELiterals].flatten.toList | ||
99 | val List<EReference> references = classes.map[EReferences].flatten.toList | ||
100 | |||
101 | val List<EAttribute> attributes = classes.map[EAttributes].flatten.toList | ||
102 | |||
103 | return new EcoreMetamodelDescriptor(classes,#{},false,enums,literals,references,attributes) | ||
104 | } | ||
105 | override loadQueries(EcoreMetamodelDescriptor metamodel) { | ||
106 | val i = hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns.instance | ||
107 | val patterns = i.specifications.toList | ||
108 | val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name== "Constraint"]].toSet | ||
109 | val derivedFeatures = new LinkedHashMap | ||
110 | val res = new ViatraQuerySetDescriptor( | ||
111 | patterns, | ||
112 | wfPatterns, | ||
113 | derivedFeatures | ||
114 | ) | ||
115 | return res | ||
116 | } | ||
117 | override getRelevantTypes(EcoreMetamodelDescriptor descriptor) { | ||
118 | descriptor.classes.filterByNames([it.name],#["Vertex","Transition","Synchronization"]) | ||
119 | } | ||
120 | |||
121 | override getRelevantReferences(EcoreMetamodelDescriptor descriptor) { | ||
122 | descriptor.references.filterByNames([it.name],#["source","target"]) | ||
123 | } | ||
124 | |||
125 | override loadPartialModel() { | ||
126 | this.workspace.readModel(EObject,"Yakindu.xmi").eResource.allContents.toList | ||
127 | } | ||
128 | |||
129 | override additionalConstraints() { | ||
130 | #[[method | new SGraphInconsistencyDetector(method)]] | ||
131 | } | ||
132 | } \ No newline at end of file | ||