Skip to content

Commit eefb4fb

Browse files
committed
Feat/refactor manage monitoring and review processing lns: lgos and lsvs
Signed-off-by: Samir Romdhani <[email protected]> fix: review processing lns: lgos and lsvs Signed-off-by: Samir Romdhani <[email protected]> fix: get extref per ied Signed-off-by: Samir Romdhani <[email protected]> fix: review processing lns: lgos and lsvs Signed-off-by: Samir Romdhani <[email protected]> fix: remove processing lns: lgos and lsvs with adapter Signed-off-by: Samir Romdhani <[email protected]> fix: review Signed-off-by: Samir Romdhani <[email protected]> fix: review Signed-off-by: Samir Romdhani <[email protected]> fix: review processing lns (lgos and lsvs) remove jaxbcontext Signed-off-by: Samir Romdhani <[email protected]>
1 parent b677539 commit eefb4fb

File tree

16 files changed

+305
-427
lines changed

16 files changed

+305
-427
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.lfenergy.compas.scl2007b4.model.SCL;
1111
import org.lfenergy.compas.sct.commons.*;
1212
import org.lfenergy.compas.sct.commons.api.ControlBlockEditor;
13+
import org.lfenergy.compas.sct.commons.api.DataTypeTemplateReader;
1314
import org.lfenergy.compas.sct.commons.api.SclEditor;
1415
import org.lfenergy.compas.sct.commons.api.SubstationEditor;
1516
import org.lfenergy.compas.sct.commons.dto.HeaderDTO;
@@ -29,9 +30,14 @@
2930

