diff --git a/assets/models/TT.ttmodel b/assets/models/TT.ttmodel deleted file mode 100644 index 55150aa0af2efcc0a0f34af8990c77233dfa900d..0000000000000000000000000000000000000000 --- a/assets/models/TT.ttmodel +++ /dev/null @@ -1,137 +0,0 @@ -<?xml version="1.0" encoding="ASCII"?> -<tt:TruthTable xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tt="https://www.transformation-tool-contest.eu/2019/tt" name="TableI4O2Seed42"> - <ports xsi:type="tt:InputPort" name="I0" cells="//@rows.0/@cells.0 //@rows.1/@cells.0 //@rows.2/@cells.0 //@rows.3/@cells.0 //@rows.4/@cells.0 //@rows.5/@cells.0 //@rows.6/@cells.0 //@rows.7/@cells.0 //@rows.8/@cells.0 //@rows.9/@cells.0 //@rows.10/@cells.0 //@rows.11/@cells.0 //@rows.12/@cells.0 //@rows.13/@cells.0 //@rows.14/@cells.0 //@rows.15/@cells.0"/> - <ports xsi:type="tt:InputPort" name="I1" cells="//@rows.0/@cells.1 //@rows.1/@cells.1 //@rows.2/@cells.1 //@rows.3/@cells.1 //@rows.4/@cells.1 //@rows.5/@cells.1 //@rows.6/@cells.1 //@rows.7/@cells.1 //@rows.8/@cells.1 //@rows.9/@cells.1 //@rows.10/@cells.1 //@rows.11/@cells.1 //@rows.12/@cells.1 //@rows.13/@cells.1 //@rows.14/@cells.1 //@rows.15/@cells.1"/> - <ports xsi:type="tt:InputPort" name="I2" cells="//@rows.0/@cells.2 //@rows.1/@cells.2 //@rows.2/@cells.2 //@rows.3/@cells.2 //@rows.4/@cells.2 //@rows.5/@cells.2 //@rows.6/@cells.2 //@rows.7/@cells.2 //@rows.8/@cells.2 //@rows.9/@cells.2 //@rows.10/@cells.2 //@rows.11/@cells.2 //@rows.12/@cells.2 //@rows.13/@cells.2 //@rows.14/@cells.2 //@rows.15/@cells.2"/> - <ports xsi:type="tt:InputPort" name="I3" cells="//@rows.0/@cells.3 //@rows.1/@cells.3 //@rows.2/@cells.3 //@rows.3/@cells.3 //@rows.4/@cells.3 //@rows.5/@cells.3 //@rows.6/@cells.3 //@rows.7/@cells.3 //@rows.8/@cells.3 //@rows.9/@cells.3 //@rows.10/@cells.3 //@rows.11/@cells.3 //@rows.12/@cells.3 //@rows.13/@cells.3 //@rows.14/@cells.3 //@rows.15/@cells.3"/> - <ports xsi:type="tt:OutputPort" name="O0" cells="//@rows.0/@cells.4 //@rows.1/@cells.4 //@rows.2/@cells.4 //@rows.3/@cells.4 //@rows.4/@cells.4 //@rows.5/@cells.4 //@rows.6/@cells.4 //@rows.7/@cells.4 //@rows.8/@cells.4 //@rows.9/@cells.4 //@rows.10/@cells.4 //@rows.11/@cells.4 //@rows.12/@cells.4 //@rows.13/@cells.4 //@rows.14/@cells.4 //@rows.15/@cells.4"/> - <ports xsi:type="tt:OutputPort" name="O1" cells="//@rows.0/@cells.5 //@rows.1/@cells.5 //@rows.2/@cells.5 //@rows.3/@cells.5 //@rows.4/@cells.5 //@rows.5/@cells.5 //@rows.6/@cells.5 //@rows.7/@cells.5 //@rows.8/@cells.5 //@rows.9/@cells.5 //@rows.10/@cells.5 //@rows.11/@cells.5 //@rows.12/@cells.5 //@rows.13/@cells.5 //@rows.14/@cells.5 //@rows.15/@cells.5"/> - <rows> - <cells port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells value="true" port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells value="true" port="//@ports.5"/> - </rows> - <rows> - <cells port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells value="true" port="//@ports.5"/> - </rows> - <rows> - <cells port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells value="true" port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells value="true" port="//@ports.5"/> - </rows> - <rows> - <cells port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells value="true" port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells value="true" port="//@ports.5"/> - </rows> - <rows> - <cells port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> - <rows> - <cells value="true" port="//@ports.0"/> - <cells value="true" port="//@ports.1"/> - <cells value="true" port="//@ports.2"/> - <cells value="true" port="//@ports.3"/> - <cells value="true" port="//@ports.4"/> - <cells port="//@ports.5"/> - </rows> -</tt:TruthTable> diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala index a69d98eaaf3b9f5488c36028e548fb56fd2903b0..fe08984a067d9eadadde465081e233b9dbc6b3bc 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/SClass.scala @@ -211,6 +211,8 @@ class SClass(_name: String, * Interfaces are not checked. */ def isRootClass: Boolean = parentClass == null + + def isAbsoluteRootClassOrInterface: Boolean = parentClass == null && parentInterfaces.isEmpty def getRootClassWithNameAndPackage(n: String, p: String): SClass = { var parent = this 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 148c785ca767f6fe052a44960b052bbed9276885..bfa7fefca86bec5b3e3b43a2723e89dba38783f0 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 @@ -2,6 +2,7 @@ package org.rosi_project.model_sync.generator.acr_model import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes import org.eclipse.emf.ecore.EClass +import org.rosi_project.model_sync.generator.acr_model.types.PredefEcoreTypes /** Repository to keep track of all types and classes of model. It ensures that all attributes, * methods, etc. reference the same type instances and thus prevent duplication and conflicting @@ -30,6 +31,11 @@ object STypeRegistry { PredefTypes.Short -> null, ) + /*private val ecoreTypes: Map[STypedElement, EClass] = Map( + PredefEcoreTypes.EcoreObject -> null, + PredefEcoreTypes.EcoreStructuralFeature -> null, + )*/ + def getFromClass(cls: EClass): STypedElement = { registeredTypes.foreach(r => { if (r._2 == cls) { @@ -41,6 +47,7 @@ object STypeRegistry { registeredTypes ++= defaultTypesNull registeredTypes ++= defaultTypesNotNull + //registeredTypes ++= ecoreTypes /** * Return true if this name comes from a standard null type. diff --git a/src/main/scala/org/rosi_project/model_sync/generator/acr_model/types/PredefEcoreTypes.scala b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/types/PredefEcoreTypes.scala new file mode 100644 index 0000000000000000000000000000000000000000..0bee4f51a323edb096c1cd01e9ce60453d92a493 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/acr_model/types/PredefEcoreTypes.scala @@ -0,0 +1,22 @@ +package org.rosi_project.model_sync.generator.acr_model.types + +import org.rosi_project.model_sync.generator.acr_model.SType + +/** Contains a number of types that are part of the Ecore package. + * + * This should prevent creating them over and over again every time a `SType` should be set to any + * of these types. + * + * @author Christopher Werner + */ +object PredefEcoreTypes { + + /** `org.eclipse.emf.ecore.EObject` */ + val EcoreObject = SType("EObject", "org.eclipse.emf.ecore") + + /** `org.eclipse.emf.ecore.EStructuralFeature` */ + val EcoreStructuralFeature = SType("EStructuralFeature", "org.eclipse.emf.ecore") + + /** `org.eclipse.emf.ecore.EOperation` */ + val EcoreOperation = SType("EOperation", "org.eclipse.emf.ecore") +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_sync/generator/conversion/EmfTypeTranslator.scala b/src/main/scala/org/rosi_project/model_sync/generator/conversion/EmfTypeTranslator.scala index dee01840a5d64ece6c666d7ab4de918906c1c80a..b95c358cc41578ff0233697c0a4c5b3957b14b2e 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/conversion/EmfTypeTranslator.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/conversion/EmfTypeTranslator.scala @@ -5,6 +5,7 @@ import java.util.Objects import org.eclipse.emf.ecore.EDataType import org.rosi_project.model_sync.generator.acr_model.SType import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes +import org.rosi_project.model_sync.generator.acr_model.types.PredefEcoreTypes /** Service to map an instance of [[EDataType]] to its corresponding [[SType]] (which wrap Scala's * native types). @@ -25,6 +26,9 @@ object EmfTypeTranslator { "ELong" -> PredefTypes.Long, "EShort" -> PredefTypes.Short, "EString" -> PredefTypes.String, + "EObject" -> PredefTypes.Object, + "EStructuralFeature" -> PredefEcoreTypes.EcoreStructuralFeature, + "EOperation" -> PredefEcoreTypes.EcoreOperation, ) /** Maps an EMF data type to its corresponding Scala type. diff --git a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala index 986423df28a89116814b7720d3e22e7bd5940e8e..f059a89f957a34495ed9a18edda8342845cf82d4 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SClassConverter.scala @@ -18,7 +18,8 @@ class SClassConverter extends Converter[EClass, SClass] { var pars: List[STypedElement] = List.empty // fetch the attributes of the SClass - (source.getEAttributes: List[EAttribute]).foreach(eAttr => { + (source.getEAttributes: List[EAttribute]).foreach(eAttr => { + //println("Attribute: " + eAttr.getEAttributeType.getName + " pkg: " + eAttr.getEAttributeType.getEPackage.getNsPrefix + " pre: " + PackageNames.sourcePkgPrefix) val attrType: STypedElement = STypeRegistry // check if the attribute type is already known and registered .query(eAttr.getEAttributeType.getName, PackageNames.sourcePkgPrefix + eAttr.getEAttributeType.getEPackage.getNsPrefix) @@ -50,6 +51,8 @@ class SClassConverter extends Converter[EClass, SClass] { val lowerBound: Int = eRef.getLowerBound() //Lower bound var newTypeCreated: Boolean = false + + //println("Referenz: " + refType + " pkg: " + refTypePckg) var sRefType: STypedElement = STypeRegistry // check if the attribute type is already known and registered @@ -63,7 +66,7 @@ class SClassConverter extends Converter[EClass, SClass] { .getSClassFromEmf(refType) // otherwise create a new class (as the attribute should instance of a class rather than a type in this case) .getOrElse(new SClass(refType, refTypePckg)) - + // finally save the type STypeRegistry.addType(newAttr, null) } diff --git a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala index d3e42a359b458ea704d529a6935961d718dcaa2a..5b41f9f6fc9f9d0d3a25e5309c5a190bca23e24e 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SModelGenerator.scala @@ -23,7 +23,8 @@ class SModelGenerator extends Converter[EPackage, SModel] { println("First run creates all classes, important for abstract and interface relations") contents.foreach { case ec: EClass => - STypeRegistry.addType(new SClass(ec.getName, PackageNames.sourcePkgPrefix + ec.getEPackage.getNsPrefix, ec.isAbstract, ec.isInterface), ec) + //STypeRegistry.addType(new SClass(ec.getName, PackageNames.sourcePkgPrefix + ec.getEPackage.getNsPrefix, ec.isAbstract, ec.isInterface), ec) + STypeRegistry.addType(new SClass(ec.getName, PackageNames.sourcePkgPrefix + ec.getEPackage.getNsPrefix, ec.isInterface, ec.isAbstract), ec) case ee: EEnum => //prinltn(ee) model.addModelEnums(new SEnumConverter convert (ee, sourceName)) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala index ac922d292e36c7070e6d1a58f0d2d008ba62c9f8..f82e0bbf5b1695f2c4250af94492d106cebd5bdd 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SClassWriter.scala @@ -3,6 +3,8 @@ package org.rosi_project.model_sync.generator.io import org.rosi_project.model_sync.generator.acr_model._ import org.rosi_project.model_sync.generator.support.ExtendedString.stringToExtended import org.rosi_project.model_sync.generator.sync.PredefRsumTypes +import org.rosi_project.model_sync.generator.acr_model.types.GenericSequence +import org.rosi_project.model_sync.generator.sync.HelperFunctions /** The `Writer` generates the source code of a [[SClass]] and provides it as a `String`. * @@ -10,6 +12,8 @@ import org.rosi_project.model_sync.generator.sync.PredefRsumTypes */ class SClassWriter(val modelClass: SClass, val isView: Boolean, val isObject: Boolean) { + private val ttcLive2019 = true + private val pckg: String = if (modelClass.isDefaultPackage) "" else s"package ${modelClass.sPackage}" private val imports: Seq[String] = modelClass.collectImports.toSeq @@ -31,6 +35,8 @@ class SClassWriter(val modelClass: SClass, val isView: Boolean, val isObject: Bo | |${clazzFixture} { | + | ${if (ttcLive2019) s"${generateAttributeFixture}" else ""} + | | ${modelClass.getAdditionalConstructorStatements.map(_.getContent).mkString("\n")} | | ${modelClass.getMethods.map(stringifyMethod).mkString("\n")} @@ -70,7 +76,7 @@ class SClassWriter(val modelClass: SClass, val isView: Boolean, val isObject: Bo /** Writes the "''companion fixture''" for views. */ protected def generateCompanionFixture: String = { - s"""object ${modelClass.getName} extends ${PredefRsumTypes.VIEWTYPE_INFO_STYPE.getName} { + s"""object ${modelClass.getName} extends ${PredefRsumTypes.VIEWTYPE_INFO_STYPE.getName} { | | override def getViewName(): String = "${modelClass.getName}" | @@ -108,6 +114,17 @@ class SClassWriter(val modelClass: SClass, val isView: Boolean, val isObject: Bo } visibility } + + /** + * Generate the attribute fixtures to add them in the body. + */ + protected def generateAttributeFixture: String = { + modelClass.getStructuralFeatures.map(attr => { + val finalS: String = if(attr.isFinal) "val" else "var" + val instanziationS: String = if(attr.getTypeElement.isInstanceOf[GenericSequence]) "= Set.empty" else s"= ${HelperFunctions.classEmptyType(attr.getTypeElement.getName)}" + s"${getVisibilityString(attr.getVisibility)}${finalS} ${attr.getName}: ${attr.getTypeElement.getDeepName} ${instanziationS} \n" + }).mkString(" \n") + } /** Writes the "''class fixture''", i.e. the `class` identifier followed by the constructor and * optionally a parent class. The parent constructor will be called correctly. @@ -144,11 +161,12 @@ class SClassWriter(val modelClass: SClass, val isView: Boolean, val isObject: Bo } else if (isObject) { baseFixture = s"object ${modelClass.getName}" } else { - baseFixture = s"${modelClass.getName}$constructor" + baseFixture = s"class ${modelClass.getName}" + if (!ttcLive2019) { + baseFixture = s"$baseFixture$constructor" + } if (modelClass.isAbstract) { - baseFixture = s"abstract class $baseFixture" - } else { - baseFixture = s"class $baseFixture" + baseFixture = s"abstract $baseFixture" } } @@ -161,7 +179,11 @@ class SClassWriter(val modelClass: SClass, val isView: Boolean, val isObject: Bo } } } else { - baseFixture = s"$baseFixture extends ${parent.getName}$parentConstructor" + if (ttcLive2019) { + baseFixture = s"$baseFixture extends ${parent.getName}" + } else { + baseFixture = s"$baseFixture extends ${parent.getName}$parentConstructor" + } if (allInterfaces != "") { baseFixture = s"$baseFixture with $allInterfaces" } diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala index 661c8295b2c0ec883f904357b071278406012d81..02dab551744b2ece4ee03c76f1e358ef80645366 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/SyncEnhancingVisitor.scala @@ -22,7 +22,8 @@ class SyncEnhancingVisitor() extends SModelVisitor { override def visit(sClass: SClass): Unit = { //TODO: do not have in mind trait extends abstract extends trait hierarchy - if (sClass.isRootClass && !sClass.isInterface && !sClass.isInstanceOf[SRelationalCompartmentClass]) { + if (sClass.isAbsoluteRootClassOrInterface && !sClass.isInstanceOf[SRelationalCompartmentClass]) { + //if (sClass.isRootClass && !sClass.isInterface && !sClass.isInstanceOf[SRelationalCompartmentClass]) { sClass.addParent(PredefSyncTypes.PLAYER_SYNC_STYPE) } } 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 7ad2462687802819d5b0ecb36aa7d3336a9e6eb0..a28abfbc6576677ba67a3c168c13924bc66bf052 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 @@ -11,7 +11,11 @@ object ApplicationTest extends App { //runShrinkingModel(Creation.rsum) //runTTC2019(Creation.rolecomb) - runTTC2019(Creation.rolesync) + //runTTC2019(Creation.rolesync) + + //runTTCLive2019Part(Creation.rolesync) + runTTCLive2019(Creation.rolesync) + //runTTC2019(Creation.rolesync) //runAllTests(Creation.rsum) @@ -39,6 +43,18 @@ object ApplicationTest extends App { println("#####################################################################################") } + def runTTCLive2019Part(cre: Creation.Value): Unit = { + var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BibTeX.ecore"), false, new File("assets/models")); + config.setCreate(cre) + new Generator(config).run() + } + + def runTTCLive2019(cre: Creation.Value): Unit = { + var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BibTeX.ecore", "assets/models/DocBook.ecore", "assets/models/NMetaChanges.ecore"), false, new File("assets/models")); + config.setCreate(cre) + new Generator(config).run() + } + def runTTC2019(cre: Creation.Value): Unit = { var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BDD.ecore", "assets/models/BDDv2.ecore", "assets/models/TT.ecore"), false, new File("assets/models")); config.setCreate(cre)