diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/ExtRefEditorService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/ExtRefEditorService.java index d8e914d37..55d426231 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/ExtRefEditorService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/ExtRefEditorService.java @@ -144,7 +144,7 @@ private static boolean doesIcdHeaderMatchLDEPFChannel(IEDAdapter iedAdapter, TCh * @return LDeviceAdapter object that matches the EPF channel */ private Optional getActiveSourceLDeviceByLDEPFChannel(IEDAdapter iedAdapter, TChannel channel) { - return ldeviceService.findLdevice(iedAdapter.getCurrentElem(), tlDevice -> tlDevice.getInst().equals(channel.getLDInst())) + return ldeviceService.findLdevice(iedAdapter.getCurrentElem(), channel.getLDInst()) .filter(tlDevice -> ldeviceService.getLdeviceStatus(tlDevice).map(ActiveStatus.ON::equals).orElse(false)) .map(tlDevice -> new LDeviceAdapter(iedAdapter, tlDevice)); } @@ -267,7 +267,7 @@ public List manageBindingForLDEPF(SCL scd, EPF epf) { SclRootAdapter sclRootAdapter = new SclRootAdapter(scd); if (!epf.isSetChannels()) return sclReportItems; iedService.getFilteredIeds(scd, ied -> !ied.getName().contains("TEST")) - .forEach(tied -> ldeviceService.findLdevice(tied, tlDevice -> LDEVICE_LDEPF.equals(tlDevice.getInst())) + .forEach(tied -> ldeviceService.findLdevice(tied, LDEVICE_LDEPF) .ifPresent(tlDevice -> getExtRefWithBayReferenceInLDEPF(scd.getDataTypeTemplates(), tied, tlDevice, sclReportItems) .forEach(extRefBayRef -> epf.getChannels().getChannel().stream().filter(tChannel -> doesExtRefMatchLDEPFChannel(extRefBayRef.extRef(), tChannel)) .findFirst().ifPresent(channel -> { @@ -291,7 +291,7 @@ public List manageBindingForLDEPF(SCL scd, EPF epf) { @Override public void epfPostProcessing(SCL scd) { iedService.getFilteredIeds(scd, ied -> !ied.getName().contains("TEST")) - .forEach(tied -> ldeviceService.findLdevice(tied, tlDevice -> LDEVICE_LDEPF.equals(tlDevice.getInst())) + .forEach(tied -> ldeviceService.findLdevice(tied, LDEVICE_LDEPF) .ifPresent(tlDevice -> tlDevice.getLN0().getDOI() .stream().filter(tdoi -> tdoi.getName().startsWith(INREF_PREFIX)) .forEach(tdoi -> { diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LdeviceService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LdeviceService.java index d2eefaf84..523986370 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LdeviceService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LdeviceService.java @@ -46,6 +46,10 @@ public Optional findLdevice(TIED tied, Predicate ldevicePred return getFilteredLdevices(tied, ldevicePredicate).findFirst(); } + public Optional findLdevice(TIED tied, String ldInst) { + return findLdevice(tied, tlDevice -> tlDevice.getInst().equals(ldInst)); + } + public Optional getLdeviceStatus(TLDevice tlDevice) { return lnService.getDaiModStValValue(tlDevice.getLN0()); } 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 905cd8a2e..854f4f572 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 @@ -38,6 +38,10 @@ public Optional findAnyLn(TLDevice tlDevice, Predicate lnPredica return getFilteredAnyLns(tlDevice, lnPredicate).findFirst(); } + public Optional findAnyLn(TLDevice tlDevice, String lnClass, String lnInst, String lnPrefix) { + return findAnyLn(tlDevice, tAnyLN -> matchesLn(tAnyLN, lnClass, lnInst, lnPrefix)); + } + public Stream getLns(TLDevice tlDevice) { return tlDevice.getLN().stream(); } @@ -50,6 +54,16 @@ public Optional findLn(TLDevice tlDevice, Predicate lnPredicate) { return getFilteredLns(tlDevice, lnPredicate).findFirst(); } + public boolean matchesLn(TAnyLN tAnyLN, String lnClass, String lnInst, String lnPrefix) { + return switch (tAnyLN) { + case TLN ln -> lnClass.equals(ln.getLnClass().getFirst()) + && StringUtils.trimToEmpty(lnInst).equals(StringUtils.trimToEmpty(ln.getInst())) + && (StringUtils.trimToEmpty(lnPrefix).equals(StringUtils.trimToEmpty(ln.getPrefix()))); + case LN0 ignored -> lnClass.equals(TLLN0Enum.LLN_0.value()); + default -> throw new IllegalStateException("Unexpected value: " + tAnyLN); + }; + } + /** * The Lnode status depends on the LN0 status. * If Ln stVAl = null => we take the LN0 status @@ -177,16 +191,6 @@ public DoLinkedToDa getDoLinkedToDaCompletedFromDAI(TIED tied, String ldInst, TA return result; } - public boolean matchesLn(TAnyLN tAnyLN, String lnClass, String lnInst, String lnPrefix) { - return switch (tAnyLN) { - case TLN ln -> lnClass.equals(ln.getLnClass().getFirst()) - && lnInst.equals(ln.getInst()) - && (StringUtils.trimToEmpty(lnPrefix).equals(StringUtils.trimToEmpty(ln.getPrefix()))); - case LN0 ignored -> lnClass.equals(TLLN0Enum.LLN_0.value()); - default -> throw new IllegalStateException("Unexpected value: " + tAnyLN); - }; - } - private boolean hasSettingGroup(TDAI tdai) { return tdai.isSetVal() && tdai.getVal().stream().anyMatch(tVal -> tVal.isSetSGroup() && tVal.getSGroup() > 0); } diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LdeviceServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LdeviceServiceTest.java index 051f1ce84..181b69840 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LdeviceServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LdeviceServiceTest.java @@ -68,7 +68,7 @@ void getFilteredLdevices_should_return_ldevices() { } @Test - void findLdevice_should_return_ldevice() { + void findLdevice_with_predicate_should_return_ldevice() { //Given SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); TIED tied = std.getIED().getFirst(); @@ -80,6 +80,19 @@ void findLdevice_should_return_ldevice() { .containsExactly("LDTM", "VirtualSAMULDTM"); } + @Test + void findLdevice_with_ldInst_should_return_ldevice() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TIED tied = std.getIED().getFirst(); + //When + TLDevice ldevice = ldeviceService.findLdevice(tied, "LDTM").orElseThrow(); + //Then + assertThat(ldevice) + .extracting(TLDevice::getInst, TLDevice::getLdName) + .containsExactly("LDTM", "VirtualSAMULDTM"); + } + @Test void getActiveLdevices_should_return_ldevices() { //Given 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 0ab1cd0f0..5db482a3a 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 @@ -50,7 +50,7 @@ void getAnylns_should_return_lns() { } @Test - void findAnyLn_should_return_ln() { + void findAnyLn_with_predicate_should_return_ln() { //Given SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); TLDevice ldsuied = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); @@ -64,6 +64,36 @@ void findAnyLn_should_return_ln() { .containsExactly("RTE_080BBB4D93E4E704CF69E8616CAF1A74_LLN0_V1.0.0", LN0.class); } + @Test + void findAnyLn_with_lnClass_lnInst_lnPrefix_should_return_ln() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); + TLDevice ldtm = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().stream().filter(tlDevice -> "LDTM".equals(tlDevice.getInst())).findFirst().orElseThrow(); + + //When + Optional anyLn = lnService.findAnyLn(ldtm, "TCTR", "43", "I04C"); + + //Then + assertThat(anyLn.orElseThrow()) + .extracting(TAnyLN::getLnType, TAnyLN::getClass) + .containsExactly("RTE_336B5093F3DDA93A19E979FB89196E26_TCTR_V1.0.0", TLN.class); + } + + @Test + void findAnyLn_with_lnClass_lnInst_lnPrefix_should_return_ln0() { + //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, "LLN0", "", null); + + //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