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 e852eb223f3d858b61930dc6ec9ff78ffd04c93f..2f28ca24b1a9e644ec9799541d88ef1d65c8e972 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 55939bb94a99d76253b1aa0d467526ee3ef5ad5e..d1601adb2c3dcb2a24657adf7240f17188483e02 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 f5b69db409963b419951c3770d925a6eec056edb..ff9aa456fc1aa70bf9c2ee317be547f040f0260c 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 646fc799b93187c51a0fed1e7b3d3e960ab67006..7d2599fcf11c3167a9a8d9da10cc8123bc1a050f 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 2368fb35f8f4b8da2330ee5adf77379271670aac..148c785ca767f6fe052a44960b052bbed9276885 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 65e0e322d9ca3d3bdb7379c0f5bdd50a25169df5..9671ae744434661a5f2abe42971ace812318cdce 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")