aboutsummaryrefslogtreecommitdiffstats
path: root/Framework
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <oszka@152.66.252.189>2017-07-05 14:03:32 +0200
committerLibravatar OszkarSemerath <oszka@152.66.252.189>2017-07-05 14:03:32 +0200
commit94c8f0eb155b624b07b92db2504dd17991be3f0f (patch)
treee8871f5f5458092e9185355f787fa5ff26709225 /Framework
parentWhen there is a definition to a declaration in the logic problem, the (diff)
downloadVIATRA-Generator-94c8f0eb155b624b07b92db2504dd17991be3f0f.tar.gz
VIATRA-Generator-94c8f0eb155b624b07b92db2504dd17991be3f0f.tar.zst
VIATRA-Generator-94c8f0eb155b624b07b92db2504dd17991be3f0f.zip
full Ecore -> Logic -> Ecore support
Diffstat (limited to 'Framework')
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/EReferenceMapper.xtend6
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/META-INF/MANIFEST.MF1
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend45
3 files changed, 35 insertions, 17 deletions
diff --git a/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/EReferenceMapper.xtend b/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/EReferenceMapper.xtend
index e5de6584..81c0858d 100644
--- a/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/EReferenceMapper.xtend
+++ b/Framework/hu.bme.mit.inf.dslreasoner.ecore2logic/src/hu/bme/mit/inf/dslreasoner/ecore2logic/EReferenceMapper.xtend
@@ -14,6 +14,7 @@ import org.eclipse.emf.ecore.EReference
14 14
15interface EReferenceMapper{ 15interface EReferenceMapper{
16 def void transformEReferences(Ecore2Logic_Trace trace, LogicProblem problem, Iterable<EReference> classes); 16 def void transformEReferences(Ecore2Logic_Trace trace, LogicProblem problem, Iterable<EReference> classes);
17 def Iterable<EReference> allReferencesInScope(Ecore2Logic_Trace trace)
17 def Term IsInReference(Ecore2Logic_Trace trace, TermDescription source, TermDescription target, EReference type) 18 def Term IsInReference(Ecore2Logic_Trace trace, TermDescription source, TermDescription target, EReference type)
18 def RelationDeclaration relationOfReference(Ecore2Logic_Trace trace, EReference reference) 19 def RelationDeclaration relationOfReference(Ecore2Logic_Trace trace, EReference reference)
19} 20}
@@ -151,4 +152,9 @@ class EReferenceMapper_RelationsOverTypes implements EReferenceMapper{
151 override relationOfReference(Ecore2Logic_Trace trace, EReference reference) { 152 override relationOfReference(Ecore2Logic_Trace trace, EReference reference) {
152 trace.referenceMapperTrace.asTrace.indicators.get(reference) 153 trace.referenceMapperTrace.asTrace.indicators.get(reference)
153 } 154 }
155
156 override allReferencesInScope(Ecore2Logic_Trace trace) {
157 trace.referenceMapperTrace.asTrace.indicators.keySet
158 }
159
154} \ No newline at end of file 160} \ No newline at end of file
diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/META-INF/MANIFEST.MF b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/META-INF/MANIFEST.MF
index 7a572aa9..5f89c3d0 100644
--- a/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/META-INF/MANIFEST.MF
+++ b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/META-INF/MANIFEST.MF
@@ -10,4 +10,5 @@ Require-Bundle: com.google.guava,
10 org.eclipse.xtend.lib.macro, 10 org.eclipse.xtend.lib.macro,
11 hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", 11 hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0",
12 org.eclipse.ocl.ecore;bundle-version="3.6.0" 12 org.eclipse.ocl.ecore;bundle-version="3.6.0"
13Export-Package: hu.bme.mit.inf.dslreasoner.logic2ecore
13 14
diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend
index 2ab7091e..65328a3a 100644
--- a/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend
+++ b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend
@@ -14,6 +14,7 @@ import java.util.Set
14import org.eclipse.emf.ecore.EObject 14import org.eclipse.emf.ecore.EObject
15import java.util.List 15import java.util.List
16import java.util.Collection 16import java.util.Collection
17import org.eclipse.emf.ecore.EStructuralFeature
17 18
18class Logic2Ecore { 19class Logic2Ecore {
19 private val extension LogicProblemBuilder problemBuilder = new LogicProblemBuilder 20 private val extension LogicProblemBuilder problemBuilder = new LogicProblemBuilder
@@ -29,7 +30,6 @@ class Logic2Ecore {
29 val elements = new HashSet 30 val elements = new HashSet
30 val element2Classes = new HashMap 31 val element2Classes = new HashMap
31 32
32
33 for(clazz: allClasses) { 33 for(clazz: allClasses) {
34 val type = ecore2Logic.TypeofEClass(forwardTrace,clazz); 34 val type = ecore2Logic.TypeofEClass(forwardTrace,clazz);
35 val elementsOfClass = getElements(interpretation,type) 35 val elementsOfClass = getElements(interpretation,type)
@@ -48,20 +48,22 @@ class Logic2Ecore {
48 48
49 val allReferences = ecore2Logic.allReferencesInScope(forwardTrace) 49 val allReferences = ecore2Logic.allReferencesInScope(forwardTrace)
50 for(referenceType : allReferences) { 50 for(referenceType : allReferences) {
51 for(sourceElement : elements) { 51 if(referenceType.canSetFeature) {
52 val sourceObject = sourceElement.lookup(element2Object) 52 for(sourceElement : elements) {
53 if(sourceObject.eClass.isSuperTypeOf(referenceType.EContainingClass)) { 53 val sourceObject = sourceElement.lookup(element2Object)
54 for(targetElement: elements) { 54 if(referenceType.EContainingClass.isSuperTypeOf(sourceObject.eClass)) {
55 val targetObject = targetElement.lookup(element2Object) 55 for(targetElement: elements) {
56 if(targetObject.eClass.isSuperTypeOf(referenceType.EReferenceType)) { 56 val targetObject = targetElement.lookup(element2Object)
57 val expression = ecore2Logic.IsInReference(forwardTrace,sourceElement,targetElement,referenceType) 57 if(referenceType.EReferenceType.isSuperTypeOf(targetObject.eClass)) {
58 val linkExist = interpretation.evalAsBool(expression) 58 val expression = ecore2Logic.IsInReference(forwardTrace,sourceElement,targetElement,referenceType)
59 if(linkExist) { 59 val linkExist = interpretation.evalAsBool(expression)
60 if(referenceType.isMany) { 60 if(linkExist) {
61 val list = sourceObject.eGet(referenceType) as List<? super EObject> 61 if(referenceType.isMany) {
62 list+= targetObject 62 val list = sourceObject.eGet(referenceType) as List<? super EObject>
63 } else { 63 list+= targetObject
64 sourceObject.eSet(referenceType,targetObject) 64 } else {
65 sourceObject.eSet(referenceType,targetObject)
66 }
65 } 67 }
66 } 68 }
67 } 69 }
@@ -70,11 +72,15 @@ class Logic2Ecore {
70 } 72 }
71 } 73 }
72 74
73 /// Attributes 75 /// + Attributes
74 76
75 return element2Object.values.root 77 return element2Object.values.root
76 } 78 }
77 79
80 private def canSetFeature(EStructuralFeature feature) {
81 feature.changeable && !feature.derived
82 }
83
78 def mostConcreteType(Set<EClass> classes) { 84 def mostConcreteType(Set<EClass> classes) {
79 for(candidate : classes) { 85 for(candidate : classes) {
80 val subtypeOfAll = classes.forall[it.isSuperTypeOf(candidate)] 86 val subtypeOfAll = classes.forall[it.isSuperTypeOf(candidate)]
@@ -86,6 +92,11 @@ class Logic2Ecore {
86 } 92 }
87 93
88 def getRoot(Collection<EObject> objects) { 94 def getRoot(Collection<EObject> objects) {
89 objects.filter[eContainer === null].head 95 val rootCandidates = objects.filter[eContainer === null]
96 if(rootCandidates.size == 1) {
97 return rootCandidates.head
98 } else {
99 throw new AssertionError("Multiple root objects")
100 }
90 } 101 }
91} \ No newline at end of file 102} \ No newline at end of file