From 69d3bab540eda6247db893872637f8d4e1caa948 Mon Sep 17 00:00:00 2001
From: Dominique Marcadet <Dominique.Marcadet@centralesupelec.fr>
Date: Thu, 14 Feb 2019 10:44:35 +0100
Subject: [PATCH] a BasicType may be referred by several DataAttribute

---
 .../model/nsd.ecore                           |   4 +-
 .../riseclipse/iec61850/nsd/BasicType.java    |  30 ++---
 .../riseclipse/iec61850/nsd/NsdPackage.java   |   8 +-
 .../iec61850/nsd/impl/BasicTypeImpl.java      | 122 +++---------------
 .../iec61850/nsd/impl/NsdPackageImpl.java     |   2 +-
 5 files changed, 37 insertions(+), 129 deletions(-)

diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/model/nsd.ecore b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/model/nsd.ecore
index eb32c37..6383757 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/model/nsd.ecore
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/model/nsd.ecore
@@ -401,8 +401,8 @@
         eType="#//BasicTypes" transient="true" unsettable="true" resolveProxies="false"
         eOpposite="#//BasicTypes/basicType"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="referredByDataAttribute"
-        ordered="false" eType="#//DataAttribute" transient="true" unsettable="true"
-        resolveProxies="false" eOpposite="#//DataAttribute/refersToBasicType"/>
+        ordered="false" upperBound="-1" eType="#//DataAttribute" transient="true"
+        unsettable="true" resolveProxies="false" eOpposite="#//DataAttribute/refersToBasicType"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="BasicTypes" eSuperTypes="#//NsdObject">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/BasicType.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/BasicType.java
index 8826039..3be1c8b 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/BasicType.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/BasicType.java
@@ -19,6 +19,8 @@
  */
 package fr.centralesupelec.edf.riseclipse.iec61850.nsd;
 
+import org.eclipse.emf.common.util.EList;
+
 /**
  * <!-- begin-user-doc -->
  * A representation of the model object '<em><b>Basic Type</b></em>'.
@@ -170,7 +172,8 @@ public interface BasicType extends NsdObject {
     void setBasicTypes( BasicTypes value );
 
     /**
-     * Returns the value of the '<em><b>Referred By Data Attribute</b></em>' reference.
+     * Returns the value of the '<em><b>Referred By Data Attribute</b></em>' reference list.
+     * The list contents are of type {@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute}.
      * It is bidirectional and its opposite is '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute#getRefersToBasicType <em>Refers To Basic Type</em>}'.
      * <!-- begin-user-doc -->
      * <p>
@@ -178,48 +181,33 @@ public interface BasicType extends NsdObject {
      * there really should be more of a description here...
      * </p>
      * <!-- end-user-doc -->
-     * @return the value of the '<em>Referred By Data Attribute</em>' reference.
+     * @return the value of the '<em>Referred By Data Attribute</em>' reference list.
      * @see #isSetReferredByDataAttribute()
      * @see #unsetReferredByDataAttribute()
-     * @see #setReferredByDataAttribute(DataAttribute)
      * @see fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage#getBasicType_ReferredByDataAttribute()
      * @see fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute#getRefersToBasicType
      * @model opposite="refersToBasicType" resolveProxies="false" unsettable="true" transient="true" ordered="false"
      * @generated
      */
