From 2cfc407234b89136712ca242cea37fdf898aad78 Mon Sep 17 00:00:00 2001
From: tkuehn <thomas.kuehn3@tu-dresden.de>
Date: Wed, 13 Jun 2018 21:19:59 +0200
Subject: [PATCH] Fixed InterRelationship constraints, by fixing canCreate,
 canStart, and corresponding EditPolicies

---
 ...actInterRelationshipConstraintPattern.java |  4 +-
 .../InterRelationship.ecl                     | 16 ++---
 .../InterRelationship.editpolicy              | 64 ++++++++++++++++---
 3 files changed, 66 insertions(+), 18 deletions(-)

diff --git a/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/AbstractInterRelationshipConstraintPattern.java b/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/AbstractInterRelationshipConstraintPattern.java
index 4b7bc607..98aadb15 100644
--- a/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/AbstractInterRelationshipConstraintPattern.java
+++ b/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/AbstractInterRelationshipConstraintPattern.java
@@ -159,7 +159,7 @@ public abstract class AbstractInterRelationshipConstraintPattern extends FRaMEDC
 	    org.framed.iorm.model.ModelElement targetConnection = UIUtil.getModelElementForAnchor(targetAnchor);
 	    if(sourceConnection != null && targetConnection != null) {
 	    	if(sourceConnection.getContainer() == targetConnection.getContainer()) {
-				return EditPolicyService.getHandler(this.getDiagram()).canCreate(createContext, this.modelType);
+				return EditPolicyService.getHandler(this.getDiagram()).canCreate(createContext, this.getModelType());
 	    	}	
 	    }
 	    return false;
@@ -179,7 +179,7 @@ public abstract class AbstractInterRelationshipConstraintPattern extends FRaMEDC
 		org.framed.iorm.model.ModelElement sourceConnection = UIUtil.getModelElementForAnchor(sourceAnchor);
 		if(sourceConnection != null){	
 			if(sourceConnection.getType() == Type.RELATIONSHIP)
-				return EditPolicyService.getHandler(this.getDiagram()).canStart(createContext, sourceConnection.getType() );
+				return EditPolicyService.getHandler(this.getDiagram()).canStart(createContext, this.getModelType() );
 		}	
 		return false;
 	}
diff --git a/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.ecl b/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.ecl
index 6d084323..241aab42 100644
--- a/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.ecl
+++ b/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.ecl
@@ -1,10 +1,10 @@
 //InterRelationship  
-Start RelationshipExclusion (Inter_Relationship_Constraints) when true;
-Add RelationshipExclusion (Inter_Relationship_Constraints) when true; 
-Reconnect RelationshipExclusion (Inter_Relationship_Constraints) when true;
-Create RelationshipExclusion (Inter_Relationship_Constraints) when true;
+Start RelationshipExclusion (Inter_Relationship_Constraints) when IsSourceType(Relationship);
+Add RelationshipExclusion (Inter_Relationship_Constraints) when IsSourceType(Relationship) and SourceEqualsTargetType() and !SourceEqualsTarget(); 
+Reconnect RelationshipExclusion (Inter_Relationship_Constraints) when IsSourceType(Relationship) and SourceEqualsTargetType() and !SourceEqualsTarget();
+Create RelationshipExclusion (Inter_Relationship_Constraints) when IsSourceType(Relationship) and SourceEqualsTargetType() and !SourceEqualsTarget();
 
