diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SReference.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SReference.scala index f61cc1bf57f1c09c3ab5c7ebf09af842beb6b43b..275337162cae16c2847db9a45f4f149db661e895 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SReference.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SReference.scala @@ -31,6 +31,22 @@ case class SReference(_name: String, /*val stype: STypedElement,*/ _ttype: SType } this } + + def getMinimalConnection: SReference = { + if (lowerBound == 0 && upperBound == 1) { + return this + } + if (hasOpposite && oppositeRef.lowerBound == 0 && oppositeRef.upperBound == 1) { + return oppositeRef + } + if (lowerBound == 1 && upperBound == 1) { + return this + } + if (hasOpposite && oppositeRef.lowerBound == 1 && oppositeRef.upperBound == 1) { + return oppositeRef + } + return null + } override def accept(visitor: SModelVisitor): Unit = visitor.visit(this) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala index 7131f58ea53021ad678e219f7438b148a019ac03..18c6ae53effbad8c796e3833fea71362ee7065bd 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala @@ -61,6 +61,7 @@ class SumModelReadingVisitor(config: GeneratorConfig) extends SModelVisitor { result = PredefTypes.Unit, params = Seq(SMethodParameter("obj", PredefEcoreTypes.EcoreObject), SMethodParameter("creator", creatorInterface)), implementation = Seq.empty) + createObj.setVisibility(MethodVisibility.privateVis) var createObjImpl = Seq(SMethodStatement(content = s"var objName = obj.eClass.getName"), SMethodStatement(content = s"objName match {")) @@ -69,9 +70,9 @@ class SumModelReadingVisitor(config: GeneratorConfig) extends SModelVisitor { result = PredefTypes.Unit, params = Seq(SMethodParameter("o1", PredefEcoreTypes.EcoreObject), SMethodParameter("creator", creatorInterface)), implementation = Seq.empty) - var createRefImpl = Seq(SMethodStatement(content = s"o1.eClass().getEAllReferences.forEach(sf => {"), - SMethodStatement(content = s"val sfName = sf.getName"), - SMethodStatement(content = s"val o2 = o1.eGet(sf).asInstanceOf[EObject]"), + createRef.setVisibility(MethodVisibility.privateVis) + var stringList: Set[String] = Set.empty + var createRefImpl = Seq(SMethodStatement(content = s"val o2 = o1.eGet(sf).asInstanceOf[EObject]"), SMethodStatement(content = s"val o1Name = o1.eClass().getName"), SMethodStatement(content = s"val o2Name = o2.eClass().getName")) @@ -103,7 +104,7 @@ class SumModelReadingVisitor(config: GeneratorConfig) extends SModelVisitor { result = PredefTypes.Unit, params = c.getAttributeConstructorParameters :+ SMethodParameter("id", PredefEcoreTypes.EcoreObject), implementation = Seq( - SMethodStatement(content = s"mapping += (id -> new ${c.getName}(${c.getAllConstructorParameters.map(m => if(m.getType.isInstanceOf[GenericSequence]) "Set.empty" else if (m.getType.isInstanceOf[SClass]) "null" else m.getName).mkString(", ")}))", usedTypes = Set(c))), //TODO + SMethodStatement(content = s"mapping += (id -> new ${c.getName}(${c.getAllConstructorParameters.map(m => if (m.getType.isInstanceOf[GenericSequence]) "Set.empty" else if (m.getType.isInstanceOf[SClass]) "null" else m.getName).mkString(", ")}))", usedTypes = Set(c))), //TODO overrides = true) creatorSync.addMethod(methodSync) @@ -145,7 +146,7 @@ class SumModelReadingVisitor(config: GeneratorConfig) extends SModelVisitor { params = Seq(SMethodParameter("s", PredefEcoreTypes.EcoreObject), SMethodParameter("t", PredefEcoreTypes.EcoreObject)), implementation = Seq.empty, overrides = true) - var implMethodSync = Seq(SMethodStatement(content = s"val s1 = mapping.get(s).get.asInstanceOf[${rc.sClass.getName}]", usedTypes = Set(rc, rc.sClass, rc.tClass)), + var implMethodSync = Seq(SMethodStatement(content = s"val s1 = mapping.get(s).get.asInstanceOf[${rc.sClass.getName}]", usedTypes = Set(rc.sClass, rc.tClass)), SMethodStatement(content = s"val t1 = mapping.get(t).get.asInstanceOf[${rc.tClass.getName}]")) if (rc.connectedRef.getTypeElement.isInstanceOf[GenericSequence]) { //add -> add method @@ -166,17 +167,31 @@ class SumModelReadingVisitor(config: GeneratorConfig) extends SModelVisitor { methodSync.implementation = implMethodSync creatorSync.addMethod(methodSync) - createRefImpl = createRefImpl :+ SMethodStatement(content = s"""if (o1Name.contains("${rc.sClass.getName}") && sfName == "${rc.connectedRef.getName}" && o2Name.contains("${rc.tClass.getName}")) {""") - createRefImpl = createRefImpl :+ SMethodStatement(content = s"creator.create${rc.getName}(o1, o2)") - createRefImpl = createRefImpl :+ SMethodStatement(content = "}") + //TODO: anpassen + val reference = rc.connectedRef.getMinimalConnection + if (reference != null) { + if (reference == rc.connectedRef) { + createRefImpl = createRefImpl :+ SMethodStatement(content = s"""if (o1Name.contains("${rc.sClass.getName}") && sfName == "${reference.getName}" && o2Name.contains("${rc.tClass.getName}")) {""") + createRefImpl = createRefImpl :+ SMethodStatement(content = s"creator.create${rc.getName}(o1, o2)") + createRefImpl = createRefImpl :+ SMethodStatement(content = "}") + } else { + createRefImpl = createRefImpl :+ SMethodStatement(content = s"""if (o1Name.contains("${rc.tClass.getName}") && sfName == "${reference.getName}" && o2Name.contains("${rc.sClass.getName}")) {""") + createRefImpl = createRefImpl :+ SMethodStatement(content = s"creator.create${rc.getName}(o2, o1)") + createRefImpl = createRefImpl :+ SMethodStatement(content = "}") + } + stringList += reference.getName + } }) createObjImpl = createObjImpl :+ SMethodStatement(content = "case _ =>") createObjImpl = createObjImpl :+ SMethodStatement(content = "}") createObj.implementation = createObjImpl - loader.addMethod(createObj) + loader.addMethod(createObj) - createRefImpl = createRefImpl :+ SMethodStatement(content = "})") + createRefImpl = createRefImpl :+ SMethodStatement(content = "}})") + createRefImpl = Seq(SMethodStatement(content = s"o1.eClass().getEAllReferences.forEach(sf => {"), + SMethodStatement(content = s"val sfName = sf.getName"), + SMethodStatement(content = s"""if(${stringList.map(str => s"""sfName == "${str}" """).mkString(" || ")}) {""")) ++ createRefImpl createRef.implementation = createRefImpl loader.addMethod(createRef) 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 e9c860d7a22f5409264aed688e780ca5a8b430b7..e83db03ca0e43e14eafaa8484475e403d38634b9 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 @@ -13,8 +13,8 @@ object ApplicationTest extends App { //runTestAML(Creation.rolesum) //TTC Case examples - //runTTC2019(Creation.rolecomb) - runTTC2019(Creation.rolesync) + runTTC2019(Creation.rolecomb) + //runTTC2019(Creation.rolesync) //runTTCLive2019(Creation.rolesync) //Run all tests