From 1c62d67378df3a11e07dcfbaa056ec4e47d73f9d Mon Sep 17 00:00:00 2001 From: Dominique Marcadet <Dominique.Marcadet@centralesupelec.fr> Date: Wed, 15 May 2019 17:54:50 +0200 Subject: [PATCH] handle specific LNodeType --- .../validator/nsd/NsdEObjectValidator.java | 65 ++++++++++++++----- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/NsdEObjectValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/NsdEObjectValidator.java index 5642274..7a03416 100644 --- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/NsdEObjectValidator.java +++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/NsdEObjectValidator.java @@ -20,6 +20,7 @@ package fr.centralesupelec.edf.riseclipse.iec61850.scl.validator.nsd; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import org.eclipse.emf.common.util.BasicDiagnostic; import org.eclipse.emf.common.util.Diagnostic; @@ -31,6 +32,8 @@ import org.eclipse.emf.ecore.EValidator; import fr.centralesupelec.edf.riseclipse.iec61850.nsd.LNClass; 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.DOType; import fr.centralesupelec.edf.riseclipse.iec61850.scl.LNodeType; import fr.centralesupelec.edf.riseclipse.iec61850.scl.util.SclSwitch; import fr.centralesupelec.edf.riseclipse.iec61850.scl.validator.RiseClipseValidatorSCL; @@ -125,7 +128,7 @@ public class NsdEObjectValidator implements EValidator { } private boolean validateAnyLN( AnyLN ln, DiagnosticChain diagnostics ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] NsdEObjectValidator.validateAnyLN( " + ln.getLnClass() + " )" ); + AbstractRiseClipseConsole.getConsole().verbose( "[NSD validate] NsdEObjectValidator.validateAnyLN( " + ln.getLnClass() + " )" ); // Check that LN has valid LNClass if( ! this.anyLNValidatorMap.containsKey( ln.getLnClass() )) { @@ -133,33 +136,65 @@ public class NsdEObjectValidator implements EValidator { Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "[NSD] LNClass " + ln.getLnClass() + " not found for AnyLN at line " + ln.getLineNumber(), + "[NSD validate] LNClass " + ln.getLnClass() + " not found for AnyLN at line " + ln.getLineNumber(), new Object[] { ln } )); return false; } - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] found LNClass " + ln.getLnClass() + " for AnyLN at line " + ln.getLineNumber() ); + AbstractRiseClipseConsole.getConsole().verbose( "[NSD validate] found LNClass " + ln.getLnClass() + " for AnyLN at line " + ln.getLineNumber() ); // AnyLNValidator validates LN content return anyLNValidatorMap.get( ln.getLnClass() ).validateAnyLN( ln, diagnostics ); } protected Boolean validateLNodeType( LNodeType lNodeType, DiagnosticChain diagnostics ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] NsdEObjectValidator.validateLNodeType( " + lNodeType.getLnClass() + " )" ); + AbstractRiseClipseConsole.getConsole().verbose( "[NSD validate] NsdEObjectValidator.validateLNodeType( " + lNodeType.getLnClass() + " )" ); // Check that LNodeType has valid LNClass - if( ! this.anyLNValidatorMap.containsKey( lNodeType.getLnClass() )) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] LNClass " + lNodeType.getLnClass() + " not found for LNodeType at line " + lNodeType.getLineNumber(), - new Object[] { lNodeType } )); - return false; + if( this.anyLNValidatorMap.containsKey( lNodeType.getLnClass() )) { + AbstractRiseClipseConsole.getConsole().verbose( "[NSD validate] LNClass " + lNodeType.getLnClass() + " found for LNodeType at line " + lNodeType.getLineNumber() ); + + // LNodeTypeValidator validates LNodeType content + return lNodeTypeValidatorMap.get( lNodeType.getLnClass() ).validateLNodeType( lNodeType, diagnostics ); + } + + // A specific LNodeType: + // - must have a DO with name "NamPlt" + // - its DOType must have a DA with name "lnNs" + Optional< DOType > doType = + lNodeType + .getDO() + .stream() + .filter( d -> "NamPlt".equals( d.getName() )) + .findAny() + .map( d -> d.getRefersToDOType() ); + if( doType.isPresent() ) { + Optional< DA > da = + doType + .get() + .getDA() + .stream() + .filter( d -> "lnNs".equals( d.getName() )) + .findAny(); + if( da.isPresent() ) { + diagnostics.add( new BasicDiagnostic( + Diagnostic.INFO, + RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, + 0, + "[NSD validate] LNodeType at line " + lNodeType.getLineNumber() + " with lnClass " + lNodeType.getLnClass() + " is specific and has DA \"lnNs\" in DO \"NamPlt\"", + new Object[] { lNodeType } )); + return true; + } + } - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] LNClass " + lNodeType.getLnClass() + " found for LNodeType at line " + lNodeType.getLineNumber() ); - // LNodeTypeValidator validates LNodeType content - return lNodeTypeValidatorMap.get( lNodeType.getLnClass() ).validateLNodeType( lNodeType, diagnostics ); + diagnostics.add( new BasicDiagnostic( + Diagnostic.ERROR, + RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, + 0, + "[NSD validate] LNClass " + lNodeType.getLnClass() + " not found for LNodeType at line " + lNodeType.getLineNumber() + + " and DA \"lnNs\" in DO \"NamPlt\" not found", + new Object[] { lNodeType } )); + return false; } } -- GitLab