blob: d9219d5aa7be9e9d99285b21d16c38dafd35895d (
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
77
78
79
80
81
82
|
package hu.bme.mit.inf.yakinduModelExtractor
import org.yakindu.sct.model.sgraph.Statechart
import org.yakindu.sct.model.sgraph.SGraphPackage
import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage
import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummFactory
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EClass
import java.util.HashMap
import org.eclipse.emf.ecore.EReference
import java.util.List
class Yakindu2CommonModel {
val yakinduSGraphPackage = org.yakindu.sct.model.sgraph.SGraphPackage.eINSTANCE
val commonSGraphPackage = YakindummPackage.eINSTANCE
val extension YakindummFactory factory = YakindummFactory.eINSTANCE
def transform(Statechart s) {
val o2o = new HashMap
o2o.put(s,s.copyObject)
for(content: s.eAllContents.toIterable) {
val copied = content.copyObject
if(copied !== null) {
o2o.put(content,copied)
}
}
for(sourceObjectEntry : o2o.entrySet) {
val originalSource = sourceObjectEntry.key
val copiedSource = sourceObjectEntry.value
for(originalReference : originalSource.eClass.EAllReferences) {
if(originalReference.isMany) {
val originalTargets = originalSource.eGet(originalReference) as List<? extends EObject>
for(originalTarget : originalTargets) {
if(o2o.containsKey(originalTarget)) {
copyReference(originalReference,copiedSource,o2o.get(originalTarget))
}
}
} else {
val originalTarget = originalSource.eGet(originalReference) as EObject
if(o2o.containsKey(originalTarget)) {
copyReference(originalReference,copiedSource,o2o.get(originalTarget))
}
}
}
}
return o2o.get(s)
}
def private copyObject(EObject o) {
if(o.createCopy) {
val className = o.eClass.name
//if(className =="Exit") println("Exit")
val correspondingClass = commonSGraphPackage.EClassifiers.filter(EClass).filter[it.name == className].head
if(correspondingClass != null) {
return factory.create(correspondingClass)
} else {
println(className)
return null
}
}
else return null
}
def private copyReference(EReference reference, EObject source, EObject target) {
val correspondingSourceClass = commonSGraphPackage.EClassifiers.filter(EClass).filter[it.name == reference.EContainingClass.name].head
if(correspondingSourceClass !== null) {
val correspondingReference = correspondingSourceClass.EReferences.filter[it.name === reference.name].head
if(correspondingReference !== null) {
if(correspondingReference.isMany) {
(source.eGet(correspondingReference) as List<? super EObject>).add(target)
} else {
source.eSet(correspondingReference,target);
}
}
}
}
def private createCopy(EObject o) {
o.eClass.EPackage === yakinduSGraphPackage
}
}
|