From 02d9b6008712d39dafd89f6e0fe4e5c1ae96be3a Mon Sep 17 00:00:00 2001 From: Dominique Marcadet <Dominique.Marcadet@centralesupelec.fr> Date: Mon, 1 Apr 2019 09:19:07 +0200 Subject: [PATCH] display line numbers in messages --- .../scl/validator/AnyLNValidator.java | 44 +++++++++---------- .../iec61850/scl/validator/DOIValidator.java | 33 +++++++------- .../scl/validator/NsdEObjectValidator.java | 10 ++--- 3 files changed, 43 insertions(+), 44 deletions(-) diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/AnyLNValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/AnyLNValidator.java index 0dc3cd0..62b539d 100644 --- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/AnyLNValidator.java +++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/AnyLNValidator.java @@ -43,6 +43,7 @@ public class AnyLNValidator { this.lnClass = lnClass.getName(); this.doMap = new HashMap<>(); // link between DOI (name) and its respective DataObject this.cdcMap = new HashMap<>(); // link between CDC (name) and its respective DOIValidator + generateValidators( doMap, cdcMap, lnClass ); // LNClass hierarchy taken into account @@ -56,10 +57,10 @@ public class AnyLNValidator { public void generateValidators( HashMap< String, DataObject > doMap, HashMap< String, DOIValidator > cdcMap, AnyLNClass lnClass ) { for( DataObject dObj : lnClass.getDataObject() ) { - this.doMap.put( dObj.getName(), dObj ); + doMap.put( dObj.getName(), dObj ); if( dObj.getRefersToCDC() != null ) { if( ! cdcMap.containsKey( dObj.getRefersToCDC().getName() )) { - this.cdcMap.put( dObj.getRefersToCDC().getName(), new DOIValidator( dObj.getRefersToCDC() )); + cdcMap.put( dObj.getRefersToCDC().getName(), new DOIValidator( dObj.getRefersToCDC() )); } } } @@ -74,19 +75,18 @@ public class AnyLNValidator { AbstractRiseClipseConsole.getConsole().verbose( "validateDOI( " + doi.getName() + " )" ); // Test if DOI is a possible DOI in this LN - if( ! this.doMap.containsKey( doi.getName() ) ) { + if( ! doMap.containsKey( doi.getName() ) ) { diagnostics.add( new BasicDiagnostic( Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DO " + doi.getName() + " not found in LNClass " + ln.getLnClass(), + "DO " + doi.getName() + " in LN at line " + ln.getLineNumber() + " not found in LNClass " + ln.getLnClass(), new Object[] { ln } )); continue; } // Control of DOI presence in LN - String presCond = this.doMap.get( doi.getName() ).getPresCond(); - this.updateCompulsory( doi, presCond, checkedDO, diagnostics ); + updateCompulsory( doi, checkedDO, diagnostics ); // Validation of DOI content if( ! validateDOI( doi, diagnostics ) ) { @@ -96,29 +96,29 @@ public class AnyLNValidator { } // Verify all necessary DOI were present - if( ! this.doMap.entrySet().stream() - .map( x -> checkCompulsory( ln, x.getKey(), x.getValue().getPresCond(), checkedDO, diagnostics )) + if( ! doMap.values().stream() + .map( x -> checkCompulsory( ln, x, checkedDO, diagnostics )) .reduce( ( a, b ) -> a && b ).get() ) { diagnostics.add( new BasicDiagnostic( Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "LN does not contain all mandatory DO from class " + ln.getLnClass(), + "LN at line " + ln.getLineNumber() + " does not contain all mandatory DO from class " + ln.getLnClass(), new Object[] { ln } )); res = false; } return res; } - public boolean checkCompulsory( AnyLN ln, String name, String presCond, HashSet< String > checkedDO, DiagnosticChain diagnostics ) { - switch( presCond ) { + public boolean checkCompulsory( AnyLN ln, DataObject dataObject, HashSet< String > checkedDO, DiagnosticChain diagnostics ) { + switch( dataObject.getPresCond() ) { case "M": - if( ! checkedDO.contains( name ) ) { + if( ! checkedDO.contains( dataObject.getName() ) ) { diagnostics.add( new BasicDiagnostic( Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DO " + name + " is missing", + "DO " + dataObject.getName() + " is missing in LN at line " + ln.getLineNumber(), new Object[] { ln } )); return false; } @@ -126,8 +126,8 @@ public class AnyLNValidator { return true; } - public boolean updateCompulsory( DOI doi, String presCond, HashSet< String > checkedDO, DiagnosticChain diagnostics ) { - switch( presCond ) { + public boolean updateCompulsory( DOI doi, HashSet< String > checkedDO, DiagnosticChain diagnostics ) { + switch( doMap.get( doi.getName() ).getPresCond() ) { case "M": case "O": if( checkedDO.contains( doi.getName() )) { @@ -135,20 +135,18 @@ public class AnyLNValidator { Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DO " + doi + " cannot appear more than once", + "DO " + doi + " cannot appear more than once in LN at line " + doi.getAnyLN().getLineNumber(), new Object[] { doi } )); return false; } - else { - checkedDO.add( doi.getName() ); - break; - } + checkedDO.add( doi.getName() ); + break; case "F": diagnostics.add( new BasicDiagnostic( Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DO " + doi + " is forbidden", + "DO " + doi + " is forbidden in LN at line " + doi.getAnyLN().getLineNumber(), new Object[] { doi } )); return false; } @@ -157,10 +155,10 @@ public class AnyLNValidator { public boolean validateDOI( DOI doi, DiagnosticChain diagnostics ) { - AbstractRiseClipseConsole.getConsole().verbose( "found DO " + doi.getName() + " in LNClass " + this.lnClass ); + AbstractRiseClipseConsole.getConsole().verbose( "found DO " + doi.getName() + " in LNClass " + lnClass ); // DOIValidator validates DOI content - String cdc = this.doMap.get( doi.getName() ).getRefersToCDC().getName(); + String cdc = doMap.get( doi.getName() ).getRefersToCDC().getName(); return cdcMap.get( cdc ).validateDOI( doi, diagnostics ); } diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java index 9b17fba..7f0d306 100644 --- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java +++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java @@ -40,6 +40,7 @@ public class DOIValidator { public DOIValidator( CDC cdc ) { this.cdc = cdc.getName(); this.daMap = new HashMap<>(); // link between DAI (name) and its respective DataAttribute + for( DataAttribute da : cdc.getDataAttribute() ) { this.daMap.put( da.getName(), da ); } @@ -50,22 +51,22 @@ public class DOIValidator { HashSet< String > checkedDA = new HashSet<>(); for( DAI dai : doi.getDAI() ) { - AbstractRiseClipseConsole.getConsole().verbose( "validateDAI( " + dai.getName() + " )" ); + AbstractRiseClipseConsole.getConsole().verbose( "validateDAI( " + dai.getName() + " ) (line" + dai.getLineNumber() + ")" ); // Test if DAI is a possible DAI in this DOI - if( ! this.daMap.containsKey( dai.getName() ) ) { + if( ! daMap.containsKey( dai.getName() ) ) { diagnostics.add( new BasicDiagnostic( Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DA " + dai.getName() + " not found in CDC", + "DAI " + dai.getName() + " (line" + dai.getLineNumber() + ") not found in CDC", new Object[] { doi, cdc } )); res = false; continue; } // Control of DAI presence in DOI - this.updateCompulsory( dai, checkedDA, diagnostics ); + updateCompulsory( dai, checkedDA, diagnostics ); // Validation of DAI content if( ! validateDAI( dai, diagnostics ) ) { @@ -75,21 +76,21 @@ public class DOIValidator { } // Verify all necessary DAI were present - if( ! this.daMap.values().stream() - .map( x -> checkCompulsory( x, checkedDA, diagnostics ) ) + if( ! daMap.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, - "DO does not contain all mandatory DA from CDC ", + "DOI (line " + doi.getLineNumber() + ") does not contain all mandatory DA from CDC ", new Object[] { doi, cdc } )); res = false; } return res; } - public boolean checkCompulsory( DataAttribute da, HashSet< String > checked, DiagnosticChain diagnostics ) { + public boolean checkCompulsory( DOI doi, DataAttribute da, HashSet< String > checked, DiagnosticChain diagnostics ) { switch( da.getPresCond() ) { case "M": if( ! checked.contains( da.getName() )) { @@ -97,7 +98,7 @@ public class DOIValidator { Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DA " + da.getName() + " not found in CDC", + "DA " + da.getName() + " not found in DOI (line " + doi.getLineNumber() + ")", new Object[] { da } )); return false; } @@ -106,7 +107,7 @@ public class DOIValidator { } public boolean updateCompulsory( DAI dai, HashSet< String > checked, DiagnosticChain diagnostics ) { - switch( this.daMap.get( dai.getName() ).getPresCond() ) { + switch( daMap.get( dai.getName() ).getPresCond() ) { case "M": case "O": if( checked.contains( dai.getName() ) ) { @@ -114,7 +115,7 @@ public class DOIValidator { Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DA " + dai.getName() + " cannot appear more than once", + "DAI " + dai.getName() + " (line " + dai.getLineNumber() + ") cannot appear more than once", new Object[] { dai } )); return false; } @@ -127,7 +128,7 @@ public class DOIValidator { Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "DA " + dai.getName() + " is forbidden", + "DAI " + dai.getName() + " (line " + dai.getLineNumber() + ") is forbidden", new Object[] { dai } )); return false; } @@ -136,10 +137,10 @@ public class DOIValidator { public boolean validateDAI( DAI dai, DiagnosticChain diagnostics ) { - AbstractRiseClipseConsole.getConsole().verbose( "found DA " + dai.getName() + " in CDC " + this.cdc ); + AbstractRiseClipseConsole.getConsole().verbose( "found DA " + dai.getName() + " in CDC " + cdc ); // DataAttributes that are BASIC have a BasicType which describes allowed Val of DA - DataAttribute da = this.daMap.get( dai.getName() ); + DataAttribute da = daMap.get( dai.getName() ); if( da.getTypeKind().getName().equals( "BASIC" ) ) { for( Val val : dai.getVal() ) { if( ! validateVal( val.getValue(), da.getType() )) { @@ -147,11 +148,11 @@ public class DOIValidator { Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "Val " + val.getValue() + " of DA " + dai.getName() + " is not of type " + da.getType(), + "Val " + val.getValue() + " (" + dai.getLineNumber() + ") of DA " + dai.getName() + " is not of type " + da.getType(), new Object[] { dai, val } )); return false; } - AbstractRiseClipseConsole.getConsole().verbose( "Val " + val.getValue() + " of DA " + dai.getName() + + AbstractRiseClipseConsole.getConsole().verbose( "Val " + val.getValue() + " (" + dai.getLineNumber() + ") of DA " + dai.getName() + " is of type " + da.getType() ); } } 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 index 6f1c803..fa2ef5e 100644 --- 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 @@ -75,14 +75,14 @@ public class NsdEObjectValidator implements EValidator { AnyLN ln = ( AnyLN ) eObject; return validateLN( ln, diagnostics ); default: - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: NSDEObjectValidator.validate( " + eClass.getName() + " )" ); + AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: NsdEObjectValidator.validate( " + eClass.getName() + " )" ); return false; } } @Override public boolean validate( EDataType eDataType, Object value, DiagnosticChain diagnostics, Map< Object, Object > context ) { - AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: NSDEObjectValidator.validate( " + eDataType.getName() +" )" ); + AbstractRiseClipseConsole.getConsole().info( "NOT IMPLEMENTED: NsdEObjectValidator.validate( " + eDataType.getName() + " )" ); // TODO: use nsdResource to validate value @@ -91,7 +91,7 @@ public class NsdEObjectValidator implements EValidator { public boolean validateLN( AnyLN ln, DiagnosticChain diagnostics ) { AbstractRiseClipseConsole.getConsole().verbose( "" ); - AbstractRiseClipseConsole.getConsole().verbose( "NSDEObjectValidator.validateLN( " + ln.getLnClass() + " )" ); + AbstractRiseClipseConsole.getConsole().verbose( "NsdEObjectValidator.validateLN( " + ln.getLnClass() + " )" ); // Check that LN has valid LNClass if( ! this.lnMap.containsKey( ln.getLnClass() )) { @@ -99,11 +99,11 @@ public class NsdEObjectValidator implements EValidator { Diagnostic.ERROR, RiseClipseValidatorSCL.DIAGNOSTIC_SOURCE, 0, - "LNClass " + ln.getLnClass() + " not found in NSD files", + "LNClass " + ln.getLnClass() + " not found in NSD files for LN at line " + ln.getLineNumber(), new Object[] { ln } )); return false; } - AbstractRiseClipseConsole.getConsole().verbose( "found LNClass " + ln.getLnClass() + " in NSD files" ); + AbstractRiseClipseConsole.getConsole().verbose( "found LNClass " + ln.getLnClass() + " in NSD files for LN at line " + ln.getLineNumber() ); // AnyLNValidator validates LN content return lnMap.get( ln.getLnClass() ).validateLN( ln, diagnostics ); -- GitLab