From 3c5d7ebaaaee10114a19b50b1b2374b64e310a20 Mon Sep 17 00:00:00 2001
From: Fabian Brosig <fabian.brosig@uni-wuerzburg.de>
Date: Thu, 7 Aug 2014 14:23:36 +0000
Subject: [PATCH] corrected the association between Relationship and
 InterfaceProvidingRequiringEntity to be bidirectional (with
 InterfaceProvidingRequiringEntity being the container)

git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/DMM/trunk@16338 9e42b895-fcda-4063-8a3b-11be15eb1bbd
---
 .../model/parameterdependency.ecore           |  3 +-
 .../model/repository.ecore                    |  3 +-
 .../model/repository.ecore.oclinecore         |  2 +-
 .../ParameterdependenciesPackage.java         | 12 +--
 .../parameterdependencies/Relationship.java   | 12 +--
 .../ParameterdependenciesPackageImpl.java     |  2 +-
 .../impl/RelationshipImpl.java                | 82 ++++++++++++-------
 .../InterfaceProvidingRequiringEntity.java    |  8 +-
 .../repository/RepositoryPackage.java         | 18 ++--
 .../ComposedProvidingRequiringEntityImpl.java |  9 +-
 ...InterfaceProvidingRequiringEntityImpl.java |  9 +-
 .../impl/RepositoryPackageImpl.java           |  2 +-
 12 files changed, 102 insertions(+), 60 deletions(-)

diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/model/parameterdependency.ecore b/edu.kit.ipd.descartes.mm.applicationlevel/model/parameterdependency.ecore
index b2038b35..8f4eabfb 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/model/parameterdependency.ecore
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/model/parameterdependency.ecore
@@ -77,7 +77,8 @@
       <details key="EnforceExplicitDescriptionWhenExplicitCharacterizationType" value="&#xA;&#x9;&#x9;&#x9;self.characterization = RelationshipCharacterizationType::EXPLICIT implies explicitDescription &lt;> null"/>
     </eAnnotations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="surroundingEntity" lowerBound="1"
-        eType="ecore:EClass repository.ecore#//InterfaceProvidingRequiringEntity"/>
+        eType="ecore:EClass repository.ecore#//InterfaceProvidingRequiringEntity"
+        eOpposite="repository.ecore#//InterfaceProvidingRequiringEntity/relationships"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="characterization" lowerBound="1"
         eType="#//RelationshipCharacterizationType"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="explicitDescription" eType="ecore:EClass functions.ecore#//ExplicitDescription"
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore b/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore
index c047df27..623bcbb5 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore
@@ -47,7 +47,8 @@
         ordered="false" upperBound="-1" eType="ecore:EClass servicebehavior.ecore#//CoarseGrainedBehavior"
         containment="true"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="relationships" ordered="false"
