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