diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoTypeService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoTypeService.java index df3337d52..b1b3708f8 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoTypeService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoTypeService.java @@ -6,10 +6,8 @@ import org.lfenergy.compas.scl2007b4.model.*; import org.lfenergy.compas.sct.commons.dto.DataAttributeRef; -import org.lfenergy.compas.sct.commons.dto.DataTypeName; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -17,7 +15,6 @@ public class DoTypeService { - final SDOOrDAService sdoOrDAService = new SDOOrDAService(); final DaTypeService daTypeService = new DaTypeService(); public Stream getDoTypes(TDataTypeTemplates tDataTypeTemplates) { @@ -32,99 +29,105 @@ public Optional findDoType(TDataTypeTemplates tDataTypeTemplates, Predi return getFilteredDoTypes(tDataTypeTemplates, tdoTypePredicate).findFirst(); } - public List getDataAttributeRefs(TDataTypeTemplates dtt, - TDOType tdoType, - DataAttributeRef dataRef) { + public List getDataAttributeRefs(TDataTypeTemplates dtt, TDOType tdoType, DataAttributeRef dataRef) { List result = new ArrayList<>(); for (TUnNaming tUnNaming : tdoType.getSDOOrDA()) { + // clear struct data objects before processing each unNaming object dataRef.getDoName().getStructNames().clear(); if (tUnNaming.getClass() == TDA.class) { TDA tda = (TDA) tUnNaming; dataRef.getDaName().setName(tda.getName()); + if(tda.isSetFc()) dataRef.getDaName().setFc(tda.getFc()); if(tda.isSetType()) dataRef.getDaName().setType(tda.getType()); if(tda.isSetBType()) dataRef.getDaName().setBType(tda.getBType()); - DataAttributeRef currentDataRef = new DataAttributeRef(); - currentDataRef.setDoName(dataRef.getDoName()); - currentDataRef.setDaName(dataRef.getDaName()); + if(tda.isSetValImport()) dataRef.getDaName().setValImport(tda.isValImport()); + DataAttributeRef dataAttributeRef = new DataAttributeRef(); + dataAttributeRef.setDoName(dataRef.getDoName()); + dataAttributeRef.setDaName(dataRef.getDaName()); + + // STRUCT type (BType=STRUCT) refer to BDA, otherwise it is DA if(tda.isSetType() && tda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)) { daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(tda.getType())) - .ifPresent(tdaType1 -> result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType1, currentDataRef))); + .ifPresent(nextDaType -> result.addAll(getDataAttributesFromBDA(dtt, nextDaType, dataAttributeRef))); - } else { - result.add(currentDataRef); } + result.add(dataAttributeRef); } else { TSDO tsdo = (TSDO) tUnNaming; dataRef.getDoName().getStructNames().add(tsdo.getName()); - DataAttributeRef currentDataRef = new DataAttributeRef(); - currentDataRef.setDoName(dataRef.getDoName()); - currentDataRef.setDaName(dataRef.getDaName()); - List dataRefsSDO = findDoType(dtt, tdoType1 -> tdoType1.getId().equals(tsdo.getType())) - .stream() - .flatMap(tdoType2 -> getDataAttributeRefsRECSDOAndComplete(dtt, tdoType2, currentDataRef).stream()) - .toList(); - result.addAll(dataRefsSDO); + DataAttributeRef newDataObjectRef = new DataAttributeRef(); + newDataObjectRef.setDoName(dataRef.getDoName()); + newDataObjectRef.setDaName(dataRef.getDaName()); + + findDoType(dtt, tdoType1 -> tdoType1.getId().equals(tsdo.getType())) + .ifPresent(nextDoType -> { + if(nextDoType.isSetCdc()) newDataObjectRef.getDoName().setCdc(nextDoType.getCdc()); + result.addAll(getDataAttributeRefsFromSDO(dtt, nextDoType, newDataObjectRef)); + }); } } return result; } - private List getDataAttributeRefsRECSDOAndComplete(TDataTypeTemplates dtt, TDOType tdoType, DataAttributeRef deepDataRef) { + private List getDataAttributeRefsFromSDO(TDataTypeTemplates dtt, TDOType tdoType, DataAttributeRef dataObjectRef) { List result = new ArrayList<>(); + // DA -> BDA -> BDA.. + tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TDA.class)).map(TDA.class::cast).toList() + .forEach(subDa -> { + dataObjectRef.getDaName().setName(subDa.getName()); + if(subDa.isSetFc()) dataObjectRef.getDaName().setFc(subDa.getFc()); + if(subDa.isSetType()) dataObjectRef.getDaName().setType(subDa.getType()); + if(subDa.isSetBType()) dataObjectRef.getDaName().setBType(subDa.getBType()); + if(subDa.isSetValImport()) dataObjectRef.getDaName().setValImport(subDa.isValImport()); - // DA/BDA - List tdas = tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TDA.class)) - .map(TDA.class::cast).toList(); - tdas.forEach(subDa -> { - if(subDa.isSetType() && subDa.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)){ - daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(subDa.getType())) - .ifPresent(tdaType1 -> { - DataAttributeRef currentDataRef = new DataAttributeRef(); - currentDataRef.setDoName(deepDataRef.getDoName()); - currentDataRef.setDaName(deepDataRef.getDaName()); - currentDataRef.getDaName().setName(subDa.getName()); - result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType1, currentDataRef)); - }); - } else { - deepDataRef.getDaName().setName(subDa.getName()); - result.add(deepDataRef); - } - }); - // DO/SDO - List tsdos = tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TSDO.class)) - .map(TSDO.class::cast).toList(); - tsdos.forEach(subSdo -> { - deepDataRef.getDoName().getStructNames().add(subSdo.getName()); - if(subSdo.isSetType()){ - findDoType(dtt, tdoType1 -> tdoType1.getId().equals(subSdo.getType())) - .ifPresent(tdoType2 -> getDataAttributeRefsRECSDOAndComplete(dtt, tdoType2, deepDataRef)); - } - }); + // STRUCT type (BType=STRUCT) refer to BDA, otherwise it is DA + if(subDa.isSetType() && subDa.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)){ + daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(subDa.getType())) + .ifPresent(nextDaType -> result.addAll(getDataAttributesFromBDA(dtt, nextDaType, dataObjectRef))); + } else { + DataAttributeRef newDataAttributeRef = new DataAttributeRef(); + newDataAttributeRef.setDoName(dataObjectRef.getDoName()); + newDataAttributeRef.setDaName(dataObjectRef.getDaName()); + newDataAttributeRef.getDaName().setName(subDa.getName()); + result.add(newDataAttributeRef); + } + }); + // SDO -> SDO -> SDO.. + tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TSDO.class)).map(TSDO.class::cast) + .forEach(subSdo -> { + if(subSdo.isSetType()){ + dataObjectRef.getDoName().getStructNames().add(subSdo.getName()); + findDoType(dtt, tdoType1 -> tdoType1.getId().equals(subSdo.getType())) + .ifPresent(nextDoType -> { + if(nextDoType.isSetCdc()) dataObjectRef.getDoName().setCdc(nextDoType.getCdc()); + result.addAll(getDataAttributeRefsFromSDO(dtt, nextDoType, dataObjectRef)); + }); + } + }); return result; } - private List getDataAttributeRefsRECBDAAndComplete(TDataTypeTemplates dtt, TDAType tdaType1, - DataAttributeRef deepDaRef) { + private List getDataAttributesFromBDA(TDataTypeTemplates dtt, TDAType tdaType1, DataAttributeRef dataAttributeRef) { List result = new ArrayList<>(); + // BDA -> BDA -> BDA.. tdaType1.getBDA().forEach(bda -> { - if(bda.isSetType()) deepDaRef.getDaName().setType(bda.getType()); + if(bda.isSetType()) dataAttributeRef.getDaName().setType(bda.getType()); + if(bda.isSetBType()) dataAttributeRef.getDaName().setBType(bda.getBType()); + if(bda.isSetValImport()) dataAttributeRef.getDaName().setValImport(bda.isValImport()); + + // STRUCT type (BType=STRUCT) refer to complex BDA object, otherwise it is kind of DA object if(bda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)){ - DataAttributeRef currentDataRef = new DataAttributeRef(); - currentDataRef.setDoName(deepDaRef.getDoName()); - currentDataRef.setDaName(deepDaRef.getDaName()); - currentDataRef.getDaName().getStructNames().add(bda.getName()); + dataAttributeRef.getDaName().getStructNames().add(bda.getName()); daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(bda.getType())) - .ifPresent(tdaType2 -> result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType2, currentDataRef))); + .ifPresent(nextDaType -> result.addAll(getDataAttributesFromBDA(dtt, nextDaType, dataAttributeRef))); } else { - DataAttributeRef currentDataRef = new DataAttributeRef(); - currentDataRef.setDoName(deepDaRef.getDoName()); - currentDataRef.setDaName(deepDaRef.getDaName()); - currentDataRef.getDaName().getStructNames().add(bda.getName()); - result.add(currentDataRef); + DataAttributeRef newDataAttributeRef = new DataAttributeRef(); + newDataAttributeRef.setDoName(dataAttributeRef.getDoName()); + newDataAttributeRef.setDaName(dataAttributeRef.getDaName()); + newDataAttributeRef.getDaName().getStructNames().add(bda.getName()); + result.add(newDataAttributeRef); } }); return result; } - - } diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java index 304e47af8..dda0a81f6 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java @@ -331,6 +331,4 @@ private TSDI findOrCreateSDIByStructName(TSDI sdi, LinkedList structName return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(sdi, structName.getFirst()), structName); } - - } diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnodeTypeService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnodeTypeService.java index 8516eabad..f65ee46c8 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnodeTypeService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnodeTypeService.java @@ -4,15 +4,12 @@ package org.lfenergy.compas.sct.commons; -import org.lfenergy.compas.scl2007b4.model.TDOType; import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates; import org.lfenergy.compas.scl2007b4.model.TLNodeType; import org.lfenergy.compas.sct.commons.dto.DaTypeName; import org.lfenergy.compas.sct.commons.dto.DataAttributeRef; import org.lfenergy.compas.sct.commons.dto.DoTypeName; -import org.lfenergy.compas.sct.commons.scl.dtt.DOTypeAdapter; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.Predicate; diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclElementsProviderService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclElementsProviderService.java index 40d23bc01..48b46b332 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclElementsProviderService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclElementsProviderService.java @@ -5,8 +5,6 @@ package org.lfenergy.compas.sct.commons; import org.lfenergy.compas.scl2007b4.model.*; -import org.lfenergy.compas.sct.commons.api.DataTypeTemplateReader; -import org.lfenergy.compas.sct.commons.api.LNEditor; import org.lfenergy.compas.sct.commons.api.SclElementsProvider; import org.lfenergy.compas.sct.commons.dto.*; import org.lfenergy.compas.sct.commons.exception.ScdException; @@ -26,9 +24,7 @@ public class SclElementsProviderService implements SclElementsProvider { private final IedService iedService = new IedService(); private final LdeviceService ldeviceService = new LdeviceService(); - private final DataTypeTemplateReader dttReader = new DataTypeTemplatesService(); private final LnodeTypeService lnodeTypeService = new LnodeTypeService(); - private final LNEditor lnEditor = new LnService(); @Override public List getSubnetwork(SCL scd) throws ScdException { @@ -110,22 +106,27 @@ public Set getDAI(SCL scd, String iedName, String ldInst, Data @Override public List getDAI2(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException { -// return iedService.findIed(scd, tied -> tied.getName().equals(iedName)) -// .flatMap(tied -> ldeviceService.findLdevice(tied, tlDevice1 -> tlDevice1.getInst().equals(ldInst))) -// .stream() -// .flatMap(tlDevice -> Stream.of((TAnyLN)tlDevice.getLN().stream(), (TAnyLN)tlDevice.getLN0()) -// .flatMap(tAnyLN1 -> lnodeTypeService.findLnodeType(scd.getDataTypeTemplates(), tlNodeType -> tlNodeType.getId().equals(tAnyLN1.getLnType())) -// .stream() -// .flatMap(tlNodeType -> lnodeTypeService.getDataAttributeRefs(scd.getDataTypeTemplates(), tlNodeType).stream()))).toList(); return iedService.findIed(scd, tied -> tied.getName().equals(iedName)) .flatMap(tied -> ldeviceService.findLdevice(tied, tlDevice1 -> tlDevice1.getInst().equals(ldInst))) .stream() - .flatMap(tlDevice -> tlDevice.getLN() - .stream() - .flatMap(tAnyLN1 -> lnodeTypeService.findLnodeType(scd.getDataTypeTemplates(), tlNodeType -> tlNodeType.getId().equals(tAnyLN1.getLnType())) - .stream() - .flatMap(tlNodeType -> lnodeTypeService.getDataAttributeRefs(scd.getDataTypeTemplates(), tlNodeType) - .stream()))).toList(); + .flatMap(tlDevice -> + Stream.of(tlDevice.getLN().stream(), tlDevice.getLN0()) + .flatMap(tAnyLN -> { + String lnType = null; + if(tAnyLN instanceof TLN0 ln0){ + lnType = ln0.getLnType(); + } + if(tAnyLN instanceof TLN ln ){ + lnType = ln.getLnType(); + } + String finalLnType = lnType; + return lnodeTypeService.findLnodeType(scd.getDataTypeTemplates(), + tlNodeType -> tlNodeType.getId().equals(finalLnType)) + .stream() + .flatMap(tlNodeType -> lnodeTypeService.getDataAttributeRefs( + scd.getDataTypeTemplates(), tlNodeType) + .stream()); + })).toList(); } @Override diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java index 4b0a9e547..0155ce41d 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java @@ -353,7 +353,7 @@ void getAllDataObjectsAndDataAttributes_should_return_all_dataReference() { DataTypeTemplatesService dttService = new DataTypeTemplatesService(); List dataRef = dttService.getAllDataObjectsAndDataAttributes(dtt); // Then - assertThat(dataRef).hasSize(6); + assertThat(dataRef).hasSize(8); } } diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoTypeServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoTypeServiceTest.java index b3284cab1..42cf8e953 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoTypeServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoTypeServiceTest.java @@ -91,9 +91,11 @@ void getDataAttributeRefs_should_return_expected_dataReference() { //When List list = doTypeService.getDataAttributeRefs(dtt, tdoType, dataRef); //Then - assertThat(list).hasSize(6); + assertThat(list).hasSize(8); assertThat(list.stream().map(DataAttributeRef::getDoRef)) .containsExactly( + "firstDONAME.unused", + "firstDONAME.unused.otherSdo", "firstDONAME.unused.otherSdo.otherSdo2", "firstDONAME.sdo2", "firstDONAME.sdo2", @@ -102,6 +104,8 @@ void getDataAttributeRefs_should_return_expected_dataReference() { "firstDONAME"); assertThat(list.stream().map(DataAttributeRef::getDaRef)) .containsExactly( + "unused", + "unused", "danameForotherSdo2", "da1", "da2.bda1sample", @@ -110,4 +114,24 @@ void getDataAttributeRefs_should_return_expected_dataReference() { "daname"); } -} \ No newline at end of file + @Test + void getDataAttributeRefs_should_return_all_dai() { + // GIVEN + SCL scd = SclTestMarshaller.getSCLFromFile("/scl-srv-import-ieds/ied_1_test.xml"); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + + DoTypeService doTypeService = new DoTypeService(); + TDOType tdoType = doTypeService.findDoType(dtt, tdoType1 -> tdoType1.getId() + .equals("DO11")).get(); + DataAttributeRef dataRef = new DataAttributeRef(); + DoTypeName doTypeName = new DoTypeName(); + doTypeName.setName("firstDONAME"); + DaTypeName daTypeName = new DaTypeName(); + dataRef.setDoName(doTypeName); + dataRef.setDaName(daTypeName); + // When + List list = doTypeService.getDataAttributeRefs(dtt, tdoType, dataRef); + // Then + assertThat(list).hasSize(811); + } +} diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java index d80c7fcae..102973e42 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java @@ -387,4 +387,4 @@ private TAnyLN initDOAndDAInstances(LinkedList doInstances, LinkedList list = lnodeTypeService.getDataAttributeRefs(dtt, tdoType); //Then - assertThat(list).hasSize(6); + assertThat(list).hasSize(8); assertThat(list.stream().map(DataAttributeRef::getDoRef)) .containsExactly( + "Do1.unused", + "Do1.unused.otherSdo", "Do1.unused.otherSdo.otherSdo2", "Do1.sdo2", "Do1.sdo2", @@ -106,6 +108,8 @@ void getDataAttributeRefs_should_return_expected_dataReference() { "Do1"); assertThat(list.stream().map(DataAttributeRef::getDaRef)) .containsExactly( + "unused", + "unused", "danameForotherSdo2", "da1", "da2.bda1sample", @@ -114,5 +118,19 @@ void getDataAttributeRefs_should_return_expected_dataReference() { "daname"); } + @Test + void getDataAttributeRefs_should_return_all_dai() { + // given + SCL scd = SclTestMarshaller.getSCLFromFile("/scl-srv-import-ieds/ied_1_test.xml"); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); -} \ No newline at end of file + // when + LnodeTypeService lnodeTypeService = new LnodeTypeService(); + TLNodeType tdoType = lnodeTypeService.findLnodeType(dtt, tlNodeType -> tlNodeType.getId() + .equals("LN2")).get(); + //When + List list = lnodeTypeService.getDataAttributeRefs(dtt, tdoType); + //Then + assertThat(list).hasSize(1622); + } +} diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclElementsProviderServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclElementsProviderServiceTest.java index 0250fca07..2cdc36044 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclElementsProviderServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclElementsProviderServiceTest.java @@ -5,7 +5,6 @@ package org.lfenergy.compas.sct.commons; import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -136,6 +135,21 @@ void getExtRefSourceInfo_whenExtRefMatchFCDA_shouldReturnListOfControlBlocks() { assertThat(controlBlocks.get(0).getName()).isEqualTo("goose2"); } + @Test + void getDAI2_should_return_all_dai() { + // GIVEN + SCL scd = SclTestMarshaller.getSCLFromFile("/scl-srv-import-ieds/ied_1_test.xml"); + // WHEN + List result = sclElementsProviderService.getDAI2(scd, "IED_NAME1", "LD_INST12", new DataAttributeRef(), true); + // THEN +// result.forEach(data -> { +// System.out.println("===="); +// System.out.println("[DO] "+data.getDoName().getName() +" -> "+data.getDoName().getStructNames()); +// System.out.println("[DA] "+data.getDaName().getName() +" -> "+data.getDaName().getStructNames()); +// }); + assertThat(result).hasSize(811);//original one expect 733 ref + } + @Test void getDAI_should_return_all_dai() { // given diff --git a/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_test.xml b/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_test.xml index 182f21ba8..c0dcecdde 100644 --- a/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_test.xml +++ b/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_test.xml @@ -16,7 +16,6 @@ -