From 7cd20e76ce3262a3ff064ea9a1d023f2d26018d7 Mon Sep 17 00:00:00 2001
From: Dominique Marcadet <Dominique.Marcadet@centralesupelec.fr>
Date: Mon, 11 Feb 2019 15:12:07 +0100
Subject: [PATCH] Keep only NSD validation for the moment. Renames files.

---
 .../META-INF/MANIFEST.MF                      |   3 +-
 .../scl/validator/NSDEObjectValidator.java    | 152 ---------------
 .../scl/validator/NSDModelLoader.java         |  70 -------
 .../scl/validator/NsdEObjectValidator.java    | 181 ++++++++++++++++++
 .../scl/validator/NsdModelLoader.java         | 129 +++++++++++++
 .../{NSDValidator.java => NsdValidator.java}  |  20 +-
 .../scl/validator/RiseClipseValidatorSCL.java |  54 +++---
 7 files changed, 348 insertions(+), 261 deletions(-)
 delete mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDEObjectValidator.java
 delete mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDModelLoader.java
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdEObjectValidator.java
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdModelLoader.java
 rename fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/{NSDValidator.java => NsdValidator.java} (87%)

diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/META-INF/MANIFEST.MF b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/META-INF/MANIFEST.MF
index 2057aad..70b6e48 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/META-INF/MANIFEST.MF
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/META-INF/MANIFEST.MF
@@ -19,4 +19,5 @@ Require-Bundle: org.eclipse.core.runtime,
  fr.centralesupelec.edf.riseclipse.iec61850.scl.edit,
  fr.centralesupelec.edf.riseclipse.validation.ocl,
  fr.centralesupelec.edf.riseclipse.iec61850.nsd,
