From 638bba8387860f007c221f8bf2f9145550ddaac1 Mon Sep 17 00:00:00 2001
From: Chrissi <christopher@hbsc-werner.de>
Date: Thu, 11 Jul 2019 10:45:53 +0200
Subject: [PATCH] require functionality now depends on the type

---
 .../representation/core/AttributePath.java    |  1 -
 .../generator/acr_model/SSetter.scala         |  9 +++-
 .../generator/acr_model/SSetterAdd.scala      | 11 +++--
 .../generator/acr_model/SSetterRemove.scala   | 11 +++--
 .../generator/acr_model/STypeRegistry.scala   | 45 ++++++++++++++-----
 .../acr_model/types/PredefTypes.scala         |  6 +--
 6 files changed, 60 insertions(+), 23 deletions(-)

diff --git a/src/main/java/org/rosi_project/model_sync/model_join/representation/core/AttributePath.java b/src/main/java/org/rosi_project/model_sync/model_join/representation/core/AttributePath.java
index e852eb2..2f28ca2 100644
--- a/src/main/java/org/rosi_project/model_sync/model_join/representation/core/AttributePath.java
+++ b/src/main/java/org/rosi_project/model_sync/model_join/representation/core/AttributePath.java
@@ -1,6 +1,5 @@
 package org.rosi_project.model_sync.model_join.representation.core;
 
