Skip to content

Commit 67f0679

Browse files
authored
Merge pull request #572 from com-pas/develop
Release 0.2.55
2 parents 30c3871 + 431bb87 commit 67f0679

File tree

11 files changed

+124
-60
lines changed

11 files changed

+124
-60
lines changed

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

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,38 @@
44

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

7+
import lombok.RequiredArgsConstructor;
78
import org.lfenergy.compas.scl2007b4.model.*;
89
import org.lfenergy.compas.sct.commons.api.DataTypeTemplateReader;
910
import org.lfenergy.compas.sct.commons.domain.DataAttribute;
1011
import org.lfenergy.compas.sct.commons.domain.DataObject;
1112
import org.lfenergy.compas.sct.commons.domain.DataRef;
1213
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa;
1314

14-
import java.util.ArrayList;
1515
import java.util.List;
1616
import java.util.Optional;
17-
import java.util.function.Predicate;
1817
import java.util.stream.Stream;
1918

19+
import static org.lfenergy.compas.scl2007b4.model.TPredefinedBasicTypeEnum.STRUCT;
20+
21+
@RequiredArgsConstructor
2022
public class DataTypeTemplatesService implements DataTypeTemplateReader {
2123

22-
final LnodeTypeService lnodeTypeService = new LnodeTypeService();
23-
final DoTypeService doTypeService = new DoTypeService();
24-
final DaTypeService daTypeService = new DaTypeService();
25-
final DoService doService = new DoService();
26-
final DaService daService = new DaService();
27-
final SdoService sdoService = new SdoService();
28-
final BDAService bdaService = new BDAService();
24+
/**
25+
* Create a new instance without passing dependency.
26+
* This will create a new instance of each dependency
27+
*/
28+
public DataTypeTemplatesService() {
29+
this(new LnodeTypeService(), new DoTypeService(new DaTypeService(), new DaService(), new SdoService(), new BDAService()), new DaTypeService(), new DoService(), new DaService(), new SdoService(), new BDAService());
30+
}
31+
32+
final LnodeTypeService lnodeTypeService;
33+
final DoTypeService doTypeService;
34+
final DaTypeService daTypeService;
35+
final DoService doService;
36+
final DaService daService;
37+
final SdoService sdoService;
38+
final BDAService bdaService;
2939

3040
@Override
3141
public Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt) {
@@ -41,7 +51,7 @@ public Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt, String lN
4151
return lnodeTypeService.findLnodeType(dtt, lNodeTypeId)
4252
.stream()
4353
.flatMap(tlNodeType -> doService.getDos(tlNodeType)
44-
.flatMap(tdo -> getAllDoLinkedToDa(dtt, tdo)));
54+
.flatMap(tdo -> getAllDoLinkedToDa(dtt, tdo)));
4555
}
4656

4757
@Override
@@ -68,46 +78,57 @@ private Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt, TDO tdo)
6878