-        upperBound="-1" eType="ecore:EClass parameterdependency.ecore#//Relationship"/>
+        upperBound="-1" eType="ecore:EClass parameterdependency.ecore#//Relationship"
+        containment="true" eOpposite="parameterdependency.ecore#//Relationship/surroundingEntity"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Import">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="importURI" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore.oclinecore b/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore.oclinecore
index 2ba8154a..63e69338 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore.oclinecore
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/model/repository.ecore.oclinecore
@@ -24,7 +24,7 @@ package repository : repository = 'http://www.descartes-research.net/metamodel/r
 	abstract class InterfaceProvidingRequiringEntity extends InterfaceProvidingEntity, InterfaceRequiringEntity
 	{
 		property coarseGrainedBehavior : servicebehavior_0::CoarseGrainedBehavior[*] { composes };
-		property relationships#surroundingEntity : parameterdependency_0::Relationship[*];
+		property relationships#surroundingEntity : parameterdependency_0::Relationship[*] { composes };
 		invariant AtMostOneCoarseGrainedBehaviorPerProvidedService:
 			not self.coarseGrainedBehavior->isEmpty() implies 
 			self.coarseGrainedBehavior->isUnique(cgb1 | cgb1.describedSignature);
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/ParameterdependenciesPackage.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/ParameterdependenciesPackage.java
index b4d8ff13..1b719d9a 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/ParameterdependenciesPackage.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/ParameterdependenciesPackage.java
@@ -347,7 +347,7 @@ public interface ParameterdependenciesPackage extends EPackage {
 	int RELATIONSHIP = 7;
 
 	/**
-	 * The feature id for the '<em><b>Surrounding Entity</b></em>' reference.
+	 * The feature id for the '<em><b>Surrounding Entity</b></em>' container reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -393,7 +393,7 @@ public interface ParameterdependenciesPackage extends EPackage {
 	int DEPENDENCY_RELATIONSHIP = 8;
 
 	/**
-	 * The feature id for the '<em><b>Surrounding Entity</b></em>' reference.
+	 * The feature id for the '<em><b>Surrounding Entity</b></em>' container reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -457,7 +457,7 @@ public interface ParameterdependenciesPackage extends EPackage {
 	int DEPENDENCY_PROPAGATION_RELATIONSHIP = 9;
 
 	/**
-	 * The feature id for the '<em><b>Surrounding Entity</b></em>' reference.
+	 * The feature id for the '<em><b>Surrounding Entity</b></em>' container reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -1119,10 +1119,10 @@ public interface ParameterdependenciesPackage extends EPackage {
 	EClass getRelationship();
 
 	/**
-	 * Returns the meta object for the reference '{@link edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship#getSurroundingEntity <em>Surrounding Entity</em>}'.
+	 * Returns the meta object for the container reference '{@link edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship#getSurroundingEntity <em>Surrounding Entity</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Surrounding Entity</em>'.
+	 * @return the meta object for the container reference '<em>Surrounding Entity</em>'.
 	 * @see edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship#getSurroundingEntity()
 	 * @see #getRelationship()
 	 * @generated
@@ -1604,7 +1604,7 @@ public interface ParameterdependenciesPackage extends EPackage {
 		EClass RELATIONSHIP = eINSTANCE.getRelationship();
 
 		/**
-		 * The meta object literal for the '<em><b>Surrounding Entity</b></em>' reference feature.
+		 * The meta object literal for the '<em><b>Surrounding Entity</b></em>' container reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/Relationship.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/Relationship.java
index be4e44db..0361e419 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/Relationship.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/Relationship.java
@@ -31,26 +31,28 @@ import org.eclipse.emf.ecore.EObject;
  */
 public interface Relationship extends EObject {
 	/**
-	 * Returns the value of the '<em><b>Surrounding Entity</b></em>' reference.
+	 * Returns the value of the '<em><b>Surrounding Entity</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link edu.kit.ipd.descartes.mm.applicationlevel.repository.InterfaceProvidingRequiringEntity#getRelationships <em>Relationships</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Surrounding Entity</em>' reference isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Surrounding Entity</em>' reference.
+	 * @return the value of the '<em>Surrounding Entity</em>' container reference.
 	 * @see #setSurroundingEntity(InterfaceProvidingRequiringEntity)
 	 * @see edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.ParameterdependenciesPackage#getRelationship_SurroundingEntity()
-	 * @model required="true"
+	 * @see edu.kit.ipd.descartes.mm.applicationlevel.repository.InterfaceProvidingRequiringEntity#getRelationships
+	 * @model opposite="relationships" required="true" transient="false"
 	 * @generated
 	 */
 	InterfaceProvidingRequiringEntity getSurroundingEntity();
 
 	/**
-	 * Sets the value of the '{@link edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship#getSurroundingEntity <em>Surrounding Entity</em>}' reference.
+	 * Sets the value of the '{@link edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship#getSurroundingEntity <em>Surrounding Entity</em>}' container reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Surrounding Entity</em>' reference.
+	 * @param value the new value of the '<em>Surrounding Entity</em>' container reference.
 	 * @see #getSurroundingEntity()
 	 * @generated
 	 */
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/ParameterdependenciesPackageImpl.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/ParameterdependenciesPackageImpl.java
index dfbc398f..e641d14b 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/ParameterdependenciesPackageImpl.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/ParameterdependenciesPackageImpl.java
@@ -860,7 +860,7 @@ public class ParameterdependenciesPackageImpl extends EPackageImpl implements Pa
 		initEAttribute(getShadowParameter_Description(), ecorePackage.getEString(), "description", null, 1, 1, ShadowParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(relationshipEClass, Relationship.class, "Relationship", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRelationship_SurroundingEntity(), theRepositoryPackage.getInterfaceProvidingRequiringEntity(), null, "surroundingEntity", null, 1, 1, Relationship.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getRelationship_SurroundingEntity(), theRepositoryPackage.getInterfaceProvidingRequiringEntity(), theRepositoryPackage.getInterfaceProvidingRequiringEntity_Relationships(), "surroundingEntity", null, 1, 1, Relationship.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getRelationship_Characterization(), this.getRelationshipCharacterizationType(), "characterization", null, 1, 1, Relationship.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getRelationship_ExplicitDescription(), theFunctionsPackage.getExplicitDescription(), null, "explicitDescription", null, 0, 1, Relationship.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/RelationshipImpl.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/RelationshipImpl.java
index 1226738b..1d68483f 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/RelationshipImpl.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/parameterdependencies/impl/RelationshipImpl.java
@@ -11,6 +11,7 @@ import edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relations
 
 import edu.kit.ipd.descartes.mm.applicationlevel.repository.InterfaceProvidingRequiringEntity;
 
+import edu.kit.ipd.descartes.mm.applicationlevel.repository.RepositoryPackage;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
@@ -19,6 +20,7 @@ import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 
 /**
  * <!-- begin-user-doc -->
@@ -36,16 +38,6 @@ import org.eclipse.emf.ecore.impl.EObjectImpl;
  * @generated
  */
 public abstract class RelationshipImpl extends EObjectImpl implements Relationship {
-	/**
-	 * The cached value of the '{@link #getSurroundingEntity() <em>Surrounding Entity</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSurroundingEntity()
-	 * @generated
-	 * @ordered
-	 */
-	protected InterfaceProvidingRequiringEntity surroundingEntity;
-
 	/**
 	 * The default value of the '{@link #getCharacterization() <em>Characterization</em>}' attribute.
 	 * <!-- begin-user-doc -->
@@ -101,15 +93,8 @@ public abstract class RelationshipImpl extends EObjectImpl implements Relationsh
 	 * @generated
 	 */
 	public InterfaceProvidingRequiringEntity getSurroundingEntity() {
-		if (surroundingEntity != null && surroundingEntity.eIsProxy()) {
-			InternalEObject oldSurroundingEntity = (InternalEObject)surroundingEntity;
-			surroundingEntity = (InterfaceProvidingRequiringEntity)eResolveProxy(oldSurroundingEntity);
-			if (surroundingEntity != oldSurroundingEntity) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY, oldSurroundingEntity, surroundingEntity));
-			}
-		}
-		return surroundingEntity;
+		if (eContainerFeatureID() != ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY) return null;
+		return (InterfaceProvidingRequiringEntity)eInternalContainer();
 	}
 
 	/**
@@ -117,8 +102,9 @@ public abstract class RelationshipImpl extends EObjectImpl implements Relationsh
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public InterfaceProvidingRequiringEntity basicGetSurroundingEntity() {
-		return surroundingEntity;
+	public NotificationChain basicSetSurroundingEntity(InterfaceProvidingRequiringEntity newSurroundingEntity, NotificationChain msgs) {
+		msgs = eBasicSetContainer((InternalEObject)newSurroundingEntity, ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY, msgs);
+		return msgs;
 	}
 
 	/**
@@ -127,10 +113,19 @@ public abstract class RelationshipImpl extends EObjectImpl implements Relationsh
 	 * @generated
 	 */
 	public void setSurroundingEntity(InterfaceProvidingRequiringEntity newSurroundingEntity) {
-		InterfaceProvidingRequiringEntity oldSurroundingEntity = surroundingEntity;
-		surroundingEntity = newSurroundingEntity;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY, oldSurroundingEntity, surroundingEntity));
+		if (newSurroundingEntity != eInternalContainer() || (eContainerFeatureID() != ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY && newSurroundingEntity != null)) {
+			if (EcoreUtil.isAncestor(this, newSurroundingEntity))
+				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+			NotificationChain msgs = null;
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (newSurroundingEntity != null)
+				msgs = ((InternalEObject)newSurroundingEntity).eInverseAdd(this, RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS, InterfaceProvidingRequiringEntity.class, msgs);
+			msgs = basicSetSurroundingEntity(newSurroundingEntity, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY, newSurroundingEntity, newSurroundingEntity));
 	}
 
 	/**
@@ -197,6 +192,22 @@ public abstract class RelationshipImpl extends EObjectImpl implements Relationsh
 			eNotify(new ENotificationImpl(this, Notification.SET, ParameterdependenciesPackage.RELATIONSHIP__EXPLICIT_DESCRIPTION, newExplicitDescription, newExplicitDescription));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY:
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return basicSetSurroundingEntity((InterfaceProvidingRequiringEntity)otherEnd, msgs);
+		}
+		return super.eInverseAdd(otherEnd, featureID, msgs);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -205,12 +216,28 @@ public abstract class RelationshipImpl extends EObjectImpl implements Relationsh
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
+			case ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY:
+				return basicSetSurroundingEntity(null, msgs);
 			case ParameterdependenciesPackage.RELATIONSHIP__EXPLICIT_DESCRIPTION:
 				return basicSetExplicitDescription(null, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+		switch (eContainerFeatureID()) {
+			case ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY:
+				return eInternalContainer().eInverseRemove(this, RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS, InterfaceProvidingRequiringEntity.class, msgs);
+		}
+		return super.eBasicRemoveFromContainerFeature(msgs);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -220,8 +247,7 @@ public abstract class RelationshipImpl extends EObjectImpl implements Relationsh
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY:
-				if (resolve) return getSurroundingEntity();
-				return basicGetSurroundingEntity();
+				return getSurroundingEntity();
 			case ParameterdependenciesPackage.RELATIONSHIP__CHARACTERIZATION:
 				return getCharacterization();
 			case ParameterdependenciesPackage.RELATIONSHIP__EXPLICIT_DESCRIPTION:
@@ -281,7 +307,7 @@ public abstract class RelationshipImpl extends EObjectImpl implements Relationsh
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
 			case ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY:
-				return surroundingEntity != null;
+				return getSurroundingEntity() != null;
 			case ParameterdependenciesPackage.RELATIONSHIP__CHARACTERIZATION:
 				return characterization != CHARACTERIZATION_EDEFAULT;
 			case ParameterdependenciesPackage.RELATIONSHIP__EXPLICIT_DESCRIPTION:
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/InterfaceProvidingRequiringEntity.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/InterfaceProvidingRequiringEntity.java
index ee8aa801..8866a930 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/InterfaceProvidingRequiringEntity.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/InterfaceProvidingRequiringEntity.java
@@ -46,17 +46,19 @@ public interface InterfaceProvidingRequiringEntity extends InterfaceProvidingEnt
 	EList<CoarseGrainedBehavior> getCoarseGrainedBehavior();
 
 	/**
-	 * Returns the value of the '<em><b>Relationships</b></em>' reference list.
+	 * Returns the value of the '<em><b>Relationships</b></em>' containment reference list.
 	 * The list contents are of type {@link edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship}.
+	 * It is bidirectional and its opposite is '{@link edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship#getSurroundingEntity <em>Surrounding Entity</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Relationships</em>' reference list isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Relationships</em>' reference list.
+	 * @return the value of the '<em>Relationships</em>' containment reference list.
 	 * @see edu.kit.ipd.descartes.mm.applicationlevel.repository.RepositoryPackage#getInterfaceProvidingRequiringEntity_Relationships()
-	 * @model ordered="false"
+	 * @see edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship#getSurroundingEntity
+	 * @model opposite="surroundingEntity" containment="true" ordered="false"
 	 * @generated
 	 */
 	EList<Relationship> getRelationships();
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/RepositoryPackage.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/RepositoryPackage.java
index 91b1da67..5aa1d65a 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/RepositoryPackage.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/RepositoryPackage.java
@@ -264,7 +264,7 @@ public interface RepositoryPackage extends EPackage {
 	int INTERFACE_PROVIDING_REQUIRING_ENTITY__COARSE_GRAINED_BEHAVIOR = INTERFACE_PROVIDING_ENTITY_FEATURE_COUNT + 1;
 
 	/**
-	 * The feature id for the '<em><b>Relationships</b></em>' reference list.
+	 * The feature id for the '<em><b>Relationships</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -602,7 +602,7 @@ public interface RepositoryPackage extends EPackage {
 	int COMPOSED_PROVIDING_REQUIRING_ENTITY__COARSE_GRAINED_BEHAVIOR = COMPOSED_STRUCTURE_FEATURE_COUNT + 3;
 
 	/**
-	 * The feature id for the '<em><b>Relationships</b></em>' reference list.
+	 * The feature id for the '<em><b>Relationships</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -931,7 +931,7 @@ public interface RepositoryPackage extends EPackage {
 	int REPOSITORY_COMPONENT__COARSE_GRAINED_BEHAVIOR = INTERFACE_PROVIDING_REQUIRING_ENTITY__COARSE_GRAINED_BEHAVIOR;
 
 	/**
-	 * The feature id for the '<em><b>Relationships</b></em>' reference list.
+	 * The feature id for the '<em><b>Relationships</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -1022,7 +1022,7 @@ public interface RepositoryPackage extends EPackage {
 	int BASIC_COMPONENT__COARSE_GRAINED_BEHAVIOR = REPOSITORY_COMPONENT__COARSE_GRAINED_BEHAVIOR;
 
 	/**
-	 * The feature id for the '<em><b>Relationships</b></em>' reference list.
+	 * The feature id for the '<em><b>Relationships</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -1177,7 +1177,7 @@ public interface RepositoryPackage extends EPackage {
 	int COMPOSITE_COMPONENT__COARSE_GRAINED_BEHAVIOR = REPOSITORY_COMPONENT__COARSE_GRAINED_BEHAVIOR;
 
 	/**
-	 * The feature id for the '<em><b>Relationships</b></em>' reference list.
+	 * The feature id for the '<em><b>Relationships</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -1304,7 +1304,7 @@ public interface RepositoryPackage extends EPackage {
 	int SUB_SYSTEM__COARSE_GRAINED_BEHAVIOR = REPOSITORY_COMPONENT__COARSE_GRAINED_BEHAVIOR;
 
 	/**
-	 * The feature id for the '<em><b>Relationships</b></em>' reference list.
+	 * The feature id for the '<em><b>Relationships</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -2058,10 +2058,10 @@ public interface RepositoryPackage extends EPackage {
 	EReference getInterfaceProvidingRequiringEntity_CoarseGrainedBehavior();
 
 	/**
-	 * Returns the meta object for the reference list '{@link edu.kit.ipd.descartes.mm.applicationlevel.repository.InterfaceProvidingRequiringEntity#getRelationships <em>Relationships</em>}'.
+	 * Returns the meta object for the containment reference list '{@link edu.kit.ipd.descartes.mm.applicationlevel.repository.InterfaceProvidingRequiringEntity#getRelationships <em>Relationships</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Relationships</em>'.
+	 * @return the meta object for the containment reference list '<em>Relationships</em>'.
 	 * @see edu.kit.ipd.descartes.mm.applicationlevel.repository.InterfaceProvidingRequiringEntity#getRelationships()
 	 * @see #getInterfaceProvidingRequiringEntity()
 	 * @generated
@@ -2940,7 +2940,7 @@ public interface RepositoryPackage extends EPackage {
 		EReference INTERFACE_PROVIDING_REQUIRING_ENTITY__COARSE_GRAINED_BEHAVIOR = eINSTANCE.getInterfaceProvidingRequiringEntity_CoarseGrainedBehavior();
 
 		/**
-		 * The meta object literal for the '<em><b>Relationships</b></em>' reference list feature.
+		 * The meta object literal for the '<em><b>Relationships</b></em>' containment reference list feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/ComposedProvidingRequiringEntityImpl.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/ComposedProvidingRequiringEntityImpl.java
index e837c80b..d38bf22e 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/ComposedProvidingRequiringEntityImpl.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/ComposedProvidingRequiringEntityImpl.java
@@ -3,6 +3,7 @@
  */
 package edu.kit.ipd.descartes.mm.applicationlevel.repository.impl;
 
+import edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.ParameterdependenciesPackage;
 import edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship;
 
 import edu.kit.ipd.descartes.mm.applicationlevel.repository.ComposedProvidingRequiringEntity;
@@ -89,7 +90,7 @@ public abstract class ComposedProvidingRequiringEntityImpl extends ComposedStruc
 	protected EList<CoarseGrainedBehavior> coarseGrainedBehavior;
 
 	/**
-	 * The cached value of the '{@link #getRelationships() <em>Relationships</em>}' reference list.
+	 * The cached value of the '{@link #getRelationships() <em>Relationships</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getRelationships()
@@ -172,7 +173,7 @@ public abstract class ComposedProvidingRequiringEntityImpl extends ComposedStruc
 	 */
 	public EList<Relationship> getRelationships() {
 		if (relationships == null) {
-			relationships = new EObjectResolvingEList<Relationship>(Relationship.class, this, RepositoryPackage.COMPOSED_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS);
+			relationships = new EObjectContainmentWithInverseEList<Relationship>(Relationship.class, this, RepositoryPackage.COMPOSED_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS, ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY);
 		}
 		return relationships;
 	}
@@ -190,6 +191,8 @@ public abstract class ComposedProvidingRequiringEntityImpl extends ComposedStruc
 				return ((InternalEList<InternalEObject>)(InternalEList<?>)getInterfaceProvidingRoles()).basicAdd(otherEnd, msgs);
 			case RepositoryPackage.COMPOSED_PROVIDING_REQUIRING_ENTITY__INTERFACE_REQUIRING_ROLES:
 				return ((InternalEList<InternalEObject>)(InternalEList<?>)getInterfaceRequiringRoles()).basicAdd(otherEnd, msgs);
+			case RepositoryPackage.COMPOSED_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS:
+				return ((InternalEList<InternalEObject>)(InternalEList<?>)getRelationships()).basicAdd(otherEnd, msgs);
 		}
 		return super.eInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -210,6 +213,8 @@ public abstract class ComposedProvidingRequiringEntityImpl extends ComposedStruc
 				return ((InternalEList<?>)getInterfaceRequiringRoles()).basicRemove(otherEnd, msgs);
 			case RepositoryPackage.COMPOSED_PROVIDING_REQUIRING_ENTITY__COARSE_GRAINED_BEHAVIOR:
 				return ((InternalEList<?>)getCoarseGrainedBehavior()).basicRemove(otherEnd, msgs);
+			case RepositoryPackage.COMPOSED_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS:
+				return ((InternalEList<?>)getRelationships()).basicRemove(otherEnd, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/InterfaceProvidingRequiringEntityImpl.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/InterfaceProvidingRequiringEntityImpl.java
index db134332..6489f3df 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/InterfaceProvidingRequiringEntityImpl.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/InterfaceProvidingRequiringEntityImpl.java
@@ -3,6 +3,7 @@
  */
 package edu.kit.ipd.descartes.mm.applicationlevel.repository.impl;
 
+import edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.ParameterdependenciesPackage;
 import edu.kit.ipd.descartes.mm.applicationlevel.parameterdependencies.Relationship;
 
 import edu.kit.ipd.descartes.mm.applicationlevel.repository.InterfaceProvidingRequiringEntity;
@@ -63,7 +64,7 @@ public abstract class InterfaceProvidingRequiringEntityImpl extends InterfacePro
 	protected EList<CoarseGrainedBehavior> coarseGrainedBehavior;
 
 	/**
-	 * The cached value of the '{@link #getRelationships() <em>Relationships</em>}' reference list.
+	 * The cached value of the '{@link #getRelationships() <em>Relationships</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getRelationships()
@@ -122,7 +123,7 @@ public abstract class InterfaceProvidingRequiringEntityImpl extends InterfacePro
 	 */
 	public EList<Relationship> getRelationships() {
 		if (relationships == null) {
-			relationships = new EObjectResolvingEList<Relationship>(Relationship.class, this, RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS);
+			relationships = new EObjectContainmentWithInverseEList<Relationship>(Relationship.class, this, RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS, ParameterdependenciesPackage.RELATIONSHIP__SURROUNDING_ENTITY);
 		}
 		return relationships;
 	}
@@ -138,6 +139,8 @@ public abstract class InterfaceProvidingRequiringEntityImpl extends InterfacePro
 		switch (featureID) {
 			case RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__INTERFACE_REQUIRING_ROLES:
 				return ((InternalEList<InternalEObject>)(InternalEList<?>)getInterfaceRequiringRoles()).basicAdd(otherEnd, msgs);
+			case RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS:
+				return ((InternalEList<InternalEObject>)(InternalEList<?>)getRelationships()).basicAdd(otherEnd, msgs);
 		}
 		return super.eInverseAdd(otherEnd, featureID, msgs);
 	}
@@ -154,6 +157,8 @@ public abstract class InterfaceProvidingRequiringEntityImpl extends InterfacePro
 				return ((InternalEList<?>)getInterfaceRequiringRoles()).basicRemove(otherEnd, msgs);
 			case RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__COARSE_GRAINED_BEHAVIOR:
 				return ((InternalEList<?>)getCoarseGrainedBehavior()).basicRemove(otherEnd, msgs);
+			case RepositoryPackage.INTERFACE_PROVIDING_REQUIRING_ENTITY__RELATIONSHIPS:
+				return ((InternalEList<?>)getRelationships()).basicRemove(otherEnd, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
diff --git a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/RepositoryPackageImpl.java b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/RepositoryPackageImpl.java
index f7f1329b..05d54263 100644
--- a/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/RepositoryPackageImpl.java
+++ b/edu.kit.ipd.descartes.mm.applicationlevel/src/edu/kit/ipd/descartes/mm/applicationlevel/repository/impl/RepositoryPackageImpl.java
@@ -1329,7 +1329,7 @@ public class RepositoryPackageImpl extends EPackageImpl implements RepositoryPac
 
 		initEClass(interfaceProvidingRequiringEntityEClass, InterfaceProvidingRequiringEntity.class, "InterfaceProvidingRequiringEntity", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getInterfaceProvidingRequiringEntity_CoarseGrainedBehavior(), theServicebehaviorPackage.getCoarseGrainedBehavior(), null, "coarseGrainedBehavior", null, 0, -1, InterfaceProvidingRequiringEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
-		initEReference(getInterfaceProvidingRequiringEntity_Relationships(), theParameterdependenciesPackage.getRelationship(), null, "relationships", null, 0, -1, InterfaceProvidingRequiringEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
+		initEReference(getInterfaceProvidingRequiringEntity_Relationships(), theParameterdependenciesPackage.getRelationship(), theParameterdependenciesPackage.getRelationship_SurroundingEntity(), "relationships", null, 0, -1, InterfaceProvidingRequiringEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
 
 		initEClass(importEClass, Import.class, "Import", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getImport_ImportURI(), ecorePackage.getEString(), "importURI", null, 0, 1, Import.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-- 
GitLab