Skip to content

Commit c5146cd

Browse files
authored
Merge pull request #488 from com-pas/486-improve-do-search-services
feat(486): Improve DoSearch Services
2 parents 0062f76 + 6ca946f commit c5146cd

File tree

12 files changed

+290
-49
lines changed

12 files changed

+290
-49
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// SPDX-FileCopyrightText: 2024 RTE FRANCE
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package org.lfenergy.compas.sct.commons;
6+
7+
import org.lfenergy.compas.scl2007b4.model.TDA;
8+
import org.lfenergy.compas.scl2007b4.model.TDOType;
9+
10+
import java.util.Optional;
11+
import java.util.function.Predicate;
12+
import java.util.stream.Stream;
13+
14+
public class DaService {
15+
16+
public Stream<TDA> getDAs(TDOType tdoType) {
17+
return tdoType.getSDOOrDA().stream()
18+
.filter(tUnNaming -> tUnNaming.getClass().equals(TDA.class))
19+
.map(TDA.class::cast);
20+
}
21+
22+
public Stream<TDA> getFilteredDAs(TDOType tdoType, Predicate<TDA> tdaPredicate) {
23+
return getDAs(tdoType).filter(tdaPredicate);
24+
}
25+
26+
public Optional<TDA> findDA(TDOType tdoType, Predicate<TDA> tdaPredicate) {
27+
return getFilteredDAs(tdoType, tdaPredicate).findFirst();
28+
}
29+
30+
public Optional<TDA> findDA(TDOType tdoType, String daName) {
31+
return getFilteredDAs(tdoType, tda -> tda.getName().equals(daName)).findFirst();
32+
}
33+
34+
}

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

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public class DataTypeTemplatesService implements DataTypeTemplateReader {
2727
final DoTypeService doTypeService = new DoTypeService();
2828
final DaTypeService daTypeService = new DaTypeService();
2929
final DoService doService = new DoService();
30-
final SDOOrDAService sdoOrDAService = new SDOOrDAService();
30+
final DaService daService = new DaService();
31+
final SdoService sdoService = new SdoService();
3132
final BDAService bdaService = new BDAService();
3233

3334
/**
@@ -48,10 +49,10 @@ public class DataTypeTemplatesService implements DataTypeTemplateReader {
4849
* @return true if the Data Object (Mod) and Data attribute (stVal) present, false otherwise
4950
*/
5051
public boolean isDoModAndDaStValExist(TDataTypeTemplates dtt, String lNodeTypeId) {
51-
return lnodeTypeService.findLnodeType(dtt, lNodeType -> lNodeTypeId.equals(lNodeType.getId()))
52-
.flatMap(lNodeType -> doService.findDo(lNodeType, tdo -> MOD_DO_NAME.equals(tdo.getName()))
53-
.flatMap(tdo -> doTypeService.findDoType(dtt, doType -> tdo.getType().equals(doType.getId()))
54-
.map(doType -> sdoOrDAService.findDA(doType, tda -> STVAL_DA_NAME.equals(tda.getName())).isPresent())))
52+
return lnodeTypeService.findLnodeType(dtt, lNodeTypeId)
53+
.flatMap(lNodeType -> doService.findDo(lNodeType, MOD_DO_NAME)
54+
.flatMap(tdo -> doTypeService.findDoType(dtt, tdo.getType())
55+
.map(doType -> daService.findDA(doType, STVAL_DA_NAME).isPresent())))
5556
.orElse(false);
5657
}
5758

@@ -62,7 +63,7 @@ public Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt) {
6263
DoLinkedToDa doLinkedToDa = new DoLinkedToDa(new DataObject(), new DataAttribute());
6364
return tlNodeType.getDO()
6465
.stream()
65-
.map(tdo -> doTypeService.findDoType(dtt, tdoType -> tdoType.getId().equals(tdo.getType()))
66+
.map(tdo -> doTypeService.findDoType(dtt, tdo.getType())
6667
.map(doType -> {
6768
doLinkedToDa.dataObject().setDoName(tdo.getName());
6869
return doTypeService.getAllSDOLinkedToDa(dtt, doType, doLinkedToDa).stream();
@@ -74,15 +75,15 @@ public Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt) {
7475

7576
@Override
7677
public Stream<DoLinkedToDa> getFilteredDoLinkedToDa(TDataTypeTemplates dtt, String lNodeTypeId, DoLinkedToDaFilter doLinkedToDaFilter) {
77-
return lnodeTypeService.findLnodeType(dtt, tlNodeType -> tlNodeType.getId().equals(lNodeTypeId))
78+
return lnodeTypeService.findLnodeType(dtt, lNodeTypeId)
7879
.stream()
7980
.flatMap(tlNodeType -> doService.getFilteredDos(tlNodeType, tdo -> StringUtils.isBlank(doLinkedToDaFilter.doName())
8081
|| doLinkedToDaFilter.doName().equals(tdo.getName()))
8182
.flatMap(tdo -> {
8283
DataObject dataObject = new DataObject();
8384
dataObject.setDoName(tdo.getName());
8485
DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, new DataAttribute());
85-
return doTypeService.findDoType(dtt, tdoType -> tdoType.getId().equals(tdo.getType()))
86+
return doTypeService.findDoType(dtt, tdo.getType())
8687
.stream()
8788
.flatMap(tdoType -> {
8889
doLinkedToDa.dataObject().setCdc(tdoType.getCdc());
@@ -99,17 +100,17 @@ public Optional<DoLinkedToDa> findDoLinkedToDa(TDataTypeTemplates dtt, String lN
99100
List<String> dataRefList = new ArrayList<>(doLinkedToDaFilter.sdoNames());
100101
dataRefList.addAll(doLinkedToDaFilter.bdaNames());
101102

102-
return lnodeTypeService.findLnodeType(dtt, lNodeType -> lNodeTypeId.equals(lNodeType.getId()))
103-
.flatMap(lNodeType -> doService.findDo(lNodeType, tdo -> tdo.getName().equals(doLinkedToDaFilter.doName()))
103+
return lnodeTypeService.findLnodeType(dtt, lNodeTypeId)
104+
.flatMap(lNodeType -> doService.findDo(lNodeType, doLinkedToDaFilter.doName())
104105
// Search DoType for each DO
105-
.flatMap(tdo -> doTypeService.findDoType(dtt, doType -> doType.getId().equals(tdo.getType()))
106+
.flatMap(tdo -> doTypeService.findDoType(dtt, tdo.getType())
106107
.flatMap(tdoType -> {
107108
// Search last DoType from DOType (SDO) > DOType (SDO)
108109
TDOType lastDoType = findDOTypeBySdoName(dtt, tdoType, dataRefList);
109110
// Prepare DataObject
110111
DataObject dataObject = new DataObject(tdo.getName(), tdoType.getCdc(), doLinkedToDaFilter.sdoNames());
111112
// Search first DA from last DoType
112-
return sdoOrDAService.findDA(lastDoType, tda -> tda.getName().equals(doLinkedToDaFilter.daName()))
113+
return daService.findDA(lastDoType, doLinkedToDaFilter.daName())
113114
.flatMap(tda -> {
114115
// Prepare DataAttribute
115116
DataAttribute dataAttribute = new DataAttribute();
@@ -165,14 +166,14 @@ public Stream<String> getEnumValues(TDataTypeTemplates dataTypeTemplates, String
165166
}
166167

167168
private Optional<TDAType> getDATypeByDaName(TDataTypeTemplates dtt, TDOType tdoType, String daName) {
168-
return sdoOrDAService.findDA(tdoType, tda -> tda.getName().equals(daName))
169+
return daService.findDA(tdoType, daName)
169170
.flatMap(tda -> daTypeService.findDaType(dtt, tda.getType()));
170171
}
171172

172173
private TDOType findDOTypeBySdoName(TDataTypeTemplates dtt, TDOType tdoType, List<String> sdoNames) {
173174
if (sdoNames.isEmpty()) return tdoType;
174-
return sdoOrDAService.findSDO(tdoType, tsdo -> tsdo.getName().equals(sdoNames.getFirst()))
175-
.flatMap(tsdo -> doTypeService.findDoType(dtt, tdoType2 -> tdoType2.getId().equals(tsdo.getType())))
175+
return sdoService.findSDO(tdoType, sdoNames.getFirst())
176+
.flatMap(tsdo -> doTypeService.findDoType(dtt, tsdo.getType()))
176177
.map(tdoType2 -> {
177178
sdoNames.removeFirst();
178179
return findDOTypeBySdoName(dtt, tdoType2, sdoNames);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ public Optional<TDO> findDo(TLNodeType tlNodeType, Predicate<TDO> tdoPredicate)
2525
return getFilteredDos(tlNodeType, tdoPredicate).findFirst();
2626
}
2727

28+
public Optional<TDO> findDo(TLNodeType tlNodeType, String doName) {
29+
return getFilteredDos(tlNodeType, tdo -> tdo.getName().equals(doName)).findFirst();
30+
}
31+
2832
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
public class DoTypeService {
1818

1919
final DaTypeService daTypeService = new DaTypeService();
20-
final SDOOrDAService sdoOrDAService = new SDOOrDAService();
20+
final DaService daService = new DaService();
21+
final SdoService sdoService = new SdoService();
2122
final BDAService bdaService = new BDAService();
2223

2324
public Stream<TDOType> getDoTypes(TDataTypeTemplates tDataTypeTemplates) {
@@ -32,10 +33,14 @@ public Optional<TDOType> findDoType(TDataTypeTemplates tDataTypeTemplates, Predi
3233
return getFilteredDoTypes(tDataTypeTemplates, tdoTypePredicate).findFirst();
3334
}
3435

36+
public Optional<TDOType> findDoType(TDataTypeTemplates tDataTypeTemplates, String doTypeId) {
37+
return getFilteredDoTypes(tDataTypeTemplates, tdoType -> tdoType.getId().equals(doTypeId)).findFirst();
38+
}
39+
3540
public List<DoLinkedToDa> getAllSDOLinkedToDa(TDataTypeTemplates dtt, TDOType tdoType, DoLinkedToDa doLinkedToDaTemplate) {
3641
List<DoLinkedToDa> result = new ArrayList<>();
3742
// DA -> BDA -> BDA..
38-
sdoOrDAService.getDAs(tdoType).forEach(tda -> {
43+
daService.getDAs(tdoType).forEach(tda -> {
3944
DoLinkedToDa doLinkedToDa = doLinkedToDaTemplate.deepCopy();
4045
doLinkedToDa.dataAttribute().setDaName(tda.getName());
4146
if (tda.isSetFc()) {
@@ -52,10 +57,10 @@ public List<DoLinkedToDa> getAllSDOLinkedToDa(TDataTypeTemplates dtt, TDOType td
5257
}
5358
});
5459
// SDO -> SDO -> SDO..
55-
sdoOrDAService.getSDOs(tdoType)
60+
sdoService.getSDOs(tdoType)
5661
.forEach(tsdo -> {
5762
if (tsdo.isSetType()) {
58-
findDoType(dtt, tdoType1 -> tdoType1.getId().equals(tsdo.getType()))
63+
findDoType(dtt, tsdo.getType())
5964
.ifPresent(nextDoType -> {
6065
DoLinkedToDa newDoLinkedToDa = doLinkedToDaTemplate.deepCopy();
6166
newDoLinkedToDa.dataObject().getSdoNames().add(tsdo.getName());

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ public Optional<TLNodeType> findLnodeType(TDataTypeTemplates tDataTypeTemplates,
2525
return getFilteredLnodeTypes(tDataTypeTemplates, tlNodeTypePredicate).findFirst();
2626
}
2727

28+
public Optional<TLNodeType> findLnodeType(TDataTypeTemplates tDataTypeTemplates, String lNodeTypeId) {
29+
return getFilteredLnodeTypes(tDataTypeTemplates, tlNodeType -> tlNodeType.getId().equals(lNodeTypeId)).findFirst();
30+
}
31+
2832
}

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SDOOrDAService.java renamed to sct-commons/src/main/java/org/lfenergy/compas/sct/commons/SdoService.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,31 @@
44

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

7-
import org.lfenergy.compas.scl2007b4.model.*;
7+
import org.lfenergy.compas.scl2007b4.model.TDOType;
8+
import org.lfenergy.compas.scl2007b4.model.TSDO;
89

910
import java.util.Optional;
1011
import java.util.function.Predicate;
1112
import java.util.stream.Stream;
1213

13-
public class SDOOrDAService {
14-
14+
public class SdoService {
1515

1616
public Stream<TSDO> getSDOs(TDOType tdoType) {
1717
return tdoType.getSDOOrDA().stream()
1818
.filter(tUnNaming -> tUnNaming.getClass().equals(TSDO.class))
1919
.map(TSDO.class::cast);
2020
}
2121

22-
public Stream<TDA> getDAs(TDOType tdoType) {
23-
return tdoType.getSDOOrDA().stream()
24-
.filter(tUnNaming -> tUnNaming.getClass().equals(TDA.class))
25-
.map(TDA.class::cast);
26-
}
27-
2822
public Stream<TSDO> getFilteredSDOs(TDOType tdoType, Predicate<TSDO> tsdoPredicate) {
2923
return getSDOs(tdoType).filter(tsdoPredicate);
3024
}
3125

32-
public Stream<TDA> getFilteredDAs(TDOType tdoType, Predicate<TDA> tdaPredicate) {
33-
return getDAs(tdoType).filter(tdaPredicate);
34-
}
35-
3626
public Optional<TSDO> findSDO(TDOType tdoType, Predicate<TSDO> tsdoPredicate) {
3727
return getFilteredSDOs(tdoType, tsdoPredicate).findFirst();
3828
}
3929

40-
public Optional<TDA> findDA(TDOType tdoType, Predicate<TDA> tdaPredicate) {
41-
return getFilteredDAs(tdoType, tdaPredicate).findFirst();
30+
public Optional<TSDO> findSDO(TDOType tdoType, String sdoName) {
31+
return getFilteredSDOs(tdoType, tsdo -> tsdo.getName().equals(sdoName)).findFirst();
4232
}
4333

4434
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public static LNodeDTO from(TAnyLN tAnyLN, LogicalNodeOptions options, String ie
183183
.lnType(lnType)
184184
.build();
185185

186-
TLNodeType lnodeType = new LnodeTypeService().findLnodeType(scl.getDataTypeTemplates(), lnodeType1 -> lnodeType1.getId().equals(lnType))
186+
TLNodeType lnodeType = new LnodeTypeService().findLnodeType(scl.getDataTypeTemplates(), lnType)
187187
.orElseThrow(() -> new IllegalArgumentException("Corrupted SCD file: reference to unknown lnType(" + lnType + ")"));
188188
List<DataAttributeRef> dataAttributeRefList = new LNodeTypeAdapter(new DataTypeTemplateAdapter(new SclRootAdapter(scl), scl.getDataTypeTemplates()), lnodeType)
189189
.getDataAttributeRefs(filter);
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// SPDX-FileCopyrightText: 2024 RTE FRANCE
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package org.lfenergy.compas.sct.commons;
6+
7+
import org.junit.jupiter.api.Test;
8+
import org.lfenergy.compas.scl2007b4.model.TDA;
9+
import org.lfenergy.compas.scl2007b4.model.TDOType;
10+
import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates;
11+
import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller;
12+
13+
import java.util.List;
14+
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
17+
class DaServiceTest {
18+
19+
private final DaService daService = new DaService();
20+
21+
@Test
22+
void getDAs() {
23+
//Given
24+
TDataTypeTemplates dataTypeTemplates = SclTestMarshaller.getSCLFromFile("/std/std_sample.std").getDataTypeTemplates();
25+
TDOType tdoType = dataTypeTemplates.getDOType().getFirst();
26+
27+
//When
28+
List<TDA> dAs = daService.getDAs(tdoType).toList();
29+
30+
//Then
31+
assertThat(dAs).hasSize(8)
32+
.extracting(TDA::getName)
33+
.containsExactly("vendor", "hwRev", "swRev", "serNum", "model", "location", "name", "d");
34+
}
35+
36+
@Test
37+
void getFilteredDAs() {
38+
//Given
39+
TDataTypeTemplates dataTypeTemplates = SclTestMarshaller.getSCLFromFile("/std/std_sample.std").getDataTypeTemplates();
40+
TDOType tdoType = dataTypeTemplates.getDOType().getFirst();
41+
42+
//When
43+
List<TDA> dAs = daService.getFilteredDAs(tdoType, tda -> tda.getName().equals("vendor")).toList();
44+
45+
//Then
46+
assertThat(dAs)
47+
.hasSize(1)
48+
.extracting(TDA::getName)
49+
.containsExactly("vendor");
50+
}
51+
52+
@Test
53+
void findDA() {
54+
//Given
55+
TDataTypeTemplates dataTypeTemplates = SclTestMarshaller.getSCLFromFile("/std/std_sample.std").getDataTypeTemplates();
56+
TDOType tdoType = dataTypeTemplates.getDOType().getFirst();
57+
58+
//When
59+
TDA da = daService.findDA(tdoType, tda -> tda.getName().equals("vendor")).orElseThrow();
60+
61+
//Then
62+
assertThat(da)
63+
.extracting(TDA::getName)
64+
.isEqualTo("vendor");
65+
}
66+
67+
@Test
68+
void findDA_should_find_by_name() {
69+
//Given
70+
TDataTypeTemplates dataTypeTemplates = SclTestMarshaller.getSCLFromFile("/std/std_sample.std").getDataTypeTemplates();
71+
TDOType tdoType = dataTypeTemplates.getDOType().getFirst();
72+
73+
//When
74+
TDA da = daService.findDA(tdoType, "vendor").orElseThrow();
75+
76+
//Then
77+
assertThat(da)
78+
.extracting(TDA::getName)
79+
.isEqualTo("vendor");
80+
}
81+
}

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

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717

1818
class DoServiceTest {
1919

20+
private final DoService doService = new DoService();
21+
2022
@Test
2123
void getDos() {
2224
//Given
2325
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
24-
TLNodeType lnodeType = std.getDataTypeTemplates().getLNodeType().get(0);
25-
DoService doService = new DoService();
26+
TLNodeType lnodeType = std.getDataTypeTemplates().getLNodeType().getFirst();
2627

2728
//When
2829
List<TDO> dos = doService.getDos(lnodeType).toList();
@@ -51,8 +52,7 @@ void getDos() {
5152
void getFilteredDos() {
5253
//Given
5354
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
54-
TLNodeType lnodeType = std.getDataTypeTemplates().getLNodeType().get(0);
55-
DoService doService = new DoService();
55+
TLNodeType lnodeType = std.getDataTypeTemplates().getLNodeType().getFirst();
5656

5757
//When
5858
List<TDO> dos = doService.getFilteredDos(lnodeType, tdo -> "NumInput1".equals(tdo.getName())).toList();
@@ -68,8 +68,7 @@ void getFilteredDos() {
6868
void findDo() {
6969
//Given
7070
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
71-
TLNodeType lnodeType = std.getDataTypeTemplates().getLNodeType().get(0);
72-
DoService doService = new DoService();
71+
TLNodeType lnodeType = std.getDataTypeTemplates().getLNodeType().getFirst();
7372

7473
//When
7574
TDO tdo1 = doService.findDo(lnodeType, tdo -> "NumInput1".equals(tdo.getName())).orElseThrow();
@@ -79,4 +78,19 @@ void findDo() {
7978
.extracting(TDO::getName, TDO::getType)
8079
.containsExactly("NumInput1", "RTE_X_X_X_553F8AE90EC0448B1518B00F5EAABB58_ING_V1.0.0");
8180
}
81+
82+
@Test
83+
void findDo_should_find_by_name() {
84+
//Given
85+
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
86+
TLNodeType lnodeType = std.getDataTypeTemplates().getLNodeType().getFirst();
87+
88+
//When
89+
TDO tdo1 = doService.findDo(lnodeType, "NumInput1").orElseThrow();
90+
91+
//Then
92+
assertThat(tdo1)
93+
.extracting(TDO::getName, TDO::getType)
94+
.containsExactly("NumInput1", "RTE_X_X_X_553F8AE90EC0448B1518B00F5EAABB58_ING_V1.0.0");
95+
}
8296
}

0 commit comments

Comments
 (0)