-import amlanguage.Attribute;
 import java.util.Objects;
 import javax.annotation.Nonnull;
 
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetter.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetter.scala
index 55939bb..d1601ad 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetter.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetter.scala
@@ -11,7 +11,12 @@ class SSetter(struc: SStructuralFeature) extends SMethod(
   name = s"set${struc.getName.firstLetterToUpperCase}",
   result = PredefTypes.Unit,
   params = Seq(SMethodParameter(struc.getName.head.toString, struc.getTypeElement)),
-  implementation = Seq(SMethodStatement(content = s"require(${struc.getName.head} != null)"),
-      SMethodStatement(content = s"${struc.getName} = ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) {
+  implementation = Seq(SMethodStatement(content = s"${struc.getName} = ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) {
 
+  if (!STypeRegistry.isDefaultNotNullType(struc.getTypeElement.getName)) {
+    implementation = Seq(SMethodStatement(content = s"require(${struc.getName.head} != null)"),
+      SMethodStatement(content = s"${struc.getName} = ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))
+  } else {
+    implementation = Seq(SMethodStatement(content = s"${struc.getName} = ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))
+  } 
 }
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
index f5b69db..ff9aa45 100644
--- 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
@@ -11,8 +11,13 @@ class SSetterAdd(struc: SStructuralFeature, inner: STypedElement) extends SMetho
   name = s"add${struc.getName.firstLetterToUpperCase}",
   result = PredefTypes.Unit,
   params = Seq(SMethodParameter(struc.getName.head.toString, inner)),
-  implementation = Seq(SMethodStatement(content = s"require(${struc.getName.head} != null)"),
-      SMethodStatement(content = s"require(!${struc.getName}.contains(${struc.getName.head}))"),
-      SMethodStatement(content = s"${struc.getName} += ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) {
+  implementation = Seq(SMethodStatement(content = s"${struc.getName} += ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) {
 
+  if (!STypeRegistry.isDefaultNotNullType(struc.getTypeElement.getName)) {
+    implementation = Seq(SMethodStatement(content = s"require(${struc.getName.head} != null)"),
+      SMethodStatement(content = s"require(!${struc.getName}.contains(${struc.getName.head}))"),
+      SMethodStatement(content = s"${struc.getName} += ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))
+  } else {
+    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/acr_model/SSetterRemove.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterRemove.scala
index 646fc79..7d2599f 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterRemove.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SSetterRemove.scala
@@ -11,8 +11,13 @@ class SSetterRemove(struc: SStructuralFeature, inner: STypedElement) extends SMe
   name = s"remove${struc.getName.firstLetterToUpperCase}",
   result = PredefTypes.Unit,
   params = Seq(SMethodParameter(struc.getName.head.toString, inner)),
-  implementation = Seq(SMethodStatement(content = s"require(${struc.getName.head} != null)"),
-      SMethodStatement(content = s"require(${struc.getName}.contains(${struc.getName.head}))"),
-      SMethodStatement(content = s"${struc.getName} -= ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) {
+  implementation = Seq(SMethodStatement(content = s"${struc.getName} -= ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))) {
 
+  if (!STypeRegistry.isDefaultNotNullType(struc.getTypeElement.getName)) {
+    implementation = Seq(SMethodStatement(content = s"require(${struc.getName.head} != null)"),
+      SMethodStatement(content = s"require(${struc.getName}.contains(${struc.getName.head}))"),
+      SMethodStatement(content = s"${struc.getName} -= ${struc.getName.head}", usedTypes = Set(struc.getTypeElement)))
+  } else {
+    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/acr_model/STypeRegistry.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypeRegistry.scala
index 2368fb3..148c785 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypeRegistry.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/STypeRegistry.scala
@@ -13,18 +13,21 @@ object STypeRegistry {
   
   private var registeredTypes: Map[STypedElement, EClass] = Map.empty
   
-  private val defaultTypes: Map[STypedElement, EClass] = Map(
+  private val defaultTypesNull: Map[STypedElement, EClass] = Map(
+    PredefTypes.Date -> null,
+    PredefTypes.Object -> null,
+    PredefTypes.String -> null,
+  )
+  
+  private val defaultTypesNotNull: Map[STypedElement, EClass] = Map(
     PredefTypes.Boolean -> null,
     PredefTypes.Byte -> null,
     PredefTypes.Char -> null,
-    PredefTypes.Date -> null,
     PredefTypes.Double -> null,
     PredefTypes.Float -> null,
     PredefTypes.Integer -> null,
-    PredefTypes.Object -> null,
     PredefTypes.Long -> null,
     PredefTypes.Short -> null,
-    PredefTypes.String -> null,
   )
   
   def getFromClass(cls: EClass): STypedElement = {
@@ -36,7 +39,30 @@ object STypeRegistry {
     null
   }
 
-  registeredTypes ++= defaultTypes
+  registeredTypes ++= defaultTypesNull
+  registeredTypes ++= defaultTypesNotNull
+  
+  /**
+   * Return true if this name comes from a standard null type.
+   * 
+   * @param name the name that must be proven.
+   * @return `true` if it is a default type. Otherwise return false.
+   */
+  def isDefaultNullType(name: String): Boolean = {
+    val existingNull: Option[STypedElement] = defaultTypesNull.keySet.find(existing => existing.getName == name)
+    return !existingNull.isEmpty
+  }
+  
+  /**
+   * Return true if this name comes from a standard not null type.
+   * 
+   * @param name the name that must be proven.
+   * @return `true` if it is a default type. Otherwise return false.
+   */
+  def isDefaultNotNullType(name: String): Boolean = {
+    val existingNotNull: Option[STypedElement] = defaultTypesNotNull.keySet.find(existing => existing.getName == name)
+    return !existingNotNull.isEmpty
+  }
   
   /**
    * Return true if this name comes from a standard type.
@@ -45,12 +71,9 @@ object STypeRegistry {
    * @return `true` if it is a default type. Otherwise return false.
    */
   def isDefaultType(name: String): Boolean = {
-    val existing: Option[STypedElement] = defaultTypes.keySet.find(existing => existing.getName == name)
-    if (existing.isEmpty) {
-      return false
-    } else {
-      return true
-    }
+    val existingNotNull: Option[STypedElement] = defaultTypesNotNull.keySet.find(existing => existing.getName == name)
+    val existingNull: Option[STypedElement] = defaultTypesNull.keySet.find(existing => existing.getName == name)
+    return !existingNotNull.isEmpty || !existingNull.isEmpty
   }
 
   /** Registers a type if it is not already known.
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/types/PredefTypes.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/types/PredefTypes.scala
index 65e0e32..9671ae7 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/types/PredefTypes.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/types/PredefTypes.scala
@@ -35,11 +35,11 @@ object PredefTypes {
   /** `Double` */
   val Double = SType("Double")
   
-  /** `String` */
-  val String = SType("String")
-  
   /** `Boolean` */
   val Boolean = SType("Boolean")
+  
+  /** `String` */
+  val String = SType("String")  
 
   /** `java.lang.Object` */
   val Object = SType("Object")
-- 
GitLab