From 057e9e00a3bae5544607a452fb9d4dd577f77767 Mon Sep 17 00:00:00 2001
From: Dominique Marcadet <Dominique.Marcadet@centralesupelec.fr>
Date: Sun, 27 Jan 2019 11:03:49 +0100
Subject: [PATCH] use current OCL validator for SCL as the starting point

---
 README.md                                     |   2 +-
 .../.classpath                                |   7 +
 .../.project                                  |  28 ++++
 .../.settings/org.eclipse.jdt.core.prefs      |  11 ++
 .../META-INF/MANIFEST.MF                      |  21 +++
 .../build.properties                          |  20 +++
 .../plugin.properties                         |  19 +++
 .../scl/validator/RiseClipseValidatorSCL.java | 144 ++++++++++++++++++
 .../scl/validator/SCLModelLoader.java         |  71 +++++++++
 9 files changed, 322 insertions(+), 1 deletion(-)
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.classpath
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.project
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.settings/org.eclipse.jdt.core.prefs
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/META-INF/MANIFEST.MF
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/build.properties
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/plugin.properties
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/RiseClipseValidatorSCL.java
 create mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/SCLModelLoader.java

diff --git a/README.md b/README.md
index 6584389..f14ff9d 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,2 @@
-# RiseClipseSCLValidator
+# RiseClipseValidator_SCL2003
 
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.classpath b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.classpath
new file mode 100644
index 0000000..01836c4
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.project b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.project
new file mode 100644
index 0000000..932f199
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fr.centralesupelec.edf.riseclipse.iec61850.scl.validator</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.settings/org.eclipse.jdt.core.prefs b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a21537
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
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
new file mode 100644
index 0000000..2c083c5
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: RiseClipse IEC61850 SCL Tools
+Bundle-Vendor: CentraleSupélec & EDF
+Bundle-SymbolicName: fr.centralesupelec.edf.riseclipse.iec61850.scl.validator
+Bundle-Version: 1.0.0.qualifier
+Export-Package: fr.centralesupelec.edf.riseclipse.iec61850.scl.validator
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.ecore,
+ org.eclipse.emf.edit,
+ org.eclipse.emf.common,
+ org.eclipse.emf.ecore.xmi,
+ fr.centralesupelec.edf.riseclipse.main,
+ org.eclipse.ocl.pivot,
+ org.eclipse.ocl.xtext.completeocl,
+ org.eclipse.ocl.xtext.oclstdlib,
+ fr.centralesupelec.edf.riseclipse.iec61850.scl,
+ fr.centralesupelec.edf.riseclipse.iec61850.scl.edit,
+ fr.centralesupelec.edf.riseclipse.validation.ocl,
+ fr.centralesupelec.edf.riseclipse.iec61850.nsd
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/build.properties b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/build.properties
new file mode 100644
index 0000000..4acfb6b
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/build.properties
@@ -0,0 +1,20 @@
+#  Copyright (c) 2018 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/
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/plugin.properties b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/plugin.properties
new file mode 100644
index 0000000..4e2644c
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/plugin.properties
@@ -0,0 +1,19 @@
+#  Copyright (c) 2018 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/
+
+pluginName = RiseClipse IEC 61850 SCL Tools
+providerName = CentraleSup�lec & EDF
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
new file mode 100644
index 0000000..46bbee2
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/RiseClipseValidatorSCL.java
@@ -0,0 +1,144 @@
+/**
+ *  Copyright (c) 2018 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.io.File;
+import java.util.ArrayList;
+
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.SclPackage;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.provider.SclItemProviderAdapterFactory;
+import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
+import fr.centralesupelec.edf.riseclipse.util.TextRiseClipseConsole;
+import fr.centralesupelec.edf.riseclipse.validation.ocl.OCLValidator;
+
+//import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+
+public class RiseClipseValidatorSCL {
+
+    private static OCLValidator ocl;
+    private static SclItemProviderAdapterFactory adapter;
+    private static SCLModelLoader loader;
+
+    public static void usage( IRiseClipseConsole console ) {
+        console.setLevel( IRiseClipseConsole.INFO_LEVEL );
+        console.info( "java -jar RiseClipseValidatorSCL.jar [--verbose] [--make-explicit-links] [<oclFile> | <sclFile>]*" );
+        console.info( "Files ending with \".ocl\" are considered OCL files, all others are considered SCL files" );
+        System.exit( -1 );
+    }
+
+    public static void main( String[] args ) {
+        
+        final IRiseClipseConsole console = new TextRiseClipseConsole();
+        
+        console.setLevel( IRiseClipseConsole.INFO_LEVEL );
+        displayLegal( console );
+        
+        console.setLevel( IRiseClipseConsole.WARNING_LEVEL );
+        
+        if( args.length == 0 ) usage( console );
+        
+        boolean make_explicit_links = false;
+
+        int posFiles = 0;
+        for( int i = 0; i < args.length; ++i ) {
+            if( args[i].startsWith( "--" )) {
+                posFiles = i + 1;
+                if( "--verbose".equals( args[i] )) {
+                    console.setLevel( IRiseClipseConsole.INFO_LEVEL );
+                }
+                else if( "--make-explicit-links".equals( args[i] )) {
+                    make_explicit_links = true;
+                }
+                else {
+                    console.error( "Unrecognized option " + args[i] );
+                    usage( console );
+                }
+            }
+        }
+
+        ArrayList< File > oclFiles = 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] ));
+            }
+            else {
+                sclFiles.add( args[i] );
+            }
+        }
+        
+        prepare( console, oclFiles );
+        for( int i = 0; i < sclFiles.size(); ++i ) {
+            run( console, make_explicit_links, sclFiles.get( i ));
+        }
+    }
+    
+    public static void displayLegal( IRiseClipseConsole console ) {
+        console.info( "Copyright (c) 2018 CentraleSupélec & EDF." );
+        console.info( "All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0" );
+        console.info( "which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html" );
+        console.info( "" );
+        console.info( "This file is part of the RiseClipse tool." );
+        console.info( "Contributors:" );
+        console.info( "    Computer Science Department, CentraleSupélec" );
+        console.info( "    EDF R&D" );
+        console.info( "Contacts:" );
+        console.info( "    dominique.marcadet@centralesupelec.fr" );
+        console.info( "    aurelie.dehouck-neveu@edf.fr" );
+        console.info( "Web site:" );
+        console.info( "    http://wdi.supelec.fr/software/RiseClipse/" );
+        console.info( "" );
+        console.info( "RiseClipseSCLValidator version: 1.0.1 (6 June 2018)" );
+        console.info( "" );
+    }
+
+    public static void prepare( IRiseClipseConsole console, ArrayList< File > oclFiles ) {
+        SclPackage sclPg = SclPackage.eINSTANCE;
+        ocl = new OCLValidator( sclPg, 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 );
+            ocl.addOCLDocument( oclFiles.get( i ), console );
+        }
+
+        loader = new SCLModelLoader( console );
+        adapter = new SclItemProviderAdapterFactory();
+    }
+
+    public static void run( IRiseClipseConsole console, boolean make_explicit_links, String sclFile ) {
+        loader.reset();
+        Resource resource = loader.loadWithoutValidation( sclFile );
+        if( make_explicit_links ) {
+            console.info( "Making explicit links for file: " + sclFile );
+            loader.finalizeLoad();
+        }
+        if( resource != null ) {
+            console.info( "Validating file: " + sclFile );
+            ocl.validate( resource, adapter, console );
+        }
+    }
+
+}
+
diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/SCLModelLoader.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/SCLModelLoader.java
new file mode 100644
index 0000000..59c99bd
--- /dev/null
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/SCLModelLoader.java
@@ -0,0 +1,71 @@
+/**
+ *  Copyright (c) 2018 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.scl.SclPackage;
+import fr.centralesupelec.edf.riseclipse.iec61850.scl.util.SclResourceFactoryImpl;
+import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole;
+import fr.centralesupelec.edf.riseclipse.util.RiseClipseModelLoader;
+import fr.centralesupelec.edf.riseclipse.util.TextRiseClipseConsole;
+
+
+public class SCLModelLoader extends RiseClipseModelLoader {
+    
+    public SCLModelLoader( 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 SclResourceFactoryImpl() );
+
+        // Register the package to ensure it is available during loading.
+        getResourceSet().getPackageRegistry().put( SclPackage.eNS_URI, SclPackage.eINSTANCE );
+    }
+    
+    public Resource loadWithoutValidation( String name ) {
+        Object eValidator = EValidator.Registry.INSTANCE.remove( SclPackage.eINSTANCE );
+
+        Resource resource = load( name );
+        
+        if( eValidator != null ) {
+            EValidator.Registry.INSTANCE.put( SclPackage.eINSTANCE, eValidator );
+        }
+        return resource;
+    }
+    
+    public static void main( String[] args ) {
+        IRiseClipseConsole console = new TextRiseClipseConsole();
+        SCLModelLoader loader = new SCLModelLoader( console );
+        
+        for( int i = 0; i < args.length; ++i ) {
+            @SuppressWarnings( "unused" )
+            Resource resource = loader.load( args[i] );
+        }
+    }
+
+}
-- 
GitLab