Skip to content

Commit 2827570

Browse files
committed
refactor: review #506#discussion_r2077258522
Signed-off-by: Samir Romdhani <[email protected]>
1 parent 985aa2e commit 2827570

File tree

3 files changed

+57
-47
lines changed

3 files changed

+57
-47
lines changed

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

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class ExtRefEditorService implements ExtRefEditor {
5353
private final DataTypeTemplatesService dataTypeTemplatesService;
5454

5555
@Getter
56-
private final List<SclReportItem> errorHandler = new ArrayList<>();
56+
private final ThreadLocal<List<SclReportItem>> errorHandler = ThreadLocal.withInitial(ArrayList::new);
5757

5858
/**
5959
* Provides valid IED sources according to EPF configuration.<br/>
@@ -100,9 +100,9 @@ private List<ExtRefInfo.ExtRefWithBayReference> getExtRefWithBayReferenceInLDEPF
100100
String lDevicePath = "SCL/IED[@name=\"" + tied.getName() + "\"]/AccessPoint/Server/LDevice[@inst=\"" + tlDevice.getInst() + "\"]";
101101
Optional<TCompasBay> tCompasBay = PrivateUtils.extractCompasPrivate(tied, TCompasBay.class);
102102
if (tCompasBay.isEmpty()) {
103-
errorHandler.add(SclReportItem.error(lDevicePath, "The IED has no Private Bay"));
103+
errorHandler.get().add(SclReportItem.error(lDevicePath, "The IED has no Private Bay"));
104104
if (PrivateUtils.extractCompasPrivate(tied, TCompasICDHeader.class).isEmpty()) {
105-
errorHandler.add(SclReportItem.error(lDevicePath, "The IED has no Private compas:ICDHeader"));
105+
errorHandler.get().add(SclReportItem.error(lDevicePath, "The IED has no Private compas:ICDHeader"));
106106
}
107107
return Collections.emptyList();
108108
}
@@ -247,29 +247,33 @@ public TExtRef updateExtRefSource(SCL scd, ExtRefInfo extRefInfo) throws ScdExce
247247

248248
@Override
249249
public List<SclReportItem> manageBindingForLDEPF(SCL scd, EPF epf) {
250-
errorHandler.clear();
251-
if (!epf.isSetChannels()) return errorHandler;
252-
log.info("Processing %d EPF setting channels".formatted(epf.getChannels().getChannel().size()));
253-
iedService.getFilteredIeds(scd, ied -> !ied.getName().contains("TEST"))
254-
.forEach(tied -> ldeviceService.findLdevice(tied, tlDevice -> tlDevice.getInst().equals(LDEVICE_LDEPF))
255-
.filter(ldepfLdevice -> PrivateUtils.extractStringPrivate(ldepfLdevice.getLN0(), COMPAS_LNODE_STATUS).map(status -> !status.equals("off")).orElse(false))
256-
.ifPresent(ldepfLdevice -> getExtRefWithBayReferenceInLDEPF(tied, ldepfLdevice)
257-
.forEach(extRefBayRef -> epf.getChannels().getChannel().stream().filter(tChannel -> doesExtRefMatchLDEPFChannel(extRefBayRef.extRef(), tChannel))
258-
.findFirst().ifPresent(channel -> {
259-
List<TIED> iedSources = getIedSources(scd, extRefBayRef.compasBay(), channel);
260-
if (iedSources.size() == 1) {
261-
updateLDEPFExtRefBinding(extRefBayRef, iedSources.getFirst(), channel);
262-
updateLDEPFDos(scd.getDataTypeTemplates(), tied, ldepfLdevice, extRefBayRef.extRef(), channel);
263-
} else {
264-
if (iedSources.size() > 1) {
265-
errorHandler.add(SclReportItem.warning(null, "There is more than one IED source to bind the signal " +
266-
"/IED@name=" + extRefBayRef.iedName() + "/LDevice@inst=LDEPF/LN0" +
267-
"/ExtRef@desc=" + extRefBayRef.extRef().getDesc()));
250+
errorHandler.get().clear();
251+
if (!epf.isSetChannels()) return List.of();
252+
try {
253+
log.info("Processing %d EPF setting channels".formatted(epf.getChannels().getChannel().size()));
254+
iedService.getFilteredIeds(scd, ied -> !ied.getName().contains("TEST"))
255+
.forEach(tied -> ldeviceService.findLdevice(tied, tlDevice -> tlDevice.getInst().equals(LDEVICE_LDEPF))
256+
.filter(ldepfLdevice -> PrivateUtils.extractStringPrivate(ldepfLdevice.getLN0(), COMPAS_LNODE_STATUS).map(status -> !status.equals("off")).orElse(false))
257+
.ifPresent(ldepfLdevice -> getExtRefWithBayReferenceInLDEPF(tied, ldepfLdevice)
258+
.forEach(extRefBayRef -> epf.getChannels().getChannel().stream().filter(tChannel -> doesExtRefMatchLDEPFChannel(extRefBayRef.extRef(), tChannel))
259+
.findFirst().ifPresent(channel -> {
260+
List<TIED> iedSources = getIedSources(scd, extRefBayRef.compasBay(), channel);
261+
if (iedSources.size() == 1) {
262+
updateLDEPFExtRefBinding(extRefBayRef, iedSources.getFirst(), channel);
263+
updateLDEPFDos(scd.getDataTypeTemplates(), tied, ldepfLdevice, extRefBayRef.extRef(), channel);
264+
} else {
265+
if (iedSources.size() > 1) {
266+
errorHandler.get().add(SclReportItem.warning(null, "There is more than one IED source to bind the signal " +
267+
"/IED@name=" + extRefBayRef.iedName() + "/LDevice@inst=LDEPF/LN0" +
268+
"/ExtRef@desc=" + extRefBayRef.extRef().getDesc()));
269+
}
270+
// If the source IED is not found, there will be no update or report message.
268271
}
269-
// If the source IED is not found, there will be no update or report message.
270-
}
271-
}))));
272-
return errorHandler;
272+
}))));
273+
return errorHandler.get();
274+
} finally {
275+
errorHandler.remove();
276+
}
273277
}
274278

275279
@Override
@@ -356,7 +360,7 @@ private void updateLDEPFDos(TDataTypeTemplates dtt, TIED tied, TLDevice tlDevice
356360
if (setting.getChannelType().equals(TChannelType.ANALOG)) {
357361
lnEditor.findLn(tlDevice, tAnyLN -> lnEditor.matchesLn(tAnyLN, LN_RADR, setting.getChannelNum(), null))
358362
.ifPresent(tln -> updateDaiValue(dtt, tied, tlDevice, tln, tExtRef, setting));
359-
lnEditor.findLn(tlDevice, tAnyLN -> lnEditor.matchesLn(tAnyLN, LN_RADR, setting.getChannelNum(), LN_PREFIX_A))
363+
lnEditor.findLn(tlDevice, tAnyLN -> lnEditor.matchesLn(tAnyLN, LN_RBDR, setting.getChannelNum(), LN_PREFIX_A))
360364
.ifPresent(tln -> updateDaiValue(dtt, tied, tlDevice, tln, tExtRef, setting));
361365
}
362366
}
@@ -388,7 +392,7 @@ private void updateDaiVal(TDataTypeTemplates dtt, TIED tied, TLDevice tlDevice,
388392
.findFirst()
389393
.filter(doLinkedToDa1 -> {
390394
if (!doLinkedToDa1.isUpdatable()){
391-
errorHandler.add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + LnId.from(tln).lnClass() + "/DOI@name=\"" + doLinkedToDaFilter.doName() + "\"/DAI@name=\"" + doLinkedToDaFilter.daName() + "\"/Val", "The DAI cannot be updated"));
395+
errorHandler.get().add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + LnId.from(tln).lnClass() + "/DOI@name=\"" + doLinkedToDaFilter.doName() + "\"/DAI@name=\"" + doLinkedToDaFilter.daName() + "\"/Val", "The DAI cannot be updated"));
392396
}
393397
return doLinkedToDa1.isUpdatable();
394398
})

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

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public class SclService implements SclEditor {
5454
private final DataTypeTemplateReader dataTypeTemplateService;
5555

5656
@Getter
57-
private final List<SclReportItem> errorHandler = new ArrayList<>();
57+
private final ThreadLocal<List<SclReportItem>> errorHandler = ThreadLocal.withInitial(ArrayList::new);
5858

5959
@Override
6060
public SCL initScl(final UUID hId, final String hVersion, final String hRevision) throws ScdException {
@@ -221,37 +221,41 @@ public List<SclReportItem> updateDoInRef(SCL scd) {
221221

222222
@Override
223223
public List<SclReportItem> manageMonitoringLns(SCL scd) {
224-
errorHandler.clear();
225-
iedService.getFilteredIeds(scd, ied -> !ied.getName().contains(IED_TEST_NAME))
226-
.forEach(tied -> {
227-
Map<TServiceType, List<IedSource>> serviceTypeToIedSource = 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 -> new IedSource(tExtRef.getIedName(), tExtRef.getSrcCBName(), tExtRef.getSrcLDInst(), tExtRef.getServiceType())))
231-
.keySet()
232-
.stream()
233-
.collect(Collectors.groupingBy(IedSource::serviceType));
234-
ldeviceService.findLdevice(tied, LDEVICE_LDSUIED).ifPresent(ldSUIEDLDevice -> {
235-
Optional.ofNullable(serviceTypeToIedSource.get(TServiceType.GOOSE))
236-
.ifPresent(iedSourceKeys -> manageMonitoringLns(iedSourceKeys, scd, tied, ldSUIEDLDevice, DO_GOCBREF, MonitoringLnClassEnum.LGOS));
237-
Optional.ofNullable(serviceTypeToIedSource.get(TServiceType.SMV))
238-
.ifPresent(iedSourceKeys -> manageMonitoringLns(iedSourceKeys, scd, tied, ldSUIEDLDevice, DO_SVCBREF, MonitoringLnClassEnum.LSVS));
224+
errorHandler.get().clear();
225+
try {
226+
iedService.getFilteredIeds(scd, ied -> !ied.getName().contains(IED_TEST_NAME))
227+
.forEach(tied -> {
228+
Map<TServiceType, List<IedSource>> serviceTypeToIedSource = ldeviceService.getLdevices(tied)
229+
.flatMap(tlDevice -> extRefReaderService.getExtRefs(tlDevice.getLN0()))
230+
.filter(tExtRef -> tExtRef.isSetServiceType() && tExtRef.isSetSrcCBName() && (tExtRef.getServiceType().equals(TServiceType.GOOSE) || tExtRef.getServiceType().equals(TServiceType.SMV)))
231+
.collect(Collectors.groupingBy(tExtRef -> new IedSource(tExtRef.getIedName(), tExtRef.getSrcCBName(), tExtRef.getSrcLDInst(), tExtRef.getServiceType())))
232+
.keySet()
233+
.stream()
234+
.collect(Collectors.groupingBy(IedSource::serviceType));
235+
ldeviceService.findLdevice(tied, LDEVICE_LDSUIED).ifPresent(ldSUIEDLDevice -> {
236+
Optional.ofNullable(serviceTypeToIedSource.get(TServiceType.GOOSE))
237+
.ifPresent(iedSourceKeys -> manageMonitoringLns(iedSourceKeys, scd, tied, ldSUIEDLDevice, DO_GOCBREF, MonitoringLnClassEnum.LGOS));
238+
Optional.ofNullable(serviceTypeToIedSource.get(TServiceType.SMV))
239+
.ifPresent(iedSourceKeys -> manageMonitoringLns(iedSourceKeys, scd, tied, ldSUIEDLDevice, DO_SVCBREF, MonitoringLnClassEnum.LSVS));
240+
});
239241
});
240-
});
241-
return errorHandler;
242+
return errorHandler.get();
243+
} finally {
244+
errorHandler.remove();
245+
}
242246
}
243247

244248
private void manageMonitoringLns(List<IedSource> iedSources, SCL scd, TIED tied, TLDevice ldsuiedLdevice, String doName, MonitoringLnClassEnum monitoringLnClassEnum) {
245249
List<TLN> lgosOrLsvsLns = lnService.getFilteredLns(ldsuiedLdevice, tln -> monitoringLnClassEnum.value().equals(tln.getLnClass().getFirst())).toList();
246250
if (lgosOrLsvsLns.isEmpty())
247-
errorHandler.add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value(), "There is no LN %s present in LDevice".formatted(monitoringLnClassEnum.value())));
251+
errorHandler.get().add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value(), "There is no LN %s present in LDevice".formatted(monitoringLnClassEnum.value())));
248252
DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter(doName, List.of(), DA_SETSRCREF, List.of());
249253
lgosOrLsvsLns.forEach(lgosOrLsvs -> dataTypeTemplateService.getFilteredDoLinkedToDa(scd.getDataTypeTemplates(), lgosOrLsvs.getLnType(), doLinkedToDaFilter)
250254
.map(doLinkedToDa -> lnService.getDoLinkedToDaCompletedFromDAI(tied, LDEVICE_LDSUIED, lgosOrLsvs, doLinkedToDa))
251255
.findFirst()
252256
.filter(doLinkedToDa -> {
253257
if (!doLinkedToDa.isUpdatable())
254-
errorHandler.add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value() + "/DOI@name=\"" + doName + "\"/DAI@name=\"setSrcRef\"/Val", "The DAI cannot be updated"));
258+
errorHandler.get().add(SclReportItem.warning(tied.getName() + "/" + LDEVICE_LDSUIED + "/" + monitoringLnClassEnum.value() + "/DOI@name=\"" + doName + "\"/DAI@name=\"setSrcRef\"/Val", "The DAI cannot be updated"));
255259
return doLinkedToDa.isUpdatable();
256260
})
257261
.ifPresent(doLinkedToDa -> {

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DataAttribute.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,14 @@ public DataAttribute deepCopy() {
4040
}
4141

4242
public void addDaVal(List<TVal> vals) {
43+
vals.forEach(this::addDaVal);
4344
vals.forEach(tVal -> {
4445
Long settingGroup = tVal.isSetSGroup() ? tVal.getSGroup() : null;
4546
daiValues.removeIf(daVal -> Objects.equals(daVal.settingGroup(), settingGroup));
4647
daiValues.add(new DaVal(settingGroup, tVal.getValue()));
4748
});
4849
}
50+
4951
public void addDaVal(TVal tVal) {
5052
Long settingGroup = tVal.isSetSGroup() ? tVal.getSGroup() : null;
5153
daiValues.removeIf(daVal -> Objects.equals(daVal.settingGroup(), settingGroup));

0 commit comments

Comments
 (0)