Skip to content

Commit f919a91

Browse files
Merge pull request #516 from com-pas/develop
Release 0.2.43
2 parents 569b00d + 588e406 commit f919a91

17 files changed

+685
-304
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ public Optional<TDOI> findDoi(TAnyLN tAnyLN, Predicate<TDOI> tdoiPredicate) {
2525
return getFilteredDois(tAnyLN, tdoiPredicate).findFirst();
2626
}
2727

28+
public Optional<TDOI> findDoiByName(TAnyLN tAnyLN, String doiName) {
29+
return findDoi(tAnyLN, tdoi -> tdoi.getName().equals(doiName));
30+
}
31+
2832
}

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

Lines changed: 132 additions & 124 deletions
Large diffs are not rendered by default.

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> errorHanlder = 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-
errorHanlder.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 errorHanlder;
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-
errorHanlder.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-
errorHanlder.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/api/LnEditor.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

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

7-
import org.lfenergy.compas.scl2007b4.model.TAnyLN;
8-
import org.lfenergy.compas.scl2007b4.model.TDAI;
9-
import org.lfenergy.compas.scl2007b4.model.TIED;
7+
import org.lfenergy.compas.scl2007b4.model.*;
108
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa;
119
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter;
1210
import org.lfenergy.compas.sct.commons.util.ActiveStatus;
1311

1412
import java.util.Optional;
13+
import java.util.function.Predicate;
14+
import java.util.stream.Stream;
1515

1616
public interface LnEditor {
1717

@@ -24,4 +24,10 @@ public interface LnEditor {
2424
void updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedToDa);
2525

2626
DoLinkedToDa getDoLinkedToDaCompletedFromDAI(TIED tied, String ldInst, TAnyLN anyLN, DoLinkedToDa doLinkedToDa);
27+
28+
Stream<TAnyLN> getAnylns(TLDevice tlDevice);
29+
30+
Optional<TLN> findLn(TLDevice tlDevice, Predicate<TLN> lnPredicate);
31+
32+
boolean matchesLn(TAnyLN tAnyLN, String lnClass, String lnInst, String lnPrefix);
2733
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,20 @@ 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
}
4950

51+
public void addDaVal(TVal tVal) {
52+
Long settingGroup = tVal.isSetSGroup() ? tVal.getSGroup() : null;
53+
daiValues.removeIf(daVal -> Objects.equals(daVal.settingGroup(), settingGroup));
54+
daiValues.add(new DaVal(settingGroup, tVal.getValue()));
55+
}
56+
5057
@Override
5158
public String toString(){
5259
return daName + (getBdaNames().isEmpty() ? StringUtils.EMPTY : "." + String.join(".", getBdaNames()));

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class DoiServiceTest {
2323
void getDois() {
2424
//Given
2525
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
26-
LN0 ln0 = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0();
26+
LN0 ln0 = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0();
2727

2828
//When
2929
List<TDOI> tdois = doiService.getDois(ln0).toList();
@@ -39,7 +39,7 @@ void getDois() {
3939
void getFilteredDois() {
4040
//Given
4141
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
42-
LN0 ln0 = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0();
42+
LN0 ln0 = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0();
4343

4444
//When
4545
List<TDOI> tdois = doiService.getFilteredDois(ln0, tdoi -> tdoi.getName().equals("Beh")).toList();
@@ -55,7 +55,7 @@ void getFilteredDois() {
5555
void findDoi() {
5656
//Given
5757
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
58-
LN0 ln0 = std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0).getLN0();
58+
LN0 ln0 = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0();
5959

6060
//When
6161
Optional<TDOI> doi = doiService.findDoi(ln0, tdoi -> tdoi.getName().equals("Beh"));
@@ -65,4 +65,17 @@ void findDoi() {
6565
.extracting(TDOI::getName, tdoi -> tdoi.getSDIOrDAI().size())
6666
.containsExactly("Beh", 1);
6767
}
68+
69+
@Test
70+
void findDoiByName() {
71+
//Given
72+
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
73+
LN0 ln0 = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0();
74+
75+
//When
76+
Optional<TDOI> doi = doiService.findDoiByName(ln0, "Beh");
77+
78+
//Then
79+
assertThat(doi).hasValueSatisfying(tdoi -> assertThat(tdoi.getName()).isEqualTo("Beh"));
80+
}
6881
}

0 commit comments

Comments
 (0)