3031
class SclAutomationServiceIntegrationTest {
3132

32-
private SclAutomationService sclAutomationService ;
33-
private static final SclEditor sclEditor = new SclService() ;
34-
private static final SubstationEditor substationEditor = new SubstationService(new VoltageLevelService()) ;
33+
private SclAutomationService sclAutomationService;
34+
private static final IedService iedService = new IedService();
35+
private static final LnService lnService = new LnService();
36+
private static final ExtRefReaderService extRefReaderService = new ExtRefReaderService();
37+
private static final DataTypeTemplateReader dataTypeTemplatesService = new DataTypeTemplatesService() ;
38+
private static final LdeviceService ldeviceService = new LdeviceService(lnService);
39+
private static final SclEditor sclEditor = new SclService(iedService, ldeviceService, lnService, extRefReaderService, dataTypeTemplatesService) ;
40+
private static final SubstationEditor substationEditor = new SubstationService(new VoltageLevelService());
3541
private static final ControlBlockEditor controlBlockEditor = new ControlBlockEditorService(new ControlService(), new LdeviceService(new LnService()), new ConnectedAPService(), new SubNetworkService());
3642

3743
private HeaderDTO headerDTO;

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
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

1310
import java.util.stream.Stream;

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

Lines changed: 72 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@
44

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

7+
import jakarta.xml.bind.JAXBContext;
78
import lombok.Getter;
89
import lombok.NonNull;
910
import lombok.RequiredArgsConstructor;
1011
import lombok.extern.slf4j.Slf4j;
1112
import org.lfenergy.compas.scl2007b4.model.*;
13+
import org.lfenergy.compas.sct.commons.api.DataTypeTemplateReader;
1214
import org.lfenergy.compas.sct.commons.api.SclEditor;
15+
import org.lfenergy.compas.sct.commons.domain.DaVal;
16+
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter;
1317
import org.lfenergy.compas.sct.commons.dto.*;
1418
import org.lfenergy.compas.sct.commons.exception.ScdException;
15-
import org.lfenergy.compas.sct.commons.scl.ExtRefService;
1619
import org.lfenergy.compas.sct.commons.scl.SclRootAdapter;
1720
import org.lfenergy.compas.sct.commons.scl.com.CommunicationAdapter;
1821
import org.lfenergy.compas.sct.commons.scl.com.ConnectedAPAdapter;
@@ -26,16 +29,15 @@
2629
import org.lfenergy.compas.sct.commons.scl.ldevice.LDeviceAdapter;
2730
import org.lfenergy.compas.sct.commons.scl.ln.AbstractLNAdapter;
2831
import org.lfenergy.compas.sct.commons.scl.ln.LN0Adapter;
29-
import org.lfenergy.compas.sct.commons.scl.ln.LNAdapter;
3032
import org.lfenergy.compas.sct.commons.util.MonitoringLnClassEnum;
3133
import org.lfenergy.compas.sct.commons.util.PrivateUtils;
3234
import org.lfenergy.compas.sct.commons.util.Utils;
3335

3436
import java.util.*;
37+
import java.util.stream.Collectors;
3538

36-
import static org.lfenergy.compas.sct.commons.util.CommonConstants.IED_TEST_NAME;
39+
import static org.lfenergy.compas.sct.commons.util.CommonConstants.*;
3740
import static org.lfenergy.compas.sct.commons.util.PrivateEnum.COMPAS_ICDHEADER;
38-
import static org.lfenergy.compas.sct.commons.util.Utils.copySclElement;
3941

4042
@Slf4j
4143
@RequiredArgsConstructor
@@ -48,6 +50,9 @@ public class SclService implements SclEditor {
4850
private final IedService iedService;
4951
private final LdeviceService ldeviceService;
5052
private final LnService lnService;
53+
private final ExtRefReaderService extRefReaderService;
54+
private final DataTypeTemplateReader dataTypeTemplateService;
55+
5156
@Getter
5257
private final List<SclReportItem> errorHanlder = new ArrayList<>();
5358

@@ -213,61 +218,77 @@ public List<SclReportItem> updateDoInRef(SCL scd) {
213218
.toList();
214219
}
215220

221+
216222
@Override
217223
public List<SclReportItem> manageMonitoringLns(SCL scd) {
218224
errorHanlder.clear();
219225
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())
222-
.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();
228-
manageMonitoringLns(tExtRefs.stream().filter(tExtRef -> TServiceType.GOOSE.equals(tExtRef.getServiceType())).toList(), scd, tied, tlDevice, DO_GOCBREF, MonitoringLnClassEnum.LGOS);
229-
manageMonitoringLns(tExtRefs.stream().filter(tExtRef -> TServiceType.SMV.equals(tExtRef.getServiceType())).toList(), scd, tied, tlDevice, DO_SVCBREF, MonitoringLnClassEnum.LSVS);
230-
}));
226+
.forEach(tied -> {
227+
Map<TServiceType, List<TExtRef>> serviceTypeToExtRefs = ldeviceService.getLdevices(tied)
228+
.flatMap(tlDevice -> extRefReaderService.getExtRefs(tlDevice.getLN0()))
229+
.filter(tExtRef -> tExtRef.isSetServiceType() && tExtRef.isSetSrcCBName() && (tExtRef.getServiceType().equals(TServiceType.GOOSE) || tExtRef.getServiceType().equals(TServiceType.SMV)))
230+
.collect(Collectors.groupingBy(TExtRef::getServiceType));
231+
ldeviceService.findLdevice(tied, LDEVICE_LDSUIED).ifPresent(ldSUIEDLDevice -> {
232+
Optional.ofNullable(serviceTypeToExtRefs.get(TServiceType.GOOSE))
233+
.ifPresent(extRefs -> manageMonitoringLns(extRefs, scd, tied, ldSUIEDLDevice, DO_GOCBREF, MonitoringLnClassEnum.LGOS));
234+
Optional.ofNullable(serviceTypeToExtRefs.get(TServiceType.SMV))
235+
.ifPresent(extRefs -> manageMonitoringLns(extRefs, scd, tied, ldSUIEDLDevice, DO_SVCBREF, MonitoringLnClassEnum.LSVS));
236+
});
237+
});
231238
return errorHanlder;
232239
}
233240