- fr.centralesupelec.edf.riseclipse.iec61850.nsd.edit
+ fr.centralesupelec.edf.riseclipse.iec61850.nsd.edit,
+ org.eclipse.ocl.xtext.oclinecore
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDEObjectValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDEObjectValidator.java
deleted file mode 100644
index 10e251f..0000000
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDEObjectValidator.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- *  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.scl.validator;
-
-import java.util.Map;
-
-import org.eclipse.emf.common.util.DiagnosticChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.ecore.resource.Resource;
-
-import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DocumentRoot;
-import fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType;
-import fr.centralesupelec.edf.riseclipse.iec61850.nsd.CDC;
-import fr.centralesupelec.edf.riseclipse.iec61850.nsd.LNClass;
-import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
-import fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN;
-import fr.centralesupelec.edf.riseclipse.iec61850.scl.DA;
-import fr.centralesupelec.edf.riseclipse.iec61850.scl.DOType;
-import fr.centralesupelec.edf.riseclipse.iec61850.scl.LNode;
-import fr.centralesupelec.edf.riseclipse.iec61850.scl.LNodeType;
-import fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseConsole;
-
-public class NSDEObjectValidator implements EValidator {
-    
-    private NS ns;
-
-    public NSDEObjectValidator( Resource nsdResource ) {
-        DocumentRoot root = (DocumentRoot) nsdResource.getContents().get( 0 );
-        ns = (NS) root.getNS();
-    }
-
-    @Override
-    public boolean validate( EObject eObject, DiagnosticChain diagnostics, Map< Object, Object > context ) {
-        return validate( eObject.eClass(), eObject, diagnostics, context );
-    }
-
-    @Override
-    public boolean validate( EClass eClass, EObject eObject, DiagnosticChain diagnostics,
-            Map< Object, Object > context ) {
-        
-        switch(eClass.getName()) {
-        case "LNode":
-        	LNode lnd = (LNode) eObject;
-        	return validateLN(lnd.getLnClass());
-        case "LNodeType":
-        	LNodeType lnt = (LNodeType) eObject;
-        	return validateLN(lnt.getLnClass());
-        case "LN0":
-        case "LN":
-        	AnyLN ln = (AnyLN) eObject;
-        	return validateLN(ln.getLnClass());
-        case "DOType":
-        	DOType dot = (DOType) eObject;
-        	return validateDO(dot.getCdc());
-        case "DA":
-        	DA da = (DA) eObject;
-        	return validateDA(da.getBType());
-        default:
-        	return false;
-        }
-    }
-
-    @Override
-    public boolean validate( EDataType eDataType, Object value, DiagnosticChain diagnostics,
-            Map< Object, Object > context ) {
-        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validate( EDataType ): " + eDataType.getName() );
-        
-        // TODO: use nsdResource to validate value
-        
-
-        return true;
-    }
-    
-    
-    public boolean validateLN(String lnClassName) {
-        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validateLN( " + lnClassName + " )" );
-        if(ns.getLNClasses() != null) {
-	        EList<LNClass> lnClass = ns.getLNClasses().getLNClass();
-	    	for(int i = 0; i < lnClass.size(); i++) {
-	    		if(lnClassName.equals(lnClass.get(i).getName())) {
-	    			//log("is valid");
-	    			return true;
-	    		}
-	    	}
-	    	//log("is not valid");
-	    	return false; 
-        } else {
-        	return true;
-        }
-    }
-    
-    public boolean validateDO(String cdcName) {
-        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validateDO( " + cdcName + " )" );
-        if(ns.getCDCs() != null) {
-	    	EList<CDC> cdc = ns.getCDCs().getCDC();
-	    	for(int i = 0; i < cdc.size(); i++) {
-	    		if(cdcName.equals(cdc.get(i).getName())) {
-	    			//log("is valid");
-	    			return true;
-	    		}
-	    	}
-	    	//log("is not valid");
-	    	return false;
-        } else {
-        	return true;
-        }
-    }
-
-    public boolean validateDA(String basicTypeName) {
-        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validateDA( " + basicTypeName + " )" );
-        if(ns.getBasicTypes() != null) {
-	    	EList<BasicType> basicTypes = ns.getBasicTypes().getBasicType();
-	    	for(int i = 0; i < basicTypes.size(); i++) {
-	    		if(basicTypeName.equals(basicTypes.get(i).getName())) {
-	    			//log("is valid");
-	    			return true;
-	    		}
-	    	}
-	    	//log("is not valid");
-	    	return false;
-        } else {
-        	return true;
-        }
-    }
-    
-    
-    public void log(String message) {
-        AbstractRiseClipseConsole.getConsole().info(message);
-    }
-
-    
-}
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDModelLoader.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDModelLoader.java
deleted file mode 100644
index 3a56a29..0000000
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDModelLoader.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- *  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.scl.validator;
-
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.ecore.resource.Resource;
-
-import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
-import fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceFactoryImpl;
-import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
-import fr.centralesupelec.edf.riseclipse.util.RiseClipseModelLoader;
-import fr.centralesupelec.edf.riseclipse.util.TextRiseClipseConsole;
-
-public class NSDModelLoader  extends RiseClipseModelLoader {
-    
-    public NSDModelLoader( IRiseClipseConsole console ) {
-        super( console );
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-
-        // Register the appropriate resource factory to handle all file
-        // extensions.
-        getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap()
-            .put( Resource.Factory.Registry.DEFAULT_EXTENSION, new NsdResourceFactoryImpl() );
-
-        // Register the package to ensure it is available during loading.
-        getResourceSet().getPackageRegistry().put( NsdPackage.eNS_URI, NsdPackage.eINSTANCE );
-    }
-    
-    public Resource loadWithoutValidation( String name ) {
-        Object eValidator = EValidator.Registry.INSTANCE.remove( NsdPackage.eINSTANCE );
-
-        Resource resource = load( name );
-        
-        if( eValidator != null ) {
-            EValidator.Registry.INSTANCE.put( NsdPackage.eINSTANCE, eValidator );
-        }
-        return resource;
-    }
-    
-    public static void main( String[] args ) {
-        IRiseClipseConsole console = new TextRiseClipseConsole();
-        NSDModelLoader loader = new NSDModelLoader( console );
-        
-        for( int i = 0; i < args.length; ++i ) {
-            @SuppressWarnings( "unused" )
-            Resource resource = loader.load( args[i] );
-        }
-    }
-
-}
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdEObjectValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdEObjectValidator.java
new file mode 100644
index 0000000..dc1a656
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdEObjectValidator.java
@@ -0,0 +1,181 @@
+/**
+ *  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.scl.validator;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DocumentRoot;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.BasicType;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.CDC;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataObject;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.LNClass;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NS;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceSetImpl;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.DA;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.DAI;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.DOI;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.DOType;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.LNode;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.LNodeType;
+import fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseConsole;
+
+public class NsdEObjectValidator implements EValidator {
+    
+    private NsdResourceSetImpl nsdResourceSet;
+
+    public NsdEObjectValidator( NsdResourceSetImpl nsdResourceSet ) {
+        this.nsdResourceSet = nsdResourceSet;
+    }
+
+    @Override
+    public boolean validate( EObject eObject, DiagnosticChain diagnostics, Map< Object, Object > context ) {
+        return validate( eObject.eClass(), eObject, diagnostics, context );
+    }
+
+    @Override
+    public boolean validate( EClass eClass, EObject eObject, DiagnosticChain diagnostics,
+            Map< Object, Object > context ) {
+        
+        switch(eClass.getName()) {
+//        case "LNode":
+//        	LNode lnd = (LNode) eObject;
+//        	return validateLN(lnd.getLnClass());
+//        case "LNodeType":
+//        	LNodeType lnt = (LNodeType) eObject;
+//        	return validateLN(lnt.getLnClass());
+        case "LN0":
+        case "LN":
+        	AnyLN ln = (AnyLN) eObject;
+        	return validateLN(ln);
+//        case "DOType":
+//        	DOType dot = (DOType) eObject;
+//        	return validateDO(dot.getCdc());
+//        case "DA":
+//        	DA da = (DA) eObject;
+//        	return validateDA(da.getBType());
+        default:
+        	return false;
+        }
+    }
+
+    @Override
+    public boolean validate( EDataType eDataType, Object value, DiagnosticChain diagnostics,
+            Map< Object, Object > context ) {
+        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validate( EDataType ): " + eDataType.getName() );
+        
+        // TODO: use nsdResource to validate value
+        
+
+        return true;
+    }
+    
+    
+    public boolean validateLN(AnyLN ln) {
+        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validateLN( " + ln.getLnClass() + " )" );
+        
+        // TODO: inheritance of LNClass must be taken into account
+        
+        Optional< LNClass > lnClassFound = nsdResourceSet.getLNClassStream().filter( lNClass -> lNClass.getName().equals( ln.getLnClass() )).findAny();
+        if( ! lnClassFound.isPresent() ) {
+            AbstractRiseClipseConsole.getConsole().error( "ln.getLnClass() not found in NSD files" );
+	    	return false; 
+        }
+        AbstractRiseClipseConsole.getConsole().info( "found ln.getLnClass() in NSD files" );
+        
+        // lnClassFound contains DataObject which describes allowed DOI in LN
+        for( DOI doi : ln.getDOI() ) {
+            Optional< DataObject > dataObjectFound = lnClassFound.get().getDataObject().stream().filter( dataObject -> dataObject.getName().equals( doi.getName()) ).findAny();
+            
+            if( ! dataObjectFound.isPresent() ) {
+                // TODO: add message
+                return false;
+            }
+            
+            // dataObjectFound refers to a CDC which describes allowed DAI in DOI
+            CDC cdcFound = dataObjectFound.get().getRefersToCDC();
+            for( DAI dai : doi.getDAI() ) {
+                Optional< DataAttribute > dataAttributeFound = cdcFound.getDataAttribute().stream().filter( dataAttribute -> dataAttribute.getName().equals( dai.getName() ) ).findAny();
+                if( ! dataAttributeFound.isPresent() ) {
+                    // TODO: add message
+                    return false;
+                }
+                
+                // TODO: is there anything else to check ?
+            }
+            
+            // TODO: check that compulsory DataObject in cdcFound are present in doi 
+        }
+        
+        // TODO: check that compulsory DataAttribute in lnClassFound are present in ln 
+
+        return true;
+    }
+    
+//    public boolean validateDO(String cdcName) {
+//        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validateDO( " + cdcName + " )" );
+//        if(ns.getCDCs() != null) {
+//	    	EList<CDC> cdc = ns.getCDCs().getCDC();
+//	    	for(int i = 0; i < cdc.size(); i++) {
+//	    		if(cdcName.equals(cdc.get(i).getName())) {
+//	    			//log("is valid");
+//	    			return true;
+//	    		}
+//	    	}
+//	    	//log("is not valid");
+//	    	return false;
+//        } else {
+//        	return true;
+//        }
+//    }
+//
+//    public boolean validateDA(String basicTypeName) {
+//        AbstractRiseClipseConsole.getConsole().info( "NSDEObjectValidator.validateDA( " + basicTypeName + " )" );
+//        if(ns.getBasicTypes() != null) {
+//	    	EList<BasicType> basicTypes = ns.getBasicTypes().getBasicType();
+//	    	for(int i = 0; i < basicTypes.size(); i++) {
+//	    		if(basicTypeName.equals(basicTypes.get(i).getName())) {
+//	    			//log("is valid");
+//	    			return true;
+//	    		}
+//	    	}
+//	    	//log("is not valid");
+//	    	return false;
+//        } else {
+//        	return true;
+//        }
+//    }
+    
+    
+    public void log(String message) {
+        AbstractRiseClipseConsole.getConsole().info(message);
+    }
+
+    
+}
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdModelLoader.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdModelLoader.java
new file mode 100644
index 0000000..8fb4bd8
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdModelLoader.java
@@ -0,0 +1,129 @@
+/**
+ *  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.scl.validator;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.emf.ecore.EValidator.SubstitutionLabelProvider;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.Diagnostician;
+//import org.eclipse.ocl.pivot.delegate.OCLDelegateDomain;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.NsdPackage;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.provider.NsdItemProviderAdapterFactory;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceFactoryImpl;
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceSetImpl;
+import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
+import fr.centralesupelec.edf.riseclipse.util.RiseClipseModelLoader;
+import fr.centralesupelec.edf.riseclipse.util.TextRiseClipseConsole;
+
+public class NsdModelLoader  extends RiseClipseModelLoader {
+    
+    public NsdModelLoader( IRiseClipseConsole console ) {
+        super( console );
+    }
+
+    @Override
+    public void reset() {
+        super.reset(new NsdResourceSetImpl() );
+
+        // Register the appropriate resource factory to handle all file
+        // extensions.
+        getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap()
+            .put( Resource.Factory.Registry.DEFAULT_EXTENSION, new NsdResourceFactoryImpl() );
+
+        // Register the package to ensure it is available during loading.
+        getResourceSet().getPackageRegistry().put( NsdPackage.eNS_URI, NsdPackage.eINSTANCE );
+    }
+    
+    @Override
+    public NsdResourceSetImpl getResourceSet() {
+        return ( NsdResourceSetImpl ) super.getResourceSet();
+    }
+
+    public Resource loadWithoutValidation( String name ) {
+        Object eValidator = EValidator.Registry.INSTANCE.remove( NsdPackage.eINSTANCE );
+
+        Resource resource = load( name );
+        
+        if( eValidator != null ) {
+            EValidator.Registry.INSTANCE.put( NsdPackage.eINSTANCE, eValidator );
+        }
+        return resource;
+    }
+    
+    public static void main( String[] args ) {
+        IRiseClipseConsole console = new TextRiseClipseConsole();
+        //console.setLevel( IRiseClipseConsole.ERROR_LEVEL );
+        NsdModelLoader loader = new NsdModelLoader( console );
+        
+        org.eclipse.ocl.xtext.oclinecore.OCLinEcoreStandaloneSetup.doSetup();
+        
+        Map<Object, Object> context = new HashMap< Object, Object >();
+        SubstitutionLabelProvider substitutionLabelProvider = new EValidator.SubstitutionLabelProvider() {
+            
+            @Override
+            public String getValueLabel( EDataType eDataType, Object value ) {
+                return Diagnostician.INSTANCE.getValueLabel( eDataType, value );
+            }
+            
+            @Override
+            public String getObjectLabel( EObject eObject ) {
+                NsdItemProviderAdapterFactory adapter = new NsdItemProviderAdapterFactory();
+                IItemLabelProvider labelProvider = ( IItemLabelProvider ) adapter .adapt( eObject, IItemLabelProvider.class );
+                return labelProvider.getText( eObject );
+            }
+            
+            @Override
+            public String getFeatureLabel( EStructuralFeature eStructuralFeature ) {
+                return Diagnostician.INSTANCE.getFeatureLabel( eStructuralFeature );
+            }
+        };
+        context.put(EValidator.SubstitutionLabelProvider.class, substitutionLabelProvider );
+
+        for( int i = 0; i < args.length; ++i ) {
+            Resource resource = loader.load( args[i] );
+            if( resource == null ) continue;
+            if( resource.getContents().size() == 0 ) continue;
+            Diagnostic diagnostic = Diagnostician.INSTANCE.validate( resource.getContents().get( 0 ), context );
+            
+            if( diagnostic.getSeverity() == Diagnostic.ERROR || diagnostic.getSeverity() == Diagnostic.WARNING ) {
+                for( Iterator< Diagnostic > d = diagnostic.getChildren().iterator(); d.hasNext(); ) {
+                    Diagnostic childDiagnostic = d.next();
+                    switch( childDiagnostic.getSeverity() ) {
+                    case Diagnostic.ERROR:
+                    case Diagnostic.WARNING:
+                        console.error( "\t" + childDiagnostic.getMessage() );
+                    }
+                }
+            }
+        }
+        loader.getResourceSet().buildExplicitLinks( console );
+    }
+
+}
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdValidator.java
similarity index 87%
rename from fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDValidator.java
rename to fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdValidator.java
index 0bffb46..5d105c4 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NSDValidator.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/NsdValidator.java
@@ -38,25 +38,27 @@ import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.ocl.pivot.validation.ComposedEValidator;
 
+import fr.centralesupelec.edf.riseclipse.iec61850.nsd.util.NsdResourceSetImpl;
 import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
 
-public class NSDValidator {
+public class NsdValidator {
 
     private @NonNull EPackage modelPackage;
-    private ComposedEValidator validator;
+    private NsdModelLoader nsdLoader;
 
-    public NSDValidator( @NonNull EPackage modelPackage ) {
-        this.modelPackage = modelPackage;
-        validator = ComposedEValidator.install( modelPackage );
+    public NsdValidator( @NonNull ComposedEValidator validator, IRiseClipseConsole console ) {
+        nsdLoader = new NsdModelLoader( console );
+        validator.addChild( new NsdEObjectValidator( nsdLoader.getResourceSet() ));
     }
         
-    public boolean addNSDDocument( Resource resource, IRiseClipseConsole console ) {
-        NSDEObjectValidator nsdObjectValidator = new NSDEObjectValidator( resource );
-        validator.addChild( nsdObjectValidator );
-        return true;
+    public void addNsdDocument( String nsdFile, IRiseClipseConsole console ) {
+        console.info( "Loading nsd: " + nsdFile );
+        nsdLoader.load( nsdFile );
     }
 
     public void validate( Resource resource, final AdapterFactory adapter, IRiseClipseConsole console ) {
+        nsdLoader.getResourceSet().buildExplicitLinks( console );
+        
         Map<Object, Object> context = new HashMap< Object, Object >();
         SubstitutionLabelProvider substitutionLabelProvider = new EValidator.SubstitutionLabelProvider() {
             
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/RiseClipseValidatorSCL.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/RiseClipseValidatorSCL.java
index acfe5d5..45e7de3 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/RiseClipseValidatorSCL.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/RiseClipseValidatorSCL.java
@@ -30,22 +30,24 @@ import fr.centralesupelec.edf.riseclipse.validation.ocl.OCLValidator;
 
 //import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.validation.ComposedEValidator;
 
 public class RiseClipseValidatorSCL {
 
-    private static OCLValidator oclValidator;
+    //private static OCLValidator oclValidator;
     private static SclItemProviderAdapterFactory sclAdapter;
     private static SCLModelLoader sclLoader;
-    private static NSDValidator nsdValidator;
-    private static boolean oclValidation = false;
+    private static NsdValidator nsdValidator;
+    //private static boolean oclValidation = false;
     private static boolean nsdValidation = false;
     private static NsdItemProviderAdapterFactory nsdAdapter;
 
     public static void usage( IRiseClipseConsole console ) {
         console.setLevel( IRiseClipseConsole.INFO_LEVEL );
         console.info( "java -jar RiseClipseValidatorSCL.jar [--verbose] [--make-explicit-links] [<oclFile> | <nsdFile> | <sclFile>]*" );
-        console.info( "Files ending with \".ocl\" are considered OCL files, "
-                    + "files ending with \\\".nsd\\\" are considered NSD files, "
+        console.info( /*"Files ending with \".ocl\" are considered OCL files, "
+                    +*/ "files ending with \\\".nsd\\\" are considered NSD files, "
                     + "all others are considered SCL files" );
         System.exit( -1 );
     }
