diff --git a/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala b/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala
index 9d594c796e28e64a9b937b7ed64ff9054f21ae88..c81f2580a69b093bf5bd6150dab8b5dde7689f58 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala
@@ -51,6 +51,7 @@ class Generator(config: GeneratorConfig) {
//create the new classes for rsum and rsync
if (config.getCreate == Creation.rolesync) {
sModels.foreach(sm => {
+ //instance generation for rsync
if (sm._2.obj != null) {
new SModelSyncInstanceService prepareModel(sm._1, sm._2)
}
@@ -63,6 +64,8 @@ class Generator(config: GeneratorConfig) {
sModels.foreach(sm => {
//create core stuff
new SModelSUMCorePreparationService prepareModel (sm._1)
+ //remove references
+ new SModelSUMRemoveRefService prepareModel (sm._1)
//create view and query stuff
new SModelSUMPreparationService prepareModel (sm._1)
})
@@ -73,6 +76,15 @@ class Generator(config: GeneratorConfig) {
new SModelSUMCorePreparationService prepareModel (sm._1)
//add sync stuff
new SModelOnlySyncService prepareModel (sm._1)
+ //instance generation for combi means rsum
+ if (sm._2.obj != null) {
+ new SModelCombiInstanceService prepareModel(sm._1, sm._2)
+ }
+ else
+ {
+ //remove references
+ new SModelSUMRemoveRefService prepareModel (sm._1)
+ }
//create view and query stuff
new SModelSUMPreparationService prepareModel (sm._1)
})
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiInstanceService.scala b/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiInstanceService.scala
new file mode 100644
index 0000000000000000000000000000000000000000..348b2e34752a81d9d5115f95fc17c519ecc20ad6
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiInstanceService.scala
@@ -0,0 +1,22 @@
+package org.rosi_project.model_sync.generator
+
+import org.rosi_project.model_sync.generator.acr_model.SModel
+import org.rosi_project.model_sync.generator.util.ClassAndInstance
+import org.rosi_project.model_sync.generator.sync.InstanceCombiGenerator
+
+/** Simple service to create instances.
+ * For the combination of sum and sync.
+ *
+ * @author Christopher Werner
+ */
+class SModelCombiInstanceService {
+
+ /** Add a new class to the [[SModel]] to instantiate it.
+ *
+ * @param sModel the model to augment
+ */
+ def prepareModel(sModel: SModel, clsAins: ClassAndInstance): Unit = {
+ val insgenerator = new InstanceCombiGenerator(clsAins)
+ sModel.accept(insgenerator)
+ }
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMCorePreparationService.scala b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMCorePreparationService.scala
index 4debc8d050760c878265a49739f6015c6c514077..eb2d80c4ff2fbc4f7870f167e277f8a61d413513 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMCorePreparationService.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMCorePreparationService.scala
@@ -18,11 +18,9 @@ class SModelSUMCorePreparationService {
def prepareModel(sModel: SModel): Unit = {
val getterSetterVisitor = new BasicTypeGetterSetterGeneratingVisitor
val relationCompartmentVisitor = new RelationCompartmentGeneratingVisitor
- val removeReferencesVisitor = new ReferenceRemoveVisitor
//order is important !!!!
sModel.accept(getterSetterVisitor)
sModel.accept(relationCompartmentVisitor)
- sModel.accept(removeReferencesVisitor)
}
}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMRemoveRefService.scala b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMRemoveRefService.scala
new file mode 100644
index 0000000000000000000000000000000000000000..b389f9f65c9a28e0c9ba15e801c411fc448a29fd
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMRemoveRefService.scala
@@ -0,0 +1,22 @@
+package org.rosi_project.model_sync.generator
+
+import org.rosi_project.model_sync.generator.acr_model.SModel
+import org.rosi_project.model_sync.generator.sync.ReferenceRemoveVisitor
+
+/** Remove references from model classes.
+ *
+ * @author Christopher Werner
+ */
+class SModelSUMRemoveRefService {
+
+ /** Remove reference from model classes.
+ *
+ * @param sModel the model to augment
+ */
+ def prepareModel(sModel: SModel): Unit = {
+ val removeReferencesVisitor = new ReferenceRemoveVisitor
+
+ //order is important !!!!
+ sModel.accept(removeReferencesVisitor)
+ }
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala
index 08cc5865b2eb2c7a707b3d59bd8bb15b50a545ad..a69d98eaaf3b9f5488c36028e548fb56fd2903b0 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala
@@ -77,6 +77,20 @@ class SClass(_name: String,
}
}
}
+
+ override def proofHierarchicalEquality(sType: STypedElement): Boolean = {
+ if (sType == this) {
+ return true
+ } else {
+ this.getAllParents().foreach(p => {
+ if (p.proofHierarchicalEquality(sType)) {
+ return true
+ }
+ })
+ return false
+ }
+
+ }
/**
* Augments `this` class with another method.
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala
index d3de6f2e80dc12bcc7828804f123ce0b38862fc8..b57f9e3fc76d145ffacd569510b83e863e7ccc1c 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypedElement.scala
@@ -34,6 +34,11 @@ abstract class STypedElement (_name: String,
* will be ignored however.
*/
def getInheritanceHierarchy: Seq[STypedElement] = Seq.empty
+
+ /**
+ * Proof the hierarchical equality between two STypedElement
+ */
+ def proofHierarchicalEquality(sType: STypedElement): Boolean = sType == this
/** Provides all classes that need to be imported for `this` type.
*/
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala
new file mode 100644
index 0000000000000000000000000000000000000000..4cefc3eb377e2768ca6402374e5478874d24a706
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala
@@ -0,0 +1,134 @@
+package org.rosi_project.model_sync.generator.sync
+
+import scala.collection.JavaConverters._
+import org.rosi_project.model_sync.generator.acr_model._
+import org.rosi_project.model_sync.generator.util.ClassAndInstance
+import org.eclipse.emf.ecore.EObject
+import org.rosi_project.model_sync.generator.util.InstanceLine
+import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes
+import org.eclipse.emf.ecore.EStructuralFeature
+import org.eclipse.emf.common.util.EList
+import org.rosi_project.model_sync.util.EMFUtilForGenerator
+import java.util.List
+
+class InstanceCombiGenerator(val clsins: ClassAndInstance) extends SModelVisitor {
+
+ override def visit(sModel: SModel): Unit = {
+ //println("++++++++++++++++++++++++++++++++++++++++++++++")
+ val example = new SClass("ExampleCombiCase", "example")
+ val contents = clsins.obj.eAllContents().asScala
+ var counter = 0
+ var lines: Seq[InstanceLine] = Seq.empty
+ var generationLines: Seq[InstanceLine] = Seq.empty
+ var sType = STypeRegistry.getFromClass(clsins.obj.eClass())
+ if (sType != null) {
+ lines = lines :+ new InstanceLine(counter, clsins.obj, sType)
+ counter += 1
+ }
+ contents.foreach(o => {
+ sType = STypeRegistry.getFromClass(o.eClass())
+ if (sType != null) {
+ lines = lines :+ new InstanceLine(counter, o, sType)
+ counter += 1
+ }
+ })
+ //add values for instances
+ lines.foreach(l => {
+ l.usedType.getAllConstructorParameters.foreach(cp => {
+ if (!STypeRegistry.isDefaultType(cp.getType.getName)) {
+ val structs: Seq[EStructuralFeature] = l.obj.eClass().getEAllStructuralFeatures.asScala
+ structs.foreach(att => {
+ if (att.getName == cp.getName) {
+ val obj = l.obj.eGet(att)
+ if (obj.isInstanceOf[EObject]) {
+ lines.foreach(lnow => {
+ if (lnow.obj == obj.asInstanceOf[EObject]) {
+ //println("Found: " + lnow.counter) .filter(_.isInstanceOf[SRelationalCompartmentClass])
+ sModel.getRelationalCompartments.foreach(rc => {
+ val realRc = rc.asInstanceOf[SRelationalCompartmentClass]
+ //println(" AN: " + att.getName + " l1: " + l.usedType.getName + " l2: " + lnow.usedType.getName + " RC: " + realRc.connectedRef.getName + " SN: " + realRc.sClass.getName + " TN: " + realRc.tClass.getName)
+ if (realRc.connectedRef.getName == att.getName && l.usedType.proofHierarchicalEquality(realRc.sClass) && lnow.usedType.proofHierarchicalEquality(realRc.tClass)) {
+ val s = s"new ${realRc.getName}(${l.getName()}, ${lnow.getName()})"
+ generationLines = generationLines :+ new InstanceLine(0, null, realRc, s)
+ }
+ })
+ }
+ })
+ } else {
+ val listi: List[EObject] = EMFUtilForGenerator.getList(obj)
+ val liste = listi.asScala
+ liste.foreach(eo => {
+ lines.foreach(lnow => {
+ if (lnow.obj == eo) {
+ sModel.getRelationalCompartments.foreach(rc => {
+ val realRc = rc.asInstanceOf[SRelationalCompartmentClass]
+ //println(" AN: " + att.getName + " l1: " + l.usedType.getName + " l2: " + lnow.usedType.getName + " RC: " + realRc.connectedRef.getName + " SN: " + realRc.sClass.getName + " TN: " + realRc.tClass.getName)
+ if (realRc.connectedRef.getName == att.getName && l.usedType.proofHierarchicalEquality(realRc.sClass) && lnow.usedType.proofHierarchicalEquality(realRc.tClass)) {
+ val s = s"new ${realRc.getName}(${l.getName()}, ${lnow.getName()})"
+ generationLines = generationLines :+ new InstanceLine(0, null, realRc, s)
+ }
+ })
+ }
+ })
+ })
+ }
+ }
+ })
+ }
+ })
+ })
+
+ //remove references
+ sModel.getModelClasses.foreach(cls => {
+ //remove all references from the class
+ cls.setReferences(null)
+ })
+
+ //construction of instances
+ lines.foreach(l => {
+ example.augmentConstructor(new SMethodStatement(l.getLine(), Set(l.usedType)))
+ })
+
+ //construction of connections
+ generationLines.foreach(l => {
+ example.augmentConstructor(new SMethodStatement(l.getLine(), Set(l.usedType)))
+ })
+
+
+ example.addParent(PredefTypes.App)
+ sModel.addJoinObject(example)
+ //println("++++++++++++++++++++++++++++++++++++++++++++++")
+ // pass
+
+ }
+
+ def setValues(eo: EObject, lines: Seq[InstanceLine]): String = {
+ lines.foreach(lnow => {
+ if (lnow.obj == eo) {
+ return lnow.getName()
+ }
+ })
+ ""
+ }
+
+ override def visit(sClass: SClass): Unit = {
+ // pass
+ }
+
+ override def visit(sAttr: SAttribute): Unit = {
+ // pass
+ }
+
+ override def visit(sRef: SReference): Unit = {
+ // pass
+ }
+
+ override def visit(sMethod: SMethod): Unit = {
+ // pass
+ }
+
+ override def visit(sType: SType): Unit = {
+ // pass
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala
index 066cc6e761485e33d9684ec816a9f67ab52c8c5f..224714e16a1cb6785afa43cad3a2acc7c75de9a3 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala
@@ -19,7 +19,7 @@ import java.util.List
class InstanceGenerator(val clsins: ClassAndInstance) extends SModelVisitor {
override def visit(sModel: SModel): Unit = {
- println("++++++++++++++++++++++++++++++++++++++++++++++")
+ //println("++++++++++++++++++++++++++++++++++++++++++++++")
val example = new SClass("ExampleCase", "example")
val contents = clsins.obj.eAllContents().asScala
var counter = 0
@@ -48,9 +48,8 @@ class InstanceGenerator(val clsins: ClassAndInstance) extends SModelVisitor {
structs.foreach(att => {
if (att.getName == cp.getName) {
val obj = l.obj.eGet(att)
- println("### " + att.getName + " T: " + obj.isTraversableAgain + " Si: " + obj.size + " C: " + obj.getClass + " " + obj.getClass.getSimpleName)
+ //println("### " + att.getName)
if (obj.isInstanceOf[EObject]) {
- //println("Obj")
lines.foreach(lnow => {
if (lnow.obj == obj.asInstanceOf[EObject]) {
//println("Found: " + lnow.counter)
@@ -68,16 +67,10 @@ class InstanceGenerator(val clsins: ClassAndInstance) extends SModelVisitor {
})
}
})
-
- /*var structs: Seq[EStructuralFeature] = l.obj.eClass().getEAllStructuralFeatures.asScala
- structs.foreach(att => {
- println(att.getName + " " + l.obj.eGet(att))
- })*/
- //println(l.obj.eGet(l.obj.eClass().getEAllAttributes.get(0)))
})
example.addParent(PredefTypes.App)
sModel.addJoinObject(example)
- println("++++++++++++++++++++++++++++++++++++++++++++++")
+ //println("++++++++++++++++++++++++++++++++++++++++++++++")
// pass
}
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/util/InstanceLine.scala b/src/main/scala/org/rosi_project/model_sync/generator/util/InstanceLine.scala
index d7a3624a2ef970f5bbf03701a7d362d92294a882..56bd013cd7ce0d1d44472f5a3b08c6c2169581e5 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/util/InstanceLine.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/util/InstanceLine.scala
@@ -9,10 +9,13 @@ import org.rosi_project.model_sync.generator.acr_model.SMethodParameter
import org.rosi_project.model_sync.generator.acr_model.STypeRegistry
import org.eclipse.emf.ecore.EStructuralFeature
-class InstanceLine(val counter: Int, val obj: EObject, val usedType: STypedElement) {
+class InstanceLine(val counter: Int, val obj: EObject, val usedType: STypedElement, val lineString: String = "") {
def getLine(): String = {
- s"val i${counter} = new ${usedType.getName} (${usedType.getAllConstructorParameters.map(classEmptyConstructorParameterCreation(_)).mkString(", ")})"
+ if (obj != null) {
+ return s"val i${counter} = new ${usedType.getName} (${usedType.getAllConstructorParameters.map(classEmptyConstructorParameterCreation(_)).mkString(", ")})"
+ }
+ return lineString
}
def getName(): String = "i" + counter