-Start RelationshipImplication (Inter_Relationship_Constraints) when true;
-Add RelationshipImplication (Inter_Relationship_Constraints) when true;
-Reconnect RelationshipImplication (Inter_Relationship_Constraints) when true;
-Create RelationshipImplication (Inter_Relationship_Constraints) when true;
+Start RelationshipImplication (Inter_Relationship_Constraints) when IsSourceType(Relationship);
+Add RelationshipImplication (Inter_Relationship_Constraints) when IsSourceType(Relationship) and SourceEqualsTargetType() and !SourceEqualsTarget();
+Reconnect RelationshipImplication (Inter_Relationship_Constraints) when IsSourceType(Relationship) and SourceEqualsTargetType() and !SourceEqualsTarget();
+Create RelationshipImplication (Inter_Relationship_Constraints) when IsSourceType(Relationship) and SourceEqualsTargetType() and !SourceEqualsTarget();
diff --git a/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.editpolicy b/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.editpolicy
index 2a11004b..e185a8e1 100644
--- a/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.editpolicy
+++ b/org.framed.iorm.ui/modules/relationship/inter_relationship_constraints/InterRelationship.editpolicy
@@ -2,34 +2,82 @@
 <editpolicymodel:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:editpolicymodel="http://framed/editpolicymodel">
   <policies action="Start" actionType="RelationshipExclusion">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
   </policies>
   <policies action="Add" actionType="RelationshipExclusion">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:AndConstraintRule">
+      <rules xsi:type="editpolicymodel:AndConstraintRule">
+        <rules xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
+        <rules xsi:type="editpolicymodel:SourceEqualsTargetType"/>
+      </rules>
+      <rules xsi:type="editpolicymodel:NotConstraintRule">
+        <rule xsi:type="editpolicymodel:SourceEqualsTarget"/>
+      </rules>
+    </constraintRule>
   </policies>
   <policies action="Reconnect" actionType="RelationshipExclusion">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:AndConstraintRule">
+      <rules xsi:type="editpolicymodel:AndConstraintRule">
+        <rules xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
+        <rules xsi:type="editpolicymodel:SourceEqualsTargetType"/>
+      </rules>
+      <rules xsi:type="editpolicymodel:NotConstraintRule">
+        <rule xsi:type="editpolicymodel:SourceEqualsTarget"/>
+      </rules>
+    </constraintRule>
   </policies>
   <policies actionType="RelationshipExclusion">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:AndConstraintRule">
+      <rules xsi:type="editpolicymodel:AndConstraintRule">
+        <rules xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
+        <rules xsi:type="editpolicymodel:SourceEqualsTargetType"/>
+      </rules>
+      <rules xsi:type="editpolicymodel:NotConstraintRule">
+        <rule xsi:type="editpolicymodel:SourceEqualsTarget"/>
+      </rules>
+    </constraintRule>
   </policies>
   <policies action="Start" actionType="RelationshipImplication">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
   </policies>
   <policies action="Add" actionType="RelationshipImplication">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:AndConstraintRule">
+      <rules xsi:type="editpolicymodel:AndConstraintRule">
+        <rules xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
+        <rules xsi:type="editpolicymodel:SourceEqualsTargetType"/>
+      </rules>
+      <rules xsi:type="editpolicymodel:NotConstraintRule">
+        <rule xsi:type="editpolicymodel:SourceEqualsTarget"/>
+      </rules>
+    </constraintRule>
   </policies>
   <policies action="Reconnect" actionType="RelationshipImplication">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:AndConstraintRule">
+      <rules xsi:type="editpolicymodel:AndConstraintRule">
+        <rules xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
+        <rules xsi:type="editpolicymodel:SourceEqualsTargetType"/>
+      </rules>
+      <rules xsi:type="editpolicymodel:NotConstraintRule">
+        <rule xsi:type="editpolicymodel:SourceEqualsTarget"/>
+      </rules>
+    </constraintRule>
   </policies>
   <policies actionType="RelationshipImplication">
     <featureRule xsi:type="editpolicymodel:IsFeature" featureName="Inter_Relationship_Constraints"/>
-    <constraintRule xsi:type="editpolicymodel:TrueConstraintRule"/>
+    <constraintRule xsi:type="editpolicymodel:AndConstraintRule">
+      <rules xsi:type="editpolicymodel:AndConstraintRule">
+        <rules xsi:type="editpolicymodel:IsSourceType" type="Relationship"/>
+        <rules xsi:type="editpolicymodel:SourceEqualsTargetType"/>
+      </rules>
+      <rules xsi:type="editpolicymodel:NotConstraintRule">
+        <rule xsi:type="editpolicymodel:SourceEqualsTarget"/>
+      </rules>
+    </constraintRule>
   </policies>
 </editpolicymodel:Model>
-- 
GitLab