diff --git a/assets/models/BDDv2.ecore b/assets/models/BDDv2.ecore new file mode 100644 index 0000000000000000000000000000000000000000..451da6f04bf5b7609b80d69503beb024a6cc8a89 --- /dev/null +++ b/assets/models/BDDv2.ecore @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="bddg" nsURI="https://www.transformation-tool-contest.eu/2019/bdd/graph" + nsPrefix="bddg"> + <eClassifiers xsi:type="ecore:EClass" name="BDD"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" + lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="ports" ordered="false" + lowerBound="1" upperBound="-1" eType="#//Port" containment="true" eOpposite="#//Port/owner"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="root" ordered="false" lowerBound="1" + eType="#//Tree"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="trees" upperBound="-1" + eType="#//Tree" containment="true" eOpposite="#//Tree/ownerBDD"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Port" abstract="true"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" + lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false" + lowerBound="1" eType="#//BDD" eOpposite="#//BDD/ports"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="InputPort" eSuperTypes="#//Port"> + <eStructuralFeatures xsi:type="ecore:EReference" name="subtrees" ordered="false" + upperBound="-1" eType="#//Subtree" eOpposite="#//Subtree/port"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="OutputPort" eSuperTypes="#//Port"> + <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" ordered="false" + upperBound="-1" eType="#//Assignment" eOpposite="#//Assignment/port"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Tree" abstract="true"> + <eStructuralFeatures xsi:type="ecore:EReference" name="ownerBDD" ordered="false" + eType="#//BDD" eOpposite="#//BDD/trees"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="ownerSubtreeForZero" ordered="false" + upperBound="-1" eType="#//Subtree" eOpposite="#//Subtree/treeForZero"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="ownerSubtreeForOne" ordered="false" + upperBound="-1" eType="#//Subtree" eOpposite="#//Subtree/treeForOne"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Leaf" eSuperTypes="#//Tree"> + <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" ordered="false" + lowerBound="1" upperBound="-1" eType="#//Assignment" containment="true" eOpposite="#//Assignment/owner"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Assignment"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" + unique="false" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="port" ordered="false" lowerBound="1" + eType="#//OutputPort" eOpposite="#//OutputPort/assignments"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false" + lowerBound="1" eType="#//Leaf" eOpposite="#//Leaf/assignments"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="Subtree" eSuperTypes="#//Tree"> + <eStructuralFeatures xsi:type="ecore:EReference" name="port" ordered="false" lowerBound="1" + eType="#//InputPort" eOpposite="#//InputPort/subtrees"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="treeForZero" ordered="false" + lowerBound="1" eType="#//Tree" eOpposite="#//Tree/ownerSubtreeForZero"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="treeForOne" ordered="false" + lowerBound="1" eType="#//Tree" eOpposite="#//Tree/ownerSubtreeForOne"/> + </eClassifiers> +</ecore:EPackage> diff --git a/src/main/scala/org/rosi_project/model_sync/generator/EcoreLoader.scala b/src/main/scala/org/rosi_project/model_sync/generator/EcoreLoader.scala index eaa9018d9a976b1825bba6c3d8ebd795ffac3a5d..9824ab763b0c5e02f0e62bb6dd6a7abfecdfe3e3 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/EcoreLoader.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/EcoreLoader.scala @@ -24,7 +24,6 @@ class EcoreLoader { * @return the model described by the XML */ def loadEcore(path: String = "assets/ttc17.ecore"): ClassAndInstance = { - // see https://github.com/max-leuthaeuser/SCROLL/blob/dd269d5620257be1ea2f2044f398c090e9755fb3/core/src/main/scala/scroll/internal/ecore/ECoreImporter.scala require(null != path && path.nonEmpty) val resourceSet = new ResourceSetImpl() @@ -41,24 +40,6 @@ class EcoreLoader { val univEPackage = res.getContents().get(0); resourceSet.getPackageRegistry().put("https://www.transformation-tool-contest.eu/2019/tt", univEPackage); val myModel = resourceSet.getResource(URI.createURI(path.replace(".ecore", ".ttmodel")), true); - /*println(myModel.getContents()) - myModel.getContents.forEach(o => { - var contents = o.eAllContents().asScala - contents.foreach(i => { - println("++") - println(i) - println(i.eContainingFeature()) - println(i.eCrossReferences()) - println(i.eClass()) - var iners = i.eAllContents().asScala - iners.foreach(a => { - println(a) - }) - }) - println(o) - }) - println("###########") - println(myModel.getContents().toArray(new Array[EObject](0)).toList.head)*/ return new ClassAndInstance(res.getContents.toArray(new Array[EObject](0)).toList.find(_.isInstanceOf[EPackage]).map((p: EObject) => p.asInstanceOf[EPackage]).orNull, myModel.getContents().toArray(new Array[EObject](0)).toList.head) } 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 04d810063c93453a1e6734de30e34ca3743ab62d..34deddbeeb653dd9cca21460ed752bd94ca91f24 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 @@ -43,7 +43,6 @@ class Generator(config: GeneratorConfig) { //create s models from the incoming ecore models var sModels: Map[SModel, ClassAndInstance] = Map.empty - //var sModels: Seq[SModel] = Seq.empty ecoreModels.foreach(ec => { sModels = sModels + ((new SModelGenerator convert (ec._2.pkg, ec._1)) -> ec._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 new file mode 100644 index 0000000000000000000000000000000000000000..531bfc8d66d822c8d4bf0b2a6a0894db80ec6194 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/PackageNames.scala @@ -0,0 +1,20 @@ +package org.rosi_project.model_sync.generator + +object PackageNames { + + var sourcePkgPrefix: String = "sum." + + val viewPkgName: String = "view" + val viewPostName: String = "View" + val viewRolePostName: String = "Role" + + val queryPkgName: String = "query" + val queryPostName: String = "Query" + val queryRolePostName: String = "Role" + val queryHelperPrefix: String = "Helper" + + val joinPkgName: String = "join" + + val examplePkgName: String = "example" + +} \ No newline at end of file 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 7e5ed25cd2a5a62d464f17ff91720597773dbb59..986423df28a89116814b7720d3e22e7bd5940e8e 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 @@ -4,6 +4,7 @@ import org.eclipse.emf.ecore.{EAttribute, EClass, EReference} import org.rosi_project.model_sync.generator.acr_model._ import org.rosi_project.model_sync.generator.acr_model.types.SList import org.rosi_project.model_sync.generator.acr_model.types.SSet +import org.rosi_project.model_sync.generator.PackageNames /** Converter to generate instances of [[SClass]] based on [[EClass EClasses]]. * @@ -20,14 +21,14 @@ class SClassConverter extends Converter[EClass, SClass] { (source.getEAttributes: List[EAttribute]).foreach(eAttr => { val attrType: STypedElement = STypeRegistry // check if the attribute type is already known and registered - .query(eAttr.getEAttributeType.getName, eAttr.getEAttributeType.getEPackage.getNsPrefix) + .query(eAttr.getEAttributeType.getName, PackageNames.sourcePkgPrefix + eAttr.getEAttributeType.getEPackage.getNsPrefix) // otherwise create a new type .getOrElse { val newAttr = EmfTypeTranslator // if the type is wrapped by EMF (such as EString), use the corresponding scala type .getSClassFromEmf(eAttr.getEAttributeType) // otherwise create a new class (as the attribute should instance of a class rather than a type in this case) - .getOrElse(new SClass(eAttr.getEAttributeType.getName, eAttr.getEAttributeType.getEPackage.getNsPrefix)) + .getOrElse(new SClass(eAttr.getEAttributeType.getName, PackageNames.sourcePkgPrefix + eAttr.getEAttributeType.getEPackage.getNsPrefix)) // finally save the type STypeRegistry.addType(newAttr, null) @@ -41,7 +42,7 @@ class SClassConverter extends Converter[EClass, SClass] { .foreach(eRef => { val refName: String = eRef.getName //Attribute name val refType: String = eRef.getEReferenceType.getName //Name of the attribute type - val refTypePckg: String = eRef.getEReferenceType.getEPackage.getNsPrefix //Package name of the attribute type + val refTypePckg: String = PackageNames.sourcePkgPrefix + eRef.getEReferenceType.getEPackage.getNsPrefix //Package name of the attribute type val containment: Boolean = eRef.isContainment() //Containment relation or not val oppositeERef: EReference = eRef.getEOpposite() //Opposite reference var oppositeRef: SReference = null //Opposite reference @@ -94,38 +95,20 @@ class SClassConverter extends Converter[EClass, SClass] { }) val eClassParents: List[EClass] = source.getESuperTypes.toArray(new Array[EClass](0)).toList - - //implemented multiple inheritance support - /*if (violatesSingleInheritance(eClassParents)) { - throw new UnconvertibleEmfException(source.getEPackage, s"For class: $source") - }*/ eClassParents.foreach { p => pars ::= STypeRegistry // check if we already know the parent - .query(p.getName, p.getEPackage.getNsPrefix) + .query(p.getName, PackageNames.sourcePkgPrefix + p.getEPackage.getNsPrefix) // otherwise we need to create and register it .getOrElse { - val parentSClass: SClass = new SClass(p.getName, p.getEPackage.getNsPrefix) + val parentSClass: SClass = new SClass(p.getName, PackageNames.sourcePkgPrefix + p.getEPackage.getNsPrefix) // register the parent (it will be visited and completely inflated later on) STypeRegistry.addType(parentSClass, null) parentSClass } } - /*val parent: STypedElement = eClassParents.headOption.map((p: EClass) => { - STypeRegistry - // check if we already know the parent - .queryForName(p.getName) - // otherwise we need to create and register it - .getOrElse { - val parentSClass: SClass = new SClass(p.getName, sPackage = p.getEPackage.getNsPrefix) - // register the parent (it will be visited and completely inflated later on) - STypeRegistry.addType(parentSClass) - parentSClass - } - }).orNull*/ - /* `convert` may be called on two different occasions: either for a completely new type or * for a type that was already created before when another type was being inflated by `convert`. * In the first case we need to set up all the necessary attributes of the SClass and therefore @@ -136,7 +119,7 @@ class SClassConverter extends Converter[EClass, SClass] { * have the type known). Therefore we will set these now. */ - val currentClass: Option[STypedElement] = STypeRegistry.query(source.getName, source.getEPackage.getNsPrefix) + val currentClass: Option[STypedElement] = STypeRegistry.query(source.getName, PackageNames.sourcePkgPrefix + source.getEPackage.getNsPrefix) currentClass.map { case clazz: SClass => @@ -149,7 +132,7 @@ class SClassConverter extends Converter[EClass, SClass] { case sType => sys.error(s"sType should have been a class: $sType") }.getOrElse { - val createdClass: SClass = new SClass(source.getName, source.getEPackage.getNsPrefix, source.isAbstract, source.isInterface) + val createdClass: SClass = new SClass(source.getName, PackageNames.sourcePkgPrefix + source.getEPackage.getNsPrefix, source.isAbstract, source.isInterface) createdClass.setAttributes(attrs) createdClass.setReferences(refs) pars.foreach(p => { diff --git a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SEnumConverter.scala b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SEnumConverter.scala index 127ac5bc818ae9c889e846d9732bf58a26d194fb..64578dfdc03267bff40e086168e94628fd54984c 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/conversion/SEnumConverter.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/conversion/SEnumConverter.scala @@ -4,6 +4,7 @@ import org.eclipse.emf.ecore.EEnum import org.rosi_project.model_sync.generator.acr_model.SEnum import org.eclipse.emf.ecore.EEnumLiteral import org.rosi_project.model_sync.generator.acr_model.STypeRegistry +import org.rosi_project.model_sync.generator.PackageNames class SEnumConverter extends Converter[EEnum, SEnum] { @@ -16,7 +17,7 @@ class SEnumConverter extends Converter[EEnum, SEnum] { strings += elit.getName }) - val createdEnum: SEnum = new SEnum(source.getName, source.getEPackage.getNsPrefix, strings) + val createdEnum: SEnum = new SEnum(source.getName, PackageNames.sourcePkgPrefix + source.getEPackage.getNsPrefix, strings) STypeRegistry.addType(createdEnum, null) createdEnum } 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 a8ed626e83a3684a8c298bd7a312442c4003157e..d3e42a359b458ea704d529a6935961d718dcaa2a 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 @@ -6,6 +6,7 @@ import org.rosi_project.model_sync.generator.acr_model.{SModel, SType, STypeRegi import scala.collection.JavaConverters._ import org.rosi_project.model_sync.generator.acr_model.SClass import org.eclipse.emf.ecore.EEnum +import org.rosi_project.model_sync.generator.PackageNames /** Converter to generate an [[SModel]] from ecore. * @@ -22,7 +23,7 @@ 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, ec.getEPackage.getNsPrefix, ec.isAbstract, ec.isInterface), ec) + STypeRegistry.addType(new SClass(ec.getName, PackageNames.sourcePkgPrefix + ec.getEPackage.getNsPrefix, ec.isAbstract, ec.isInterface), 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/sync/GenerateQueryHelperVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/GenerateQueryHelperVisitor.scala index f946b773dc049e02e94d5b1bae11e4591fca11e8..3018c8f3b324af53276385c1aab3baeb164f4f0a 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/GenerateQueryHelperVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/GenerateQueryHelperVisitor.scala @@ -2,6 +2,7 @@ package org.rosi_project.model_sync.generator.sync import org.rosi_project.model_sync.generator.acr_model._ import org.rosi_project.model_sync.generator.acr_model.types.PredefTypes +import org.rosi_project.model_sync.generator.PackageNames class GenerateQueryHelperVisitor extends SModelVisitor { @@ -10,7 +11,7 @@ class GenerateQueryHelperVisitor extends SModelVisitor { //iterate over all abstract classes or interfaces sModel.getModelClasses.foreach(cls => { if (cls.isAbstract || cls.isInterface) { - val newClass = new SClass("Helper" + cls.getName, cls.getPackage) + val newClass = new SClass(PackageNames.queryHelperPrefix + cls.getName, cls.getPackage) newClass.addParent(cls) newClass.addParent(PredefRsumTypes.QUERY_HELPER_STYPE) newClass.addMethod(new SMethod( diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala index a631992ff2dfbd6a162cf3b8dec870b1d8b45b8b..4194f049ae4ea57e06091d6f17905ec34e9f1337 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceCombiGenerator.scala @@ -10,12 +10,13 @@ import org.eclipse.emf.ecore.EStructuralFeature import org.eclipse.emf.common.util.EList import org.rosi_project.model_sync.util.EMFUtilForGenerator import java.util.List +import org.rosi_project.model_sync.generator.PackageNames class InstanceCombiGenerator(val clsins: ClassAndInstance) extends SModelVisitor { override def visit(sModel: SModel): Unit = { //println("++++++++++++++++++++++++++++++++++++++++++++++") - val example = new SClass("ExampleCombiCase", "example") + val example = new SClass("ExampleCombiCase", PackageNames.examplePkgName) val contents = clsins.obj.eAllContents().asScala var counter = 0 var lines: Seq[InstanceLine] = Seq.empty @@ -32,7 +33,7 @@ class InstanceCombiGenerator(val clsins: ClassAndInstance) extends SModelVisitor counter += 1 } }) - //add values for instances + //add values for instances lines.foreach(l => { l.usedType.getAllConstructorParameters.foreach(cp => { if (!STypeRegistry.isDefaultType(cp.getType.getName)) { diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala index 224714e16a1cb6785afa43cad3a2acc7c75de9a3..0ca45b307360e460de231f226161b4c907f2f7df 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/InstanceGenerator.scala @@ -10,6 +10,7 @@ import org.eclipse.emf.ecore.EStructuralFeature import org.eclipse.emf.common.util.EList import org.rosi_project.model_sync.util.EMFUtilForGenerator import java.util.List +import org.rosi_project.model_sync.generator.PackageNames /** * Service to create an instance creation object. @@ -20,7 +21,7 @@ class InstanceGenerator(val clsins: ClassAndInstance) extends SModelVisitor { override def visit(sModel: SModel): Unit = { //println("++++++++++++++++++++++++++++++++++++++++++++++") - val example = new SClass("ExampleCase", "example") + val example = new SClass("ExampleCase", PackageNames.examplePkgName) val contents = clsins.obj.eAllContents().asScala var counter = 0 var lines: Seq[InstanceLine] = Seq.empty diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala index f81939038a1af8a4f066afef86b4c9a93cefcab6..1a0d3a6c8babadae60bbd5cb7168344d0d7ecf1c 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/ModelJoinViewGeneratingVisitor.scala @@ -6,6 +6,7 @@ import org.rosi_project.model_sync.model_join.representation.grammar._ import scala.collection.JavaConverters._ import scala.collection.convert.AsScalaConverters import org.rosi_project.model_management.sum.join.RsumJoinType +import org.rosi_project.model_sync.generator.PackageNames class ModelJoinViewGeneratingVisitor(joinExpression: ModelJoinExpression) extends SModelVisitor { @@ -24,7 +25,7 @@ class ModelJoinViewGeneratingVisitor(joinExpression: ModelJoinExpression) extend newInternalRoles = Seq.empty newInternalRelationalRoles = Seq.empty allImportClasses = Set.empty - viewCompartment = new SClass(joinExpression.getName() + counter, "view") + viewCompartment = new SClass(joinExpression.getName() + counter, PackageNames.viewPkgName) counter += 1 viewCompartment.addParent(PredefRsumTypes.IVIEW_COMPARTMENT_STYPE) @@ -83,7 +84,7 @@ class ModelJoinViewGeneratingVisitor(joinExpression: ModelJoinExpression) extend }) } else { refClasses = refClasses :+ cls - internalClass = new SInnerViewNaturalClass(cls.getName + "Role", + internalClass = new SInnerViewNaturalClass(cls.getName + PackageNames.viewRolePostName, _isAbstract = cls.isAbstract, _isInterface = cls.isInterface, _externalClass = viewCompartment, @@ -216,7 +217,7 @@ class ModelJoinViewGeneratingVisitor(joinExpression: ModelJoinExpression) extend //now find the right relational compartment refRelationalClasses = refRelationalClasses :+ rc //Iterate over all Relational compartments and create relational internal role classes - val internalRelClass = new SInnerViewRelationalClass(rc.getName + "Role", _externalClass = viewCompartment, + val internalRelClass = new SInnerViewRelationalClass(rc.getName + PackageNames.viewRolePostName, _externalClass = viewCompartment, sumSource = rc, viewSource = sourceRole, viewTarget = targetRole) internalRelClass.setAttributes(sourceAtt ++ targetAtt) internalRelClass.addMethod(ViewMethods.getIsRelationalMethod(true)) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala index 1886459dfbf178300faf9e45c89f9983ae363148..d40d5ad26600f869b70cc975c1225f8a5941a5d1 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/QueryGeneratingVisitor.scala @@ -2,12 +2,13 @@ package org.rosi_project.model_sync.generator.sync import org.rosi_project.model_sync.generator.acr_model._ import org.rosi_project.model_sync.generator.acr_model.types._ +import org.rosi_project.model_sync.generator.PackageNames class QueryGeneratingVisitor extends SModelVisitor { override def visit(sModel: SModel): Unit = { - val viewCompartment = new SClass(sModel.getName.capitalize + "Query", "query") + val viewCompartment = new SClass(sModel.getName.capitalize + PackageNames.queryPostName, PackageNames.queryPkgName) var newInternalRoles: Seq[SInnerViewNaturalClass] = Seq.empty var newInternalRelationalRoles: Seq[SInnerViewRelationalClass] = Seq.empty viewCompartment.addParent(PredefRsumTypes.IQUERY_VIEW_COMPARTMENT_STYPE) @@ -21,8 +22,8 @@ class QueryGeneratingVisitor extends SModelVisitor { viewCompartment.augmentConstructor(SMethodStatement(s"""init("${viewCompartment.getName}")""", allTypes)) //Iterate over all Model classes and create natural internal role classes - sModel.getModelClasses.filter(!_.getName.startsWith("Helper")).foreach(cls => { - val internalClass = new SInnerViewNaturalClass(cls.getName + "Role", + sModel.getModelClasses.filter(!_.getName.startsWith(PackageNames.queryHelperPrefix)).foreach(cls => { + val internalClass = new SInnerViewNaturalClass(cls.getName + PackageNames.queryRolePostName, _isAbstract = false, _isInterface = false, _externalClass = viewCompartment, @@ -54,7 +55,7 @@ class QueryGeneratingVisitor extends SModelVisitor { inner.addMethod(ViewMethods.getDeleteElementNaturalMethod(inner)) //add parents cls.getAllParents().foreach(p => { - val existing: Option[STypedElement] = newInternalRoles.find(existing => existing.getName == p.getName + "Role") + val existing: Option[STypedElement] = newInternalRoles.find(existing => existing.getName == p.getName + PackageNames.queryRolePostName) if (!existing.isEmpty) { inner.addParent(existing.get) } @@ -77,7 +78,7 @@ class QueryGeneratingVisitor extends SModelVisitor { var targetRole: SInnerViewNaturalClass = null r.getAttributes.foreach(attr => { newInternalRoles.foreach(inte => { - if (inte.getName == attr.getTypeElement.getName + "Role") { + if (inte.getName == attr.getTypeElement.getName + PackageNames.queryRolePostName) { if (attr.getName == "sInstance") { sourceRole = inte sourceAtt = new SAttribute("source", inte) @@ -92,7 +93,7 @@ class QueryGeneratingVisitor extends SModelVisitor { } }) }) - val internalClass = new SInnerViewRelationalClass(r.getName + "Role", _externalClass = viewCompartment, + val internalClass = new SInnerViewRelationalClass(r.getName + PackageNames.queryRolePostName, _externalClass = viewCompartment, sumSource = r.asInstanceOf[SRelationalCompartmentClass], viewSource = sourceRole, viewTarget = targetRole) internalClass.setAttributes(sourceAtt ++ targetAtt) internalClass.addMethod(ViewMethods.getIsRelationalMethod(true)) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala index eb944853215ab42922a3597bb5869647ece406bd..2611fa736b09a28e98d7c331589a76ae3a3c6de4 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/ViewGeneratingVisitor.scala @@ -2,19 +2,20 @@ package org.rosi_project.model_sync.generator.sync import org.rosi_project.model_sync.generator.acr_model._ import org.rosi_project.model_sync.generator.acr_model.types._ +import org.rosi_project.model_sync.generator.PackageNames class ViewGeneratingVisitor extends SModelVisitor { override def visit(sModel: SModel): Unit = { - val viewCompartment = new SClass(sModel.getName.capitalize + "View", "view") + val viewCompartment = new SClass(sModel.getName.capitalize + PackageNames.viewPostName, PackageNames.viewPkgName) var newInternalRoles: Seq[SInnerViewNaturalClass] = Seq.empty var newInternalRelationalRoles: Seq[SInnerViewRelationalClass] = Seq.empty viewCompartment.addParent(PredefRsumTypes.IVIEW_COMPARTMENT_STYPE) //Iterate over all Model classes and create natural internal role classes sModel.getModelClasses.foreach(cls => { - val internalClass = new SInnerViewNaturalClass(cls.getName + "Role", + val internalClass = new SInnerViewNaturalClass(cls.getName + PackageNames.viewRolePostName, _isAbstract = cls.isAbstract, _isInterface = cls.isInterface, _externalClass = viewCompartment, @@ -49,7 +50,7 @@ class ViewGeneratingVisitor extends SModelVisitor { inner.addMethod(ViewMethods.getDeleteElementNaturalMethod(inner)) //add parents cls.getAllParents().foreach(p => { - val existing: Option[STypedElement] = newInternalRoles.find(existing => existing.getName == p.getName + "Role") + val existing: Option[STypedElement] = newInternalRoles.find(existing => existing.getName == p.getName + PackageNames.viewRolePostName) if (!existing.isEmpty) { inner.addParent(existing.get) } @@ -70,7 +71,7 @@ class ViewGeneratingVisitor extends SModelVisitor { var targetRole: SInnerViewNaturalClass = null r.getAttributes.foreach(attr => { newInternalRoles.foreach(inte => { - if (inte.getName == attr.getTypeElement.getName + "Role") { + if (inte.getName == attr.getTypeElement.getName + PackageNames.viewRolePostName) { if (attr.getName == "sInstance") { sourceRole = inte sourceAtt = new SAttribute("source", inte) @@ -85,7 +86,7 @@ class ViewGeneratingVisitor extends SModelVisitor { } }) }) - val internalClass = new SInnerViewRelationalClass(r.getName + "Role", _externalClass = viewCompartment, + val internalClass = new SInnerViewRelationalClass(r.getName + PackageNames.viewRolePostName, _externalClass = viewCompartment, sumSource = r.asInstanceOf[SRelationalCompartmentClass], viewSource = sourceRole, viewTarget = targetRole) internalClass.setAttributes(sourceAtt ++ targetAtt) internalClass.addMethod(ViewMethods.getIsRelationalMethod(true)) 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 664b0c6392727e6ac48a076deef97a85f691bc6d..549fabc00846ceabf7bb29133893f06e731ac83b 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 @@ -40,7 +40,7 @@ object ApplicationTest extends App { } def runTTC2019(cre: Creation.Value): Unit = { - var config: GeneratorConfig = GeneratorConfig(Seq("assets/models/BDD.ecore", "assets/models/TT.ecore"), false, new File("assets/models")); + 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) new Generator(config).run() }