6979
@Override
7080
public Optional<DoLinkedToDa> findDoLinkedToDa(TDataTypeTemplates dtt, String lNodeTypeId, DataRef dataRef) {
71-
List<String> dataRefList = new ArrayList<>(dataRef.sdoNames());
72-
dataRefList.addAll(dataRef.bdaNames());
73-
7481
return lnodeTypeService.findLnodeType(dtt, lNodeTypeId)
7582
.flatMap(lNodeType -> doService.findDo(lNodeType, dataRef.doName())
7683
// Search DoType for each DO
7784
.flatMap(tdo -> doTypeService.findDoType(dtt, tdo.getType())
7885
.flatMap(tdoType -> {
7986
// Search last DoType from DOType (SDO) > DOType (SDO)
80-
TDOType lastDoType = findDOTypeBySdoName(dtt, tdoType, dataRefList);
87+
Optional<TDOType> optLastDoType = findDOTypeBySdoName(dtt, tdoType, dataRef.sdoNames());
88+
if (optLastDoType.isEmpty()) {
89+
// it means that one of the SDO in dataRef.sdoNames() is missing
90+
return Optional.empty();
91+
}
8192
// Prepare DataObject
8293
DataObject dataObject = new DataObject(tdo.getName(), tdoType.getCdc(), dataRef.sdoNames());
8394
// Search first DA from last DoType
84-
return daService.findDA(lastDoType, dataRef.daName())
95+
return daService.findDA(optLastDoType.get(), dataRef.daName())
8596
.flatMap(tda -> {
8697
// Prepare DataAttribute
8798
DataAttribute dataAttribute = new DataAttribute();
8899
dataAttribute.setDaName(tda.getName());
89100
dataAttribute.setFc(tda.getFc());
90-
// Check if first DA is STRUCT or not
91-
if (!tda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)) {
92-
dataAttribute.addDaVal(tda.getVal());
93-
dataAttribute.setBType(tda.getBType());
94-
dataAttribute.setType(tda.getType());
95-
dataAttribute.setValImport(tda.isValImport());
96-
dataAttribute.setValKind(tda.getValKind());
97-
return Optional.of(new DoLinkedToDa(dataObject, dataAttribute));
101+
// 1. case dataRef.bdaNames() is empty
102+
if (dataRef.bdaNames().isEmpty()) {
103+
if (tda.getBType() != STRUCT) {
104+
// It's a match, because DA has no BDA and dataRef.bdaNames() is empty
105+
dataAttribute.addDaVal(tda.getVal());
106+
dataAttribute.setBType(tda.getBType());
107+
dataAttribute.setType(tda.getType());
108+
dataAttribute.setValImport(tda.isValImport());
109+
dataAttribute.setValKind(tda.getValKind());
110+
return Optional.of(new DoLinkedToDa(dataObject, dataAttribute));
111+
}
112+
// else, the DA is a STRUCT, so it has a BDA, but dataRef.bdaNames() is empty
113+
return Optional.empty();
114+
}
115+
// 2. case dataRef.bdaNames() is not empty
116+
if (tda.getBType() != STRUCT) {
117+
// the DA is not STRUCT, so it has no BDA, but dataRef.bdaNames() is not empty
118+
return Optional.empty();
98119
}
99120
// Search first DaType from DOType (from last DOType where DA is STRUCT)
100-
return getDATypeByDaName(dtt, lastDoType, tda.getName())
121+
return getDATypeByDaName(dtt, optLastDoType.get(), tda.getName())
101122
.flatMap(tdaType -> {
102-
// Search last DAType from first DAType
103-
TDAType lastDAType = findDATypeByBdaName(dtt, tdaType, tbda -> tbda.isSetBType()
104-
&& tbda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT), dataRefList);
105-
106-
// last DAType should contain BDA not STRUCT
107-
if (dataRefList.size() != 1) return Optional.empty();
108-
String lastBdaName = dataRefList.getFirst();
109-
return bdaService.findBDA(lastDAType, tbda -> tbda.getName().equals(lastBdaName)
110-
&& !tbda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT))
123+
// Search last STRUCT DAType
124+
Optional<TDAType> optLastStructDAType = findStructDATypeByBdaName(dtt, tdaType, dataRef.bdaNames().subList(0, dataRef.bdaNames().size() - 1));
125+
if (optLastStructDAType.isEmpty()) {
126+
// it means that one of the BDA in dataRef.bdaNames() is missing
127+
return Optional.empty();
128+
}
129+
// Search last BDA, which must not be a STRUCT
130+
String lastBdaName = dataRef.bdaNames().getLast();
131+
return bdaService.findBDA(optLastStructDAType.get(), tbda -> tbda.getName().equals(lastBdaName) && tbda.getBType() != STRUCT)
111132
.flatMap(tbda -> {
112133
dataAttribute.getBdaNames().addAll(dataRef.bdaNames());
113134
dataAttribute.setBType(tbda.getBType());
@@ -139,25 +160,23 @@ private Optional<TDAType> getDATypeByDaName(TDataTypeTemplates dtt, TDOType tdoT
139160
.flatMap(tda -> daTypeService.findDaType(dtt, tda.getType()));
140161
}
141162

142-
private TDOType findDOTypeBySdoName(TDataTypeTemplates dtt, TDOType tdoType, List<String> sdoNames) {
143-
if (sdoNames.isEmpty()) return tdoType;
163+
private Optional<TDOType> findDOTypeBySdoName(TDataTypeTemplates dtt, TDOType tdoType, List<String> sdoNames) {
164+
if (sdoNames.isEmpty()) {
165+
return Optional.of(tdoType);
166+
}
144167
return sdoService.findSDO(tdoType, sdoNames.getFirst())
145168
.flatMap(tsdo -> doTypeService.findDoType(dtt, tsdo.getType()))
146-
.map(tdoType2 -> {
147-
sdoNames.removeFirst();
148-
return findDOTypeBySdoName(dtt, tdoType2, sdoNames);
149-
}).orElse(tdoType);
169+
.flatMap(tdoType2 -> findDOTypeBySdoName(dtt, tdoType2, sdoNames.subList(1, sdoNames.size())));
150170
}
151171

152-
private TDAType findDATypeByBdaName(TDataTypeTemplates dtt, TDAType tdaType, Predicate<TBDA> tbdaPredicate, List<String> bdaNames) {
153-
if (bdaNames.isEmpty()) return tdaType;
154-
return bdaService.getFilteredBDAs(tdaType, tbdaPredicate)
172+
private Optional<TDAType> findStructDATypeByBdaName(TDataTypeTemplates dtt, TDAType tdaType, List<String> bdaNames) {
173+
if (bdaNames.isEmpty()) {
174+
return Optional.of(tdaType);
175+
}
176+
return bdaService.getFilteredBDAs(tdaType, tbda -> tbda.getName().equals(bdaNames.getFirst()) && tbda.getBType() == STRUCT)
155177
.findFirst()
156178
.flatMap(tbda -> daTypeService.findDaType(dtt, tbda.getType()))
157-
.map(tdaType2 -> {
158-
bdaNames.removeFirst();
159-
return findDATypeByBdaName(dtt, tdaType2, tbdaPredicate, bdaNames);
160-
}).orElse(tdaType);
179+
.flatMap(tdaType2 -> findStructDATypeByBdaName(dtt, tdaType2, bdaNames.subList(1, bdaNames.size())));
161180
}
162181

163182
}

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

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

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

7+
import lombok.RequiredArgsConstructor;
78
import org.lfenergy.compas.scl2007b4.model.*;
89
import org.lfenergy.compas.sct.commons.domain.DataAttribute;
910
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa;
@@ -14,12 +15,21 @@
1415
import java.util.function.Predicate;
1516
import java.util.stream.Stream;
1617

18+
@RequiredArgsConstructor
1719
public class DoTypeService {
1820

19-
final DaTypeService daTypeService = new DaTypeService();
20-
final DaService daService = new DaService();
21-
final SdoService sdoService = new SdoService();
22-
final BDAService bdaService = new BDAService();
21+
/**
22+
* Create a new instance without passing dependency.
23+
* This will create a new instance of each dependency
24+
*/
25+
public DoTypeService() {
26+
this(new DaTypeService(), new DaService(), new SdoService(), new BDAService());
27+
}
28+
29+
final DaTypeService daTypeService;
30+
final DaService daService;
31+
final SdoService sdoService;
32+
final BDAService bdaService;
2333

2434
public Stream<TDOType> getDoTypes(TDataTypeTemplates tDataTypeTemplates) {
2535
return tDataTypeTemplates.getDOType().stream();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ 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) {
28+
public Optional<TDOI> findDoi(TAnyLN tAnyLN, String doiName) {
2929
return findDoi(tAnyLN, tdoi -> tdoi.getName().equals(doiName));
3030
}
3131

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public Optional<TIED> findIed(SCL scd, Predicate<TIED> iedPredicate) {
2222
return getFilteredIeds(scd, iedPredicate).findFirst();
2323
}
2424

25-
public Optional<TIED> findByName(SCL scd, String iedName) {
25+
public Optional<TIED> findIed(SCL scd, String iedName) {
2626
if (null == iedName)
2727
throw new ScdException("The given iedName is null");
2828
return findIed(scd, tied -> iedName.equals(tied.getName()));

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@
1919
@RequiredArgsConstructor
2020
public class LdeviceService {
2121

22+
/**
23+
* Create a new instance without passing dependency.
24+
* This will create a new instance of each dependency
25+
*/
26+
public LdeviceService() {
27+
this(new LnService());
28+
}
29+
2230
private final LnService lnService;
2331

2432
public Stream<TLDevice> getLdevices(TIED tied) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ private void manageMonitoringLns(List<IedSource> iedSources, SCL scd, TIED tied,
273273
for (int i = 0; i < iedSources.size(); i++) {
274274
TLN lnToAdd = copyLn(lgosOrLsvs); //duplicate actual LGOS or LSVS in order to add LDSUIED with extRefs properties
275275
IedSource iedSource = iedSources.get(i);
276-
TIED sourceIed = iedService.findByName(scd, iedSource.iedName()).orElseThrow(() -> new ScdException("IED.name '" + iedSource.iedName() + "' not found in SCD"));
276+
TIED sourceIed = iedService.findIed(scd, iedSource.iedName()).orElseThrow(() -> new ScdException("IED.name '" + iedSource.iedName() + "' not found in SCD"));
277277
String sourceLdName = ldeviceService.findLdevice(sourceIed, iedSource.srcLdInst()).orElseThrow(() -> new ScdException(String.format("LDevice.inst '%s' not found in IED '%s'", iedSource.srcLdInst(), iedSource.iedName()))).getLdName();
278278
lnToAdd.setInst(String.valueOf(i + 1));
279279
DaVal newVal = new DaVal(null, sourceLdName + "/" + TLLN0Enum.LLN_0.value() + "." + iedSource.srcCBName());

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import org.junit.jupiter.api.BeforeEach;
88
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.params.ParameterizedTest;
10+
import org.junit.jupiter.params.provider.CsvSource;
911
import org.lfenergy.compas.scl2007b4.model.*;
1012
import org.lfenergy.compas.sct.commons.domain.*;
1113
import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller;
@@ -95,6 +97,31 @@ void findDoLinkedToDa_should_find_DO_DA() {
9597
assertThat(result).get().usingRecursiveComparison().isEqualTo(doLinkedToDa);
9698
}
9799

100+
@ParameterizedTest
101+
@CsvSource({
102+
"InexistantDo.sdo1.sdo2,da2.bda1.bda2",
103+
"Do1.InexistantSdo.sdo2,da2.bda1.bda2",
104+
"Do1.sdo1.InexistantSdo,da2.bda1.bda2",
105+
"Do1.sdo1.sdo2,InexistantDa.bda1.bda2",
106+
"Do1.sdo1.sdo2,da2.inexistantStructBda.bda2",
107+
"Do1.sdo1.sdo2,da2.bda1.inexisentFinalBda",
108+
"Do1.sdo1.sdo2,da2.bda1", // last BDA is a STRUCT, missing a final BDA
109+
"Do1.sdo1.sdo2,da2", // DA is a struct, missing BDA
110+
"Do1.sdo1,da2.bda1.bda2", // Missing a SDO
111+
"Do1.sdo2,da2.bda1.bda2", // Missing a SDO
112+
"sdo1.sdo2,da2.bda1.bda2", // Missing DO
113+
"Do1.sdo1.sdo2,bda1.bda2", // Missing DA
114+
"Do1.sdo1.sdo2,da2.bda2", // Missing a BDA
115+
})
116+
void findDoLinkedToDa_when_dataRef_not_found_should_return_empty(String doNames, String daNames) {
117+
// Given
118+
TDataTypeTemplates dtt = initDttFromFile("dtt-test-schema-conf/scd_dtt_do_sdo_da_bda.xml");
119+
// When
120+
Optional<DoLinkedToDa> result = dataTypeTemplatesService.findDoLinkedToDa(dtt, "LN1", DataRef.from(doNames, daNames));
121+
// Then
122+
assertThat(result).isEmpty();
123+
}
124+
98125
@Test
99126
void getAllDOAndDA_when_1DO_linked_to_1DA_should_return_expectedItems() {
100127
//Given

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void getFilteredDois() {
5252
}
5353

5454
@Test
55-
void findDoi() {
55+
void findDoi_by_predicate() {
5656
//Given
5757
SCL std = SclTestMarshaller.getSCLFromResource("std/std_sample.std");
5858
LN0 ln0 = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0();
@@ -67,13 +67,13 @@ void findDoi() {
6767
}
6868

6969
@Test
70-
void findDoiByName() {
70+
void findDoi_by_name() {
7171
//Given
7272
SCL std = SclTestMarshaller.getSCLFromResource("std/std_sample.std");
7373
LN0 ln0 = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0();
7474

7575
//When
76-
Optional<TDOI> doi = doiService.findDoiByName(ln0, "Beh");
76+
Optional<TDOI> doi = doiService.findDoi(ln0, "Beh");
7777

7878
//Then
7979
assertThat(doi).hasValueSatisfying(tdoi -> assertThat(tdoi.getName()).isEqualTo("Beh"));

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void findByName_should_return_ied_infos() {
4141
IedService iedService = new IedService();
4242

4343
//When
44-
TIED tied = iedService.findByName(std, "IED_NAME1").orElseThrow();
44+
TIED tied = iedService.findIed(std, "IED_NAME1").orElseThrow();
4545

4646
//Then
4747
assertThat(tied)
@@ -57,7 +57,7 @@ void findByName_should_fail() {
5757

5858
//When
5959
//Then
60-
assertThatCode(() -> iedService.findByName(std, null))
60+
assertThatCode(() -> iedService.findIed(std, (String) null))
6161
.isInstanceOf(ScdException.class)
6262
.hasMessage("The given iedName is null");
6363
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class LdeviceServiceTest {
2626

2727
@BeforeEach
2828
void setUp() {
29-
ldeviceService = new LdeviceService(new LnService());
29+
ldeviceService = new LdeviceService();
3030
}
3131

3232
@Test

0 commit comments

Comments
 (0)