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