From 74fae12819c80b8478eab352b18d7eb0a51605b3 Mon Sep 17 00:00:00 2001
From: Dominique Marcadet <Dominique.Marcadet@centralesupelec.fr>
Date: Thu, 14 Feb 2019 15:11:53 +0100
Subject: [PATCH] NSD single file and zip van be loaded in editor

---
 .../plugin.xml                                |  9 ++
 .../plugin.xml                                | 10 ++
 .../iec61850/nsd/util/NsdResourceImpl.java    | 11 ++-
 .../nsd/util/NsdResourceSetFactory.java       | 36 +++++++
 .../iec61850/nsd/util/NsdResourceSetImpl.java | 98 ++++++++++---------
 5 files changed, 118 insertions(+), 46 deletions(-)
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetFactory.java

diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd.edit/plugin.xml b/fr.centralesupelec.edf.riseclipse.iec61850.nsd.edit/plugin.xml
index fc2be38..1a2947e 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd.edit/plugin.xml
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd.edit/plugin.xml
@@ -36,4 +36,13 @@
                org.eclipse.emf.edit.provider.IItemPropertySource"/>
    </extension>
 
+   <extension
+         point="fr.centralesupelec.edf.riseclipse.main.meta_models">
+      <meta_model
+            adapterFactory="fr.centralesupelec.edf.riseclipse.iec61850.nsd.provider.NsdItemProviderAdapterFactory"
+            name="IEC61850 NSD (version 2017A)"
+            uri="http://www.iec.ch/61850/2016/NSD">
+      </meta_model>
+   </extension>
+
 </plugin>
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/plugin.xml b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/plugin.xml
index e93ddc7..9c5c4f6 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/plugin.xml
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/plugin.xml
@@ -44,4 +44,14 @@
             class="fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceFactoryImpl"/>
    </extension>
 
+   <extension
+         point="fr.centralesupelec.edf.riseclipse.main.meta_models">
+      <meta_model
+            name="IEC61850 NSD (version 2017A)"
+            resourceFactory="fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceFactoryImpl"
+            resourceSetFactory="fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceSetFactory"
+            uri="http://www.iec.ch/61850/2016/NSD">
+      </meta_model>
+   </extension>
+
 </plugin>
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceImpl.java
index cb01b7c..b88be73 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceImpl.java
@@ -20,9 +20,11 @@
 package fr.centralesupelec.edf.riseclipse.iec61850.nsd.util;
 
 import org.eclipse.emf.common.util.URI;
-
 import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
 
+import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
+import fr.centralesupelec.edf.riseclipse.util.IRiseClipseResource;
+
 /**
  * <!-- begin-user-doc -->
  * The <b>Resource </b> associated with the package.
@@ -30,7 +32,7 @@ import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
  * @see fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceFactoryImpl
  * @generated
  */
