Skip to content

Commit b91c0cf

Browse files
committed
feat(#459): Change LnService.getDaiModStVal
Signed-off-by: massifben <105049157+massifben@users.noreply.github.com>
1 parent e6cf3d6 commit b91c0cf

File tree

8 files changed

+172
-112
lines changed

8 files changed

+172
-112
lines changed

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

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

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

7-
import org.lfenergy.compas.scl2007b4.model.*;
7+
import org.lfenergy.compas.scl2007b4.model.TAccessPoint;
8+
import org.lfenergy.compas.scl2007b4.model.TIED;
9+
import org.lfenergy.compas.scl2007b4.model.TLDevice;
10+
import org.lfenergy.compas.scl2007b4.model.TServer;
811
import org.lfenergy.compas.sct.commons.util.ActiveStatus;
912

1013
import java.util.Objects;
@@ -41,6 +44,6 @@ public Optional<TLDevice> findLdevice(TIED tied, Predicate<TLDevice> ldevicePred
4144

4245
public Optional<ActiveStatus> getLdeviceStatus(TLDevice tlDevice) {
4346
LnService lnService = new LnService();
44-
return lnService.getDaiModStval(tlDevice.getLN0());
47+
return lnService.getDaiModStValValue(tlDevice.getLN0());
4548
}
4649
}

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

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.lfenergy.compas.sct.commons.util.ActiveStatus;
1313

1414
import java.util.ArrayList;
15-
import java.util.Collection;
1615
import java.util.List;
1716
import java.util.Optional;
1817
import java.util.function.Predicate;
@@ -60,33 +59,37 @@ public Optional<TLN> findLn(TLDevice tlDevice, Predicate<TLN> lnPredicate) {
6059
* @return the Lnode Status
6160
*/
6261
public ActiveStatus getLnStatus(TAnyLN tAnyLN, LN0 ln0) {
63-
Optional<ActiveStatus> ln0Status = getDaiModStval(ln0);
64-
return getDaiModStval(tAnyLN).filter(ActiveStatus.OFF::equals).orElseGet(() -> ln0Status.orElse(ActiveStatus.OFF));
62+
Optional<ActiveStatus> ln0Status = getDaiModStValValue(ln0);
63+
return getDaiModStValValue(tAnyLN).filter(ActiveStatus.OFF::equals).orElseGet(() -> ln0Status.orElse(ActiveStatus.OFF));
6564
}
6665

67-
public Optional<ActiveStatus> getDaiModStval(TAnyLN tAnyLN) {
66+
public Optional<ActiveStatus> getDaiModStValValue(TAnyLN tAnyLN) {
67+
return getDaiModStVal(tAnyLN)
68+
.stream()
69+
.flatMap(tdai -> tdai.getVal().stream())
70+
.map(TVal::getValue)
71+
.findFirst()
72+
.map(ActiveStatus::fromValue);
73+
}
74+
75+
public Optional<TDAI> getDaiModStVal(TAnyLN tAnyLN) {
6876
return tAnyLN
6977
.getDOI()
7078
.stream()
7179
.filter(tdoi -> MOD_DO_NAME.equals(tdoi.getName()))
72-
.findFirst()
73-
.flatMap(tdoi -> tdoi.getSDIOrDAI()
74-
.stream()
75-
.filter(dai -> dai.getClass().equals(TDAI.class))
76-
.map(TDAI.class::cast)
77-
.filter(tdai -> STVAL_DA_NAME.equals(tdai.getName()))
78-
.map(TDAI::getVal)
79-
.flatMap(Collection::stream)
80-
.findFirst()
81-
.map(TVal::getValue))
82-
.map(ActiveStatus::fromValue);
80+
.flatMap(tdoi -> tdoi.getSDIOrDAI().stream())
81+
.filter(TDAI.class::isInstance)
82+
.map(TDAI.class::cast)
83+
.filter(tdai -> STVAL_DA_NAME.equals(tdai.getName()))
84+
.findFirst();
8385
}
86+
8487
public Stream<TAnyLN> getActiveLns(TLDevice tlDevice) {
8588
LN0 ln0 = tlDevice.getLN0();
8689
Stream<TLN> tlnStream = tlDevice.getLN()
8790
.stream()
8891
.filter(tln -> ActiveStatus.ON.equals(getLnStatus(tln, ln0)));
89-
Stream<LN0> ln0Stream = Stream.of(ln0).filter(ln02 -> getDaiModStval(ln02).map(ActiveStatus.ON::equals).orElse(false));
92+
Stream<LN0> ln0Stream = Stream.of(ln0).filter(ln02 -> getDaiModStValValue(ln02).map(ActiveStatus.ON::equals).orElse(false));
9093
return Stream.concat(ln0Stream, tlnStream);
9194
}
9295

@@ -99,7 +102,7 @@ public Optional<TDAI> getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLi
99102
return tAnyLN.getDOI().stream().filter(doi -> doi.getName().equals(doLinkedToDaFilter.doName()))
100103
.findFirst()
101104
.flatMap(doi -> {
102-
if(structNamesList.size() > 1) {
105+
if (structNamesList.size() > 1) {
103106
String firstSDIName = structNamesList.removeFirst();
104107
return this.getSdiByName(doi, firstSDIName)
105108
.map(intermediateSdi -> findSDIByStructName(intermediateSdi, structNamesList))
@@ -116,7 +119,7 @@ public Optional<TDAI> getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLi
116119
return Optional.empty();
117120
})
118121
.stream().findFirst();
119-
} else if(structNamesList.size() == 1){
122+
} else if (structNamesList.size() == 1) {
120123
return doi.getSDIOrDAI().stream()
121124
.filter(unNaming -> unNaming.getClass().equals(TDAI.class))
122125
.map(TDAI.class::cast)
@@ -138,7 +141,7 @@ public void updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedT
138141
.ifPresentOrElse(tVal -> tVal.setValue(value),
139142
() -> tdai.getVal().add(newVal(value)));
140143
} else {
141-
for (DaVal daVal: daiVals) {
144+
for (DaVal daVal : daiVals) {
142145
tdai.getVal().stream()
143146
.filter(tValElem -> tValElem.isSetSGroup() && tValElem.getSGroup() == daVal.settingGroup())
144147
.findFirst()
@@ -198,22 +201,22 @@ private Optional<TDAI> createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject
198201

199202
TDOI doi = tAnyLN.getDOI().stream().filter(doi1 -> doi1.getName().equals(dataObject.getDoName()))
200203
.findFirst()
201-
.orElseGet(()-> {
204+
.orElseGet(() -> {
202205
TDOI newDOI = new TDOI();
203206
newDOI.setName(dataObject.getDoName());
204207
tAnyLN.getDOI().add(newDOI);
205208
return newDOI;
206209
});
207-
if(structInstances.size() > 1){
210+
if (structInstances.size() > 1) {
208211
TSDI firstSDI = findOrCreateSDIFromDOI(doi, structInstances.getFirst());
209212
TSDI lastSDI = findOrCreateSDIByStructName(firstSDI, structInstances);
210-
if(structInstances.size() == 1){
213+
if (structInstances.size() == 1) {
211214
return lastSDI.getSDIOrDAI().stream()
212215
.filter(tUnNaming -> tUnNaming.getClass().equals(TDAI.class))
213216
.map(TDAI.class::cast)
214217
.filter(tdai -> tdai.getName().equals(structInstances.getFirst()))
215218
.map(tdai -> {
216-
if(tdai.isSetValImport()) {
219+
if (tdai.isSetValImport()) {
217220
tdai.setValImport(dataAttribute.isValImport());
218221
}
219222
return tdai;
@@ -226,13 +229,13 @@ private Optional<TDAI> createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject
226229
return Optional.of(newDAI);
227230
});
228231
}
229-
} else if(structInstances.size() == 1){
232+
} else if (structInstances.size() == 1) {
230233
return doi.getSDIOrDAI().stream()
231234
.filter(tUnNaming -> tUnNaming.getClass().equals(TDAI.class))
232235
.map(TDAI.class::cast)
233236
.filter(tdai -> tdai.getName().equals(structInstances.getFirst()))
234237
.map(tdai -> {
235-
if(tdai.isSetValImport()) tdai.setValImport(dataAttribute.isValImport());
238+
if (tdai.isSetValImport()) tdai.setValImport(dataAttribute.isValImport());
236239
return tdai;
237240
})
238241
.findFirst()
@@ -247,7 +250,7 @@ private Optional<TDAI> createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject
247250
}
248251

249252
private TSDI findSDIByStructName(TSDI tsdi, List<String> sdiNames) {
250-
if(sdiNames.isEmpty()) return tsdi;
253+
if (sdiNames.isEmpty()) return tsdi;
251254
return this.getSdiByName(tsdi, sdiNames.getFirst())
252255
.map(sdi1 -> {
253256
sdiNames.removeFirst();
@@ -294,14 +297,13 @@ private Optional<TSDI> getSdiByName(TSDI sdi, String sdiName) {
294297
}
295298

296299
/**
297-
*
298-
* @param sdi TSDI
300+
* @param sdi TSDI
299301
* @param structName list start with sdi name
300302
* @return already existing TSDI or newly created TSDI from given TSDI
301303
*/
302304
private TSDI findOrCreateSDIByStructName(TSDI sdi, List<String> structName) {
303305
structName.removeFirst();
304-
if(structName.isEmpty() || structName.size() == 1) return sdi;
306+
if (structName.isEmpty() || structName.size() == 1) return sdi;
305307
return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(sdi, structName.getFirst()), structName);
306308
}
307309

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@
88
import lombok.Getter;
99
import lombok.NoArgsConstructor;
1010
import lombok.extern.slf4j.Slf4j;
11-
import org.lfenergy.compas.scl2007b4.model.*;
11+
import org.lfenergy.compas.scl2007b4.model.SCL;
12+
import org.lfenergy.compas.scl2007b4.model.TAnyLN;
13+
import org.lfenergy.compas.scl2007b4.model.TExtRef;
14+
import org.lfenergy.compas.scl2007b4.model.TLNodeType;
1215
import org.lfenergy.compas.sct.commons.DataSetService;
1316
import org.lfenergy.compas.sct.commons.ExtRefReaderService;
1417
import org.lfenergy.compas.sct.commons.LnodeTypeService;
1518
import org.lfenergy.compas.sct.commons.scl.SclRootAdapter;
1619
import org.lfenergy.compas.sct.commons.scl.dtt.DataTypeTemplateAdapter;
1720
import org.lfenergy.compas.sct.commons.scl.dtt.LNodeTypeAdapter;
18-
import org.lfenergy.compas.sct.commons.scl.ln.AbstractLNAdapter;
1921
import org.lfenergy.compas.sct.commons.scl.ldevice.LDeviceAdapter;
22+
import org.lfenergy.compas.sct.commons.scl.ln.AbstractLNAdapter;
2023
import org.lfenergy.compas.sct.commons.scl.ln.LNAdapter;
21-
import org.lfenergy.compas.sct.commons.scl.ln.LnKey;
24+
import org.lfenergy.compas.sct.commons.scl.ln.LnId;
2225
import org.lfenergy.compas.sct.commons.util.Utils;
2326

2427
import java.util.HashSet;
@@ -152,14 +155,10 @@ public static <T extends TAnyLN> LNodeDTO from(AbstractLNAdapter<T> nodeAdapter,
152155

153156
public static LNodeDTO from(TAnyLN tAnyLN, LogicalNodeOptions options, String iedName, String ldInst, SCL scl) {
154157
log.info(Utils.entering());
155-
LnKey lnKey = switch (tAnyLN) {
156-
case LN0 ln0 -> new LnKey(ln0);
157-
case TLN tln -> new LnKey(tln);
158-
default -> throw new IllegalStateException("Unexpected value: " + tAnyLN);
159-
};
160-
String inst = lnKey.getInst();
161-
String lnClass = lnKey.getLnClass();
162-
String prefix = lnKey.getPrefix();
158+
LnId lnId = LnId.from(tAnyLN);
159+
String inst = lnId.lnInst();
160+
String lnClass = lnId.lnClass();
161+
String prefix = lnId.prefix();
163162
String lnType = tAnyLN.getLnType();
164163
LNodeDTO lNodeDTO = new LNodeDTO(inst, lnClass, prefix, lnType);
165164
if (options.isWithExtRef()) {
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// SPDX-FileCopyrightText: 2025 RTE FRANCE
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.sct.commons.scl.ln;
5+
6+
import org.apache.commons.lang3.StringUtils;
7+
import org.lfenergy.compas.scl2007b4.model.*;
8+
import org.lfenergy.compas.sct.commons.exception.ScdException;
9+
10+
import java.util.List;
11+
import java.util.Objects;
12+
13+
public record LnId(String lnClass, String lnInst, String prefix) {
14+
private static final String LN0_LNCLASS = TLLN0Enum.LLN_0.value();
15+
16+
/**
17+
* Id of LN0. All LN0 have the same lnClass, lnInst and prefix in SCD
18+
*/
19+
public static final LnId LN0_ID = new LnId(LN0_LNCLASS, "", "");
20+
21+
/**
22+
* Constructor
23+
*
24+
* @param lnClass always required
25+
* @param lnInst optional. It should be empty for LN0, and should be filled for LN. No verification is done because some Lnode GAPC do not have a lninst.
26+
* @param prefix optional. Is set to empty if null because empty is the default value on LN and the majority of the JAXB Element (LN, LNode, FCDA, ClientLN, but not on ExtRef and IEDName unfortunately)
27+
*/
28+
public LnId(String lnClass, String lnInst, String prefix) {
29+
if (StringUtils.isBlank(lnClass)) {
30+
throw new ScdException("lnClass is required");
31+
}
32+
this.lnClass = lnClass;
33+
this.lnInst = Objects.requireNonNullElse(lnInst, "");
34+
this.prefix = Objects.requireNonNullElse(prefix, "");
35+
}
36+
37+
/**
38+
* Alternative constructor with lnClass as a List instead of a String.
39+
* JAXB classes lnClass attribute are List, even though it can only contain one element.
40+
* This constructor makes it easier to create LnId from JAXB classes
41+
*
42+
* @param lnClass one element list containing the lnClass value of the LN
43+
* @param lnInst LN lnInst
44+
* @param prefix LN prefix
45+
*/
46+
public LnId(List<String> lnClass, String lnInst, String prefix) {
47+
this(lnClass == null || lnClass.isEmpty() ? null : lnClass.getFirst(), lnInst, prefix);
48+
}
49+
50+
/**
51+
* Extract id from LN element
52+
*
53+
* @param tAnyLN LN element
54+
* @return id
55+
*/
56+
public static LnId from(TAnyLN tAnyLN) {
57+
if (tAnyLN instanceof TLN0) {
58+
return LN0_ID;
59+
} else if (tAnyLN instanceof TLN tln) {
60+
return new LnId(tln.getLnClass(), tln.getInst(), tln.getPrefix());
61+
} else {
62+
throw new ScdException("Unexpected class : " + (tAnyLN != null ? tAnyLN.getClass() : null));
63+
}
64+
}
65+
66+
/**
67+
* Extract id from LNode element
68+
*
69+
* @param tlNode LNode element
70+
* @return id
71+
*/
72+
public static LnId from(TLNode tlNode) {
73+
if (tlNode.getLnClass().contains(LN0_LNCLASS)) {
74+
return LN0_ID;
75+
} else {
76+
return new LnId(tlNode.getLnClass(), tlNode.getLnInst(), tlNode.getPrefix());
77+
}
78+
}
79+
80+
81+
}

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ln/LnKey.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,13 @@ void getFilteredAnyLns_should_return_lns() {
121121
}
122122

123123
@Test
124-
void getDaiModStval_should_return_status() {
124+
void getDaiModStValValue_should_return_status() {
125125
//Given
126126
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
127127
TLDevice tlDevice = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst();
128128

129129
//When
130-
Optional<ActiveStatus> daiModStval = lnService.getDaiModStval(tlDevice.getLN0());
130+
Optional<ActiveStatus> daiModStval = lnService.getDaiModStValValue(tlDevice.getLN0());
131131

132132
//Then
133133
assertThat(daiModStval).contains(ActiveStatus.ON);

0 commit comments

Comments
 (0)