-    DataAttribute getReferredByDataAttribute();
-
-    /**
-     * Sets the value of the '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute <em>Referred By Data Attribute</em>}' reference.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @param value the new value of the '<em>Referred By Data Attribute</em>' reference.
-     * @see #isSetReferredByDataAttribute()
-     * @see #unsetReferredByDataAttribute()
-     * @see #getReferredByDataAttribute()
-     * @generated
-     */
-    void setReferredByDataAttribute( DataAttribute value );
+    EList< DataAttribute > getReferredByDataAttribute();
 
     /**
-     * Unsets the value of the '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute <em>Referred By Data Attribute</em>}' reference.
+     * Unsets the value of the '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute <em>Referred By Data Attribute</em>}' reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @see #isSetReferredByDataAttribute()
      * @see #getReferredByDataAttribute()
-     * @see #setReferredByDataAttribute(DataAttribute)
      * @generated
      */
     void unsetReferredByDataAttribute();
 
     /**
-     * Returns whether the value of the '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute <em>Referred By Data Attribute</em>}' reference is set.
+     * Returns whether the value of the '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute <em>Referred By Data Attribute</em>}' reference list is set.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @return whether the value of the '<em>Referred By Data Attribute</em>' reference is set.
+     * @return whether the value of the '<em>Referred By Data Attribute</em>' reference list is set.
      * @see #unsetReferredByDataAttribute()
      * @see #getReferredByDataAttribute()
-     * @see #setReferredByDataAttribute(DataAttribute)
      * @generated
      */
     boolean isSetReferredByDataAttribute();
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/NsdPackage.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/NsdPackage.java
index c365085..26c4194 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/NsdPackage.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/NsdPackage.java
@@ -1906,7 +1906,7 @@ public interface NsdPackage extends EPackage {
     int BASIC_TYPE__BASIC_TYPES = NSD_OBJECT_FEATURE_COUNT + 2;
 
     /**
-     * The feature id for the '<em><b>Referred By Data Attribute</b></em>' reference.
+     * The feature id for the '<em><b>Referred By Data Attribute</b></em>' reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @generated
@@ -7273,10 +7273,10 @@ public interface NsdPackage extends EPackage {
     EReference getBasicType_BasicTypes();
 
     /**
-     * Returns the meta object for the reference '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute <em>Referred By Data Attribute</em>}'.
+     * Returns the meta object for the reference list '{@link fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute <em>Referred By Data Attribute</em>}'.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @return the meta object for the reference '<em>Referred By Data Attribute</em>'.
+     * @return the meta object for the reference list '<em>Referred By Data Attribute</em>'.
      * @see fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType#getReferredByDataAttribute()
      * @see #getBasicType()
      * @generated
@@ -10470,7 +10470,7 @@ public interface NsdPackage extends EPackage {
         EReference BASIC_TYPE__BASIC_TYPES = eINSTANCE.getBasicType_BasicTypes();
 
         /**
-         * The meta object literal for the '<em><b>Referred By Data Attribute</b></em>' reference feature.
+         * The meta object literal for the '<em><b>Referred By Data Attribute</b></em>' reference list feature.
          * <!-- begin-user-doc -->
          * <!-- end-user-doc -->
          * @generated
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/BasicTypeImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/BasicTypeImpl.java
index 0eef17f..f282cdd 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/BasicTypeImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/BasicTypeImpl.java
@@ -24,14 +24,18 @@ import fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicTypes;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
 
+import java.util.Collection;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectWithInverseEList;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
 
 /**
  * <!-- begin-user-doc -->
@@ -109,23 +113,14 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
     protected boolean nameESet;
 
     /**
-     * The cached value of the '{@link #getReferredByDataAttribute() <em>Referred By Data Attribute</em>}' reference.
+     * The cached value of the '{@link #getReferredByDataAttribute() <em>Referred By Data Attribute</em>}' reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @see #getReferredByDataAttribute()
      * @generated
      * @ordered
      */
-    protected DataAttribute referredByDataAttribute;
-
-    /**
-     * This is true if the Referred By Data Attribute reference has been set.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     * @ordered
-     */
-    protected boolean referredByDataAttributeESet;
+    protected EList< DataAttribute > referredByDataAttribute;
 
     /**
      * <!-- begin-user-doc -->
@@ -295,78 +290,13 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
      * @generated
      */
     @Override
-    public DataAttribute getReferredByDataAttribute() {
-        return referredByDataAttribute;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicSetReferredByDataAttribute( DataAttribute newReferredByDataAttribute,
-            NotificationChain msgs ) {
-        DataAttribute oldReferredByDataAttribute = referredByDataAttribute;
-        referredByDataAttribute = newReferredByDataAttribute;
-        boolean oldReferredByDataAttributeESet = referredByDataAttributeESet;
-        referredByDataAttributeESet = true;
-        if( eNotificationRequired() ) {
-            ENotificationImpl notification = new ENotificationImpl( this, Notification.SET,
-                    NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE, oldReferredByDataAttribute,
-                    newReferredByDataAttribute, !oldReferredByDataAttributeESet );
-            if( msgs == null )
-                msgs = notification;
-            else
-                msgs.add( notification );
-        }
-        return msgs;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void setReferredByDataAttribute( DataAttribute newReferredByDataAttribute ) {
-        if( newReferredByDataAttribute != referredByDataAttribute ) {
-            NotificationChain msgs = null;
-            if( referredByDataAttribute != null ) msgs = ( ( InternalEObject ) referredByDataAttribute )
-                    .eInverseRemove( this, NsdPackage.DATA_ATTRIBUTE__REFERS_TO_BASIC_TYPE, DataAttribute.class, msgs );
-            if( newReferredByDataAttribute != null ) msgs = ( ( InternalEObject ) newReferredByDataAttribute )
-                    .eInverseAdd( this, NsdPackage.DATA_ATTRIBUTE__REFERS_TO_BASIC_TYPE, DataAttribute.class, msgs );
-            msgs = basicSetReferredByDataAttribute( newReferredByDataAttribute, msgs );
-            if( msgs != null ) msgs.dispatch();
+    public EList< DataAttribute > getReferredByDataAttribute() {
+        if( referredByDataAttribute == null ) {
+            referredByDataAttribute = new EObjectWithInverseEList.Unsettable< DataAttribute >( DataAttribute.class,
+                    this, NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE,
+                    NsdPackage.DATA_ATTRIBUTE__REFERS_TO_BASIC_TYPE );
         }
-        else {
-            boolean oldReferredByDataAttributeESet = referredByDataAttributeESet;
-            referredByDataAttributeESet = true;
-            if( eNotificationRequired() ) eNotify(
-                    new ENotificationImpl( this, Notification.SET, NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE,
-                            newReferredByDataAttribute, newReferredByDataAttribute, !oldReferredByDataAttributeESet ) );
-        }
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public NotificationChain basicUnsetReferredByDataAttribute( NotificationChain msgs ) {
-        DataAttribute oldReferredByDataAttribute = referredByDataAttribute;
-        referredByDataAttribute = null;
-        boolean oldReferredByDataAttributeESet = referredByDataAttributeESet;
-        referredByDataAttributeESet = false;
-        if( eNotificationRequired() ) {
-            ENotificationImpl notification = new ENotificationImpl( this, Notification.UNSET,
-                    NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE, oldReferredByDataAttribute, null,
-                    oldReferredByDataAttributeESet );
-            if( msgs == null )
-                msgs = notification;
-            else
-                msgs.add( notification );
-        }
-        return msgs;
+        return referredByDataAttribute;
     }
 
     /**
@@ -376,19 +306,7 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
      */
     @Override
     public void unsetReferredByDataAttribute() {
-        if( referredByDataAttribute != null ) {
-            NotificationChain msgs = null;
-            msgs = ( ( InternalEObject ) referredByDataAttribute ).eInverseRemove( this,
-                    NsdPackage.DATA_ATTRIBUTE__REFERS_TO_BASIC_TYPE, DataAttribute.class, msgs );
-            msgs = basicUnsetReferredByDataAttribute( msgs );
-            if( msgs != null ) msgs.dispatch();
-        }
-        else {
-            boolean oldReferredByDataAttributeESet = referredByDataAttributeESet;
-            referredByDataAttributeESet = false;
-            if( eNotificationRequired() ) eNotify( new ENotificationImpl( this, Notification.UNSET,
-                    NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE, null, null, oldReferredByDataAttributeESet ) );
-        }
+        if( referredByDataAttribute != null ) ( ( InternalEList.Unsettable< ? > ) referredByDataAttribute ).unset();
     }
 
     /**
@@ -398,7 +316,7 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
      */
     @Override
     public boolean isSetReferredByDataAttribute() {
-        return referredByDataAttributeESet;
+        return referredByDataAttribute != null && ( ( InternalEList.Unsettable< ? > ) referredByDataAttribute ).isSet();
     }
 
     /**
@@ -406,6 +324,7 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
      * <!-- end-user-doc -->
      * @generated
      */
+    @SuppressWarnings( "unchecked" )
     @Override
     public NotificationChain eInverseAdd( InternalEObject otherEnd, int featureID, NotificationChain msgs ) {
         switch( featureID ) {
@@ -413,9 +332,8 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
             if( eInternalContainer() != null ) msgs = eBasicRemoveFromContainer( msgs );
             return basicSetBasicTypes( ( BasicTypes ) otherEnd, msgs );
         case NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE:
-            if( referredByDataAttribute != null ) msgs = ( ( InternalEObject ) referredByDataAttribute )
-                    .eInverseRemove( this, NsdPackage.DATA_ATTRIBUTE__REFERS_TO_BASIC_TYPE, DataAttribute.class, msgs );
-            return basicSetReferredByDataAttribute( ( DataAttribute ) otherEnd, msgs );
+            return ( ( InternalEList< InternalEObject > ) ( InternalEList< ? > ) getReferredByDataAttribute() )
+                    .basicAdd( otherEnd, msgs );
         }
         return super.eInverseAdd( otherEnd, featureID, msgs );
     }
@@ -431,7 +349,7 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
         case NsdPackage.BASIC_TYPE__BASIC_TYPES:
             return basicSetBasicTypes( null, msgs );
         case NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE:
-            return basicUnsetReferredByDataAttribute( msgs );
+            return ( ( InternalEList< ? > ) getReferredByDataAttribute() ).basicRemove( otherEnd, msgs );
         }
         return super.eInverseRemove( otherEnd, featureID, msgs );
     }
@@ -476,6 +394,7 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
      * <!-- end-user-doc -->
      * @generated
      */
+    @SuppressWarnings( "unchecked" )
     @Override
     public void eSet( int featureID, Object newValue ) {
         switch( featureID ) {
@@ -489,7 +408,8 @@ public class BasicTypeImpl extends NsdObjectImpl implements BasicType {
             setBasicTypes( ( BasicTypes ) newValue );
             return;
         case NsdPackage.BASIC_TYPE__REFERRED_BY_DATA_ATTRIBUTE:
-            setReferredByDataAttribute( ( DataAttribute ) newValue );
+            getReferredByDataAttribute().clear();
+            getReferredByDataAttribute().addAll( ( Collection< ? extends DataAttribute > ) newValue );
             return;
         }
         super.eSet( featureID, newValue );
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/NsdPackageImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/NsdPackageImpl.java
index cccbac8..e4c05ab 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/NsdPackageImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/impl/NsdPackageImpl.java
@@ -4395,7 +4395,7 @@ public class NsdPackageImpl extends EPackageImpl implements NsdPackage {
                 null, 0, 1, BasicType.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE,
                 !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED );
         initEReference( getBasicType_ReferredByDataAttribute(), this.getDataAttribute(),
-                this.getDataAttribute_RefersToBasicType(), "referredByDataAttribute", null, 0, 1, BasicType.class,
+                this.getDataAttribute_RefersToBasicType(), "referredByDataAttribute", null, 0, -1, BasicType.class,
                 IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE,
                 !IS_DERIVED, !IS_ORDERED );
 
-- 
GitLab