diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java index 86aba5cafab1e68e8b43da70367e835033a3b2cf..639b358dd550b8a8be2bb9b8189a709b6879637b 100644 --- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java +++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.validator/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/nsd/DataObjectPresenceConditionValidator.java @@ -142,6 +142,10 @@ public class DataObjectPresenceConditionValidator { // and duplicate it in each sub-LNClass for adding specific elements if( base == null ) { atLeastOne = new HashMap<>(); + atMostOne = new HashSet<>(); + allOrNonePerGroup = new HashMap<>(); + allOnlyOneGroup = new HashMap<>(); + allAtLeastOneGroup = new HashMap<>(); } else { atLeastOne = ( HashMap< Integer, HashSet< String > > ) base.atLeastOne.clone(); @@ -152,6 +156,31 @@ public class DataObjectPresenceConditionValidator { } } + atMostOne = ( HashSet< String > ) base.atMostOne.clone(); + for( String name : atMostOne ) { + presentDO.put( name, null ); + } + + allOrNonePerGroup = ( HashMap< Integer, HashSet< String > > ) base.allOrNonePerGroup.clone(); + for( Integer group : allOrNonePerGroup.keySet() ) { + for( String name : allOrNonePerGroup.get( group )) { + presentDO.put( name, null ); + } + } + + allOnlyOneGroup = ( HashMap< Integer, HashSet< String > > ) base.allOnlyOneGroup.clone(); + for( Integer group : allOnlyOneGroup.keySet() ) { + for( String name : allOnlyOneGroup.get( group )) { + presentDO.put( name, null ); + } + } + + allAtLeastOneGroup = ( HashMap< Integer, HashSet< String > > ) base.allAtLeastOneGroup.clone(); + for( Integer group : allAtLeastOneGroup.keySet() ) { + for( String name : allAtLeastOneGroup.get( group )) { + presentDO.put( name, null ); + } + } } anyLNClass @@ -235,13 +264,13 @@ public class DataObjectPresenceConditionValidator { } case "AtMostOne" : // At most one of marked elements shall be present - if( atMostOne == null ) atMostOne = new HashSet<>(); + //if( atMostOne == null ) atMostOne = new HashSet<>(); atMostOne.add( name ); break; case "AllOrNonePerGroup" : // Parameter n: group number (> 0). // All or none of the elements of a group n shall be present - if( allOrNonePerGroup == null ) allOrNonePerGroup = new HashMap<>(); + //if( allOrNonePerGroup == null ) allOrNonePerGroup = new HashMap<>(); try { Integer arg = Integer.valueOf( presCondArgs ); if( arg <= 0 ) { @@ -261,7 +290,7 @@ public class DataObjectPresenceConditionValidator { case "AllOnlyOneGroup" : // Parameter n: group number (> 0). // All elements of only one group n shall be present - if( allOnlyOneGroup == null ) allOnlyOneGroup = new HashMap<>(); + //if( allOnlyOneGroup == null ) allOnlyOneGroup = new HashMap<>(); try { Integer arg = Integer.valueOf( presCondArgs ); if( arg <= 0 ) { @@ -281,7 +310,7 @@ public class DataObjectPresenceConditionValidator { case "AllAtLeastOneGroup" : // Parameter n: group number (> 0). // All elements of at least one group n shall be present - if( allAtLeastOneGroup == null ) allAtLeastOneGroup = new HashMap<>(); + //if( allAtLeastOneGroup == null ) allAtLeastOneGroup = new HashMap<>(); try { Integer arg = Integer.valueOf( presCondArgs ); if( arg <= 0 ) { @@ -860,6 +889,7 @@ public class DataObjectPresenceConditionValidator { // Parameter n: group number (> 0). // At least one of marked elements of a group n shall be present // Usage in standard NSD files (version 2007B): DataObject and SubDataObject and DataAttribute and SubDataAttribute + //if( atLeastOne != null ) { if( ! asSuperclass ) { AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AtLeastOne\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() ); for( Entry< Integer, HashSet< String > > e1 : atLeastOne.entrySet() ) { @@ -885,7 +915,8 @@ public class DataObjectPresenceConditionValidator { // presCond: "AtMostOne" : // At most one of marked elements shall be present // Usage in standard NSD files (version 2007B): DataObject - if( atMostOne != null ) { + //if( atMostOne != null ) { + if( ! asSuperclass ) { AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AtMostOne\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() ); int count = 0; for( String s : atMostOne ) { @@ -908,7 +939,8 @@ public class DataObjectPresenceConditionValidator { // Parameter n: group number (> 0). // All or none of the elements of a group n shall be present // Usage in standard NSD files (version 2007B): DataAttribute - if( allOrNonePerGroup != null ) { + //if( allOrNonePerGroup != null ) { + if( ! asSuperclass ) { AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AllOrNonePerGroup\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() ); for( Entry< Integer, HashSet< String > > e1 : allOrNonePerGroup.entrySet() ) { int groupCount = 0; @@ -933,7 +965,8 @@ public class DataObjectPresenceConditionValidator { // Parameter n: group number (> 0). // All elements of only one group n shall be present // Usage in standard NSD files (version 2007B): DataObject and SubDataAttribute - if( allOnlyOneGroup != null ) { + //if( allOnlyOneGroup != null ) { + if(( ! asSuperclass ) && ( allOnlyOneGroup.size() != 0 )) { // groupNumber == 0 not an error if empty AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AllOnlyOneGroup\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() ); int groupNumber = 0; for( Entry< Integer, HashSet< String > > e1 : allOnlyOneGroup.entrySet() ) { @@ -982,7 +1015,8 @@ public class DataObjectPresenceConditionValidator { // Parameter n: group number (> 0). // All elements of at least one group n shall be present // Usage in standard NSD files (version 2007B): DataAttribute - if( allAtLeastOneGroup != null ) { + //if( allAtLeastOneGroup != null ) { + if(( ! asSuperclass ) && ( allAtLeastOneGroup.size() != 0 )) { // groupNumber == 0 not an error if empty AbstractRiseClipseConsole.getConsole().verbose( "[NSD validation] validation of presence condition \"AllAtLeastOneGroup\" on LNodeType (id=" + lNodeType.getId() + ") at line " + lNodeType.getLineNumber() ); int groupNumber = 0; for( Entry< Integer, HashSet< String > > e1 : allAtLeastOneGroup.entrySet() ) {