-public class NsdResourceImpl extends XMLResourceImpl {
+public class NsdResourceImpl extends XMLResourceImpl implements IRiseClipseResource {
     /**
      * Creates an instance of the resource.
      * <!-- begin-user-doc -->
@@ -42,4 +44,9 @@ public class NsdResourceImpl extends XMLResourceImpl {
         super( uri );
     }
 
+    @Override
+    public void printStatistics( IRiseClipseConsole console ) {
+        // TODO !
+    }
+
 } //NsdResourceImpl
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetFactory.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetFactory.java
new file mode 100644
index 0000000..c18d5be
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetFactory.java
@@ -0,0 +1,36 @@
+/**
+ *  Copyright (c) 2019 CentraleSupélec & EDF.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  This file is part of the RiseClipse tool
+ *  
+ *  Contributors:
+ *      Computer Science Department, CentraleSupélec
+ *      EDF R&D
+ *  Contacts:
+ *      dominique.marcadet@centralesupelec.fr
+ *      aurelie.dehouck-neveu@edf.fr
+ *  Web site:
+ *      http://wdi.supelec.fr/software/RiseClipse/
+ * 
+ */
+package fr.centralesupelec.edf.riseclipse.iec61850.nsd.util;
+
+import fr.centralesupelec.edf.riseclipse.util.IRiseClipseResourceSet;
+import fr.centralesupelec.edf.riseclipse.util.RiseClipseResourceSetFactory;
+
+public class NsdResourceSetFactory extends RiseClipseResourceSetFactory {
+
+    /* (non-Javadoc)
+     * @see fr.centralesupelec.edf.riseclipse.util.RiseClipseResourceSetFactory#createResourceSet()
+     */
+    @Override
+    public IRiseClipseResourceSet createResourceSet() {
+        // TODO Auto-generated method stub
+        return new NsdResourceSetImpl();
+    }
+
+}
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetImpl.java b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetImpl.java
index be4362b..cc9a0df 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetImpl.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.nsd/src/fr/centralesupelec/edf/riseclipse/iec61850/nsd/util/NsdResourceSetImpl.java
@@ -24,15 +24,14 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DocumentRoot;
 import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
 import fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseConsole;
 import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
+import fr.centralesupelec.edf.riseclipse.util.RiseClipseResourceSet;
 
 
-public class NsdResourceSetImpl extends ResourceSetImpl {
+public class NsdResourceSetImpl extends RiseClipseResourceSet {
     
     private Map< String, NS > nsdResources;
 
@@ -71,8 +70,60 @@ public class NsdResourceSetImpl extends ResourceSetImpl {
         nsdResources.put( ns.getId(), ns );
     }
 
+    /* (non-Javadoc)
+     * @see fr.centralesupelec.edf.riseclipse.util.RiseClipseResourceSet#finalizeLoad(fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole)
+     */
+    @Override
+    public void finalizeLoad( IRiseClipseConsole console ) {
+        buildExplicitLinks( console );
+    }
+
+    /*
+     * The following links are implicit:
+     * 
+     *   DependsOn.id                       -> NS.id                                DONE
+     *   AnyLNClass.base                    -> AbstractLNClass                      DONE
+     *   DataObject.type                    -> CDC.name                             DONE
+     *   DataObject.presCond                -> PresenceCondition.name               DONE
+     *   DataObject.dsPresCond              -> PresenceCondition.name               DONE
+     *   SubDataObject.type                 -> CDC.name                             DONE
+     *   SubDataObject.presCond             -> PresenceCondition.name               DONE
+     *   SubDataObject.sizeAttribute        -> DataAttribute.name                   DONE
+     *   SubDataObject.maxIndexAttribute    -> DataAttribute.name                   DONE
+     *   DataAttribute.fc                   -> FunctionalConstraint.abbreviation    DONE
+     *   DataAttribute.presCond             -> PresenceCondition.name               DONE
+     *   DataAttribute.sizeAttribute        -> DataAttribute.name                   DONE
+     *   DataAttribute.maxIndexAttribute    -> DataAttribute.name                   DONE
+     *   ServiceParameter.name              -> DataAttribute.name                   ? Name of the data attribute but may be not name of a DataAttribute ?
+     *   SubDataAttribute.presCond          -> PresenceCondition.name               DONE
+     *   SubDataAttribute.sizeAttribute     -> DataAttribute.name                   ? Which DataAttribute ?
+     *   SubDataAttribute.maxIndexAttribute -> DataAttribute.name                   ? Which DataAttribute ?
+     *   Enumeration.inheritedFrom          -> Enumeration.name                     DONE
+     *   ServiceCDC.cdc                     -> CDC.name                             ? not sure and in ServiceNS file
+     *   ServiceCDC.ServiceDataAttribute    -> DataAttribute.name                   ? not sure and in ServiceNS file
+     *   ServiceDataAttribute.fc            -> FunctionalConstraint.abbreviation    ? in ServiceNS file
+     *   ServiceDataAttribute.presCond      -> PresenceCondition.name               ? in ServiceNS file
+     *   AppliesTo.id                       -> NS.id                                ? in ServiceNS file
+     *   ServiceTypeRealization.fc          -> FunctionalConstraint.abbreviation    ? ServiceTypeRealization is not a name of a type but a name of a reference
+     *   ServiceTypeRealization.presCond    -> PresenceCondition.name               ? ServiceTypeRealization is not a name of a type but a name of a reference
+     *   
+     */
+    private void buildExplicitLinks( IRiseClipseConsole console ) {
+        for( Resource resource : getResources() ) {
+            DocumentRoot root = (DocumentRoot) resource.getContents().get( 0 );
+            NS ns = ( NS ) root.getNS();
+            ns.buildExplicitLinks( console );
+        }
+        
+    }
+
+    public NS getNS( String id ) {
+        return nsdResources.get( id );
+    }
+
     /*
      * Constraints
+     * 
      *   NSDoc:
      *     Name: uniqueDocID                           Selector: nsd:Doc                           Field: @id
      *     Within an NSDoc element, there shall not be two Doc sub-elements with same id.
@@ -173,46 +224,5 @@ public class NsdResourceSetImpl extends ResourceSetImpl {
      *   ServiceNS/ServiceCDCs:
      *     Name: uniqueServiceCDC                      Selector: nsd:ServiceCDC                    Field: @cdc @variant
      *     Within an ServiceNS, there shall not be two ServiceCDC sub-elements with same name and (if defined) variant.
-     *   
-     *   
-     * The following links are implicit:
-     *   DependsOn.id                       -> NS.id                                DONE
-     *   AnyLNClass.base                    -> AbstractLNClass                      DONE
-     *   DataObject.type                    -> CDC.name                             DONE
-     *   DataObject.presCond                -> PresenceCondition.name               DONE
-     *   DataObject.dsPresCond              -> PresenceCondition.name               DONE
-     *   SubDataObject.type                 -> CDC.name                             DONE
-     *   SubDataObject.presCond             -> PresenceCondition.name               DONE
-     *   SubDataObject.sizeAttribute        -> DataAttribute.name                   DONE
-     *   SubDataObject.maxIndexAttribute    -> DataAttribute.name                   DONE
-     *   DataAttribute.fc                   -> FunctionalConstraint.abbreviation    DONE
-     *   DataAttribute.presCond             -> PresenceCondition.name               DONE
-     *   DataAttribute.sizeAttribute        -> DataAttribute.name                   DONE
-     *   DataAttribute.maxIndexAttribute    -> DataAttribute.name                   DONE
-     *   ServiceParameter.name              -> DataAttribute.name                   ? Name of the data attribute but may be not name of a DataAttribute ?
-     *   SubDataAttribute.presCond          -> PresenceCondition.name               DONE
-     *   SubDataAttribute.sizeAttribute     -> DataAttribute.name                   ? Which DataAttribute ?
-     *   SubDataAttribute.maxIndexAttribute -> DataAttribute.name                   ? Which DataAttribute ?
-     *   Enumeration.inheritedFrom          -> Enumeration.name                     DONE
-     *   ServiceCDC.cdc                     -> CDC.name                             ? not sure and in ServiceNS file
-     *   ServiceCDC.ServiceDataAttribute    -> DataAttribute.name                   ? not sure and in ServiceNS file
-     *   ServiceDataAttribute.fc            -> FunctionalConstraint.abbreviation    ? in ServiceNS file
-     *   ServiceDataAttribute.presCond      -> PresenceCondition.name               ? in ServiceNS file
-     *   AppliesTo.id                       -> NS.id                                ? in ServiceNS file
-     *   ServiceTypeRealization.fc          -> FunctionalConstraint.abbreviation    ? ServiceTypeRealization is not a name of a type but a name of a reference
-     *   ServiceTypeRealization.presCond    -> PresenceCondition.name               ? ServiceTypeRealization is not a name of a type but a name of a reference
      */
-    public void buildExplicitLinks( IRiseClipseConsole console ) {
-        for( Resource resource : getResources() ) {
-            DocumentRoot root = (DocumentRoot) resource.getContents().get( 0 );
-            NS ns = ( NS ) root.getNS();
-            ns.buildExplicitLinks( console );
-        }
-        
-    }
-
-    public NS getNS( String id ) {
-        return nsdResources.get( id );
-    }
-
 }
-- 
GitLab