@@ -56,7 +58,6 @@ public class RiseClipseValidatorSCL {
         
         console.setLevel( IRiseClipseConsole.INFO_LEVEL );
         displayLegal( console );
-        
         console.setLevel( IRiseClipseConsole.WARNING_LEVEL );
         
         if( args.length == 0 ) usage( console );
@@ -80,15 +81,15 @@ public class RiseClipseValidatorSCL {
             }
         }
 
-        ArrayList< File > oclFiles = new ArrayList<>();
+        //ArrayList< String > oclFiles = new ArrayList<>();
         ArrayList< String > nsdFiles = new ArrayList<>();
         ArrayList< String > sclFiles = new ArrayList<>();
         for( int i = posFiles; i < args.length; ++i ) {
-            if( args[i].endsWith( ".ocl" )) {
-                oclFiles.add( new File( args[i] ));
+            /*if( args[i].endsWith( ".ocl" )) {
+                oclFiles.add( args[i] );
                 oclValidation = true;
             }
-            else if( args[i].endsWith( ".nsd" )) {
+            else*/ if( args[i].endsWith( ".nsd" )) {
                 nsdFiles.add( args[i] );
                 nsdValidation = true;
             }
@@ -97,7 +98,7 @@ public class RiseClipseValidatorSCL {
             }
         }
         
-        prepare( console, oclFiles, nsdFiles );
+        prepare( console, /*oclFiles,*/ nsdFiles );
         for( int i = 0; i < sclFiles.size(); ++i ) {
             run( console, make_explicit_links, sclFiles.get( i ));
         }
@@ -122,29 +123,24 @@ public class RiseClipseValidatorSCL {
         console.info( "" );
     }
 
-    public static void prepare( IRiseClipseConsole console, ArrayList< File > oclFiles, ArrayList< String > nsdFiles ) {
-        if( oclValidation ) {
-            oclValidator = new OCLValidator( SclPackage.eINSTANCE, true );
+    public static void prepare( IRiseClipseConsole console, /*ArrayList< String > oclFiles,*/ ArrayList< String > nsdFiles ) {
+        @NonNull
+        ComposedEValidator validator = ComposedEValidator.install( SclPackage.eINSTANCE );
+        
+        /*if( oclValidation ) {
+            oclValidator = new OCLValidator( validator, true );
     
             for( int i = 0; i < oclFiles.size(); ++i ) {
-                console.info( "Loading ocl: " + oclFiles.get( i ));
-                // workaround for bug 486872
-//              File file = new File( oclFiles.get( i ));
-//              URI uri = file.isFile() ? URI.createFileURI( file.getAbsolutePath() ) : URI.createURI( oclFiles.get( i ));
-//              oclFiles.add( uri );
-//              ocl.addOCLDocument( uri, console );
                 oclValidator.addOCLDocument( oclFiles.get( i ), console );
             }
-        }
+        }*/
         
         if( nsdValidation ) {
-            nsdValidator = new NSDValidator( SclPackage.eINSTANCE );
-            NSDModelLoader nsdLoader = new NSDModelLoader( console );
+            nsdValidator = new NsdValidator( validator, console );
             for( int i = 0; i < nsdFiles.size(); ++i ) {
-                console.info( "Loading nsd: " + nsdFiles.get( i ));
-                nsdValidator.addNSDDocument( nsdLoader.load( nsdFiles.get( i )), console );
+                nsdValidator.addNsdDocument( nsdFiles.get( i ), console );
             }
-            nsdAdapter = new NsdItemProviderAdapterFactory();
+            //nsdAdapter = new NsdItemProviderAdapterFactory();
         }
 
         sclLoader = new SCLModelLoader( console );
@@ -159,13 +155,13 @@ public class RiseClipseValidatorSCL {
             sclLoader.finalizeLoad();
         }
         if( resource != null ) {
-            if( oclValidation ) {
+            /*if( oclValidation ) {
                 console.info( "Validating file: " + sclFile + " with OCL" );
                 oclValidator.validate( resource, sclAdapter, console );
-            }
+            }*/
             if( nsdValidation ) {
                 console.info( "Validating file: " + sclFile + " with NSD" );
-                nsdValidator.validate( resource, nsdAdapter, console );
+                nsdValidator.validate( resource, sclAdapter, console );
             }
        }
     }
-- 
GitLab