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