Skip to content

Commit fd6aede

Browse files
committed
Feat/refactor manage monitoring lns
Signed-off-by: Samir Romdhani <samir.romdhani_externe@rte-france.com>
1 parent b677539 commit fd6aede

5 files changed

Lines changed: 64 additions & 46 deletions

File tree

sct-app/src/test/java/org.lfenergy.compas.sct.app/SclAutomationServiceIntegrationTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
class SclAutomationServiceIntegrationTest {
3131

3232
private SclAutomationService sclAutomationService ;
33-
private static final SclEditor sclEditor = new SclService() ;
33+
private static final IedService iedService = new IedService() ;
34+
private static final LnService lnService = new LnService() ;
35+
private static final LdeviceService ldeviceService = new LdeviceService(lnService) ;
36+
private static final SclEditor sclEditor = new SclService(iedService, ldeviceService, lnService) ;
3437
private static final SubstationEditor substationEditor = new SubstationService(new VoltageLevelService()) ;
3538
private static final ControlBlockEditor controlBlockEditor = new ControlBlockEditorService(new ControlService(), new LdeviceService(new LnService()), new ConnectedAPService(), new SubNetworkService());
3639

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/ExtRefReaderService.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44

55
package org.lfenergy.compas.sct.commons;
66

7-
import org.lfenergy.compas.scl2007b4.model.LN0;
8-
import org.lfenergy.compas.scl2007b4.model.TAnyLN;
9-
import org.lfenergy.compas.scl2007b4.model.TExtRef;
10-
import org.lfenergy.compas.scl2007b4.model.TLN;
7+
import org.lfenergy.compas.scl2007b4.model.*;
118
import org.lfenergy.compas.sct.commons.api.ExtRefReader;
129

10+
import java.util.Collection;
1311
import java.util.stream.Stream;
1412

1513
public class ExtRefReaderService implements ExtRefReader {
@@ -21,4 +19,12 @@ public Stream<TExtRef> getExtRefs(TAnyLN tAnyLN) {
2119
default -> throw new IllegalStateException("Unexpected value: " + tAnyLN);
2220
};
2321
}
22+
public Stream<TExtRef> getExtRefs(SCL scd) {
23+
return scd.getIED()
24+
.stream()
25+
.flatMap(tied -> new LdeviceService(new LnService()).getLdevices(tied).flatMap(tlDevice -> Stream.of(tlDevice.getLN0())))
26+
.filter(TAnyLN::isSetInputs)
27+
.flatMap(ln0 -> ln0.getInputs().getExtRef().stream());
28+
}
29+
2430
}

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SclService.java

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
import lombok.extern.slf4j.Slf4j;
1111
import org.lfenergy.compas.scl2007b4.model.*;
1212
import org.lfenergy.compas.sct.commons.api.SclEditor;
13+
import org.lfenergy.compas.sct.commons.domain.DaVal;
14+
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter;
1315
import org.lfenergy.compas.sct.commons.dto.*;
1416
import org.lfenergy.compas.sct.commons.exception.ScdException;
15-
import org.lfenergy.compas.sct.commons.scl.ExtRefService;
1617
import org.lfenergy.compas.sct.commons.scl.SclRootAdapter;
1718
import org.lfenergy.compas.sct.commons.scl.com.CommunicationAdapter;
1819
import org.lfenergy.compas.sct.commons.scl.com.ConnectedAPAdapter;
@@ -26,14 +27,13 @@
2627
import org.lfenergy.compas.sct.commons.scl.ldevice.LDeviceAdapter;
2728
import org.lfenergy.compas.sct.commons.scl.ln.AbstractLNAdapter;
2829
import org.lfenergy.compas.sct.commons.scl.ln.LN0Adapter;
29-
import org.lfenergy.compas.sct.commons.scl.ln.LNAdapter;
3030
import org.lfenergy.compas.sct.commons.util.MonitoringLnClassEnum;
3131
import org.lfenergy.compas.sct.commons.util.PrivateUtils;
3232
import org.lfenergy.compas.sct.commons.util.Utils;
3333

3434
import java.util.*;
3535

36-
import static org.lfenergy.compas.sct.commons.util.CommonConstants.IED_TEST_NAME;
36+
import static org.lfenergy.compas.sct.commons.util.CommonConstants.*;
3737
import static org.lfenergy.compas.sct.commons.util.PrivateEnum.COMPAS_ICDHEADER;
3838
import static org.lfenergy.compas.sct.commons.util.Utils.copySclElement;
3939