234-
private void manageMonitoringLns(List<TExtRef> tExtRefs, SCL scd, TIED tied, TLDevice tlDevice, String doName, MonitoringLnClassEnum monitoringLnClassEnum) {
235-
List<TLN> tlns = lnService.getFilteredLns(tlDevice, tln -> monitoringLnClassEnum.value().equals(tln.getLnClass().getFirst())).toList();
236-
if (tlns.isEmpty())
237-
errorHanlder.add(SclReportItem.warning(tied.getName()+"/"+tlDevice.getInst()+"/"+monitoringLnClassEnum.value(), "There is no LN %s present in LDevice".formatted(monitoringLnClassEnum.value())));
238-
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-
});
241+
private void manageMonitoringLns(List<TExtRef> tExtRefs, SCL scd, TIED tied, TLDevice ldsuiedLdevice, String doName, MonitoringLnClassEnum monitoringLnClassEnum) {
242+
List<TLN> lgosOrLsvsLns = lnService.getFilteredLns(ldsuiedLdevice, tln -> monitoringLnClassEnum.value().equals(tln.getLnClass().getFirst())).toList();
243+
if (lgosOrLsvsLns.isEmpty())
244+
errorHanlder.add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value(), "There is no LN %s present in LDevice".formatted(monitoringLnClassEnum.value())));
245+
DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter(doName, List.of(), DA_SETSRCREF, List.of());
246+
lgosOrLsvsLns.forEach(lgosOrLsvs -> dataTypeTemplateService.getFilteredDoLinkedToDa(scd.getDataTypeTemplates(), lgosOrLsvs.getLnType(), doLinkedToDaFilter)
247+
.map(doLinkedToDa -> lnService.getDoLinkedToDaCompletedFromDAI(tied, LDEVICE_LDSUIED, lgosOrLsvs, doLinkedToDa))
248+
.findFirst()
249+
.filter(doLinkedToDa -> {
250+
if (!doLinkedToDa.isUpdatable())
251+
errorHanlder.add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value() + "/DOI@name=\"" + doName + "\"/DAI@name=\"setSrcRef\"/Val", "The DAI cannot be updated"));
252+
return doLinkedToDa.isUpdatable();
253+
})
254+
.ifPresent(doLinkedToDa -> {
255+
log.info("Processing %d ExtRefs in LDName=%s of service type %s for LN (lnClass=%s, inst=%s, prefix=%s)".formatted(tExtRefs.size(), ldsuiedLdevice.getLdName(), monitoringLnClassEnum.value(), lgosOrLsvs.getLnClass().getFirst(), lgosOrLsvs.getInst(), lgosOrLsvs.getPrefix()));
256+
for (int i = 0; i < tExtRefs.size(); i++) {
257+
TLN lnToAdd = copyLn(lgosOrLsvs); //duplicate actual LGOS or LSVS in order to add LDSUIED with extRefs properties
258+
TExtRef tExtRef = tExtRefs.get(i);
259+
TIED sourceIed = iedService.findByName(scd, tExtRef.getIedName()).orElseThrow(() -> new ScdException("IED.name '" + tExtRef.getIedName() + "' not found in SCD"));
260+
String sourceLdName = ldeviceService.findLdevice(sourceIed, tExtRef.getSrcLDInst()).orElseThrow(() -> new ScdException(String.format("LDevice.inst '%s' not found in IED '%s'", tExtRef.getSrcLDInst(), tExtRef.getIedName()))).getLdName();
261+
String lnClass = !tExtRef.isSetSrcLNClass() ? TLLN0Enum.LLN_0.value() : tExtRef.getSrcLNClass().getFirst();
262+
lnToAdd.setInst(String.valueOf(i + 1));
263+
DaVal newVal = new DaVal(null, sourceLdName + "/" + lnClass + "." + tExtRef.getSrcCBName());
264+
doLinkedToDa.dataAttribute().getDaiValues().clear();
265+
doLinkedToDa.dataAttribute().getDaiValues().add(newVal);
266+
lnService.updateOrCreateDOAndDAInstances(lnToAdd, doLinkedToDa);
267+
log.info("Processing %d ExtRefs in LDName=%s - added LN (lnClass=%s, inst=%s, prefix=%s) - update DOI(name=%s)/DAI(name=%s) with value=%s".formatted(tExtRefs.size(), ldsuiedLdevice.getLdName(), lgosOrLsvs.getLnClass().getFirst(), String.valueOf(i + 1), lgosOrLsvs.getPrefix(), doName, DA_SETSRCREF, newVal.val()));
268+
ldsuiedLdevice.getLN().add(lnToAdd);
269+
}
270+
ldsuiedLdevice.getLN().remove(lgosOrLsvs); //We can remove this LGOS or LSVS as we already added new ones
271+
}));
264272
}
265273

266-
private void removeLnsByLnClass(MonitoringLnClassEnum monitoringLnClassEnum, TLDevice tlDevice) {
267-
List<TLN> lnToKeep = tlDevice.getLN().stream()
268-
.filter(tln -> !Utils.lnClassEquals(tln.getLnClass(), monitoringLnClassEnum.value()))
269-
.toList();
270-
tlDevice.unsetLN();
271-
tlDevice.getLN().addAll(lnToKeep);
274+
private TLN copyLn(TLN tln) {
275+
TLN newLn = new TLN();
276+
newLn.getLnClass().addAll(tln.getLnClass());
277+
newLn.setInst(tln.getInst());
278+
newLn.setLnType(tln.getLnType());
279+
newLn.setPrefix(tln.getPrefix());
280+
newLn.setDesc(tln.getDesc());
281+
newLn.setInputs(tln.getInputs());
282+
newLn.setText(tln.getText());
283+
newLn.getPrivate().addAll(tln.getPrivate());
284+
newLn.getDataSet().addAll(tln.getDataSet());
285+
newLn.getAny().addAll(tln.getAny());
286+
newLn.getDOI().addAll(tln.getDOI());
287+
newLn.getLog().addAll(tln.getLog());
288+
newLn.getLogControl().addAll(tln.getLogControl());
289+
newLn.getOtherAttributes().putAll(tln.getOtherAttributes());
290+
newLn.getReportControl().addAll(tln.getReportControl());
291+
return newLn;
272292
}
293+
273294
}

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/api/SclEditor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

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

