From 5dc180cd314984ea7be3c6efcb4db6e2888d65da Mon Sep 17 00:00:00 2001
From: Stefan Herrnleben <s.herrnleben@syslex.de>
Date: Mon, 7 Aug 2017 23:47:01 +0200
Subject: [PATCH] let adaptable dependency and adaptable variable implement
 identifier

---
 .../model/DNIMM3AP.xcore                      |   4 +-
 .../dni/dnimm3ap/AdaptableDependency.java     |   3 +-
 .../dni/dnimm3ap/AdaptableVariable.java       |   3 +-
 .../descartes/dni/dnimm3ap/DNIAPPackage.java  |  44 ++++-
 .../impl/AdaptableDependencyImpl.java         | 166 ++++++++++++++++++
 .../dnimm3ap/impl/AdaptableVariableImpl.java  | 166 ++++++++++++++++++
 .../dni/dnimm3ap/impl/DNIAPPackageImpl.java   |   2 +
 .../AdaptableDependencyItemProvider.java      |  58 +++++-
 .../AdaptableVariableItemProvider.java        |  58 +++++-
 .../dni/dnimm3ap/util/DNIAPSwitch.java        |   2 +
 10 files changed, 496 insertions(+), 10 deletions(-)

diff --git a/tools.descartes.dni.adaptation/model/DNIMM3AP.xcore b/tools.descartes.dni.adaptation/model/DNIMM3AP.xcore
index 68fa2fb0..e6bbf485 100644
--- a/tools.descartes.dni.adaptation/model/DNIMM3AP.xcore
+++ b/tools.descartes.dni.adaptation/model/DNIMM3AP.xcore
@@ -162,7 +162,7 @@ class AlternativeDependencySet extends AlternativeDependency {
 	contains AdaptableDependency[] alternative
 }
 
