From 2a8c6f22297aacf27a91201462113fadd11c1a66 Mon Sep 17 00:00:00 2001 From: gleizesDor <115622893+gleizesDor@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:44:47 +0200 Subject: [PATCH] feat(#386): Add Compas IED type PrivateEnum Signed-off-by: gleizesDor <115622893+gleizesDor@users.noreply.github.com> --- .../compas/sct/commons/DaiService.java | 30 ++++++ .../compas/sct/commons/DoiService.java | 28 ++++++ .../compas/sct/commons/LnService.java | 23 +++++ .../compas/sct/commons/util/PrivateEnum.java | 3 +- .../compas/sct/commons/DaiServiceTest.java | 68 ++++++++++++++ .../compas/sct/commons/DoiServiceTest.java | 68 ++++++++++++++ .../compas/sct/commons/LnServiceTest.java | 93 +++++++++++++++++-- 7 files changed, 304 insertions(+), 9 deletions(-) create mode 100644 sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DaiService.java create mode 100644 sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoiService.java create mode 100644 sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DaiServiceTest.java create mode 100644 sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoiServiceTest.java diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DaiService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DaiService.java new file mode 100644 index 000000000..93521b608 --- /dev/null +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DaiService.java @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2024 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons; + +import org.lfenergy.compas.scl2007b4.model.*; + +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Stream; + +public class DaiService { + + public Stream getDais(TDOI tdoi) { + return tdoi.getSDIOrDAI() + .stream() + .filter(dai -> dai.getClass().equals(TDAI.class)) + .map(TDAI.class::cast); + } + + public Stream getFilteredDais(TDOI tdoi, Predicate tdaiPredicate) { + return getDais(tdoi).filter(tdaiPredicate); + } + + public Optional findDai(TDOI tdoi, Predicate tdaiPredicate) { + return getFilteredDais(tdoi, tdaiPredicate).findFirst(); + } + +} diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoiService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoiService.java new file mode 100644 index 000000000..992c55939 --- /dev/null +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DoiService.java @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2024 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons; + +import org.lfenergy.compas.scl2007b4.model.TAnyLN; +import org.lfenergy.compas.scl2007b4.model.TDOI; + +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Stream; + +public class DoiService { + + public Stream getDois(TAnyLN tAnyLN) { + return tAnyLN.getDOI().stream(); + } + + public Stream getFilteredDois(TAnyLN tAnyLN, Predicate tdoiPredicate) { + return getDois(tAnyLN).filter(tdoiPredicate); + } + + public Optional findDoi(TAnyLN tAnyLN, Predicate tdoiPredicate) { + return getFilteredDois(tAnyLN, tdoiPredicate).findFirst(); + } + +} 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 18f2fc7cf..3c7d69440 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 @@ -13,6 +13,9 @@ import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa; import org.lfenergy.compas.sct.commons.util.ActiveStatus; +import java.util.Collection; +import java.util.Optional; +import java.util.function.Predicate; import java.util.*; import java.util.stream.Stream; @@ -27,6 +30,26 @@ public Stream getAnylns(TLDevice tlDevice) { return Stream.concat(Stream.of(tlDevice.getLN0()), tlDevice.getLN().stream()); } + public Stream getFilteredAnyLns(TLDevice tlDevice, Predicate lnPredicate) { + return getAnylns(tlDevice).filter(lnPredicate); + } + + public Optional findAnyLn(TLDevice tlDevice, Predicate lnPredicate) { + return getFilteredAnyLns(tlDevice, lnPredicate).findFirst(); + } + + public Stream getLns(TLDevice tlDevice) { + return tlDevice.getLN().stream(); + } + + public Stream getFilteredLns(TLDevice tlDevice, Predicate lnPredicate) { + return getLns(tlDevice).filter(lnPredicate); + } + + public Optional findLn(TLDevice tlDevice, Predicate lnPredicate) { + return getFilteredLns(tlDevice, lnPredicate).findFirst(); + } + /** * The Lnode status depends on the LN0 status. * If Ln stVAl = null => we take the LN0 status diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/PrivateEnum.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/PrivateEnum.java index 170f52aa2..588bb8a8a 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/PrivateEnum.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/PrivateEnum.java @@ -27,7 +27,8 @@ public enum PrivateEnum { COMPAS_LDEVICE("COMPAS-LDevice", TCompasLDevice.class), COMPAS_SCL_FILE_TYPE("COMPAS-SclFileType", TCompasSclFileType.class), COMPAS_SYSTEM_VERSION("COMPAS-SystemVersion", TCompasSystemVersion.class), - COMPAS_TOPO("COMPAS-Topo", TCompasTopo.class); + COMPAS_TOPO("COMPAS-Topo", TCompasTopo.class), + COMPAS_IED_TYPE("COMPAS-IEDType", TCompasIEDType.class); private static final Map, PrivateEnum> classToEnum = Arrays.stream(PrivateEnum.values()).collect(Collectors.toMap( compasPrivateEnum -> compasPrivateEnum.compasClass, diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DaiServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DaiServiceTest.java new file mode 100644 index 000000000..ed3688745 --- /dev/null +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DaiServiceTest.java @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2024 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl2007b4.model.SCL; +import org.lfenergy.compas.scl2007b4.model.TDAI; +import org.lfenergy.compas.scl2007b4.model.TDOI; +import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +class DaiServiceTest { + + private final DaiService daiService = new DaiService(); + + @Test + void getDais() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TDOI tdoi = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0().getDOI().get(3); + + //When + List tdais = daiService.getDais(tdoi).toList(); + + //Then + assertThat(tdais) + .hasSize(5) + .extracting(TDAI::getName) + .containsExactly("paramRev", "valRev", "d", "configRev", "swRev"); + } + + @Test + void getFilteredDais() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TDOI tdoi = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0().getDOI().get(3); + + //When + List tdais = daiService.getFilteredDais(tdoi, tdai -> tdai.getName().equals("configRev")).toList(); + + //Then + assertThat(tdais) + .hasSize(1) + .extracting(TDAI::getName) + .containsExactly("configRev"); + } + + @Test + void findDai() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TDOI tdoi = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0().getDOI().get(3); + + //When + Optional dai = daiService.findDai(tdoi, tdai -> tdai.getName().equals("configRev")); + + //Then + assertThat(dai.orElseThrow()) + .extracting(TDAI::getName, tdai -> tdai.getVal().size()) + .containsExactly("configRev", 1); + } +} \ No newline at end of file diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoiServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoiServiceTest.java new file mode 100644 index 000000000..a33fd5fe4 --- /dev/null +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DoiServiceTest.java @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2024 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl2007b4.model.LN0; +import org.lfenergy.compas.scl2007b4.model.SCL; +import org.lfenergy.compas.scl2007b4.model.TDOI; +import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +class DoiServiceTest { + + private final DoiService doiService = new DoiService(); + + @Test + void getDois() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + LN0 ln0 = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0(); + + //When + List tdois = doiService.getDois(ln0).toList(); + + //Then + assertThat(tdois) + .hasSize(4) + .extracting(TDOI::getName) + .containsExactly("Beh", "Health", "Mod", "NamPlt"); + } + + @Test + void getFilteredDois() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + LN0 ln0 = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0(); + + //When + List tdois = doiService.getFilteredDois(ln0, tdoi -> tdoi.getName().equals("Beh")).toList(); + + //Then + assertThat(tdois) + .hasSize(1) + .extracting(TDOI::getName) + .containsExactly("Beh"); + } + + @Test + void findDoi() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + LN0 ln0 = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0(); + + //When + Optional doi = doiService.findDoi(ln0, tdoi -> tdoi.getName().equals("Beh")); + + //Then + assertThat(doi.orElseThrow()) + .extracting(TDOI::getName, tdoi -> tdoi.getSDIOrDAI().size()) + .containsExactly("Beh", 1); + } +} \ No newline at end of file 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 45ca07062..5049c1bd4 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 @@ -23,21 +23,101 @@ class LnServiceTest { + private final LnService lnService = new LnService(); + @Test void getAnylns_should_return_lns() { //Given SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); - TLDevice tlDevice = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); - LnService lnService = new LnService(); + TLDevice ldsuied = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); //When - List tAnyLNS = lnService.getAnylns(tlDevice).toList(); + List tAnyLNS = lnService.getAnylns(ldsuied).toList(); //Then assertThat(tAnyLNS) .hasSize(2) - .extracting(TAnyLN::getLnType) - .containsExactly("RTE_080BBB4D93E4E704CF69E8616CAF1A74_LLN0_V1.0.0", "RTE_8884DBCF760D916CCE3EE9D1846CE46F_LPAI_V1.0.0"); + .extracting(TAnyLN::getLnType, TAnyLN::getClass) + .containsExactly(Tuple.tuple("RTE_080BBB4D93E4E704CF69E8616CAF1A74_LLN0_V1.0.0", LN0.class), + Tuple.tuple("RTE_8884DBCF760D916CCE3EE9D1846CE46F_LPAI_V1.0.0", TLN.class)); + } + + @Test + void findAnyLn_should_return_ln() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TLDevice ldsuied = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); + + //When + Optional anyLn = lnService.findAnyLn(ldsuied, tAnyLN -> tAnyLN.getLnType().equals("RTE_080BBB4D93E4E704CF69E8616CAF1A74_LLN0_V1.0.0")); + + //Then + assertThat(anyLn.orElseThrow()) + .extracting(TAnyLN::getLnType, TAnyLN::getClass) + .containsExactly("RTE_080BBB4D93E4E704CF69E8616CAF1A74_LLN0_V1.0.0", LN0.class); + } + + @Test + void getLns_should_return_lns() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TLDevice ldsuied = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); + + //When + List tlns = lnService.getLns(ldsuied).toList(); + + //Then + assertThat(tlns) + .hasSize(1) + .extracting(TLN::getLnType, TLN::getInst, TLN::getLnClass, TLN::getClass) + .containsExactly(Tuple.tuple("RTE_8884DBCF760D916CCE3EE9D1846CE46F_LPAI_V1.0.0", "1", List.of("LPAI"), TLN.class)); + } + + @Test + void getFilteredLns_should_return_lns() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TLDevice ldsuied = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); + + //When + List tlns = lnService.getFilteredLns(ldsuied, tln -> tln.getLnType().equals("RTE_8884DBCF760D916CCE3EE9D1846CE46F_LPAI_V1.0.0")).toList(); + + //Then + assertThat(tlns) + .hasSize(1) + .extracting(TLN::getLnType, TLN::getInst, TLN::getLnClass, TLN::getClass) + .containsExactly(Tuple.tuple("RTE_8884DBCF760D916CCE3EE9D1846CE46F_LPAI_V1.0.0", "1", List.of("LPAI"), TLN.class)); + } + + @Test + void findLn_should_return_lns() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TLDevice ldsuied = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); + + //When + Optional ln = lnService.findLn(ldsuied, tln -> tln.getLnType().equals("RTE_8884DBCF760D916CCE3EE9D1846CE46F_LPAI_V1.0.0")); + + //Then + assertThat(ln.orElseThrow()) + .extracting(TLN::getLnType, TLN::getInst, TLN::getLnClass, TLN::getClass) + .containsExactly("RTE_8884DBCF760D916CCE3EE9D1846CE46F_LPAI_V1.0.0", "1", List.of("LPAI"), TLN.class); + } + + @Test + void getFilteredAnyLns_should_return_lns() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TLDevice ldsuied = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); + + //When + List tAnyLNS = lnService.getFilteredAnyLns(ldsuied, tAnyLN -> tAnyLN.getLnType().equals("RTE_080BBB4D93E4E704CF69E8616CAF1A74_LLN0_V1.0.0")).toList(); + + //Then + assertThat(tAnyLNS) + .hasSize(1) + .extracting(TAnyLN::getLnType, TAnyLN::getClass) + .containsExactly(Tuple.tuple("RTE_080BBB4D93E4E704CF69E8616CAF1A74_LLN0_V1.0.0", LN0.class)); } @Test @@ -45,7 +125,6 @@ void getDaiModStval_should_return_status() { //Given SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); TLDevice tlDevice = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); - LnService lnService = new LnService(); //When Optional daiModStval = lnService.getDaiModStval(tlDevice.getLN0()); @@ -59,7 +138,6 @@ void getLnStatus_should_return_status() { //Given SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); TLDevice tlDevice = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); - LnService lnService = new LnService(); //When ActiveStatus lnStatus = lnService.getLnStatus(tlDevice.getLN().getFirst(), tlDevice.getLN0()); @@ -73,7 +151,6 @@ void getActiveLns_should_return_lns() { //Given SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); TLDevice tlDevice = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); - LnService lnService = new LnService(); //When List tAnyLNS = lnService.getActiveLns(tlDevice).toList();