Skip to content

Commit 76189be

Browse files
Merge pull request #379 from com-pas/refactor/dtt_manage_DO_DA_and_DOI_SDI_DAI
Refactor/dtt: solve and rewrite do>sdo>sdo>..>da>bda>bda Hierarchy in DataTypeTemplate And doi>sdi>sdi>..>dai In Logical Nodes LN
2 parents c413ac7 + 99a8ca4 commit 76189be

26 files changed

+1905
-77
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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.TBDA;
8+
import org.lfenergy.compas.scl2007b4.model.TDAType;
9+
10+
import java.util.Optional;
11+
import java.util.function.Predicate;
12+
import java.util.stream.Stream;
13+
14+
public class BDAService {
15+
16+
public Stream<TBDA> getBDAs(TDAType tdaType) {
17+
return tdaType.getBDA().stream();
18+
}
19+
20+
public Stream<TBDA> getFilteredBDAs(TDAType tdaType, Predicate<TBDA> tTBDAPredicate) {
21+
return getBDAs(tdaType).filter(tTBDAPredicate);
22+
}
23+
24+
public Optional<TBDA> findBDA(TDAType tdaType, Predicate<TBDA> tBDAPredicate) {
25+
return getFilteredBDAs(tdaType, tBDAPredicate).findFirst();
26+
}
27+
28+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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.TDAType;
8+
import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates;
9+
10+
import java.util.Optional;
11+
12+
public class DaTypeService {
13+
14+
public Optional<TDAType> findDaType(TDataTypeTemplates tDataTypeTemplates, String daTypeId) {
15+
return tDataTypeTemplates.getDAType().stream()
16+
.filter(tdaType -> tdaType.isSetId() && tdaType.getId().equals(daTypeId)).findFirst();
17+
}
18+
19+
}

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

Lines changed: 125 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,29 @@
44

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

7+
import org.apache.commons.lang3.StringUtils;
78
import org.lfenergy.compas.scl2007b4.model.*;
9+
import org.lfenergy.compas.sct.commons.api.DataTypeTemplateReader;
10+
import org.lfenergy.compas.sct.commons.domain.DataAttribute;
11+
import org.lfenergy.compas.sct.commons.domain.DataObject;
12+
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa;
13+
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter;
14+
15+
import java.util.*;
16+
import java.util.function.Predicate;
17+
import java.util.stream.Stream;
818

919
import static org.lfenergy.compas.sct.commons.util.CommonConstants.MOD_DO_NAME;
1020
import static org.lfenergy.compas.sct.commons.util.CommonConstants.STVAL_DA_NAME;
1121

12-
public class DataTypeTemplatesService {
22+
public class DataTypeTemplatesService implements DataTypeTemplateReader {
1323

1424
final LnodeTypeService lnodeTypeService = new LnodeTypeService();
1525
final DoTypeService doTypeService = new DoTypeService();
26+
final DaTypeService daTypeService = new DaTypeService();
1627
final DoService doService = new DoService();
28+
final SDOOrDAService sdoOrDAService = new SDOOrDAService();
29+
final BDAService bdaService = new BDAService();
1730

1831
/**
1932
* verify if DO(name=Mod)/DA(name=stVal) exists in DataTypeTemplate
@@ -33,14 +46,116 @@ public class DataTypeTemplatesService {
3346
*/
3447
public boolean isDoModAndDaStValExist(TDataTypeTemplates dtt, String lNodeTypeId) {
3548
return lnodeTypeService.findLnodeType(dtt, lNodeType -> lNodeTypeId.equals(lNodeType.getId()))
36-
.map(lNodeType -> doService.findDo(lNodeType, tdo -> MOD_DO_NAME.equals(tdo.getName()))
37-
.map(tdo -> doTypeService.findDoType(dtt, doType -> tdo.getType().equals(doType.getId()))
38-
.map(doType -> doType.getSDOOrDA().stream()
39-
.filter(sdoOrDa -> sdoOrDa.getClass().equals(TDA.class))
40-
.map(TDA.class::cast)
41-
.anyMatch(tda -> STVAL_DA_NAME.equals(tda.getName())))
42-
.orElse(false))
43-
.orElse(false))
44-
.orElse(false);
49+
.flatMap(lNodeType -> doService.findDo(lNodeType, tdo -> MOD_DO_NAME.equals(tdo.getName()))
50+
.flatMap(tdo -> doTypeService.findDoType(dtt, doType -> tdo.getType().equals(doType.getId()))
51+
.map(doType -> sdoOrDAService.findDA(doType, tda -> STVAL_DA_NAME.equals(tda.getName())).isPresent())))
52+
.orElse(false);
53+
}
54+
55+
@Override
56+
public Stream<DoLinkedToDa> getAllDoLinkedToDa(TDataTypeTemplates dtt) {
57+
return lnodeTypeService.getLnodeTypes(dtt)
58+
.flatMap(tlNodeType -> {
59+
DoLinkedToDa doLinkedToDa = new DoLinkedToDa();
60+
doLinkedToDa.setDataObject(new DataObject());
61+
doLinkedToDa.setDataAttribute(new DataAttribute());
62+
return tlNodeType.getDO()
63+
.stream()
64+
.map(tdo -> doTypeService.findDoType(dtt, tdoType -> tdoType.getId().equals(tdo.getType()))
65+
.map(doType -> {
66+
doLinkedToDa.getDataObject().setDoName(tdo.getName());
67+
return doTypeService.getAllSDOLinkedToDa(dtt, doType, doLinkedToDa).stream();
68+
}))
69+
.filter(Optional::isPresent)
70+
.flatMap(Optional::orElseThrow);
71+
});
72+
}
73+
74+
@Override
75+
public Stream<DoLinkedToDa> getFilteredDoLinkedToDa(TDataTypeTemplates dtt, String lNodeTypeId, DoLinkedToDaFilter doLinkedToDaFilter) {
76+
return lnodeTypeService.findLnodeType(dtt, tlNodeType -> tlNodeType.getId().equals(lNodeTypeId))
77+
.stream()
78+
.flatMap(tlNodeType -> doService.getFilteredDos(tlNodeType, tdo -> StringUtils.isBlank(doLinkedToDaFilter.getDoName())
79+
|| (StringUtils.isNotBlank(doLinkedToDaFilter.getDoName()) && doLinkedToDaFilter.getDoName().equals(tdo.getName())))
80+
.flatMap(tdo -> {
81+
DoLinkedToDa doLinkedToDa = new DoLinkedToDa();
82+
DataObject dataObject = new DataObject();
83+
dataObject.setDoName(tdo.getName());
84+
doLinkedToDa.setDataObject(dataObject);
85+
doLinkedToDa.setDataAttribute(new DataAttribute());
86+
return doTypeService.findDoType(dtt, tdoType -> tdoType.getId().equals(tdo.getType()))
87+
.stream()
88+
.flatMap(tdoType -> {
89+
doLinkedToDa.getDataObject().setCdc(tdoType.getCdc());
90+
return doTypeService.getAllSDOLinkedToDa(dtt, tdoType, doLinkedToDa).stream()
91+
.filter(doLinkedToDa1 -> StringUtils.isBlank(doLinkedToDaFilter.getDoName()) || doLinkedToDa1.getDoRef().startsWith(doLinkedToDaFilter.getDoRef())
92+
&& StringUtils.isBlank(doLinkedToDaFilter.getDaName()) || doLinkedToDa1.getDaRef().startsWith(doLinkedToDaFilter.getDaRef()));
93+
});
94+
}));
4595
}
96+
97+
@Override
98+
public Optional<DoLinkedToDa> findDoLinkedToDa(TDataTypeTemplates dtt, String lNodeTypeId, DoLinkedToDa doLinkedToDa) {
99+
List<String> dataRefList = new ArrayList<>(doLinkedToDa.getDataObject().getSdoNames());
100+
dataRefList.addAll(doLinkedToDa.getDataAttribute().getBdaNames());
101+
102+
return lnodeTypeService.findLnodeType(dtt, lNodeType -> lNodeTypeId.equals(lNodeType.getId()))
103+
.flatMap(lNodeType -> doService.findDo(lNodeType, tdo -> tdo.getName().equals(doLinkedToDa.getDataObject().getDoName()))
104+
// Search DoType for each DO
105+
.flatMap(tdo -> doTypeService.findDoType(dtt, doType -> doType.getId().equals(tdo.getType()))
106+
.flatMap(tdoType -> {
107+
// Search last DoType from DOType (SDO) > DOType (SDO)
108+
TDOType lastDoType = findDOTypeBySdoName(dtt, tdoType, dataRefList);
109+
// Search first DA from last DoType
110+
return sdoOrDAService.findDA(lastDoType, tda1 -> tda1.getName().equals(doLinkedToDa.getDataAttribute().getDaName()))
111+
.flatMap(tda -> {
112+
// Check if first DA is STRUCT or not
113+
if(!tda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)) {
114+
return Optional.of(doLinkedToDa);
115+
}
116+
// Search first DaType from DOType (from last DOType where DA is STRUCT)
117+
return getDATypeByDaName(dtt, lastDoType, tda.getName())
118+
.flatMap(tdaType -> {
119+
// Search last DAType from first DAType
120+
TDAType lastDAType = findDATypeByBdaName(dtt, tdaType, tbda -> tbda.isSetBType()
121+
&& tbda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT), dataRefList);
122+
123+
// last DAType should contain BDA not STRUCT
124+
if(dataRefList.size() != 1) return Optional.empty();
125+
String lastBdaName = dataRefList.getFirst();
126+
return bdaService.findBDA(lastDAType, tbda -> tbda.getName().equals(lastBdaName)
127+
&& !tbda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT))
128+
.flatMap(tbda -> Optional.of(doLinkedToDa));
129+
});
130+
});
131+
})
132+
));
133+
}
134+
135+
private Optional<TDAType> getDATypeByDaName(TDataTypeTemplates dtt, TDOType tdoType, String daName) {
136+
return sdoOrDAService.findDA(tdoType, tda -> tda.getName().equals(daName))
137+
.flatMap(tda -> daTypeService.findDaType(dtt, tda.getType()));
138+
}
139+
140+
private TDOType findDOTypeBySdoName(TDataTypeTemplates dtt, TDOType tdoType, List<String> sdoNames) {
141+
if(sdoNames.isEmpty()) return tdoType;
142+
return sdoOrDAService.findSDO(tdoType, tsdo -> tsdo.getName().equals(sdoNames.getFirst()))
143+
.flatMap(tsdo -> doTypeService.findDoType(dtt, tdoType2 -> tdoType2.getId().equals(tsdo.getType())))
144+
.map(tdoType2 -> {
145+
sdoNames.removeFirst();
146+
return findDOTypeBySdoName(dtt, tdoType2, sdoNames);
147+
}).orElse(tdoType);
148+
}
149+
150+
private TDAType findDATypeByBdaName(TDataTypeTemplates dtt, TDAType tdaType, Predicate<TBDA> tbdaPredicate, List<String> bdaNames) {
151+
if(bdaNames.isEmpty()) return tdaType;
152+
return bdaService.getFilteredBDAs(tdaType, tbdaPredicate)
153+
.findFirst()
154+
.flatMap(tbda -> daTypeService.findDaType(dtt, tbda.getType()))
155+
.map(tdaType2 -> {
156+
bdaNames.removeFirst();
157+
return findDATypeByBdaName(dtt, tdaType2, tbdaPredicate, bdaNames);
158+
}).orElse(tdaType);
159+
}
160+
46161
}

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

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
1-
// SPDX-FileCopyrightText: 2023 RTE FRANCE
1+
// SPDX-FileCopyrightText: 2023 2024 RTE FRANCE
22
//
33
// SPDX-License-Identifier: Apache-2.0
44

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