@@ -217,14 +217,10 @@ public List<SclReportItem> updateDoInRef(SCL scd) {
217217
public List<SclReportItem> manageMonitoringLns(SCL scd) {
218218
errorHanlder.clear();
219219
iedService.getFilteredIeds(scd, ied -> !ied.getName().contains(IED_TEST_NAME))
220-
.forEach(tied -> ldeviceService.findLdevice(tied, tlDevice -> "LDSUIED".equals(tlDevice.getInst()))
221-
.filter(tlDevice -> tlDevice.getLN0().isSetInputs())
220+
.forEach(tied ->
221+
ldeviceService.findLdevice(tied, tlDevice -> LDEVICE_LDSUIED.equals(tlDevice.getInst()))
222222
.ifPresent(tlDevice -> {
223-
List<TExtRef> tExtRefs = new ExtRefService().filterDuplicatedExtRefs(tlDevice.getLN0().getInputs().getExtRef())
224-
.stream()
225-
.filter(TExtRef::isSetServiceType)
226-
.filter(TExtRef::isSetSrcCBName)
227-
.toList();
223+
List<TExtRef> tExtRefs = new ExtRefReaderService().getExtRefs(scd).toList();
228224
manageMonitoringLns(tExtRefs.stream().filter(tExtRef -> TServiceType.GOOSE.equals(tExtRef.getServiceType())).toList(), scd, tied, tlDevice, DO_GOCBREF, MonitoringLnClassEnum.LGOS);
229225
manageMonitoringLns(tExtRefs.stream().filter(tExtRef -> TServiceType.SMV.equals(tExtRef.getServiceType())).toList(), scd, tied, tlDevice, DO_SVCBREF, MonitoringLnClassEnum.LSVS);
230226
}));
@@ -235,32 +231,40 @@ private void manageMonitoringLns(List<TExtRef> tExtRefs, SCL scd, TIED tied, TLD
235231
List<TLN> tlns = lnService.getFilteredLns(tlDevice, tln -> monitoringLnClassEnum.value().equals(tln.getLnClass().getFirst())).toList();
236232
if (tlns.isEmpty())
237233
errorHanlder.add(SclReportItem.warning(tied.getName()+"/"+tlDevice.getInst()+"/"+monitoringLnClassEnum.value(), "There is no LN %s present in LDevice".formatted(monitoringLnClassEnum.value())));
234+
if (tExtRefs.isEmpty()) {
235+
return;
236+
}
237+
DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter(doName, List.of(), DA_SETSRCREF, List.of());
238+
DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService();
238239

239-
tlns.forEach(tln -> {
240-
LNAdapter lnAdapter = new LNAdapter(new LDeviceAdapter(new IEDAdapter(new SclRootAdapter(scd), tied), tlDevice), tln);
241-
lnAdapter
242-
.getDAI(new DataAttributeRef(tln, new DoTypeName(doName), new DaTypeName(DA_SETSRCREF)), true)
243-
.stream()
244-
.findFirst()
245-
.ifPresentOrElse(daToUpdateFilter -> {
246-
removeLnsByLnClass(monitoringLnClassEnum, tlDevice);
247-
for (int i = 0; i < tExtRefs.size(); i++) {
248-
TLN copiedLn = copySclElement(tln, TLN.class);
249-
TExtRef tExtRef = tExtRefs.get(i);
250-
TIED sourceIed = iedService.findByName(scd, tExtRef.getIedName())
251-
.orElseThrow(() -> new ScdException("IED.name '" + tExtRef.getIedName() + "' not found in SCD"));
252-
String sourceLdName = ldeviceService.findLdevice(sourceIed, tExtRef.getSrcLDInst())
253-
.orElseThrow(() -> new ScdException(String.format("LDevice.inst '%s' not found in IED '%s'", tExtRef.getSrcLDInst(), tExtRef.getIedName())))
254-
.getLdName();
255-
String lnClass = !tExtRef.isSetSrcLNClass() ? TLLN0Enum.LLN_0.value() : tExtRef.getSrcLNClass().getFirst();
256-
lnAdapter.getCurrentElem().setInst(String.valueOf(i + 1));
257-
daToUpdateFilter.setVal(sourceLdName + "/" + lnClass + "." + tExtRef.getSrcCBName());
258-
lnAdapter.updateDAI(daToUpdateFilter);
259-
tlDevice.getLN().add(copiedLn);//value copy
260-
}
261-
}, () -> errorHanlder.add(SclReportItem.warning(lnAdapter.getXPath() + "/DOI@name=\"" + doName + "\"/DAI@name=\"setSrcRef\"/Val",
262-
"The DAI cannot be updated")));
263-
});
240+
tlns.forEach(tln -> dataTypeTemplatesService.getFilteredDoLinkedToDa(scd.getDataTypeTemplates(), tln.getLnType(), doLinkedToDaFilter)
241+
.map(doLinkedToDa -> lnService.getDoLinkedToDaCompletedFromDAI(tied, tlDevice.getInst(), tln, doLinkedToDa))
242+
.findFirst()
243+
.ifPresent(doLinkedToDa -> {
244+
if (!doLinkedToDa.isUpdatable()) {
245+
errorHanlder.add(SclReportItem.warning(tied.getName()+"/"+tlDevice.getInst()+"/"+monitoringLnClassEnum.value() + "/DOI@name=\"" + doName + "\"/DAI@name=\"setSrcRef\"/Val", "The DAI cannot be updated"));
246+
} else {
247+
TLN lnToUpdate = tln;
248+
// Remove LN
249+
removeLnsByLnClass(monitoringLnClassEnum, tlDevice);
250+
for (int i = 0; i < tExtRefs.size(); i++) {
251+
tlDevice.getLN().add(lnToUpdate);
252+
253+
TExtRef tExtRef = tExtRefs.get(i);
254+
TIED sourceIed = iedService.findByName(scd, tExtRef.getIedName())
255+
.orElseThrow(() -> new ScdException("IED.name '" + tExtRef.getIedName() + "' not found in SCD"));
256+
String sourceLdName = ldeviceService.findLdevice(sourceIed, tExtRef.getSrcLDInst())
257+
.orElseThrow(() -> new ScdException(String.format("LDevice.inst '%s' not found in IED '%s'", tExtRef.getSrcLDInst(), tExtRef.getIedName())))
258+
.getLdName();
259+
String lnClass = !tExtRef.isSetSrcLNClass() ? TLLN0Enum.LLN_0.value() : tExtRef.getSrcLNClass().getFirst();
260+
tln.setInst(String.valueOf(i + 1));
261+
doLinkedToDa.dataAttribute().getDaiValues().add(new DaVal(null, sourceLdName + "/" + lnClass + "." + tExtRef.getSrcCBName()));
262+
lnService.updateOrCreateDOAndDAInstances(lnToUpdate, doLinkedToDa);
263+
264+
lnToUpdate = copySclElement(tln, TLN.class); //value copy
265+
}
266+
}
267+
}));
264268
}
265269

266270
private void removeLnsByLnClass(MonitoringLnClassEnum monitoringLnClassEnum, TLDevice tlDevice) {

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/CommonConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public final class CommonConstants {
2727
public static final String LN_PREFIX_A = "a";
2828
public static final String LN_PREFIX_B = "b";
2929
public static final String LDEVICE_LDEPF = "LDEPF";
30+
public static final String LDEVICE_LDSUIED = "LDSUIED";
3031
public static final String CHNUM1_DO_NAME = "ChNum1";
3132
public static final String LEVMOD_DO_NAME = "LevMod";
3233
public static final String SRCREF_DO_NAME = "SrcRef";

sct-commons/src/test/java/org/lfenergy/compas/sct/commons/SclServiceTest.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
package org.lfenergy.compas.sct.commons;
66

77
import org.assertj.core.groups.Tuple;
8+
import org.junit.jupiter.api.BeforeEach;
89
import org.junit.jupiter.api.Tag;
910
import org.junit.jupiter.api.Test;
10-
import org.junit.jupiter.api.extension.ExtendWith;
1111
import org.junit.jupiter.params.ParameterizedTest;
1212
import org.junit.jupiter.params.provider.CsvSource;
1313
import org.lfenergy.compas.scl2007b4.model.*;
@@ -20,8 +20,6 @@
2020
import org.lfenergy.compas.sct.commons.scl.ln.LN0Adapter;
2121
import org.lfenergy.compas.sct.commons.scl.ln.LNAdapter;
2222
import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller;
23-
import org.mockito.InjectMocks;
24-
import org.mockito.junit.jupiter.MockitoExtension;
2523

2624
import java.util.List;
2725
import java.util.Optional;
@@ -36,11 +34,17 @@
3634
import static org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller.assertIsMarshallable;
3735
import static org.lfenergy.compas.sct.commons.util.PrivateEnum.COMPAS_SCL_FILE_TYPE;
3836

39-
@ExtendWith(MockitoExtension.class)
4037
class SclServiceTest {
4138

42-
@InjectMocks
43-
SclService sclService;
39+
private final IedService iedService = new IedService();
40+
private final LnService lnService = new LnService();
41+
private final LdeviceService ldeviceService = new LdeviceService(lnService);
42+
private SclService sclService;
43+
44+
@BeforeEach
45+
void setUp() {
46+
sclService = new SclService(iedService, ldeviceService, lnService);
47+
}
4448

4549
@Test
4650
void addHistoryItem_should_add_history_elements() throws ScdException {

0 commit comments

Comments
 (0)