From 52a694242a6d9c2aa182bf2224a28cea93cf1658 Mon Sep 17 00:00:00 2001
From: Chrissi <christopher@hbsc-werner.de>
Date: Tue, 11 Jun 2019 18:13:29 +0200
Subject: [PATCH] Add a new add method for sync generation of sets of elements

---
 .../model_sync/generator/PackageNames.scala      |  2 +-
 .../generator/acr_model/SSetterAdd.scala         | 16 ++++++++++++++++
 .../sync/GetterSetterGeneratingVisitor.scala     |  7 ++++++-
 .../generator/sync/SyncEnhancingVisitor.scala    |  4 +++-
 .../generator/test/ApplicationTest.scala         |  4 ++--
 5 files changed, 28 insertions(+), 5 deletions(-)
 create mode 100644 src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala

diff --git a/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala b/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala
index 531bfc8..52bdcdb 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala
@@ -2,7 +2,7 @@ package org.rosi_project.model_sync.generator
 
 object PackageNames {
   
-  var sourcePkgPrefix: String = "sum."
+  var sourcePkgPrefix: String = "sync."
   
   val viewPkgName: String = "view"
   val viewPostName: String = "View"
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala
new file mode 100644
index 0000000..3e03d5a
--- /dev/null
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterAdd.scala
@@ -0,0 +1,16 @@
+package org.rosi_project.model_sync.generator.acr_model
+
+import org.rosi_project.model_sync.generator.support.ExtendedString.stringToExtended
+import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes
+
+/** Add an element to a Set of elements.
+  *
+  * @author Rico Bergmann
+  */
+class SSetterAdd(struc: SStructuralFeature, inner: STypedElement) extends SMethod(
+  name = s"add${struc.getName.firstLetterToUpperCase}",
+  result = PredefTypes.Unit,
+  params = Seq(SMethodParameter(struc.getName.head.toString, inner)),
+  implementation = Seq(SMethodStatement(content = s"${struc.getName} += ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) {
+
+}
\ No newline at end of file
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala
index ce5e49e..4a8802f 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/GetterSetterGeneratingVisitor.scala
@@ -1,6 +1,7 @@
 package org.rosi_project.model_sync.generator.sync
 
 import org.rosi_project.model_sync.generator.acr_model._
+import org.rosi_project.model_sync.generator.acr_model.types.GenericSequence
 
 /** Service to extend [[SClass SClasses]] with getter and setter methods for all attributes.
   *
@@ -16,9 +17,13 @@ class GetterSetterGeneratingVisitor extends SModelVisitor {
     sClass.getStructuralFeatures.foreach(attr => {    
       attr.setVisibility(MethodVisibility.protectedVis)
       val getter = new SGetter(attr)
-      val setter = new SSetter(attr)
       sClass.addMethod(getter)
+      val setter = new SSetter(attr)
       sClass.addMethod(setter)
+      if (attr.getTypeElement.isInstanceOf[GenericSequence]) {
+        val adder = new SSetterAdd(attr, attr.getTypeElement.asInstanceOf[GenericSequence].typeParam)
+        sClass.addMethod(adder)
+      }
     })
 
   }
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala
index 4a30746..7fe5b4b 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala
@@ -1,7 +1,6 @@
 package org.rosi_project.model_sync.generator.sync
 
 import org.rosi_project.model_sync.generator.acr_model._
-import org.rosi_project.model_sync.sync.ISynchronizationCompartment
 
 /** Augments [[SClass SClasses]] with the necessary method calls to make it usable in a
   * synchronization context.
@@ -60,6 +59,8 @@ class SyncEnhancingVisitor() extends SModelVisitor {
     sMethod.getName match {
       case SyncEnhancingVisitor.Setter(attrName) =>
         Option(attrName)
+      case SyncEnhancingVisitor.Adder(attrName) =>
+        Option(attrName)
       case _ =>
         None
     }
@@ -72,5 +73,6 @@ class SyncEnhancingVisitor() extends SModelVisitor {
   */
 object SyncEnhancingVisitor {
   private val Setter = """set([A-Z][a-zA-z0-9]*)""".r
+  private val Adder = """add([A-Z][a-zA-z0-9]*)""".r
   private val PLAYER_SYNC_INIT = SMethodStatement("buildClass()")
 }
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala
index 549fabc..7ad2462 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/test/ApplicationTest.scala
@@ -10,8 +10,8 @@ object ApplicationTest extends App {
   //runCombinedTest(Creation.rsum)
   //runShrinkingModel(Creation.rsum)
   
-  runTTC2019(Creation.rolecomb)
-  //runTTC2019(Creation.rolesync)
+  //runTTC2019(Creation.rolecomb)
+  runTTC2019(Creation.rolesync)
 
   
   //runAllTests(Creation.rsum)
-- 
GitLab