diff --git a/build.sbt b/build.sbt index ae62066d319f9339ab556f2b0c5e9f2c4a76ed44..debe606bae3468688b9662c6932d5b116928ff50 100644 --- a/build.sbt +++ b/build.sbt @@ -9,6 +9,8 @@ val gsonVersion = "2.8.5" val modelmanagementprovider = ProjectRef(uri("https://git-st.inf.tu-dresden.de/cwerner/role_model_management_provider.git#master"), "modelmanagementprovider") val uiProvider = ProjectRef(uri("https://git-st.inf.tu-dresden.de/cwerner/role_ui_provider.git#master"), "uiprovider") +val modeljoin = ProjectRef(uri("https://git-st.inf.tu-dresden.de/cwerner/model_join.git"), "model_join") + javacOptions ++= Seq("-encoding", "UTF-8") @@ -52,6 +54,7 @@ lazy val generator = (project in file(".")) oldStrategy(x) }, ).dependsOn( + modeljoin, modelmanagementprovider, uiProvider ) diff --git a/lib/modeljoin.jar b/lib/modeljoin.jar deleted file mode 100644 index f8f8f1c984bdb976963788009f4efb26734c4e40..0000000000000000000000000000000000000000 Binary files a/lib/modeljoin.jar and /dev/null differ 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 34deddbeeb653dd9cca21460ed752bd94ca91f24..56189e3190bce3a4a2fd9c744e3fff1e8c69debe 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 @@ -81,6 +81,8 @@ class Generator(config: GeneratorConfig) { } else { + //add ref methods + new SModelCombiRefMethodService prepareModel (sm._1) //remove references new SModelSUMRemoveRefService prepareModel (sm._1) } diff --git a/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala b/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala index abcd564426912f437e3bdb022225dcd0a16e372f..681ed98699eb040a9ee54995ed4e157c85fc167a 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/ModelConfig.scala @@ -1,8 +1,5 @@ package org.rosi_project.model_sync.generator -import org.rosi_project.model_sync.provider.DisplayableModel -import org.rosi_project.model_sync.provider.ModelSyncProvider - /** Representation of a model configuration (i.e. a number of corresponding models). It tells the * generator how the model looks like, which types are needed, etc. * diff --git a/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiRefMethodService.scala b/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiRefMethodService.scala new file mode 100644 index 0000000000000000000000000000000000000000..1e1e9d9c98d352de643d9e094d783c4d94236e8c --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/SModelCombiRefMethodService.scala @@ -0,0 +1,25 @@ +package org.rosi_project.model_sync.generator + +import org.rosi_project.model_sync.generator.acr_model.SModel +import org.rosi_project.model_sync.generator.sync.ReferenceMethodCreationVisitor + +/** + * Add a method to get all references in the RSUM case. + * Sync functions necessary because we need compartment functions in the naturals. + * + * @author Christopher Werner + */ +class SModelCombiRefMethodService { + + /** + * Remove reference from model classes. + * + * @param sModel the model to augment + */ + def prepareModel(sModel: SModel): Unit = { + val refMethodVisitor = new ReferenceMethodCreationVisitor + + //order is important !!!! + sModel.accept(refMethodVisitor) + } +} \ No newline at end of file diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala index c37d1df3cde8ae63007e17a6216c3937a9a7f848..5a3b9f745bd5b0b1adaa79934ac9d8989e6e264a 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/PredefRsumTypes.scala @@ -7,6 +7,7 @@ import org.rosi_project.model_management.sum.IViewTypeInfo import org.rosi_project.model_management.sum.query._ import org.rosi_project.model_management.sum.join._ import org.rosi_project.model_management.sum.compartments._ +import org.rosi_project.model_management.sum.roles.IRelationRole object PredefRsumTypes { @@ -44,6 +45,9 @@ object PredefRsumTypes { val AQUERY_VIEW_ROLE_STYPE = SType(AQUERY_VIEW_ROLE_CLASS.getSimpleName) //, AQUERY_VIEW_ROLE_CLASS.getPackage.getName) //RELATIONAL COMPARTMENT TYPES + private val IRELATIONROLE_CLASS = classOf[IRelationRole] + val IRELATIONROLE_STYPE = SType(IRELATIONROLE_CLASS.getSimpleName, IRELATIONROLE_CLASS.getPackage.getName) + private val IAGGREGTATION_CLASS = classOf[IAggregation] val IAGGREGTATION_STYPE = SType(IAGGREGTATION_CLASS.getSimpleName, IAGGREGTATION_CLASS.getPackage.getName) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/sync/ReferenceMethodCreationVisitor.scala b/src/main/scala/org/rosi_project/model_sync/generator/sync/ReferenceMethodCreationVisitor.scala new file mode 100644 index 0000000000000000000000000000000000000000..e3ef7b31f16abe2fe6dc2688db98b3326b1edad1 --- /dev/null +++ b/src/main/scala/org/rosi_project/model_sync/generator/sync/ReferenceMethodCreationVisitor.scala @@ -0,0 +1,86 @@ +package org.rosi_project.model_sync.generator.sync + +import org.rosi_project.model_sync.generator.acr_model._ + +class ReferenceMethodCreationVisitor extends SModelVisitor { + + override def visit(sModel: SModel): Unit = { + sModel.getRelationalCompartments.foreach(cls => { + val relComp = cls.asInstanceOf[SRelationalCompartmentClass] + //iterate over all relational compartments + val methodSrc = new SMethod( + name = relComp.connectedRef.getName, + result = relComp.connectedRef.getTypeElement, + params = Seq.empty, + implementation = Seq.empty) + var implSrc: Seq[SMethodStatement] = Seq.empty + implSrc :+ SMethodStatement(content = s"var result: ${relComp.connectedRef.getTypeElement} = Set.empty") + implSrc :+ SMethodStatement(content = s"""this.roles.filter(r => r.isInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}] && + r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.isInstanceOf[${relComp.getName}]) + .foreach(r => { + list += r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.getTargetIns.asInstanceOf[${relComp.tClass.getName}] + })""") + implSrc :+ SMethodStatement(content = "result") + methodSrc.implementation = implSrc + relComp.sClass.asInstanceOf[SClass].addMethod(methodSrc) + //proof opposite reference + if (relComp.connectedRef.hasOpposite) { + val methodTrg = new SMethod( + name = relComp.connectedRef.oppositeRef.getName, + result = relComp.connectedRef.oppositeRef.getTypeElement, + params = Seq.empty, + implementation = Seq.empty) + var implTrg: Seq[SMethodStatement] = Seq.empty + implTrg :+ SMethodStatement(content = s"var result: ${relComp.connectedRef.oppositeRef.getTypeElement} = Set.empty") + implTrg :+ SMethodStatement(content = s"""this.roles.filter(r => r.isInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}] && + r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.isInstanceOf[${relComp.getName}]) + .foreach(r => { + list += r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.getSourceIns.asInstanceOf[${relComp.sClass.getName}] + })""") + implTrg :+ SMethodStatement(content = "result") + methodTrg.implementation = implTrg + relComp.tClass.asInstanceOf[SClass].addMethod(methodTrg) + } + }) + sModel.getModelClasses.foreach(cls => { + //iterate over all references and add new method to class + cls.getReferences().foreach(ref => { + val method = new SMethod( + name = ref.getName, + result = ref.getTypeElement, + params = Seq.empty, + implementation = Seq.empty) + var impl: Seq[SMethodStatement] = Seq.empty + impl :+ SMethodStatement(content = s"var result: ${ref.getTypeElement} = Set.empty") + impl :+ SMethodStatement(content = s"""this.roles.filter(r => r.isInstanceOf[IRelationRole] && + r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.isInstanceOf[VideoCassetteCastPerson]) + .foreach(r => { + list += r.asInstanceOf[${PredefRsumTypes.IRELATIONROLE_STYPE.getName}].getOuterCompartment.getTargetIns.asInstanceOf[Person] + })""") + impl :+ SMethodStatement(content = "result") + method.implementation = impl + cls.addMethod(method) + }) + }) + } + + override def visit(sClass: SClass): Unit = { + // pass + } + + override def visit(sAttr: SAttribute): Unit = { + // pass + } + + override def visit(sMethod: SMethod): Unit = { + // pass + } + + override def visit(sType: SType): Unit = { + // pass + } + + override def visit(sRef: SReference): 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 a2c5a44de066da26435ae2b5fad7aad5cf543696..ebe73fd71a945e24bf51ebaef9bd4f1c1d39a8f6 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,9 +8,9 @@ import org.rosi_project.model_sync.generator.Creation object ApplicationTest extends App { //runTestLibrary(Creation.rolesum) - //runCombinedTest(Creation.rolesum) + runCombinedTest(Creation.rolecomb) //runShrinkingModel(Creation.rolesum) - runTestAML(Creation.rolesum) + //runTestAML(Creation.rolesum) //TTC Case examples //runTTC2019(Creation.rolecomb) diff --git a/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala b/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala index d3d0045bd30c86db93cf60e6ce9991d828919d99..8bac75486976290118f70ad768883b3ab1ad2aa4 100644 --- a/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala +++ b/src/main/scala/org/rosi_project/model_sync/generator/ui/PredefUiTypes.scala @@ -3,12 +3,6 @@ package org.rosi_project.model_sync.generator.ui import org.rosi_project.model_sync.generator.acr_model.SType import org.rosi_project.model_sync.provider._ import org.rosi_project.model_sync.instances._ -import org.rosi_project.model_sync.instances.ModelInstanceConstructor -import org.rosi_project.model_sync.instances.ModelInstanceModifier -import org.rosi_project.model_sync.provider.DisplayableModel -import org.rosi_project.model_sync.provider.DisplayableModelForInitialization -import org.rosi_project.model_sync.provider.DisplayableModelForIntegration -import org.rosi_project.model_sync.provider.ModelSyncProvider object PredefUiTypes { @@ -23,7 +17,7 @@ object PredefUiTypes { private val DISPLAYABLE_MODEL_FOR_INTEGRATION_CLASS = classOf[DisplayableModelForIntegration] val DISPLAYABLE_MODEL_FOR_INTEGRATION_STYPE = SType(DISPLAYABLE_MODEL_FOR_INTEGRATION_CLASS.getSimpleName, DISPLAYABLE_MODEL_FOR_INTEGRATION_CLASS.getPackage.getName) - private val MODEL_SYNC_PROVIDER_CLASS = classOf[ModelSyncProvider] + private val MODEL_SYNC_PROVIDER_CLASS = classOf[SyncProvider] val MODEL_SYNC_PROVIDER_STYPE = SType(MODEL_SYNC_PROVIDER_CLASS.getSimpleName, MODEL_SYNC_PROVIDER_CLASS.getPackage.getName) private val MODEL_REGISTRY_CLASS = ModelRegistry.getClass