7-
import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates;
8-
import org.lfenergy.compas.scl2007b4.model.TDOType;
7+
import org.lfenergy.compas.scl2007b4.model.*;
8+
import org.lfenergy.compas.sct.commons.domain.DataAttribute;
9+
import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa;
910

11+
import java.util.ArrayList;
12+
import java.util.List;
1013
import java.util.Optional;
1114
import java.util.function.Predicate;
1215
import java.util.stream.Stream;
1316

1417
public class DoTypeService {
1518

19+
final DaTypeService daTypeService = new DaTypeService();
20+
final SDOOrDAService sdoOrDAService = new SDOOrDAService();
21+
final BDAService bdaService = new BDAService();
22+
1623
public Stream<TDOType> getDoTypes(TDataTypeTemplates tDataTypeTemplates) {
1724
return tDataTypeTemplates.getDOType().stream();
1825
}
@@ -25,4 +32,66 @@ public Optional<TDOType> findDoType(TDataTypeTemplates tDataTypeTemplates, Predi
2532
return getFilteredDoTypes(tDataTypeTemplates, tdoTypePredicate).findFirst();
2633
}
2734

28-
}
35+
public List<DoLinkedToDa> getAllSDOLinkedToDa(TDataTypeTemplates dtt, TDOType tdoType, DoLinkedToDa doLinkedToDaTemplate) {
36+
List<DoLinkedToDa> result = new ArrayList<>();
37+
// DA -> BDA -> BDA..
38+
sdoOrDAService.getDAs(tdoType).forEach(tda -> {
39+
DoLinkedToDa doLinkedToDa = DoLinkedToDa.copyFrom(doLinkedToDaTemplate);
40+
doLinkedToDa.getDataAttribute().setDaName(tda.getName());
41+
if(tda.isSetFc()) {
42+
doLinkedToDa.getDataAttribute().setFc(tda.getFc());
43+
}
44+
45+
// STRUCT type (BType=STRUCT) refer to BDA, otherwise it is DA
46+
if(TPredefinedBasicTypeEnum.STRUCT.equals(tda.getBType())) {
47+
daTypeService.findDaType(dtt, tda.getType())
48+
.ifPresent(nextDaType -> result.addAll(getDaLinkedToBDA(dtt, nextDaType, doLinkedToDa).toList()));
49+
} else {
50+
doLinkedToDa.setDataAttribute(updateDataAttributeFromDaOrBda(tda, doLinkedToDa.getDataAttribute()));
51+
result.add(doLinkedToDa);
52+
}
53+
});
54+
// SDO -> SDO -> SDO..
55+
sdoOrDAService.getSDOs(tdoType)
56+
.forEach(tsdo -> {
57+
if(tsdo.isSetType()){
58+
findDoType(dtt, tdoType1 -> tdoType1.getId().equals(tsdo.getType()))
59+
.ifPresent(nextDoType -> {
60+
DoLinkedToDa newDoLinkedToDa = DoLinkedToDa.copyFrom(doLinkedToDaTemplate);
61+
newDoLinkedToDa.getDataObject().getSdoNames().add(tsdo.getName());
62+
if(nextDoType.isSetCdc()) {
63+
newDoLinkedToDa.getDataObject().setCdc(nextDoType.getCdc());
64+
}
65+
result.addAll(getAllSDOLinkedToDa(dtt, nextDoType, newDoLinkedToDa));
66+
});
67+
}
68+
});
69+
return result;
70+
}
71+
private Stream<DoLinkedToDa> getDaLinkedToBDA(TDataTypeTemplates dtt, TDAType tdaType1, DoLinkedToDa doLinkedToDaTemplate) {
72+
// BDA -> BDA -> BDA..
73+
return bdaService.getBDAs(tdaType1)
74+
.flatMap(tbda -> {
75+
DoLinkedToDa newDoLinkedToDa = DoLinkedToDa.copyFrom(doLinkedToDaTemplate);
76+
newDoLinkedToDa.getDataAttribute().getBdaNames().add(tbda.getName());
77+
78+
// STRUCT type (BType=STRUCT) refer to complex BDA object, otherwise it is kind of DA object
79+
if(TPredefinedBasicTypeEnum.STRUCT.equals(tbda.getBType())){
80+
return daTypeService.findDaType(dtt, tbda.getType())
81+
.stream().flatMap(nextDaType -> getDaLinkedToBDA(dtt, nextDaType, newDoLinkedToDa));
82+
} else {
83+
newDoLinkedToDa.setDataAttribute(updateDataAttributeFromDaOrBda(tbda, newDoLinkedToDa.getDataAttribute()));
84+
return Stream.of(newDoLinkedToDa);
85+
}
86+
});
87+
}
88+
89+
private DataAttribute updateDataAttributeFromDaOrBda(TAbstractDataAttribute daOrBda, DataAttribute dataAttribute) {
90+
if (daOrBda.isSetType()) dataAttribute.setType(daOrBda.getType());
91+
if (daOrBda.isSetBType()) dataAttribute.setBType(daOrBda.getBType());
92+
if (daOrBda.isSetValImport()) dataAttribute.setValImport(daOrBda.isValImport());
93+
if (daOrBda.isSetVal()) dataAttribute.addDaVal(daOrBda.getVal());
94+
return dataAttribute;
95+
}
96+
97+
}

0 commit comments

Comments
 (0)