7+
import jakarta.xml.bind.JAXBContext;
78
import lombok.NonNull;
89
import org.lfenergy.compas.scl2007b4.model.SCL;
910
import org.lfenergy.compas.sct.commons.dto.*;

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/dto/DataAttributeRef.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,6 @@ public class DataAttributeRef {
5151
@NonNull
5252
private DaTypeName daName = new DaTypeName("");
5353

54-
public DataAttributeRef(TLN tln, DoTypeName doName, DaTypeName daName) {
55-
this.prefix = tln.getPrefix();
56-
this.lnClass = tln.getLnClass().getFirst();
57-
this.lnInst = tln.getInst();
58-
this.lnType = tln.getLnType();
59-
this.doName = doName;
60-
this.daName = daName;
61-
}
62-
6354
public DataAttributeRef(AbstractLNAdapter<?> lnAdapter, DoTypeName doName, DaTypeName daName) {
6455
this.lnClass = lnAdapter.getLNClass();
6556
this.lnInst = lnAdapter.getLNInst();

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/IEDAdapter.java

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@
1313
import org.lfenergy.compas.sct.commons.scl.ObjectReference;
1414
import org.lfenergy.compas.sct.commons.scl.ldevice.LDeviceAdapter;
1515
import org.lfenergy.compas.sct.commons.scl.ln.AbstractLNAdapter;
16-
import org.lfenergy.compas.sct.commons.scl.ln.LN0Adapter;
1716
import org.lfenergy.compas.sct.commons.util.PrivateUtils;
1817
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;
1918
import org.lfenergy.compas.sct.commons.scl.SclRootAdapter;
20-
import org.lfenergy.compas.sct.commons.util.MonitoringLnClassEnum;
2119
import org.lfenergy.compas.sct.commons.util.ServicesConfigEnum;
2220
import org.lfenergy.compas.sct.commons.util.Utils;
2321

@@ -64,9 +62,6 @@
6462
public class IEDAdapter extends SclElementAdapter<SclRootAdapter, TIED> {
6563

6664
private static final String MESSAGE_LDEVICE_INST_NOT_FOUND = "LDevice.inst '%s' not found in IED '%s'";
67-
private static final String DO_GOCBREF = "GoCBRef";
68-
private static final String DO_SVCBREF = "SvCBRef";
69-
private static final String LDSUIED_LDINST = "LDSUIED";
7065

7166
/**
7267
* Constructor
@@ -390,32 +385,4 @@ public Optional<TCompasSystemVersion> getCompasSystemVersion() {
390385
return PrivateUtils.extractCompasPrivate(currentElem, TCompasSystemVersion.class);
391386
}
392387

393-
/**
394-
* Update and/or create Monitoring LNs (LSVS and LGOS) into LDSUIED for each bound ExtRef of each LDevice
395-
*
396-
* @return a list of SclReport Objects that contains errors
397-
*/
398-
public List<SclReportItem> manageMonitoringLns() {
399-
List<SclReportItem> sclReportItems = new ArrayList<>();
400-
findLDeviceAdapterByLdInst(LDSUIED_LDINST).ifPresent(lDeviceAdapter -> {
401-
lDeviceAdapter.manageMonitoringLns(retrieveAllExtRefForServiceType(TServiceType.GOOSE), DO_GOCBREF, MonitoringLnClassEnum.LGOS)
402-
.ifPresent(sclReportItems::add);
403-
lDeviceAdapter.manageMonitoringLns(retrieveAllExtRefForServiceType(TServiceType.SMV), DO_SVCBREF, MonitoringLnClassEnum.LSVS)
404-
.ifPresent(sclReportItems::add);
405-
});
406-
return sclReportItems;
407-
}
408-
409-
private List<TExtRef> retrieveAllExtRefForServiceType(TServiceType tServiceType) {
410-
return streamLDeviceAdapters()
411-
.map(LDeviceAdapter::getLN0Adapter)
412-
.filter(AbstractLNAdapter::hasInputs)
413-
.map(LN0Adapter::getInputsAdapter)
414-
.map(InputsAdapter::filterDuplicatedExtRefs)
415-
.flatMap(List::stream)
416-
.filter(tExtRef -> tExtRef.isSetServiceType() && tExtRef.isSetSrcCBName() &&
417-
tServiceType.equals(tExtRef.getServiceType()))
418-
.toList();
419-
}
420-
421388
}

0 commit comments

Comments
 (0)