diff --git a/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala b/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala index 56189e3190bce3a4a2fd9c744e3fff1e8c69debe..a2184b044860ac0ce2a0ca7823e788c2b7b40d26 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/Generator.scala @@ -75,6 +75,9 @@ class Generator(config: GeneratorConfig) { new SModelSUMCorePreparationService prepareModel (sm._1) //add sync stuff new SModelOnlySyncService prepareModel (sm._1) + //create the EMF Ecore reading models + new SModelSUMReadEMFService prepareModel (sm._1) + //instance generation for combi means rsum if (sm._2.obj != null) { new SModelCombiInstanceService prepareModel(sm._1, sm._2) 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 d174073777ccb2f7fc03e02aa7117133ab31bf10..96b9467e7d7cd779ea967ae48c42f64ee0e2214d 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 @@ -4,7 +4,7 @@ object PackageNames { val multiInhertitanceWithTraits = false - val sourcePkgPrefix: String = "" + val sourcePkgPrefix: String = "sum." val viewPkgName: String = "view" val viewPostName: String = "View" @@ -19,4 +19,6 @@ object PackageNames { val examplePkgName: String = "example" + val creationPkgName: String = "creation" + } \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMReadEMFService.scala b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMReadEMFService.scala new file mode 100644 index 0000000000000000000000000000000000000000..ca6f6a800787e120b3dfdf00f1702c58a2c53882 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/SModelSUMReadEMFService.scala @@ -0,0 +1,20 @@ +package org.rosi_project.model_sync.generator + +import org.rosi_project.model_sync.generator.sync.SumModelReadingVisitor +import org.rosi_project.model_sync.generator.acr_model.SModel + +/** Simple service to create the new emf ecore model instances. + * + * @author Christopher Werner + */ +class SModelSUMReadEMFService { + + /** Add classes to read emf and ecore models. + * + * @param sModel the model to augment + */ + def prepareModel(sModel: SModel): Unit = { + val sumModelReadingVisitor = new SumModelReadingVisitor + sModel.accept(sumModelReadingVisitor) + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala index d9c0e0d875ae5c41b5002712d32b68e7d21d7c95..88f4c2acd8ba80b38579ed0e54d4684f9b1b8f4d 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinGeneratingVisitor.scala @@ -4,6 +4,7 @@ import org.rosi_project.model_sync.generator.acr_model._ import org.rosi_project.model_sync.model_join.representation.grammar.ModelJoinExpression import org.rosi_project.model_management.sum.join.RsumJoinType import org.rosi_project.model_sync.model_join.representation.grammar.JoinExpression.JoinType +import org.rosi_project.model_sync.model_join.representation.grammar.ThetaJoinExpression class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelVisitor { @@ -21,7 +22,7 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV val baseType: Option[STypedElement] = STypeRegistry.query(j.getBaseModel().getResourceName, j.getBaseModel().getResourcePath) val otherType: Option[STypedElement] = STypeRegistry.query(j.getOtherModel().getResourceName, j.getOtherModel().getResourcePath) var targetType: Option[STypedElement] = STypeRegistry.query(j.getTarget().getResourceName, j.getTarget().getResourcePath) - + println("B: " + baseType + " O: " + otherType + " T: " + targetType + " Same: " + j.isSameElement) if (j.isSameElement || baseType.isEmpty || otherType.isEmpty || !targetType.isEmpty) { @@ -30,12 +31,16 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV val baseClass = baseType.get.asInstanceOf[SClass] val otherClass = otherType.get.asInstanceOf[SClass] + var rsumJoinType = RsumJoinType.natural + var compareString: String = null j.getType match { case JoinType.NATURAL => rsumJoinType = RsumJoinType.natural case JoinType.OUTER => rsumJoinType = RsumJoinType.outer - case JoinType.THETA => rsumJoinType = RsumJoinType.theta + case JoinType.THETA => + rsumJoinType = RsumJoinType.theta + compareString = j.asInstanceOf[ThetaJoinExpression].getCondition.get } var otherAttsBase: Set[SStructuralFeature] = Set.empty @@ -86,7 +91,7 @@ class JoinGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelV joinObject.addMethod(JoinMethods.getInstanceOtherModelMethod(otherClass)) joinObject.addMethod(JoinMethods.getNewInstanceMethod(joinClass)) joinObject.addMethod(JoinMethods.getInstanceOfMethod(joinClass)) - joinObject.addMethod(JoinMethods.getMatchMethod(baseClass, otherClass, joinAtts)) //TODO: for theta join + joinObject.addMethod(JoinMethods.getMatchMethod(baseClass, otherClass, joinAtts, compareString)) joinObject.addMethod(ToStringMethods.onlyStringToStringMethod(joinObject.getName)) //add functions to the join class diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala index ae184409362b0b9c265d3d3898fcc962d58247b1..335b5b3e9e001d16227442c17fb385bb994e0dda 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/JoinMethods.scala @@ -6,7 +6,7 @@ import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes import org.rosi_project.model_sync.generator.support.ExtendedString.stringToExtended object JoinMethods { - + //JOIN OBJECT METHODS def getJoinTypeMethod(joinType: JoinType): SMethod = { val met = new SMethod( @@ -25,63 +25,66 @@ object JoinMethods { } met } - + def getInstanceBaseModelMethod(cls: SClass): SMethod = { new SMethod( name = "isInstanceBaseModel", result = PredefTypes.Boolean, params = Seq(SMethodParameter("obj", PredefTypes.Object)), - implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls)))) + implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls)))) } - + def getInstanceOtherModelMethod(cls: SClass): SMethod = { new SMethod( name = "isInstanceOtherModel", result = PredefTypes.Boolean, params = Seq(SMethodParameter("obj", PredefTypes.Object)), - implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls)))) + implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls)))) } - + def getInstanceOfMethod(cls: SClass): SMethod = { new SMethod( name = "isInstanceOf", result = PredefTypes.Boolean, params = Seq(SMethodParameter("obj", PredefTypes.Object)), - implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls)))) + implementation = Seq(SMethodStatement(content = s"obj.isInstanceOf[${cls.getName}]", usedTypes = Set(cls)))) } - + def getNewInstanceMethod(cls: SClass): SMethod = { new SMethod( name = "getNewInstance", result = PredefRsumTypes.IJOIN_COMPARTMENT_STYPE, params = Seq(SMethodParameter("b", PredefTypes.Object), SMethodParameter("o", PredefTypes.Object)), implementation = Seq(SMethodStatement(content = s"val j = new ${cls.getName}(null, null)", usedTypes = Set(cls)), - SMethodStatement(content = "objectInitialize(j, b, o)", usedTypes = Set()), - SMethodStatement(content = "j", usedTypes = Set()))) + SMethodStatement(content = "objectInitialize(j, b, o)", usedTypes = Set()), + SMethodStatement(content = "j", usedTypes = Set()))) } - - def getMatchMethod(base: SClass, other: SClass, joinAtts: Set[SStructuralFeature]): SMethod = { + + def getMatchMethod(base: SClass, other: SClass, joinAtts: Set[SStructuralFeature], joinString: String): SMethod = { val met = new SMethod( name = "matchTwoObjects", result = PredefTypes.Boolean, params = Seq(SMethodParameter("b", PredefTypes.Object), SMethodParameter("o", PredefTypes.Object)), implementation = Seq()) met.implementation = Seq(SMethodStatement(content = s"val base = b.asInstanceOf[${base.getName}]", usedTypes = Set(base)), - SMethodStatement(content = s"val other = o.asInstanceOf[${other.getName}]", usedTypes = Set(other)), - SMethodStatement(content = s"${joinAtts.map(HelperFunctions.attributeEqualCreation(_)).mkString(" && ")}", usedTypes = Set())) + SMethodStatement(content = s"val other = o.asInstanceOf[${other.getName}]", usedTypes = Set(other))) + if (joinString == null) { + met.implementation = met.implementation :+ SMethodStatement(content = s"${joinAtts.map(HelperFunctions.attributeEqualCreation(_)).mkString(" && ")}") + } else { + met.implementation = met.implementation :+ SMethodStatement(content = joinString) + } met - } - - + } + //JOIN CLASS METHODS def getJoinInfoMethod(obj: SClass): SMethod = { new SMethod( name = "getJoinInfo", result = PredefRsumTypes.JOIN_INFO_STYPE, params = Seq.empty, - implementation = Seq(SMethodStatement(content = s"${obj.getName}", usedTypes = Set(obj)))) + implementation = Seq(SMethodStatement(content = s"${obj.getName}", usedTypes = Set(obj)))) } - + //GETTER def getBaseAttributeGetter(struc: SStructuralFeature): SMethod = { new SMethod( @@ -90,18 +93,18 @@ object JoinMethods { params = Seq.empty, implementation = Seq(SMethodStatement(content = s"+baseRole get${struc.getName.firstLetterToUpperCase}()", usedTypes = Set(struc.getTypeElement)))) } - + def getOtherAttributeGetter(struc: SStructuralFeature): SMethod = { new SMethod( name = s"get${struc.getName.firstLetterToUpperCase}", result = struc.getTypeElement, params = Seq.empty, implementation = Seq(SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()), - SMethodStatement(content = s"return +otherRole get${struc.getName.firstLetterToUpperCase}()", usedTypes = Set(struc.getTypeElement)), - SMethodStatement(content = "}", usedTypes = Set()), - SMethodStatement(content = s"return ${HelperFunctions.classEmptyType(struc.getTypeElement.getName)}", usedTypes = Set()))) + SMethodStatement(content = s"return +otherRole get${struc.getName.firstLetterToUpperCase}()", usedTypes = Set(struc.getTypeElement)), + SMethodStatement(content = "}", usedTypes = Set()), + SMethodStatement(content = s"return ${HelperFunctions.classEmptyType(struc.getTypeElement.getName)}", usedTypes = Set()))) } - + //SETTER def getBaseAttributeSetter(struc: SStructuralFeature): SMethod = { new SMethod( @@ -110,25 +113,25 @@ object JoinMethods { params = Seq(SMethodParameter(struc.getName.toLowerCase(), struc.getTypeElement)), implementation = Seq(SMethodStatement(content = s"+baseRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)))) } - + def getMixedAttributeSetter(struc: SStructuralFeature): SMethod = { new SMethod( name = s"set${struc.getName.firstLetterToUpperCase}View", result = PredefTypes.Unit, params = Seq(SMethodParameter(struc.getName.toLowerCase(), struc.getTypeElement)), implementation = Seq(SMethodStatement(content = s"+baseRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)), - SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()), - SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)), - SMethodStatement(content = "}", usedTypes = Set.empty))) + SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()), + SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)), + SMethodStatement(content = "}", usedTypes = Set.empty))) } - + def getOtherAttributeSetter(struc: SStructuralFeature): SMethod = { new SMethod( name = s"set${struc.getName.firstLetterToUpperCase}View", result = PredefTypes.Unit, params = Seq(SMethodParameter(struc.getName.toLowerCase(), struc.getTypeElement)), implementation = Seq(SMethodStatement(content = "if (otherObj != null) {", usedTypes = Set()), - SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)), - SMethodStatement(content = "}", usedTypes = Set.empty))) + SMethodStatement(content = s"+otherRole set${struc.getName.firstLetterToUpperCase}(${struc.getName.toLowerCase()})", usedTypes = Set(struc.getTypeElement)), + SMethodStatement(content = "}", usedTypes = Set.empty))) } } \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala index 560a1fe00dffb3e6620f0d8650a700db3e93fa20..4251a5fdbf145f2864f3d3591d7e774731775675 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryMethods.scala @@ -18,7 +18,7 @@ object QueryMethods { name = s"create${nr.sumSource.getName}", result = nr, params = Seq.empty, - implementation = Seq(SMethodStatement(content = s"return new ${nr.getName}()", usedTypes = Set.empty))) + implementation = Seq(SMethodStatement(content = s"return new ${nr.getName}()"))) methods = methods :+ method } }) 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 new file mode 100644 index 0000000000000000000000000000000000000000..9e9822c9da268296f219c47b2082bab8cae73648 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/SumModelReadingVisitor.scala @@ -0,0 +1,113 @@ +package org.rosi_project.model_sync.generator.sync + +import org.rosi_project.model_sync.generator.acr_model._ +import org.rosi_project.model_sync.generator.PackageNames +import org.rosi_project.model_sync.generator.acr_model.types.PredefEcoreTypes +import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes + +/** + * Read EMF and Ecore models. + * + * @author Christopher Werner + */ +class SumModelReadingVisitor() extends SModelVisitor { + + override def visit(sModel: SModel): Unit = { + //println("++++++++++++++++++++++++++++++++++++++++++++++") + val example = new SClass("Creation" + sModel.getName, PackageNames.creationPkgName) + example.augmentConstructor(SMethodStatement(content = s"var mapping: Map[EObject, Object] = Map.empty", usedTypes = Set(PredefEcoreTypes.EcoreObject))) + + sModel.getAllClasses.filter(c => !c.isAbstract && !c.isInterface).foreach(c => { + + val metod = new SMethod( + name = s"create${c.getName}", + result = PredefTypes.Unit, + params = c.getAllConstructorParameters :+ SMethodParameter("id", PredefEcoreTypes.EcoreObject), + implementation = Seq( + SMethodStatement(content = s"mapping += (id -> new ${c.getName}(name, Set.empty, Set.empty, null))", usedTypes = Set.empty))) + }) + + sModel.getRelationalCompartments.foreach(r => { + var rc = r.asInstanceOf[SRelationalCompartmentClass] + val metod = new SMethod( + name = s"create${r.getName}", + result = PredefTypes.Unit, + params = Seq(SMethodParameter("s", PredefEcoreTypes.EcoreObject), SMethodParameter("t", PredefEcoreTypes.EcoreObject)), + implementation = Seq( + SMethodStatement(content = s"val s1 = mapping.get(s).get.asInstanceOf[${rc.sClass.getName}]"), + SMethodStatement(content = s"val t1 = mapping.get(t).get.asInstanceOf[${rc.tClass.getName}]"), + SMethodStatement(content = s"(new ${rc.getName}(s1, t1)).initialize()"))) + }) + + //add values for instances + /*lines.foreach(l => { + l.usedType.getAllConstructorParameters.foreach(cp => { + if (!STypeRegistry.isDefaultType(cp.getType.getName)) { + val structs: Seq[EStructuralFeature] = l.obj.eClass().getEAllStructuralFeatures.asScala + structs.foreach(att => { + if (att.getName == cp.getName) { + val obj = l.obj.eGet(att) + if (obj.isInstanceOf[EObject]) { + lines.foreach(lnow => { + if (lnow.obj == obj.asInstanceOf[EObject]) { + //println("Found: " + lnow.counter) .filter(_.isInstanceOf[SRelationalCompartmentClass]) + sModel.getRelationalCompartments.foreach(rc => { + val realRc = rc.asInstanceOf[SRelationalCompartmentClass] + //println(" AN: " + att.getName + " l1: " + l.usedType.getName + " l2: " + lnow.usedType.getName + " RC: " + realRc.connectedRef.getName + " SN: " + realRc.sClass.getName + " TN: " + realRc.tClass.getName) + if (realRc.connectedRef.getName == att.getName && l.usedType.proofHierarchicalEquality(realRc.sClass) && lnow.usedType.proofHierarchicalEquality(realRc.tClass)) { + val s = s"(new ${realRc.getName}(${l.getName()}, ${lnow.getName()})).initialize()" + generationLines = generationLines :+ new InstanceLine(0, null, realRc, s) + } + }) + } + }) + } else { + val listi: List[EObject] = EMFUtilForGenerator.getList(obj) + val liste = listi.asScala + liste.foreach(eo => { + lines.foreach(lnow => { + if (lnow.obj == eo) { + sModel.getRelationalCompartments.foreach(rc => { + val realRc = rc.asInstanceOf[SRelationalCompartmentClass] + //println(" AN: " + att.getName + " l1: " + l.usedType.getName + " l2: " + lnow.usedType.getName + " RC: " + realRc.connectedRef.getName + " SN: " + realRc.sClass.getName + " TN: " + realRc.tClass.getName) + if (realRc.connectedRef.getName == att.getName && l.usedType.proofHierarchicalEquality(realRc.sClass) && lnow.usedType.proofHierarchicalEquality(realRc.tClass)) { + val s = s"(new ${realRc.getName}(${l.getName()}, ${lnow.getName()})).initialize()" + generationLines = generationLines :+ new InstanceLine(0, null, realRc, s) + } + }) + } + }) + }) + } + } + }) + } + }) + })*/ + + sModel.addModelClass(example) + // pass + + } + + override def visit(sClass: SClass): Unit = { + // pass + } + + override def visit(sAttr: SAttribute): Unit = { + // pass + } + + override def visit(sRef: SReference): Unit = { + // pass + } + + override def visit(sMethod: SMethod): Unit = { + // pass + } + + override def visit(sType: SType): Unit = { + // pass + } + +} \ No newline at end of file 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 ebe73fd71a945e24bf51ebaef9bd4f1c1d39a8f6..ebabed59bf3321ddfbae841d97536b36a773dd36 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 @@ -8,13 +8,13 @@ import org.rosi_project.model_sync.generator.Creation object ApplicationTest extends App { //runTestLibrary(Creation.rolesum) - runCombinedTest(Creation.rolecomb) + //runCombinedTest(Creation.rolecomb) //runShrinkingModel(Creation.rolesum) //runTestAML(Creation.rolesum) //TTC Case examples //runTTC2019(Creation.rolecomb) - //runTTC2019(Creation.rolesync) + runTTC2019(Creation.rolesync) //runTTCLive2019(Creation.rolesync) //Run all tests