From a28c3792b5383498cb05374aca26b62b63ac543a Mon Sep 17 00:00:00 2001 From: redaneuhaus <242222272+redaneuhaus@users.noreply.github.com> Date: Thu, 18 Jun 2026 14:27:38 +0200 Subject: [PATCH] feat(#610): RSR-1605 - Configuration LSVS LGOS setSrcCB value --- .../compas/sct/commons/SclService.java | 32 ++++++++++++++++--- .../compas/sct/commons/SclServiceTest.java | 21 ++++++++++++ .../scd_monitoring_lsvs_lgos.xml | 5 +++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclService.java index d9ea985cd..47c50aa24 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclService.java @@ -13,6 +13,7 @@ import org.lfenergy.compas.sct.commons.api.SclEditor; import org.lfenergy.compas.sct.commons.domain.DaVal; import org.lfenergy.compas.sct.commons.domain.DataRef; +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.ExtRefService; @@ -47,6 +48,7 @@ public class SclService implements SclEditor { private static final String DO_GOCBREF = "GoCBRef"; private static final String DO_SVCBREF = "SvCBRef"; private static final String DA_SETSRCREF = "setSrcRef"; + private static final String DA_SETSRCCB = "setSrcCB"; private final IedService iedService; private final LdeviceService ldeviceService; @@ -248,12 +250,17 @@ private void manageMonitoringLns(List iedSources, SCL scd, TIED tied, List lgosOrLsvsLns = lnService.getFilteredLns(ldsuiedLdevice, tln -> monitoringLnClassEnum.value().equals(tln.getLnClass().getFirst())).toList(); if (lgosOrLsvsLns.isEmpty()) errorHandler.get().add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value(), "There is no LN %s present in LDevice".formatted(monitoringLnClassEnum.value()))); - DataRef dataRef = new DataRef(doName, List.of(), DA_SETSRCREF, List.of()); - lgosOrLsvsLns.forEach(lgosOrLsvs -> dataTypeTemplateService.findDoLinkedToDa(scd.getDataTypeTemplates(), lgosOrLsvs.getLnType(), dataRef) + DataRef dataRefDaRef = new DataRef(doName, List.of(), DA_SETSRCREF, List.of()); + DataRef dataRefDaCb = new DataRef(doName, List.of(), DA_SETSRCCB, List.of()); + dataRefSetDaVal(iedSources, scd, tied, ldsuiedLdevice, doName, monitoringLnClassEnum, lgosOrLsvsLns, dataRefDaRef, dataRefDaCb); + } + + private void dataRefSetDaVal(List iedSources, SCL scd, TIED tied, TLDevice ldsuiedLdevice, String doName, MonitoringLnClassEnum monitoringLnClassEnum, List lgosOrLsvsLns, DataRef dataRefDaRef, DataRef dataRefDaCB) { + lgosOrLsvsLns.forEach(lgosOrLsvs -> dataTypeTemplateService.findDoLinkedToDa(scd.getDataTypeTemplates(), lgosOrLsvs.getLnType(), dataRefDaRef) .map(doLinkedToDa -> lnService.getDoLinkedToDaCompletedFromDAI(tied, LDEVICE_LDSUIED, lgosOrLsvs, doLinkedToDa)) .filter(doLinkedToDa -> { if (!doLinkedToDa.isUpdatable()) - errorHandler.get().add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value() + "/DOI@name=\"" + doName + "\"/DAI@name=\"setSrcRef\"/Val", "The DAI cannot be updated")); + errorHandler.get().add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value() + "/DOI@name=\"" + doName + "\"/DAI@name=\"" + dataRefDaRef.daName() + "\"/Val", "The DAI cannot be updated")); return doLinkedToDa.isUpdatable(); }) .ifPresent(doLinkedToDa -> { @@ -268,13 +275,30 @@ private void manageMonitoringLns(List iedSources, SCL scd, TIED tied, doLinkedToDa.dataAttribute().getDaiValues().clear(); doLinkedToDa.dataAttribute().getDaiValues().add(newVal); lnService.updateOrCreateDOAndDAInstances(lnToAdd, doLinkedToDa); - log.info("Processing %d IED Source in LDName=%s - added LN (lnClass=%s, inst=%s, prefix=%s) - update DOI(name=%s)/DAI(name=%s) with value=%s".formatted(iedSources.size(), ldsuiedLdevice.getLdName(), lgosOrLsvs.getLnClass().getFirst(), String.valueOf(i + 1), lgosOrLsvs.getPrefix(), doName, DA_SETSRCREF, newVal.val())); + addValDaCB(scd, tied, doName, monitoringLnClassEnum, dataRefDaCB, lgosOrLsvs, newVal, lnToAdd); + log.info("Processing %d IED Source in LDName=%s - added LN (lnClass=%s, inst=%s, prefix=%s) - update DOI(name=%s)/DAI(name=%s) with value=%s".formatted(iedSources.size(), ldsuiedLdevice.getLdName(), lgosOrLsvs.getLnClass().getFirst(), String.valueOf(i + 1), lgosOrLsvs.getPrefix(), doName, dataRefDaCB.daName(), newVal.val())); ldsuiedLdevice.getLN().add(lnToAdd); } ldsuiedLdevice.getLN().remove(lgosOrLsvs); //We can remove this LGOS or LSVS as we already added new ones })); } + private void addValDaCB(SCL scd, TIED tied, String doName, MonitoringLnClassEnum monitoringLnClassEnum, DataRef dataRefDaCB, TLN lgosOrLsvs, DaVal newVal, TLN lnToAdd) { + Optional daCB = dataTypeTemplateService.findDoLinkedToDa(scd.getDataTypeTemplates(), lgosOrLsvs.getLnType(), dataRefDaCB); + daCB.ifPresent(doLinkedToDaCB -> { + DoLinkedToDa doLinkedToDaCBCopy = lnService.getDoLinkedToDaCompletedFromDAI(tied, LDEVICE_LDSUIED, lgosOrLsvs, doLinkedToDaCB); + if (doLinkedToDaCBCopy.isUpdatable()) { + doLinkedToDaCBCopy.dataAttribute().getDaiValues().clear(); + doLinkedToDaCBCopy.dataAttribute().getDaiValues().add(newVal); + lnService.updateOrCreateDOAndDAInstances(lnToAdd, doLinkedToDaCBCopy); + } + else{ + errorHandler.get().add(SclReportItem.warning( + tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value() + "/DOI@name=\"" + doName + "\"/DAI@name=\"" + dataRefDaCB.daName() + "\"/Val", "The DAI cannot be updated")); + } + }); + } + record IedSource(String iedName, String srcCBName, String srcLdInst, TServiceType serviceType){} } diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclServiceTest.java index e43de1be2..c3d19d325 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclServiceTest.java @@ -382,6 +382,27 @@ void manageMonitoringLns_should_update_and_create_lsvs_and_goose() { .filteredOn(tUnNaming -> tUnNaming.getClass().equals(TDAI.class) && ((TDAI)tUnNaming).getName().equals("setSrcRef")) .map(tUnNaming -> ((TDAI)tUnNaming).getVal().getFirst().getValue()) .containsExactlyInAnyOrder("IED_NAME2LD_INST21/LLN0.smv2", "IED_NAME2LD_INST22/LLN0.smv2"); + + // LGOS setSrcCb values + assertThat(tlns) + .filteredOn(tln -> tln.getLnClass().contains("LGOS") && tln.getInst().equals("1") + || tln.getLnClass().contains("LGOS") && tln.getInst().equals("2")) + .flatExtracting(TAnyLN::getDOI) + .filteredOn(tdoi -> tdoi.getName().equals("GoCBRef")) + .flatExtracting(TDOI::getSDIOrDAI) + .filteredOn(tUnNaming -> tUnNaming.getClass().equals(TDAI.class) && ((TDAI)tUnNaming).getName().equals("setSrcCB")) + .map(tUnNaming -> ((TDAI)tUnNaming).getVal().getFirst().getValue()) + .containsExactlyInAnyOrder("IED_NAME2LD_INST21/LLN0.goose1", "IED_NAME2LD_INST22/LLN0.goose1"); + // LSVS setSrcCb values + assertThat(tlns) + .filteredOn(tln -> (tln.getLnClass().contains("LSVS") && tln.getInst().equals("1") + || tln.getLnClass().contains("LSVS") && tln.getInst().equals("2"))) + .flatExtracting(TAnyLN::getDOI) + .filteredOn(tdoi -> tdoi.getName().equals("SvCBRef")) + .flatExtracting(TDOI::getSDIOrDAI) + .filteredOn(tUnNaming -> tUnNaming.getClass().equals(TDAI.class) && ((TDAI)tUnNaming).getName().equals("setSrcCB")) + .map(tUnNaming -> ((TDAI)tUnNaming).getVal().getFirst().getValue()) + .containsExactlyInAnyOrder("IED_NAME2LD_INST21/LLN0.smv2", "IED_NAME2LD_INST22/LLN0.smv2"); }); } diff --git a/sct-commons/src/test/resources/monitoring_lns/scd_monitoring_lsvs_lgos.xml b/sct-commons/src/test/resources/monitoring_lns/scd_monitoring_lsvs_lgos.xml index 24cc02d95..2a3fc9f83 100644 --- a/sct-commons/src/test/resources/monitoring_lns/scd_monitoring_lsvs_lgos.xml +++ b/sct-commons/src/test/resources/monitoring_lns/scd_monitoring_lsvs_lgos.xml @@ -36,12 +36,16 @@ + + + + @@ -121,6 +125,7 @@ + \ No newline at end of file