From 8c35c149cd659583d11c4034ccaa4164811a27cf Mon Sep 17 00:00:00 2001 From: Samir Romdhani Date: Wed, 5 Feb 2025 11:10:24 +0100 Subject: [PATCH] feat test getDAI v2 Signed-off-by: Samir Romdhani --- .../commons/SclElementsProviderService.java | 37 ++++++++++ .../sct/commons/api/SclElementsProvider.java | 3 + .../commons/domain/DoLinkedToDaFilter.java | 19 +++++ .../SclElementsProviderServiceTest.java | 29 ++++++++ .../dai_multiple_value_test.xml | 69 +++++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 sct-commons/src/test/resources/scl-srv-import-ieds/dai_multiple_value_test.xml 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 77303b8ae..bced3794d 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 @@ -4,8 +4,11 @@ package org.lfenergy.compas.sct.commons; +import org.apache.commons.lang3.StringUtils; import org.lfenergy.compas.scl2007b4.model.*; import org.lfenergy.compas.sct.commons.api.SclElementsProvider; +import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa; +import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter; import org.lfenergy.compas.sct.commons.dto.*; import org.lfenergy.compas.sct.commons.exception.ScdException; import org.lfenergy.compas.sct.commons.scl.SclRootAdapter; @@ -15,9 +18,12 @@ import org.lfenergy.compas.sct.commons.scl.ied.*; import org.lfenergy.compas.sct.commons.scl.ldevice.LDeviceAdapter; import org.lfenergy.compas.sct.commons.scl.ln.AbstractLNAdapter; +import org.lfenergy.compas.sct.commons.util.Utils; import java.util.*; +import java.util.function.BiPredicate; import java.util.stream.Collectors; +import java.util.stream.Stream; public class SclElementsProviderService implements SclElementsProvider { @@ -91,6 +97,7 @@ public List getExtRefSourceInfo(SCL scd, ExtRefInfo extRefInfo) th .toList(); } + @Override public Set getDAI(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException { SclRootAdapter sclRootAdapter = new SclRootAdapter(scd); @@ -99,6 +106,36 @@ public Set getDAI(SCL scd, String iedName, String ldInst, Data return lDeviceAdapter.getDAI(dataAttributeRef, updatable); } + @Override + public Set getDAIV2(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException { + IedService iedService = new IedService(); + LnService lnService = new LnService(); + LdeviceService ldeviceService = new LdeviceService(lnService); + DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); + return iedService.findIed(scd, tied -> tied.getName().equals(iedName)) + .map(tied1 -> ldeviceService.findLdevice(tied1, tlDevice -> tlDevice.getInst().equals(ldInst)) + .map(tlDevice -> Stream.concat(tlDevice.getLN().stream(), Stream.of(tlDevice.getLN0())) + .filter(anyLN -> tAnyLNPredicate.test(anyLN, dataAttributeRef)) + .flatMap(tAnyLN -> dataTypeTemplatesService.getFilteredDoLinkedToDa(scd.getDataTypeTemplates(), tAnyLN.getLnType(), DoLinkedToDaFilter.from(dataAttributeRef)) + .map(dataAttribute -> { + lnService.completeFromDAInstance(tied1, tlDevice.getInst(), tAnyLN, dataAttribute); + return dataAttribute; + })) + .filter(dataRef -> !updatable || dataRef.isUpdatable()) + .collect(Collectors.toSet())) + .orElseThrow(() -> new ScdException(String.format("LDevice.inst '%s' not found in IED '%s'", ldInst, iedName)))) + .orElseThrow(() -> new ScdException(String.format("IED.name '%s' not found in SCD", iedName))); + } + + private final BiPredicate tAnyLNPredicate = (anyLN, dataRef) -> + StringUtils.isBlank(dataRef.getLnClass()) + || (anyLN instanceof TLN0 + && (dataRef.getLnClass() != null && dataRef.getLnClass().equals(TLLN0Enum.LLN_0.value()))) + || (anyLN instanceof TLN ln + && Utils.lnClassEquals(ln.getLnClass(), dataRef.getLnClass()) + && ln.getInst().equals(dataRef.getLnInst()) + && Utils.equalsOrBothBlank(dataRef.getPrefix(), ln.getPrefix())); + @Override public Set getEnumTypeValues(SCL scd, String idEnum) throws ScdException { SclRootAdapter sclRootAdapter = new SclRootAdapter(scd); diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/api/SclElementsProvider.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/api/SclElementsProvider.java index 2c69a6fbc..8ac6ea0b4 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/api/SclElementsProvider.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/api/SclElementsProvider.java @@ -5,6 +5,8 @@ package org.lfenergy.compas.sct.commons.api; import org.lfenergy.compas.scl2007b4.model.SCL; +import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa; +import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter; import org.lfenergy.compas.sct.commons.dto.*; import org.lfenergy.compas.sct.commons.exception.ScdException; @@ -95,6 +97,7 @@ public interface SclElementsProvider { * @throws ScdException SCD illegal arguments exception, missing mandatory data */ Set getDAI(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException; + Set getDAIV2(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException; /** * Gets EnumTypes values of ID idEnum from DataTypeTemplate of SCL file diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java index 04cdfd247..93d49a031 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java @@ -6,6 +6,8 @@ import org.apache.commons.lang3.StringUtils; +import org.lfenergy.compas.scl2007b4.model.TAnyLN; +import org.lfenergy.compas.sct.commons.dto.DataAttributeRef; import java.util.Arrays; import java.util.Collections; @@ -36,6 +38,23 @@ public static DoLinkedToDaFilter from(String doNames, String daNames) { return new DoLinkedToDaFilter(doName, sdoNames, daName, bdaNames); } + + public static DoLinkedToDaFilter from(DataAttributeRef dataAttributeRef) { + String doName = null; + List sdoNames = null; + String daName = null; + List bdaNames = null; + if (StringUtils.isNotBlank(dataAttributeRef.getDoRef())) { + doName = dataAttributeRef.getDoRef().split("\\.")[0]; + sdoNames = Arrays.stream(dataAttributeRef.getDoRef().split("\\.")).skip(1).toList(); + } + if (StringUtils.isNotBlank(dataAttributeRef.getDaRef())) { + daName = dataAttributeRef.getDaRef().split("\\.")[0]; + bdaNames = Arrays.stream(dataAttributeRef.getDaRef().split("\\.")).skip(1).toList(); + } + return new DoLinkedToDaFilter(doName, sdoNames, daName, bdaNames); + } + public String getDoRef() { return doName + (sdoNames().isEmpty() ? StringUtils.EMPTY : "." + String.join(".", sdoNames())); } 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 cd75dfe79..02edb2cfb 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 @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.lfenergy.compas.scl2007b4.model.*; +import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa; import org.lfenergy.compas.sct.commons.dto.*; import org.lfenergy.compas.sct.commons.exception.ScdException; import org.lfenergy.compas.sct.commons.scl.SclRootAdapter; @@ -145,6 +146,34 @@ void getDAI_should_return_all_dai_when_notUpdatable() { assertThat(result).hasSize(2433); } + @Test + void test_dai_multiple_value_sourceDataTypeTemplateAndLN() { + // Given + SCL scd = SclTestMarshaller.getSCLFromFile("/scl-srv-import-ieds/dai_multiple_value_test.xml"); + // When + Set resultV1 = sclElementsProviderService.getDAI(scd, "IED_NAME1", "LD_INST11", new DataAttributeRef(), false); + Set resultV2 = sclElementsProviderService.getDAIV2(scd, "IED_NAME1", "LD_INST11", new DataAttributeRef(), false); + // THEN + assertThat(resultV1).hasSize(1622); + assertThat(resultV2).hasSize(1622); + + Set resultV1_OnlyOneValue = resultV1.stream().filter(dataAttributeRef -> dataAttributeRef.getDaName().getDaiValues().size() == 1) + .collect(Collectors.toSet()); + assertThat(resultV1_OnlyOneValue).hasSize(2); + + Set resultV1_OnlyTWOValue = resultV1.stream().filter(dataAttributeRef -> dataAttributeRef.getDaName().getDaiValues().size() == 2) + .collect(Collectors.toSet()); + assertThat(resultV1_OnlyTWOValue).hasSize(0); + + Set resultV2_OnlyOneValue = resultV2.stream().filter(doLinkedToDa -> doLinkedToDa.dataAttribute().getDaiValues().size() == 1) + .collect(Collectors.toSet()); + assertThat(resultV2_OnlyOneValue).hasSize(1);// expected 2: not same as resultV1_OnlyOneValue + + Set resultV2_OnlyTWOValue = resultV2.stream().filter(doLinkedToDa -> doLinkedToDa.dataAttribute().getDaiValues().size() == 2) + .collect(Collectors.toSet()); + assertThat(resultV2_OnlyTWOValue).hasSize(1);// expected 0: not same as resultV1_OnlyOneValue + } + @Test void getDAI_should_return_all_dai_when_updatable() { // given diff --git a/sct-commons/src/test/resources/scl-srv-import-ieds/dai_multiple_value_test.xml b/sct-commons/src/test/resources/scl-srv-import-ieds/dai_multiple_value_test.xml new file mode 100644 index 000000000..6cb25034f --- /dev/null +++ b/sct-commons/src/test/resources/scl-srv-import-ieds/dai_multiple_value_test.xml @@ -0,0 +1,69 @@ + + + + + +
+ + + + + + + + + + BBBB + + + + + + + + + + + + + + + + + + AAAA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Completed-diff + + + \ No newline at end of file