From 72dbe721f2f206c8cb1ff6324bba09d222c7a0aa Mon Sep 17 00:00:00 2001 From: Kevin Kassin <kevinkassin@gmx.de> Date: Tue, 14 Aug 2018 17:51:01 +0200 Subject: [PATCH] Transformation or Role Groups and Compartment Types changed Compartment Types can now be transformed by a RoleModel rule, if the feature is not chosen, removing the RoleGroup package now leads to placing roles inside the compartment the role group is located in --- .../core/fulfillment/FulfillmentFilled.etl | 28 +++++++++++++++++-- .../core/rolemodel/RoleModel.etl | 27 ++++++++++++++++++ .../modules/compartment/CompartmentType.etl | 1 + .../roletype/group_constraints/RoleGroup.etl | 5 ++-- .../group_constraints/RoleGroupParent.etl | 2 +- 5 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 org.framed.iorm.ui/core/rolemodel/RoleModel.etl diff --git a/org.framed.iorm.ui/core/fulfillment/FulfillmentFilled.etl b/org.framed.iorm.ui/core/fulfillment/FulfillmentFilled.etl index 2251f4ea..62a4b63d 100644 --- a/org.framed.iorm.ui/core/fulfillment/FulfillmentFilled.etl +++ b/org.framed.iorm.ui/core/fulfillment/FulfillmentFilled.etl @@ -34,13 +34,37 @@ rule FulfillmentNoRoleGroups fulfillmentFillsRoleGroup(s) and not(s.~features.get("Group_Constraints")) + var fulfillmentsToDelete : OrderedSet(target!Fulfillment); for(fulfillment : target!Fulfillment in s.~transformed) { if(fulfillment.filled.instanceOf(target!RoleGroup)) - delete(fulfillment); - s.~transformed.remove(fulfillment); + fulfillmentsToDelete.add(fulfillment); } + for(fulfillment : target!Fulfillment in fulfillmentsToDelete) { + delete(fulfillment); + s.~transformed.remove(fulfillment); + } } +@lazy +rule FulfillmentWithOutFiller + transform s : source!Relation + to t : Sequence(target!Fulfillment) + extends Fulfillment { + guard : s.target.getType==(source!Type#CompartmentType) + + var fulfillmentsToDelete : OrderedSet(target!Fulfillment); + for(fulfillment : target!Fulfillment in s.~transformed) { + if(fulfillment.filled == null) { + fulfillment.filled.println(); + fulfillmentsToDelete.add(fulfillment); } + + } + for(fulfillment : target!Fulfillment in fulfillmentsToDelete) { + delete(fulfillment); + s.~transformed.remove(fulfillment); + } +} + operation fulfillmentFillsRoleGroup(s: source!Relation):Boolean { for(roles : source!Shape in s.getReferencedRoles) { if(roles.getType==source!Type#RoleGroup) diff --git a/org.framed.iorm.ui/core/rolemodel/RoleModel.etl b/org.framed.iorm.ui/core/rolemodel/RoleModel.etl new file mode 100644 index 00000000..949a119b --- /dev/null +++ b/org.framed.iorm.ui/core/rolemodel/RoleModel.etl @@ -0,0 +1,27 @@ +/** + * The abstract rule for compartment type outside of compartment types + */ +@lazy +rule RoleModel + transform s : source!Shape + to t : target!CompartmentType { + guard : s.getType==(source!Type#CompartmentType) and + not(s.~features.get("Compartment_Types")) and + (s.getContainer().getParent()==null or + not(s.getContainer().getParent().getType()==(source!Type#CompartmentType))) + + //set the transformed target element to ensure the subrule work on the same target and only transform once + if(s.~transformed == null) { + s.~transformed = t; + //set the compartments name + t.name = s.name; + // iterate over all children of the compartment type + if(not(s.getModel() == null)) { + for (elem : source!ModelElement in s.getModel().elements) { + //propagate the features list and and the main model reference to all children + elem.~features = s.~features; + elem.~mainModel = s.~mainModel; + //transform all children + var e = elem.equivalent(); + } } } +} diff --git a/org.framed.iorm.ui/modules/compartment/CompartmentType.etl b/org.framed.iorm.ui/modules/compartment/CompartmentType.etl index d8cfef2a..d986b648 100644 --- a/org.framed.iorm.ui/modules/compartment/CompartmentType.etl +++ b/org.framed.iorm.ui/modules/compartment/CompartmentType.etl @@ -6,6 +6,7 @@ rule CompartmentType transform s : source!Shape to t : target!CompartmentType { guard : s.getType==(source!Type#CompartmentType) and + s.~features.get("Compartment_Types") and (s.getContainer().getParent()==null or not(s.getContainer().getParent().getType()==(source!Type#CompartmentType))) diff --git a/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroup.etl b/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroup.etl index ffc775e8..98af55d6 100644 --- a/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroup.etl +++ b/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroup.etl @@ -10,7 +10,8 @@ rule RoleGroup to t : target!RoleGroup { guard : s.getType==(source!Type#RoleGroup) and s.~features.get("Group_Constraints") //feature Group_Constraints implies feature Role_Constraints (not to check) - + + //set the transformed target element to ensure the subrule work on the same target and only transform once if(s.~transformed == null) { s.~transformed = t; @@ -59,7 +60,7 @@ rule RoleGroupNotTransformed to t : target!RoleGroup { guard : s.getType==(source!Type#RoleGroup) and not(s.~features.get("Group_Constraints")) //feature Group_Constraints implies feature Role_Constraints (not to check) - + //transform children var children = s.`model`; if (not (children == null)) { diff --git a/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroupParent.etl b/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroupParent.etl index d7d57467..0e059263 100644 --- a/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroupParent.etl +++ b/org.framed.iorm.ui/modules/roletype/group_constraints/RoleGroupParent.etl @@ -9,7 +9,7 @@ rule RoleGroupInCompartmentType to t : target!RoleGroup extends RoleGroup { guard : not(s.getContainer().getParent() == null) and - s.getContainer().getParent().getType==(source!Type#CompartmentType) + s.getContainer().getParent().getType==(source!Type#CompartmentType) //get the crom equivalent to compartment type the role group is in var compartmentType = s.getContainer.getParent().equivalent(); -- GitLab