-class AdaptableDependency extends ICostable {
+class AdaptableDependency extends ICostable, tools.descartes.dni.dnimm3.Identifier {
 	contains tools.descartes.dni.dnimm3.Dependency[1] parameter
 }
 
@@ -173,7 +173,7 @@ class AlternativeVariableSet extends AlternativeVariable {
 	contains AdaptableVariable[] alternative
 }
 
-class AdaptableVariable extends ICostable {
+class AdaptableVariable extends ICostable, tools.descartes.dni.dnimm3.Identifier {
 	contains tools.descartes.dni.dnimm3.Variable[1] parameter
 }
 
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableDependency.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableDependency.java
index c78ea0f0..da97ca18 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableDependency.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableDependency.java
@@ -3,6 +3,7 @@
 package tools.descartes.dni.dnimm3ap;
 
 import tools.descartes.dni.dnimm3.Dependency;
+import tools.descartes.dni.dnimm3.Identifier;
 
 /**
  * <!-- begin-user-doc -->
@@ -20,7 +21,7 @@ import tools.descartes.dni.dnimm3.Dependency;
  * @model
  * @generated
  */
-public interface AdaptableDependency extends ICostable {
+public interface AdaptableDependency extends ICostable, Identifier {
 	/**
 	 * Returns the value of the '<em><b>Parameter</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableVariable.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableVariable.java
index 222be734..8bf48271 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableVariable.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/AdaptableVariable.java
@@ -2,6 +2,7 @@
  */
 package tools.descartes.dni.dnimm3ap;
 
+import tools.descartes.dni.dnimm3.Identifier;
 import tools.descartes.dni.dnimm3.Variable;
 
 /**
@@ -20,7 +21,7 @@ import tools.descartes.dni.dnimm3.Variable;
  * @model
  * @generated
  */
-public interface AdaptableVariable extends ICostable {
+public interface AdaptableVariable extends ICostable, Identifier {
 	/**
 	 * Returns the value of the '<em><b>Parameter</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/DNIAPPackage.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/DNIAPPackage.java
index 3c088a27..5f6ecd01 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/DNIAPPackage.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/DNIAPPackage.java
@@ -1276,6 +1276,24 @@ public interface DNIAPPackage extends EPackage {
 	 */
 	int ADAPTABLE_DEPENDENCY__COST = ICOSTABLE__COST;
 
+	/**
+	 * The feature id for the '<em><b>Uid</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ADAPTABLE_DEPENDENCY__UID = ICOSTABLE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Uid generated</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ADAPTABLE_DEPENDENCY__UID_GENERATED = ICOSTABLE_FEATURE_COUNT + 1;
+
 	/**
 	 * The feature id for the '<em><b>Parameter</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
@@ -1283,7 +1301,7 @@ public interface DNIAPPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int ADAPTABLE_DEPENDENCY__PARAMETER = ICOSTABLE_FEATURE_COUNT + 0;
+	int ADAPTABLE_DEPENDENCY__PARAMETER = ICOSTABLE_FEATURE_COUNT + 2;
 
 	/**
 	 * The number of structural features of the '<em>Adaptable Dependency</em>' class.
@@ -1292,7 +1310,7 @@ public interface DNIAPPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int ADAPTABLE_DEPENDENCY_FEATURE_COUNT = ICOSTABLE_FEATURE_COUNT + 1;
+	int ADAPTABLE_DEPENDENCY_FEATURE_COUNT = ICOSTABLE_FEATURE_COUNT + 3;
 
 	/**
 	 * The number of operations of the '<em>Adaptable Dependency</em>' class.
@@ -1387,6 +1405,24 @@ public interface DNIAPPackage extends EPackage {
 	 */
 	int ADAPTABLE_VARIABLE__COST = ICOSTABLE__COST;
 
+	/**
+	 * The feature id for the '<em><b>Uid</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ADAPTABLE_VARIABLE__UID = ICOSTABLE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Uid generated</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ADAPTABLE_VARIABLE__UID_GENERATED = ICOSTABLE_FEATURE_COUNT + 1;
+
 	/**
 	 * The feature id for the '<em><b>Parameter</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
@@ -1394,7 +1430,7 @@ public interface DNIAPPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int ADAPTABLE_VARIABLE__PARAMETER = ICOSTABLE_FEATURE_COUNT + 0;
+	int ADAPTABLE_VARIABLE__PARAMETER = ICOSTABLE_FEATURE_COUNT + 2;
 
 	/**
 	 * The number of structural features of the '<em>Adaptable Variable</em>' class.
@@ -1403,7 +1439,7 @@ public interface DNIAPPackage extends EPackage {
 	 * @generated
 	 * @ordered
 	 */
-	int ADAPTABLE_VARIABLE_FEATURE_COUNT = ICOSTABLE_FEATURE_COUNT + 1;
+	int ADAPTABLE_VARIABLE_FEATURE_COUNT = ICOSTABLE_FEATURE_COUNT + 3;
 
 	/**
 	 * The number of operations of the '<em>Adaptable Variable</em>' class.
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableDependencyImpl.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableDependencyImpl.java
index 8ad9b606..38977fac 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableDependencyImpl.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableDependencyImpl.java
@@ -17,10 +17,13 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import tools.descartes.dni.dnimm3.DNIPackage;
 import tools.descartes.dni.dnimm3.Dependency;
 
+import tools.descartes.dni.dnimm3.Identifier;
 import tools.descartes.dni.dnimm3ap.AdaptableDependency;
 import tools.descartes.dni.dnimm3ap.Cost;
 import tools.descartes.dni.dnimm3ap.DNIAPPackage;
@@ -34,6 +37,8 @@ import tools.descartes.dni.dnimm3ap.DNIAPPackage;
  * </p>
  * <ul>
  *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableDependencyImpl#getCost <em>Cost</em>}</li>
+ *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableDependencyImpl#getUid <em>Uid</em>}</li>
+ *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableDependencyImpl#getUid_generated <em>Uid generated</em>}</li>
  *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableDependencyImpl#getParameter <em>Parameter</em>}</li>
  * </ul>
  *
@@ -50,6 +55,45 @@ public class AdaptableDependencyImpl extends MinimalEObjectImpl.Container implem
 	 */
 	protected EList<Cost> cost;
 
+	/**
+	 * The default value of the '{@link #getUid() <em>Uid</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUid()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String UID_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getUid() <em>Uid</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUid()
+	 * @generated
+	 * @ordered
+	 */
+	protected String uid = UID_EDEFAULT;
+
+	/**
+	 * This is true if the Uid attribute has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean uidESet;
+
+	/**
+	 * The default value of the '{@link #getUid_generated() <em>Uid generated</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUid_generated()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String UID_GENERATED_EDEFAULT = null;
+
 	/**
 	 * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference.
 	 * <!-- begin-user-doc -->
@@ -91,6 +135,64 @@ public class AdaptableDependencyImpl extends MinimalEObjectImpl.Container implem
 		return cost;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getUid() {
+		return uid;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUid(String newUid) {
+		String oldUid = uid;
+		uid = newUid;
+		boolean oldUidESet = uidESet;
+		uidESet = true;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DNIAPPackage.ADAPTABLE_DEPENDENCY__UID, oldUid, uid, !oldUidESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetUid() {
+		String oldUid = uid;
+		boolean oldUidESet = uidESet;
+		uid = UID_EDEFAULT;
+		uidESet = false;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.UNSET, DNIAPPackage.ADAPTABLE_DEPENDENCY__UID, oldUid, UID_EDEFAULT, oldUidESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetUid() {
+		return uidESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getUid_generated() {
+		if (((this.getUid() == null) || this.getUid().isEmpty())) {
+			this.setUid(EcoreUtil.generateUUID().toString());
+		}
+		return this.getUid();
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -160,6 +262,10 @@ public class AdaptableDependencyImpl extends MinimalEObjectImpl.Container implem
 		switch (featureID) {
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__COST:
 				return getCost();
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID:
+				return getUid();
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID_GENERATED:
+				return getUid_generated();
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__PARAMETER:
 				return getParameter();
 		}
@@ -179,6 +285,9 @@ public class AdaptableDependencyImpl extends MinimalEObjectImpl.Container implem
 				getCost().clear();
 				getCost().addAll((Collection<? extends Cost>)newValue);
 				return;
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID:
+				setUid((String)newValue);
+				return;
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__PARAMETER:
 				setParameter((Dependency)newValue);
 				return;
@@ -197,6 +306,9 @@ public class AdaptableDependencyImpl extends MinimalEObjectImpl.Container implem
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__COST:
 				getCost().clear();
 				return;
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID:
+				unsetUid();
+				return;
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__PARAMETER:
 				setParameter((Dependency)null);
 				return;
@@ -214,10 +326,64 @@ public class AdaptableDependencyImpl extends MinimalEObjectImpl.Container implem
 		switch (featureID) {
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__COST:
 				return cost != null && !cost.isEmpty();
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID:
+				return isSetUid();
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID_GENERATED:
+				return UID_GENERATED_EDEFAULT == null ? getUid_generated() != null : !UID_GENERATED_EDEFAULT.equals(getUid_generated());
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__PARAMETER:
 				return parameter != null;
 		}
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+		if (baseClass == Identifier.class) {
+			switch (derivedFeatureID) {
+				case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID: return DNIPackage.IDENTIFIER__UID;
+				case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID_GENERATED: return DNIPackage.IDENTIFIER__UID_GENERATED;
+				default: return -1;
+			}
+		}
+		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+		if (baseClass == Identifier.class) {
+			switch (baseFeatureID) {
+				case DNIPackage.IDENTIFIER__UID: return DNIAPPackage.ADAPTABLE_DEPENDENCY__UID;
+				case DNIPackage.IDENTIFIER__UID_GENERATED: return DNIAPPackage.ADAPTABLE_DEPENDENCY__UID_GENERATED;
+				default: return -1;
+			}
+		}
+		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (uid: ");
+		if (uidESet) result.append(uid); else result.append("<unset>");
+		result.append(')');
+		return result.toString();
+	}
+
 } //AdaptableDependencyImpl
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableVariableImpl.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableVariableImpl.java
index e79b96eb..b2b71582 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableVariableImpl.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/AdaptableVariableImpl.java
@@ -17,8 +17,11 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import tools.descartes.dni.dnimm3.DNIPackage;
+import tools.descartes.dni.dnimm3.Identifier;
 import tools.descartes.dni.dnimm3.Variable;
 
 import tools.descartes.dni.dnimm3ap.AdaptableVariable;
@@ -34,6 +37,8 @@ import tools.descartes.dni.dnimm3ap.DNIAPPackage;
  * </p>
  * <ul>
  *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableVariableImpl#getCost <em>Cost</em>}</li>
+ *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableVariableImpl#getUid <em>Uid</em>}</li>
+ *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableVariableImpl#getUid_generated <em>Uid generated</em>}</li>
  *   <li>{@link tools.descartes.dni.dnimm3ap.impl.AdaptableVariableImpl#getParameter <em>Parameter</em>}</li>
  * </ul>
  *
@@ -50,6 +55,45 @@ public class AdaptableVariableImpl extends MinimalEObjectImpl.Container implemen
 	 */
 	protected EList<Cost> cost;
 
+	/**
+	 * The default value of the '{@link #getUid() <em>Uid</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUid()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String UID_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getUid() <em>Uid</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUid()
+	 * @generated
+	 * @ordered
+	 */
+	protected String uid = UID_EDEFAULT;
+
+	/**
+	 * This is true if the Uid attribute has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean uidESet;
+
+	/**
+	 * The default value of the '{@link #getUid_generated() <em>Uid generated</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUid_generated()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String UID_GENERATED_EDEFAULT = null;
+
 	/**
 	 * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference.
 	 * <!-- begin-user-doc -->
@@ -91,6 +135,64 @@ public class AdaptableVariableImpl extends MinimalEObjectImpl.Container implemen
 		return cost;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getUid() {
+		return uid;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUid(String newUid) {
+		String oldUid = uid;
+		uid = newUid;
+		boolean oldUidESet = uidESet;
+		uidESet = true;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DNIAPPackage.ADAPTABLE_VARIABLE__UID, oldUid, uid, !oldUidESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetUid() {
+		String oldUid = uid;
+		boolean oldUidESet = uidESet;
+		uid = UID_EDEFAULT;
+		uidESet = false;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.UNSET, DNIAPPackage.ADAPTABLE_VARIABLE__UID, oldUid, UID_EDEFAULT, oldUidESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetUid() {
+		return uidESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getUid_generated() {
+		if (((this.getUid() == null) || this.getUid().isEmpty())) {
+			this.setUid(EcoreUtil.generateUUID().toString());
+		}
+		return this.getUid();
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -160,6 +262,10 @@ public class AdaptableVariableImpl extends MinimalEObjectImpl.Container implemen
 		switch (featureID) {
 			case DNIAPPackage.ADAPTABLE_VARIABLE__COST:
 				return getCost();
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID:
+				return getUid();
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID_GENERATED:
+				return getUid_generated();
 			case DNIAPPackage.ADAPTABLE_VARIABLE__PARAMETER:
 				return getParameter();
 		}
@@ -179,6 +285,9 @@ public class AdaptableVariableImpl extends MinimalEObjectImpl.Container implemen
 				getCost().clear();
 				getCost().addAll((Collection<? extends Cost>)newValue);
 				return;
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID:
+				setUid((String)newValue);
+				return;
 			case DNIAPPackage.ADAPTABLE_VARIABLE__PARAMETER:
 				setParameter((Variable)newValue);
 				return;
@@ -197,6 +306,9 @@ public class AdaptableVariableImpl extends MinimalEObjectImpl.Container implemen
 			case DNIAPPackage.ADAPTABLE_VARIABLE__COST:
 				getCost().clear();
 				return;
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID:
+				unsetUid();
+				return;
 			case DNIAPPackage.ADAPTABLE_VARIABLE__PARAMETER:
 				setParameter((Variable)null);
 				return;
@@ -214,10 +326,64 @@ public class AdaptableVariableImpl extends MinimalEObjectImpl.Container implemen
 		switch (featureID) {
 			case DNIAPPackage.ADAPTABLE_VARIABLE__COST:
 				return cost != null && !cost.isEmpty();
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID:
+				return isSetUid();
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID_GENERATED:
+				return UID_GENERATED_EDEFAULT == null ? getUid_generated() != null : !UID_GENERATED_EDEFAULT.equals(getUid_generated());
 			case DNIAPPackage.ADAPTABLE_VARIABLE__PARAMETER:
 				return parameter != null;
 		}
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+		if (baseClass == Identifier.class) {
+			switch (derivedFeatureID) {
+				case DNIAPPackage.ADAPTABLE_VARIABLE__UID: return DNIPackage.IDENTIFIER__UID;
+				case DNIAPPackage.ADAPTABLE_VARIABLE__UID_GENERATED: return DNIPackage.IDENTIFIER__UID_GENERATED;
+				default: return -1;
+			}
+		}
+		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+		if (baseClass == Identifier.class) {
+			switch (baseFeatureID) {
+				case DNIPackage.IDENTIFIER__UID: return DNIAPPackage.ADAPTABLE_VARIABLE__UID;
+				case DNIPackage.IDENTIFIER__UID_GENERATED: return DNIAPPackage.ADAPTABLE_VARIABLE__UID_GENERATED;
+				default: return -1;
+			}
+		}
+		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (uid: ");
+		if (uidESet) result.append(uid); else result.append("<unset>");
+		result.append(')');
+		return result.toString();
+	}
+
 } //AdaptableVariableImpl
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/DNIAPPackageImpl.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/DNIAPPackageImpl.java
index b520acd1..6b257f91 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/DNIAPPackageImpl.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/impl/DNIAPPackageImpl.java
@@ -1228,8 +1228,10 @@ public class DNIAPPackageImpl extends EPackageImpl implements DNIAPPackage {
 		linkAdaptationGroupEClass.getESuperTypes().add(this.getIAdaptationGroup());
 		alternativeDependencySetEClass.getESuperTypes().add(this.getAlternativeDependency());
 		adaptableDependencyEClass.getESuperTypes().add(this.getICostable());
+		adaptableDependencyEClass.getESuperTypes().add(theDNIPackage.getIdentifier());
 		alternativeVariableSetEClass.getESuperTypes().add(this.getAlternativeVariable());
 		adaptableVariableEClass.getESuperTypes().add(this.getICostable());
+		adaptableVariableEClass.getESuperTypes().add(theDNIPackage.getIdentifier());
 		investmentEClass.getESuperTypes().add(this.getCost());
 		handlingTimeEClass.getESuperTypes().add(this.getCost());
 		fixedCostFunctionEClass.getESuperTypes().add(this.getICostFunction());
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableDependencyItemProvider.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableDependencyItemProvider.java
index 8f091176..dab142f3 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableDependencyItemProvider.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableDependencyItemProvider.java
@@ -13,17 +13,20 @@ import org.eclipse.emf.common.util.ResourceLocator;
 
 import org.eclipse.emf.ecore.EStructuralFeature;
 
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
 import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
 import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.IItemPropertySource;
 import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
 import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
 import tools.descartes.dni.dnimm3.DNIFactory;
 
+import tools.descartes.dni.dnimm3.DNIPackage;
 import tools.descartes.dni.dnimm3ap.AdaptableDependency;
 import tools.descartes.dni.dnimm3ap.DNIAPFactory;
 import tools.descartes.dni.dnimm3ap.DNIAPPackage;
@@ -63,10 +66,56 @@ public class AdaptableDependencyItemProvider
 		if (itemPropertyDescriptors == null) {
 			super.getPropertyDescriptors(object);
 
+			addUidPropertyDescriptor(object);
+			addUid_generatedPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
 
+	/**
+	 * This adds a property descriptor for the Uid feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUidPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_Identifier_uid_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_Identifier_uid_feature", "_UI_Identifier_type"),
+				 DNIPackage.Literals.IDENTIFIER__UID,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Uid generated feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUid_generatedPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_Identifier_uid_generated_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_Identifier_uid_generated_feature", "_UI_Identifier_type"),
+				 DNIPackage.Literals.IDENTIFIER__UID_GENERATED,
+				 false,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
 	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
@@ -117,7 +166,10 @@ public class AdaptableDependencyItemProvider
 	 */
 	@Override
 	public String getText(Object object) {
-		return getString("_UI_AdaptableDependency_type");
+		String label = ((AdaptableDependency)object).getUid();
+		return label == null || label.length() == 0 ?
+			getString("_UI_AdaptableDependency_type") :
+			getString("_UI_AdaptableDependency_type") + " " + label;
 	}
 	
 
@@ -133,6 +185,10 @@ public class AdaptableDependencyItemProvider
 		updateChildren(notification);
 
 		switch (notification.getFeatureID(AdaptableDependency.class)) {
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID:
+			case DNIAPPackage.ADAPTABLE_DEPENDENCY__UID_GENERATED:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__COST:
 			case DNIAPPackage.ADAPTABLE_DEPENDENCY__PARAMETER:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableVariableItemProvider.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableVariableItemProvider.java
index d8c91cbe..0f044a93 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableVariableItemProvider.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/provider/AdaptableVariableItemProvider.java
@@ -13,17 +13,20 @@ import org.eclipse.emf.common.util.ResourceLocator;
 
 import org.eclipse.emf.ecore.EStructuralFeature;
 
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
 import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
 import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.IItemPropertySource;
 import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
 import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
 import tools.descartes.dni.dnimm3.DNIFactory;
 
+import tools.descartes.dni.dnimm3.DNIPackage;
 import tools.descartes.dni.dnimm3ap.AdaptableVariable;
 import tools.descartes.dni.dnimm3ap.DNIAPFactory;
 import tools.descartes.dni.dnimm3ap.DNIAPPackage;
@@ -63,10 +66,56 @@ public class AdaptableVariableItemProvider
 		if (itemPropertyDescriptors == null) {
 			super.getPropertyDescriptors(object);
 
+			addUidPropertyDescriptor(object);
+			addUid_generatedPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
 
+	/**
+	 * This adds a property descriptor for the Uid feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUidPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_Identifier_uid_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_Identifier_uid_feature", "_UI_Identifier_type"),
+				 DNIPackage.Literals.IDENTIFIER__UID,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Uid generated feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUid_generatedPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_Identifier_uid_generated_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_Identifier_uid_generated_feature", "_UI_Identifier_type"),
+				 DNIPackage.Literals.IDENTIFIER__UID_GENERATED,
+				 false,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
 	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
@@ -117,7 +166,10 @@ public class AdaptableVariableItemProvider
 	 */
 	@Override
 	public String getText(Object object) {
-		return getString("_UI_AdaptableVariable_type");
+		String label = ((AdaptableVariable)object).getUid();
+		return label == null || label.length() == 0 ?
+			getString("_UI_AdaptableVariable_type") :
+			getString("_UI_AdaptableVariable_type") + " " + label;
 	}
 	
 
@@ -133,6 +185,10 @@ public class AdaptableVariableItemProvider
 		updateChildren(notification);
 
 		switch (notification.getFeatureID(AdaptableVariable.class)) {
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID:
+			case DNIAPPackage.ADAPTABLE_VARIABLE__UID_GENERATED:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
 			case DNIAPPackage.ADAPTABLE_VARIABLE__COST:
 			case DNIAPPackage.ADAPTABLE_VARIABLE__PARAMETER:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
diff --git a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/util/DNIAPSwitch.java b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/util/DNIAPSwitch.java
index d014dde1..81a94bac 100644
--- a/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/util/DNIAPSwitch.java
+++ b/tools.descartes.dni.adaptation/src/tools/descartes/dni/dnimm3ap/util/DNIAPSwitch.java
@@ -210,6 +210,7 @@ public class DNIAPSwitch<T1> extends Switch<T1> {
 				AdaptableDependency adaptableDependency = (AdaptableDependency)theEObject;
 				T1 result = caseAdaptableDependency(adaptableDependency);
 				if (result == null) result = caseICostable(adaptableDependency);
+				if (result == null) result = caseIdentifier(adaptableDependency);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
@@ -230,6 +231,7 @@ public class DNIAPSwitch<T1> extends Switch<T1> {
 				AdaptableVariable adaptableVariable = (AdaptableVariable)theEObject;
 				T1 result = caseAdaptableVariable(adaptableVariable);
 				if (result == null) result = caseICostable(adaptableVariable);
+				if (result == null) result = caseIdentifier(adaptableVariable);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-- 
GitLab