44
55package org .lfenergy .compas .sct .commons .scl .dtt ;
66
7+ import lombok .Getter ;
8+ import lombok .RequiredArgsConstructor ;
79import lombok .extern .slf4j .Slf4j ;
810import org .lfenergy .compas .scl2007b4 .model .*;
9- import org .lfenergy .compas .sct .commons .dto .DaTypeName ;
1011import org .lfenergy .compas .sct .commons .dto .DoTypeName ;
1112import org .lfenergy .compas .sct .commons .dto .ExtRefBindingInfo ;
1213import org .lfenergy .compas .sct .commons .dto .ExtRefSignalInfo ;
@@ -214,10 +215,7 @@ public void importEnumType(String thisIEDName, DataTypeTemplateAdapter prvDttAda
214215 String newEnumId = prvEnumType .getId ();
215216 Optional <EnumTypeAdapter > opRcvEnumTypeAdapter = this .getEnumTypeAdapterById (oldEnumId );
216217
217- boolean isImportable = false ;
218- if (!opRcvEnumTypeAdapter .isPresent () || !opRcvEnumTypeAdapter .get ().hasSameContentAs (prvEnumType )) {
219- isImportable = true ;
220- }
218+ boolean isImportable = opRcvEnumTypeAdapter .isEmpty () || !opRcvEnumTypeAdapter .get ().hasSameContentAs (prvEnumType );
221219
222220 if (isImportable && opRcvEnumTypeAdapter .isPresent ()){
223221 // same ID, different content
@@ -235,10 +233,10 @@ public void importEnumType(String thisIEDName, DataTypeTemplateAdapter prvDttAda
235233 }
236234 }
237235
238- // escalate on this DTT
236+ // escalate on this DTT and update all element linked to added EnumType
239237 pairOldAndNewEnumId .forEach ((oldId , newId ) -> {
240238 List <DATypeAdapter > daTypeAdapters = prvDttAdapter .findDATypesWhichBdaContainsEnumTypeId (oldId );
241- var bdas = daTypeAdapters .stream ()
239+ List < TBDA > bdas = daTypeAdapters .stream ()
242240 .map (DATypeAdapter ::getBdaAdapters )
243241 .flatMap (Collection ::stream )
244242 .map (DATypeAdapter .BDAAdapter ::getCurrentElem )
@@ -247,7 +245,7 @@ public void importEnumType(String thisIEDName, DataTypeTemplateAdapter prvDttAda
247245 .collect (Collectors .toList ());
248246 bdas .forEach (tbda -> tbda .setType (newId ));
249247 List <DOTypeAdapter > doTypeAdapters = prvDttAdapter .findDOTypesWhichDAContainsEnumTypeId (oldId );
250- var tdas = doTypeAdapters .stream ()
248+ List < TDA > tdas = doTypeAdapters .stream ()
251249 .map (doTypeAdapter -> retrieveSdoOrDA (doTypeAdapter .getCurrentElem ().getSDOOrDA (), TDA .class ))
252250 .flatMap (Collection ::stream )
253251 .filter (tda -> TPredefinedBasicTypeEnum .ENUM == tda .getBType ()
@@ -549,9 +547,7 @@ protected List<LNodeTypeAdapter> findLNodeTypesFromDoWithDoTypeId(String doTypeI
549547 */
550548 protected String generateDttId (String iedName ,String dttId ){
551549 final int MAX_LENGTH = 255 ;
552- StringBuilder stringBuilder = new StringBuilder ();
553- stringBuilder .append (iedName ).append ("_" ).append (dttId );
554- String str = stringBuilder .toString ();
550+ String str = iedName + "_" + dttId ;
555551 return str .length () <= MAX_LENGTH ? str : str .substring (0 ,MAX_LENGTH );
556552 }
557553
@@ -563,80 +559,35 @@ protected String generateDttId(String iedName,String dttId){
563559 * @throws ScdException
564560 */
565561 public ExtRefBindingInfo getBinderResumedDTT (String lnType , ExtRefSignalInfo signalInfo ) throws ScdException {
566-
567562 ExtRefBindingInfo binder = new ExtRefBindingInfo ();
568-
569563 // LNodeType check
570564 LNodeTypeAdapter lNodeTypeAdapter = getLNodeTypeAdapterById (lnType )
571- .orElseThrow (()-> new ScdException ("Unknown LNodeType:" + lnType ));
565+ .orElseThrow (() -> new ScdException ("Unknown LNodeType:" + lnType ));
572566 if (lNodeTypeAdapter .getLNClass () == null ){
573567 log .error ("Mandatory lnClass is missing in DTT. This should not happen for valid SCD" );
574- throw new IllegalArgumentException ("lnClass is mandatory for LNodeType in DataTemplate: " + lnType );
568+ throw new IllegalArgumentException ("lnClass is mandatory for LNodeType in DataTemplate : " + lnType );
575569 }
576-
577570 binder .setLnType (lnType );
578571 binder .setLnClass (lNodeTypeAdapter .getLNClass ());
579-
580- if (signalInfo .getPDO () == null ) {
572+ if (signalInfo .getPDO () == null ) {
581573 return binder ;
582574 }
583575 // DoType check
584- DoTypeName doName = new DoTypeName (signalInfo .getPDO ());
585- String extDoName = doName .getName ();
586- String doTypeId = lNodeTypeAdapter .getDOTypeId (extDoName )
587- .orElseThrow (() ->new ScdException ("Unknown doName :" + signalInfo .getPDO ()));
588-
589- DOTypeAdapter doTypeAdapter = getDOTypeAdapterById (doTypeId )
590- .orElseThrow (
591- () -> new IllegalArgumentException (
592- String .format ("%s: No referenced to DO id : %s" , doName , doTypeId )
593- )
594- );
595-
596- //doTypeAdapter.completeStructuredData(doName);
597- doTypeAdapter .checkAndCompleteStructData (doName );
598- binder .setDoName (doName );
599-
600- if (signalInfo .getPDA () == null ){
576+ DOTypeInfo doTypeInfo = lNodeTypeAdapter .findMatchingDOType (signalInfo );
577+ binder .setDoName (new DoTypeName (signalInfo .getPDO ()));
578+ if (signalInfo .getPDA () == null ) {
601579 return binder ;
602580 }
603-
604581 // DaType check
605- DaTypeName daName = new DaTypeName (signalInfo .getPDA ());
606- String extDaName = daName .getName ();
607- DOTypeAdapter lastDoTypeAdapter = doTypeAdapter ;
608- if (!doTypeAdapter .containsDAWithDAName (extDaName )){
609- var pair = doTypeAdapter .findPathDoType2DA (extDaName );
610- lastDoTypeAdapter = pair .getValue ();
611- }
612-
613- TDA da = lastDoTypeAdapter .getDAByName (extDaName )
614- .orElseThrow (
615- ()-> new ScdException (
616- String .format ("%s: Unknown DA (%s) in DOType (%s) " , doName , extDaName , doTypeId )
617- )
618- );
619- if (da .getBType () != TPredefinedBasicTypeEnum .STRUCT && !daName .getStructNames ().isEmpty () ){
620- throw new ScdException (
621- String .format (
622- "Invalid ExtRef signal: no coherence between pDO(%s) and pDA(%s)" ,
623- signalInfo .getPDO (),signalInfo .getPDA ()
624- )
625- );
626- }
627-
628- if (da .getBType () == TPredefinedBasicTypeEnum .STRUCT && !daName .getStructNames ().isEmpty ()){
629- String daTypeId = da .getType ();
630- DATypeAdapter daTypeAdapter = getDATypeAdapterById (daTypeId )
631- .orElseThrow (
632- () -> new IllegalArgumentException (
633- String .format ("%s: Unknown DA (%s), or no reference to its type" , daName , extDaName )
634- )
635- );
636- daTypeAdapter .check (daName );
637- daName .setFc (da .getFc ());
638- binder .setDaName (daName );
639- }
582+ binder .updateDAInfos (signalInfo , doTypeInfo );
640583 return binder ;
641584 }
585+
586+ @ RequiredArgsConstructor
587+ @ Getter
588+ public static class DOTypeInfo {
589+ private final DoTypeName doTypeName ;
590+ private final String doTypeId ;
591+ private final DOTypeAdapter doTypeAdapter ;
592+ }
642593}
0 commit comments