From 49f8313ce8de42627a6b28f10a555afa5005ab04 Mon Sep 17 00:00:00 2001 From: Dominique Marcadet <Dominique.Marcadet@centralesupelec.fr> Date: Mon, 20 May 2019 20:48:05 +0200 Subject: [PATCH] remove old code --- .../scl/validator/nsd/AnyLNValidator.java | 173 --------- .../scl/validator/nsd/DOIValidator.java | 359 ------------------ .../scl/validator/nsd/DOValidator.java | 145 ------- 3 files changed, 677 deletions(-) delete mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/AnyLNValidator.java delete mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DOIValidator.java delete mode 100644 fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DOValidator.java diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/AnyLNValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/AnyLNValidator.java deleted file mode 100644 index df3bbf2..0000000 --- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/AnyLNValidator.java +++ /dev/null @@ -1,173 +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.nsd; - -import java.util.HashMap; -import java.util.HashSet; - -import org.eclipse.emf.common.util.BasicDiagnostic; -import org.eclipse.emf.common.util.Diagnostic; -import org.eclipse.emf.common.util.DiagnosticChain; - -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.AbstractLNClass; -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataObject; -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.LNClass; -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.AnyLNClass; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.DOI; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.validator.RiseClipseValidatorSCL; -import fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseConsole; - -public class AnyLNValidator { - - private String lnClassName; - private HashMap< String, DataObject > dataObjectMap; - private HashMap< String, DOIValidator > doiValidatorMap; - - public AnyLNValidator( LNClass lnClass ) { - this.lnClassName = lnClass.getName(); - this.dataObjectMap = new HashMap<>(); // link between DOI (name) and its respective DataObject - this.doiValidatorMap = new HashMap<>(); // link between CDC (name) and its respective DOIValidator - - generateValidators( lnClass ); - - // LNClass hierarchy taken into account - AbstractLNClass parent = lnClass.getRefersToAbstractLNClass(); - while( parent != null ) { - generateValidators( parent ); - parent = parent.getRefersToAbstractLNClass(); - } - - } - - private void generateValidators( AnyLNClass lnClass ) { - for( DataObject dObj : lnClass.getDataObject() ) { - dataObjectMap.put( dObj.getName(), dObj ); - if( dObj.getRefersToCDC() != null ) { - if( ! doiValidatorMap.containsKey( dObj.getRefersToCDC().getName() )) { - doiValidatorMap.put( dObj.getRefersToCDC().getName(), new DOIValidator( dObj.getRefersToCDC() )); - } - } - } - } - - public boolean validateAnyLN( AnyLN anyLN, DiagnosticChain diagnostics ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] validateAnyLN( " + anyLN.getLnClass() + " )" ); - boolean res = true; - - HashSet< String > checkedDO = new HashSet<>(); - - for( DOI doi : anyLN.getDOI() ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] validateDOI( " + doi.getName() + " )" ); - - // Test if DOI is a possible DOI in this LN - if( ! dataObjectMap.containsKey( doi.getName() ) ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DO " + doi.getName() + " in AnyLN at line " + anyLN.getLineNumber() + " not found in LNClass " + anyLN.getLnClass(), - new Object[] { anyLN } )); - continue; - } - - // Control of DOI presence in LN - updateCompulsory( doi, checkedDO, diagnostics ); - - // Validation of DOI content - if( ! validateDOI( doi, diagnostics ) ) { - res = false; - } - - } - - // Verify all necessary DOI were present - if( ! dataObjectMap.values().stream() - .map( x -> checkCompulsory( anyLN, x, checkedDO, diagnostics )) - .reduce( ( a, b ) -> a && b ).get() ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] AnyLN at line " + anyLN.getLineNumber() + " does not contain all mandatory DO from class " + anyLN.getLnClass(), - new Object[] { anyLN } )); - res = false; - } - return res; - } - - private boolean checkCompulsory( AnyLN ln, DataObject dataObject, HashSet< String > checkedDO, DiagnosticChain diagnostics ) { - switch( dataObject.getPresCond() ) { - case "M": - if( ! checkedDO.contains( dataObject.getName() ) ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DO " + dataObject.getName() + " is missing in LN at line " + ln.getLineNumber(), - new Object[] { ln } )); - return false; - } - break; - default: - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: AnyLNValidator.checkCompulsory( " + dataObject.getPresCond() + " )" ); - break; - } - return true; - } - - private boolean updateCompulsory( DOI doi, HashSet< String > checkedDO, DiagnosticChain diagnostics ) { - switch( dataObjectMap.get( doi.getName() ).getPresCond() ) { - case "M": - case "O": - if( checkedDO.contains( doi.getName() )) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DO " + doi + " cannot appear more than once in LN at line " + doi.getParentAnyLN().getLineNumber(), - new Object[] { doi } )); - return false; - } - checkedDO.add( doi.getName() ); - break; - case "F": - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DO " + doi + " is forbidden in LN at line " + doi.getParentAnyLN().getLineNumber(), - new Object[] { doi } )); - return false; - default: - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: AnyLNValidator.updateCompulsory( " + dataObjectMap.get( doi.getName() ).getPresCond() + " )" ); - break; - } - return true; - } - - private boolean validateDOI( DOI doi, DiagnosticChain diagnostics ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] found DO " + doi.getName() + " in LNClass " + lnClassName ); - - // DOIValidator validates DOI content - String cdc = dataObjectMap.get( doi.getName() ).getRefersToCDC().getName(); - return doiValidatorMap.get( cdc ).validateDOI( doi, diagnostics ); - } - -} diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DOIValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DOIValidator.java deleted file mode 100644 index 990d840..0000000 --- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DOIValidator.java +++ /dev/null @@ -1,359 +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.nsd; - -import java.util.HashMap; -import java.util.HashSet; - -import org.eclipse.emf.common.util.BasicDiagnostic; -import org.eclipse.emf.common.util.Diagnostic; -import org.eclipse.emf.common.util.DiagnosticChain; - -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.CDC; -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.DAI; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.DOI; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.Val; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.validator.RiseClipseValidatorSCL; -import fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseConsole; - -public class DOIValidator { - - private String cdcName; - private HashMap< String, DataAttribute > dataAttributeMap; - - public DOIValidator( CDC cdc ) { - this.cdcName = cdc.getName(); - this.dataAttributeMap = new HashMap<>(); // link between DAI (name) and its respective DataAttribute - - for( DataAttribute da : cdc.getDataAttribute() ) { - this.dataAttributeMap.put( da.getName(), da ); - } - } - - public boolean validateDOI( DOI doi, DiagnosticChain diagnostics ) { - boolean res = true; - HashSet< String > checkedDA = new HashSet<>(); - - for( DAI dai : doi.getDAI() ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] validateDAI( " + dai.getName() + " ) (line " + dai.getLineNumber() + ")" ); - - // Test if DAI is a possible DAI in this DOI - if( ! dataAttributeMap.containsKey( dai.getName() ) ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DAI " + dai.getName() + " (line " + dai.getLineNumber() + ") not found in CDC", - new Object[] { doi, cdcName } )); - res = false; - continue; - } - - // Control of DAI presence in DOI - updateCompulsory( dai, checkedDA, diagnostics ); - - // Validation of DAI content - if( ! validateDAI( dai, diagnostics ) ) { - res = false; - } - - } - - // Verify all necessary DAI were present - if( ! dataAttributeMap.values().stream() - .map( x -> checkCompulsory( doi, x, checkedDA, diagnostics ) ) - .reduce( ( a, b ) -> a && b ).get() ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DOI (line " + doi.getLineNumber() + ") does not contain all mandatory DA from CDC", - new Object[] { doi, cdcName } )); - res = false; - } - return res; - } - - public boolean checkCompulsory( DOI doi, DataAttribute da, HashSet< String > checked, DiagnosticChain diagnostics ) { - switch( da.getPresCond() ) { - case "M": - if( ! checked.contains( da.getName() )) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DA " + da.getName() + " not found in DOI (line " + doi.getLineNumber() + ")", - new Object[] { da } )); - return false; - } - break; - default: - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: DOIValidator.checkCompulsory( presCond: " + da.getPresCond() + " )" ); - break; - } - return true; - } - - public boolean updateCompulsory( DAI dai, HashSet< String > checked, DiagnosticChain diagnostics ) { - switch( dataAttributeMap.get( dai.getName() ).getPresCond() ) { - case "M": - case "O": - if( checked.contains( dai.getName() ) ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DAI " + dai.getName() + " (line " + dai.getLineNumber() + ") cannot appear more than once", - new Object[] { dai } )); - return false; - } - else { - checked.add( dai.getName() ); - break; - } - case "F": - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DAI " + dai.getName() + " (line " + dai.getLineNumber() + ") is forbidden", - new Object[] { dai } )); - return false; - default: - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: DOIValidator.updateCompulsory( presCond: " + dataAttributeMap.get( dai.getName() ).getPresCond() + " )" ); - break; - } - return true; - } - - public boolean validateDAI( DAI dai, DiagnosticChain diagnostics ) { - - AbstractRiseClipseConsole.getConsole().verbose( "found DA " + dai.getName() + " in CDC " + cdcName ); - - // DataAttributes that are BASIC have a BasicType which describes allowed Val of DA - DataAttribute da = dataAttributeMap.get( dai.getName() ); - if( da.getTypeKind().getName().equals( "BASIC" ) ) { - for( Val val : dai.getVal() ) { - if( ! validateVal( val.getValue(), da.getType() )) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] Val " + val.getValue() + " (" + dai.getLineNumber() + ") of DA " + dai.getName() + " is not of type " + da.getType(), - new Object[] { dai, val } )); - return false; - } - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] Val " + val.getValue() + " (" + dai.getLineNumber() + ") of DA " + dai.getName() + - " is of type " + da.getType() ); - } - } - else { - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: DOIValidator.validateDAI( kind: " + da.getTypeKind().getName() + " )" ); - } - - return true; - } - - public boolean validateVal( String val, String type ) { - int v; - long l; - float f; - switch( type ) { - case "BOOLEAN": - return( val.equals( "0" ) || val.equals( "1" ) || val.equals( "false" ) || val.equals( "true" ) ); - case "INT8": - try { - v = Integer.parseInt( val ); - } - catch( Exception e ) { - return false; - } - return v >= -128 && v <= 127; - case "INT16": - try { - v = Integer.parseInt( val ); - } - catch( Exception e ) { - return false; - } - return v >= -32768 && v <= 32767; - case "INT32": - try { - v = Integer.parseInt( val ); - } - catch( Exception e ) { - return false; - } - return v >= Integer.MIN_VALUE && v <= Integer.MAX_VALUE; - case "INT64": - try { - l = Long.parseLong( val ); - } - catch( Exception e ) { - return false; - } - return l >= Long.MIN_VALUE && l <= Long.MAX_VALUE; - case "INT8U": - try { - v = Integer.parseInt( val ); - } - catch( Exception e ) { - return false; - } - return v >= 0 && v <= 255; - case "INT16U": - try { - v = Integer.parseInt( val ); - } - catch( Exception e ) { - return false; - } - return v >= 0 && v <= 65535; - case "INT32U": - try { - l = Long.parseLong( val ); - } - catch( Exception e ) { - return false; - } - String max = "4294967295"; - return l >= 0 && l <= Long.parseLong( max ); - case "FLOAT32": - try { - f = Float.parseFloat( val ); - } - catch( Exception e ) { - return false; - } - return f >= -Float.MAX_VALUE && f <= Float.MAX_VALUE; - case "Octet64": - byte[] bytes = val.getBytes(); - return bytes.length <= 64; - case "VisString64": - return val.length() <= 64; - case "VisString129": - return val.length() <= 129; - case "Unicode255": - case "VisString255": - return val.length() <= 255; - default: - return true; - } - } - - @SuppressWarnings( "unused" ) - private void testValidateVal() { - log( "\n--\tSTART TEST\t--\n" ); - assertTrue( validateVal( "0", "BOOLEAN" ) ); - assertTrue( validateVal( "1", "BOOLEAN" ) ); - assertTrue( validateVal( "true", "BOOLEAN" ) ); - assertTrue( validateVal( "false", "BOOLEAN" ) ); - assertTrue( !validateVal( "2", "BOOLEAN" ) ); - assertTrue( !validateVal( "-1", "BOOLEAN" ) ); - assertTrue( !validateVal( "string", "BOOLEAN" ) ); - log( "" ); - assertTrue( validateVal( "1", "INT8" ) ); - assertTrue( validateVal( "0", "INT8" ) ); - assertTrue( validateVal( "-1", "INT8" ) ); - assertTrue( validateVal( "127", "INT8" ) ); - assertTrue( validateVal( "-128", "INT8" ) ); - assertTrue( !validateVal( "128", "INT8" ) ); - assertTrue( !validateVal( "-129", "INT8" ) ); - assertTrue( !validateVal( "string", "INT8" ) ); - assertTrue( !validateVal( "22.2", "INT8" ) ); - log( "" ); - assertTrue( validateVal( "32767", "INT16" ) ); - assertTrue( validateVal( "-32768", "INT16" ) ); - assertTrue( !validateVal( "32768", "INT16" ) ); - assertTrue( !validateVal( "-32769", "INT16" ) ); - log( "" ); - assertTrue( validateVal( Integer.toString( Integer.MAX_VALUE ), "INT32" ) ); - assertTrue( validateVal( Integer.toString( Integer.MIN_VALUE ), "INT32" ) ); - assertTrue( !validateVal( "2147483648", "INT32" ) ); - assertTrue( !validateVal( "-2147483649", "INT32" ) ); - log( "" ); - assertTrue( validateVal( Long.toString( Long.MAX_VALUE ), "INT64" ) ); - assertTrue( validateVal( Long.toString( Long.MIN_VALUE ), "INT64" ) ); - assertTrue( !validateVal( "9223372036854775808", "INT64" ) ); - assertTrue( !validateVal( "-9223372036854775809", "INT64" ) ); - log( "" ); - assertTrue( validateVal( "0", "INT8U" ) ); - assertTrue( validateVal( "255", "INT8U" ) ); - assertTrue( !validateVal( "256", "INT8U" ) ); - assertTrue( !validateVal( "-1", "INT8U" ) ); - assertTrue( !validateVal( "-2", "INT8U" ) ); - log( "" ); - assertTrue( validateVal( "0", "INT16U" ) ); - assertTrue( validateVal( "65535", "INT16U" ) ); - assertTrue( !validateVal( "65536", "INT16U" ) ); - assertTrue( !validateVal( "-1", "INT16U" ) ); - assertTrue( !validateVal( "-2", "INT16U" ) ); - log( "" ); - assertTrue( validateVal( "0", "INT32U" ) ); - assertTrue( validateVal( "4294967295", "INT32U" ) ); - assertTrue( !validateVal( "4294967296", "INT32U" ) ); - assertTrue( !validateVal( "-1", "INT32U" ) ); - assertTrue( !validateVal( "-2", "INT32U" ) ); - log( "" ); - assertTrue( validateVal( "0.0", "FLOAT32" ) ); - assertTrue( validateVal( "1.2345", "FLOAT32" ) ); - assertTrue( validateVal( "-1.2345", "FLOAT32" ) ); - assertTrue( validateVal( "100", "FLOAT32" ) ); - assertTrue( validateVal( Float.toString( Float.MAX_VALUE ), "FLOAT32" ) ); - assertTrue( validateVal( Float.toString( -Float.MAX_VALUE ), "FLOAT32" ) ); - assertTrue( !validateVal( "3.4028236E38", "FLOAT32" ) ); - assertTrue( !validateVal( "-3.4028236E38", "FLOAT32" ) ); - assertTrue( !validateVal( "string", "FLOAT32" ) ); - log( "" ); - assertTrue( validateVal( "1234567890123456789012345678901234567890123456789012345678901234", "Octet64" ) ); - assertTrue( !validateVal( "12345678901234567890123456789012345678901234567890123456789012345", "Octet64" ) ); - log( "" ); - assertTrue( validateVal( "1234567890123456789012345678901234567890123456789012345678901234", "VisString64" ) ); - assertTrue( - !validateVal( "12345678901234567890123456789012345678901234567890123456789012345", "VisString64" ) ); - log( "" ); - assertTrue( validateVal( "1234567890123456789012345678901234567890123456789012345678901234" - + "12345678901234567890123456789012345678901234567890123456789012345", "VisString129" ) ); - assertTrue( !validateVal( "1234567890123456789012345678901234567890123456789012345678901234" - + "123456789012345678901234567890123456789012345678901234567890123456", "VisString129" ) ); - log( "" ); - assertTrue( validateVal( "1234567890123456789012345678901234567890123456789012345678901234" - + "1234567890123456789012345678901234567890123456789012345678901234" - + "1234567890123456789012345678901234567890123456789012345678901234" - + "123456789012345678901234567890123456789012345678901234567890123", "VisString255" ) ); - assertTrue( !validateVal( "1234567890123456789012345678901234567890123456789012345678901234" - + "1234567890123456789012345678901234567890123456789012345678901234" - + "1234567890123456789012345678901234567890123456789012345678901234" - + "1234567890123456789012345678901234567890123456789012345678901234", "VisString255" ) ); - } - - private void assertTrue( Boolean b ) { - if( b ) { - log( "Check" ); - } - else { - log( "Error" ); - } - } - - private 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/nsd/DOValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DOValidator.java deleted file mode 100644 index 0f32968..0000000 --- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DOValidator.java +++ /dev/null @@ -1,145 +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.nsd; - -import java.util.HashMap; -import java.util.HashSet; - -import org.eclipse.emf.common.util.BasicDiagnostic; -import org.eclipse.emf.common.util.Diagnostic; -import org.eclipse.emf.common.util.DiagnosticChain; - -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.CDC; -import fr.centralesupelec.edf.riseclipse.iec61850.nsd.DataAttribute; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.DA; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.DO; -import fr.centralesupelec.edf.riseclipse.iec61850.scl.validator.RiseClipseValidatorSCL; -import fr.centralesupelec.edf.riseclipse.util.AbstractRiseClipseConsole; - -public class DOValidator { - - private String cdcName; - private HashMap< String, DataAttribute > dataAttributeMap; - - public DOValidator( CDC cdc ) { - this.cdcName = cdc.getName(); - this.dataAttributeMap = new HashMap<>(); // link between DAI (name) and its respective DataAttribute - - for( DataAttribute da : cdc.getDataAttribute() ) { - this.dataAttributeMap.put( da.getName(), da ); - } - } - - public boolean validateDO( DO do_, DiagnosticChain diagnostics ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] validateDO( " + do_.getName() + " )" ); - boolean res = true; - HashSet< String > checkedDA = new HashSet<>(); - - if( do_.getRefersToDOType() == null ) { - AbstractRiseClipseConsole.getConsole().warning( "[NSD] validateDO: DO " + do_.getName() + " has no RefersToDOType" ); - } - else { - for( DA da : do_.getRefersToDOType().getDA() ) { - AbstractRiseClipseConsole.getConsole().verbose( "[NSD] validateDO on DA " + da.getName() + " (line " + da.getLineNumber() + ")" ); - - // Test if DA is a possible DA in this DO - if( ! dataAttributeMap.containsKey( da.getName() ) ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DA " + da.getName() + " (line " + da.getLineNumber() + ") not found in CDC", - new Object[] { do_, cdcName } )); - res = false; - continue; - } - - // Control of DAI presence in DO - updateCompulsory( da, checkedDA, diagnostics ); - } - } - - // Verify all necessary DA were present - if( ! dataAttributeMap.values().stream() - .map( x -> checkCompulsory( do_, x, checkedDA, diagnostics ) ) - .reduce( ( a, b ) -> a && b ).get() ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DO (line " + do_.getLineNumber() + ") does not contain all mandatory DA from CDC", - new Object[] { do_, cdcName } )); - res = false; - } - return res; - } - - public boolean checkCompulsory( DO do_, DataAttribute da, HashSet< String > checked, DiagnosticChain diagnostics ) { - switch( da.getPresCond() ) { - case "M": - if( ! checked.contains( da.getName() )) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DA " + da.getName() + " not found in DO (line " + do_.getLineNumber() + ")", - new Object[] { da } )); - return false; - } - break; - default: - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: DOValidator.checkCompulsory( presCond: " + da.getPresCond() + " )" ); - break; - } - return true; - } - - public boolean updateCompulsory( DA da, HashSet< String > checked, DiagnosticChain diagnostics ) { - switch( dataAttributeMap.get( da.getName() ).getPresCond() ) { - case "M": - case "O": - if( checked.contains( da.getName() ) ) { - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DA " + da.getName() + " (line " + da.getLineNumber() + ") cannot appear more than once", - new Object[] { da } )); - return false; - } - else { - checked.add( da.getName() ); - break; - } - case "F": - diagnostics.add( new BasicDiagnostic( - Diagnostic.ERROR, - RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, - 0, - "[NSD] DA " + da.getName() + " (line " + da.getLineNumber() + ") is forbidden", - new Object[] { da } )); - return false; - default: - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: DOValidator.updateCompulsory( presCond: " + dataAttributeMap.get( da.getName() ).getPresCond() + " )" ); - break; - } - return true; - } - -} -- GitLab