Skip to content

Commit 14e9d12

Browse files
authored
Merge pull request #559 from com-pas/develop
Release 0.2.51
2 parents 5f3757b + 4552229 commit 14e9d12

File tree

8 files changed

+149
-102
lines changed

8 files changed

+149
-102
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44

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

7-
import org.lfenergy.compas.scl2007b4.model.*;
7+
import org.apache.commons.lang3.StringUtils;
8+
import org.lfenergy.compas.scl2007b4.model.TDAI;
9+
import org.lfenergy.compas.scl2007b4.model.TDOI;
10+
import org.lfenergy.compas.scl2007b4.model.TSDI;
11+
import org.lfenergy.compas.scl2007b4.model.TVal;
812

913
import java.util.Optional;
1014
import java.util.function.Predicate;
@@ -41,4 +45,16 @@ public Optional<TDAI> findDai(TSDI tsdi, Predicate<TDAI> tdaiPredicate) {
4145
return getFilteredDais(tsdi, tdaiPredicate).findFirst();
4246
}
4347

48+
public Optional<TDAI> findDai(TDOI tdoi, String daiName) {
49+
return findDai(tdoi, tdai -> daiName.equals(tdai.getName()));
50+
}
51+
52+
public Optional<TDAI> findDai(TSDI tsdi, String daiName) {
53+
return findDai(tsdi, tdai -> daiName.equals(tdai.getName()));
54+
}
55+
56+
public Optional<String> getDaiVal(TDAI tdai) {
57+
return tdai.getVal().stream().findFirst().map(TVal::getValue).filter(StringUtils::isNotBlank);
58+
}
59+
4460
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public Optional<DoLinkedToDa> findDoLinkedToDa(TDataTypeTemplates dtt, String lN
9494
dataAttribute.setBType(tda.getBType());
9595
dataAttribute.setType(tda.getType());
9696
dataAttribute.setValImport(tda.isValImport());
97+
dataAttribute.setValKind(tda.getValKind());
9798
return Optional.of(new DoLinkedToDa(dataObject, dataAttribute));
9899
}
99100
// Search first DaType from DOType (from last DOType where DA is STRUCT)
@@ -113,6 +114,7 @@ public Optional<DoLinkedToDa> findDoLinkedToDa(TDataTypeTemplates dtt, String lN
113114
dataAttribute.setBType(tbda.getBType());
114115
dataAttribute.setType(tbda.getType());
115116
dataAttribute.setValImport(tbda.isValImport());
117+
dataAttribute.setValKind(tbda.getValKind());
116118
dataAttribute.addDaVal(tbda.getVal());
117119
return Optional.of(new DoLinkedToDa(dataObject, dataAttribute));
118120
});

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ private DataAttribute updateDataAttributeFromDaOrBda(TAbstractDataAttribute daOr
9696
if (daOrBda.isSetType()) dataAttribute.setType(daOrBda.getType());
9797
if (daOrBda.isSetBType()) dataAttribute.setBType(daOrBda.getBType());
9898
if (daOrBda.isSetValImport()) dataAttribute.setValImport(daOrBda.isValImport());
99+
if (daOrBda.isSetValKind()) dataAttribute.setValKind(daOrBda.getValKind());
99100
if (daOrBda.isSetVal()) dataAttribute.addDaVal(daOrBda.getVal());
100101
return dataAttribute;
101102
}

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

Lines changed: 89 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -137,25 +137,24 @@ public Optional<TDAI> getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLi
137137
}
138138

139139
@Override
140-
public void updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedToDa) {
141-
createDoiSdiDaiChainIfNotExists(tAnyLN, doLinkedToDa.dataObject(), doLinkedToDa.dataAttribute())
142-
.ifPresent(tdai -> {
143-
List<DaVal> daiVals = doLinkedToDa.dataAttribute().getDaiValues();
144-
if (!hasSettingGroup(tdai) && daiVals.size() == 1 && daiVals.getFirst().settingGroup() == null) {
145-
String value = daiVals.getFirst().val();
146-
tdai.getVal().stream().findFirst()
147-
.ifPresentOrElse(tVal -> tVal.setValue(value),
148-
() -> tdai.getVal().add(newVal(value)));
149-
} else {
150-
for (DaVal daVal : daiVals) {
151-
tdai.getVal().stream()
152-
.filter(tValElem -> tValElem.isSetSGroup() && tValElem.getSGroup() == daVal.settingGroup())
153-
.findFirst()
154-
.ifPresentOrElse(tVal -> tVal.setValue(daVal.val()),
155-
() -> tdai.getVal().add(newVal(daVal.val(), daVal.settingGroup())));
156-
}
157-
}
158-
});
140+
public TDAI updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedToDa) {
141+
TDAI tdai = createDoiSdiDaiChainIfNotExists(tAnyLN, doLinkedToDa.dataObject(), doLinkedToDa.dataAttribute());
142+
List<DaVal> daiVals = doLinkedToDa.dataAttribute().getDaiValues();
143+
if (!hasSettingGroup(tdai) && daiVals.size() == 1 && daiVals.getFirst().settingGroup() == null) {
144+
String value = daiVals.getFirst().val();
145+
tdai.getVal().stream().findFirst()
146+
.ifPresentOrElse(tVal -> tVal.setValue(value),
147+
() -> tdai.getVal().add(newVal(value)));
148+
} else {
149+
for (DaVal daVal : daiVals) {
150+
tdai.getVal().stream()
151+
.filter(tValElem -> tValElem.isSetSGroup() && tValElem.getSGroup() == daVal.settingGroup())
152+
.findFirst()
153+
.ifPresentOrElse(tVal -> tVal.setValue(daVal.val()),
154+
() -> tdai.getVal().add(newVal(daVal.val(), daVal.settingGroup())));
155+
}
156+
}
157+
return tdai;
159158
}
160159

161160
@Override
@@ -166,17 +165,20 @@ public DoLinkedToDa getDoLinkedToDaCompletedFromDAI(TIED tied, String ldInst, TA
166165
if (tdai.isSetVal()) {
167166
result.dataAttribute().addDaVal(tdai.getVal());
168167
}
168+
if (tdai.isSetValKind()) {
169+
result.dataAttribute().setValKind(tdai.getValKind());
170+
}
169171
if (result.dataAttribute().getFc() == TFCEnum.SG || result.dataAttribute().getFc() == TFCEnum.SE) {
170172
if (hasSettingGroup(tdai)) {
171173
boolean isIedHasConfSG = tied.isSetAccessPoint() &&
172-
tied.getAccessPoint().stream()
173-
.filter(tAccessPoint -> tAccessPoint.getServer() != null
174-
&& tAccessPoint.getServer().getLDevice().stream()
175-
.anyMatch(tlDevice -> tlDevice.getInst().equals(ldInst)))
176-
.anyMatch(tAccessPoint -> tAccessPoint.isSetServices()
177-
&& tAccessPoint.getServices() != null
178-
&& tAccessPoint.getServices().getSettingGroups() != null
179-
&& tAccessPoint.getServices().getSettingGroups().getConfSG() != null);
174+
tied.getAccessPoint().stream()
175+
.filter(tAccessPoint -> tAccessPoint.getServer() != null
176+
&& tAccessPoint.getServer().getLDevice().stream()
177+
.anyMatch(tlDevice -> tlDevice.getInst().equals(ldInst)))
178+
.anyMatch(tAccessPoint -> tAccessPoint.isSetServices()
179+
&& tAccessPoint.getServices() != null
180+
&& tAccessPoint.getServices().getSettingGroups() != null
181+
&& tAccessPoint.getServices().getSettingGroups().getConfSG() != null);
180182
result.dataAttribute().setValImport((!tdai.isSetValImport() || tdai.isValImport()) && isIedHasConfSG);
181183
} else {
182184
log.warn("Inconsistency in the SCD file - DAI= {} with fc= {} must have a sGroup attribute", tdai.getName(), result.dataAttribute().getFc());
@@ -193,59 +195,60 @@ private boolean hasSettingGroup(TDAI tdai) {
193195
return tdai.isSetVal() && tdai.getVal().stream().anyMatch(tVal -> tVal.isSetSGroup() && tVal.getSGroup() > 0);
194196
}
195197

196-
private Optional<TDAI> createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject dataObject, DataAttribute dataAttribute) {
197-
List<String> structInstances = new ArrayList<>(dataObject.getSdoNames());
198-
structInstances.add(dataAttribute.getDaName());
199-
structInstances.addAll(dataAttribute.getBdaNames());
198+
private TDAI createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject dataObject, DataAttribute dataAttribute) {
199+
if (StringUtils.isBlank(dataObject.getDoName()) || StringUtils.isBlank(dataAttribute.getDaName())) {
200+
throw new IllegalArgumentException("Missing DO or DA name in parameters : doName=%s, daName=%s".formatted(dataObject.getDoName(), dataAttribute.getDaName()));
201+
}
202+
List<String> sdiNames = new ArrayList<>(dataObject.getSdoNames());
203+
sdiNames.add(dataAttribute.getDaName());
204+
sdiNames.addAll(dataAttribute.getBdaNames());
205+
String doiName = dataObject.getDoName();
206+
String daiName = sdiNames.removeLast();
200207

201-
TDOI doi = tAnyLN.getDOI().stream().filter(doi1 -> doi1.getName().equals(dataObject.getDoName()))
208+
TDOI doi = tAnyLN.getDOI().stream().filter(doi1 -> doi1.getName().equals(doiName))
202209
.findFirst()
203210
.orElseGet(() -> {
204211
TDOI newDOI = new TDOI();
205-
newDOI.setName(dataObject.getDoName());
212+
newDOI.setName(doiName);
206213
tAnyLN.getDOI().add(newDOI);
207214
return newDOI;
208215
});
209-
if (structInstances.size() > 1) {
210-
TSDI firstSDI = findOrCreateSDIFromDOI(doi, structInstances.getFirst());
211-
TSDI lastSDI = findOrCreateSDIByStructName(firstSDI, structInstances);
212-
if (structInstances.size() == 1) {
213-
return lastSDI.getSDIOrDAI().stream()
214-
.filter(tUnNaming -> tUnNaming.getClass().equals(TDAI.class))
215-
.map(TDAI.class::cast)
216-
.filter(tdai -> tdai.getName().equals(structInstances.getFirst()))
217-
.map(tdai -> {
218-
if (tdai.isSetValImport()) {
219-
tdai.setValImport(dataAttribute.isValImport());
220-
}
221-
return tdai;
222-
})
223-
.findFirst()
224-
.or(() -> {
225-
TDAI newDAI = new TDAI();
226-
newDAI.setName(structInstances.getFirst());
227-
lastSDI.getSDIOrDAI().add(newDAI);
228-
return Optional.of(newDAI);
229-
});
230-
}
231-
} else if (structInstances.size() == 1) {
232-
return doi.getSDIOrDAI().stream()
233-
.filter(tUnNaming -> tUnNaming.getClass().equals(TDAI.class))
234-
.map(TDAI.class::cast)
235-
.filter(tdai -> tdai.getName().equals(structInstances.getFirst()))
236-
.map(tdai -> {
237-
if (tdai.isSetValImport()) tdai.setValImport(dataAttribute.isValImport());
238-
return tdai;
239-
})
240-
.findFirst()
241-
.or(() -> {
242-
TDAI newDAI = new TDAI();
243-
newDAI.setName(structInstances.getFirst());
244-
doi.getSDIOrDAI().add(newDAI);
245-
return Optional.of(newDAI);
246-
});
216+
217+
// case 1: No SDI
218+
if (sdiNames.isEmpty()) {
219+
List<TUnNaming> sdiOrDAI = doi.getSDIOrDAI();
220+
return findOrCreateDai(dataAttribute, sdiOrDAI, daiName);
247221
}
248-
return Optional.empty();
222+
// case 2: with SDI
223+
String firstSdiName = sdiNames.removeFirst();
224+
TSDI firstSdi = this.getSdiByName(doi, firstSdiName)
225+
.orElseGet(() -> {
226+
TSDI tsdi = new TSDI();
227+
tsdi.setName(firstSdiName);
228+
doi.getSDIOrDAI().add(tsdi);
229+
return tsdi;
230+
});
231+
TSDI lastSDI = sdiNames.isEmpty() ? firstSdi : findOrCreateSdiChain(firstSdi, sdiNames);
232+
List<TUnNaming> sdiOrDAI = lastSDI.getSDIOrDAI();
233+
return findOrCreateDai(dataAttribute, sdiOrDAI, daiName);
234+
}
235+
236+
private TDAI findOrCreateDai(DataAttribute dataAttribute, List<TUnNaming> sdiOrDAI, String daiName) {
237+
return sdiOrDAI.stream()
238+
.filter(tUnNaming -> tUnNaming.getClass().equals(TDAI.class))
239+
.map(TDAI.class::cast)
240+
.filter(tdai -> tdai.getName().equals(daiName))
241+
.findFirst()
242+
.map(tdai -> {
243+
if (tdai.isSetValImport()) tdai.setValImport(dataAttribute.isValImport());
244+
return tdai;
245+
})
246+
.orElseGet(() -> {
247+
TDAI newDAI = new TDAI();
248+
newDAI.setName(daiName);
249+
sdiOrDAI.add(newDAI);
250+
return newDAI;
251+
});
249252
}
250253

251254
private TSDI findSDIByStructName(TSDI tsdi, List<String> sdiNames) {
@@ -258,26 +261,6 @@ private TSDI findSDIByStructName(TSDI tsdi, List<String> sdiNames) {
258261
.orElse(tsdi);
259262
}
260263

261-
private TSDI findOrCreateSDIFromDOI(TDOI doi, String sdiName) {
262-
return this.getSdiByName(doi, sdiName)
263-
.orElseGet(() -> {
264-
TSDI tsdi = new TSDI();
265-
tsdi.setName(sdiName);
266-
doi.getSDIOrDAI().add(tsdi);
267-
return tsdi;
268-
});
269-
}
270-
271-
private TSDI findOrCreateSDIFromSDI(TSDI sdi, String sdiName) {
272-
return this.getSdiByName(sdi, sdiName)
273-
.orElseGet(() -> {
274-
TSDI tsdi = new TSDI();
275-
tsdi.setName(sdiName);
276-
sdi.getSDIOrDAI().add(tsdi);
277-
return tsdi;
278-
});
279-
}
280-
281264
private Optional<TSDI> getSdiByName(TDOI doi, String sdiName) {
282265
return doi.getSDIOrDAI().stream()
283266
.filter(unNaming -> unNaming.getClass().equals(TSDI.class))
@@ -297,13 +280,22 @@ private Optional<TSDI> getSdiByName(TSDI sdi, String sdiName) {
297280

298281
/**
299282
* @param sdi TSDI
300-
* @param structName list start with sdi name
283+
* @param sdiNames list start with sdi name
301284
* @return already existing TSDI or newly created TSDI from given TSDI
302285
*/
303-
private TSDI findOrCreateSDIByStructName(TSDI sdi, List<String> structName) {
304-
structName.removeFirst();
305-
if (structName.isEmpty() || structName.size() == 1) return sdi;
306-
return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(sdi, structName.getFirst()), structName);
286+
private TSDI findOrCreateSdiChain(TSDI sdi, List<String> sdiNames) {
287+
TSDI sdiToGet = getSdiByName(sdi, sdiNames.getFirst())
288+
.orElseGet(() -> {
289+
TSDI tsdi = new TSDI();
290+
tsdi.setName(sdiNames.getFirst());
291+
sdi.getSDIOrDAI().add(tsdi);
292+
return tsdi;
293+
});
294+
List<String> remainingSdiNames = sdiNames.subList(1, sdiNames.size());
295+
if (remainingSdiNames.isEmpty()) {
296+
return sdiToGet;
297+
}
298+
return findOrCreateSdiChain(sdiToGet, remainingSdiNames);
307299
}
308300

309301
}

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/api/LnEditor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public interface LnEditor {
2121

2222
Optional<TDAI> getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLinkedToDaFilter);
2323

24-
void updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedToDa);
24+
TDAI updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedToDa);
2525

2626
DoLinkedToDa getDoLinkedToDaCompletedFromDAI(TIED tied, String ldInst, TAnyLN anyLN, DoLinkedToDa doLinkedToDa);
2727

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.lfenergy.compas.scl2007b4.model.TFCEnum;
1111
import org.lfenergy.compas.scl2007b4.model.TPredefinedBasicTypeEnum;
1212
import org.lfenergy.compas.scl2007b4.model.TVal;
13+
import org.lfenergy.compas.scl2007b4.model.TValKindEnum;
1314

1415
import java.util.ArrayList;
1516
import java.util.List;
@@ -24,6 +25,7 @@ public class DataAttribute {
2425
private TPredefinedBasicTypeEnum bType;
2526
private TFCEnum fc;
2627
private boolean valImport;
28+
private TValKindEnum valKind;
2729
private List<String> bdaNames = new ArrayList<>();
2830
private List<DaVal> daiValues = new ArrayList<>();
2931

@@ -34,6 +36,7 @@ public DataAttribute deepCopy() {
3436
dataAttribute.setBType(getBType());
3537
dataAttribute.setFc(getFc());
3638
dataAttribute.setValImport(isValImport());
39+
dataAttribute.setValKind(getValKind());
3740
dataAttribute.getBdaNames().addAll(getBdaNames());
3841
dataAttribute.getDaiValues().addAll(getDaiValues());
3942
return dataAttribute;

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

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ void getFilteredDais_in_sdi() {
8585
}
8686

8787
@Test
88-
void findDai() {
88+
void findDai_by_predicate_should_return_dai() {
8989
//Given
9090
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
9191
TDOI tdoi = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0().getDOI().get(3);
@@ -100,7 +100,7 @@ void findDai() {
100100
}
101101

102102
@Test
103-
void findDai_in_sdi() {
103+
void findDai_in_sdi_by_predicate_should_return_dai() {
104104
//Given
105105
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
106106
TSDI tsdi = (TSDI) std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN().getFirst().getDOI().getFirst().getSDIOrDAI().getFirst();
@@ -113,4 +113,34 @@ void findDai_in_sdi() {
113113
.extracting(TDAI::getName, tdai -> tdai.getVal().size())
114114
.containsExactly("multiplier", 1);
115115
}
116-
}
116+
117+
@Test
118+
void findDai_by_name_should_return_dai() {
119+
//Given
120+
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
121+
TDOI tdoi = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN0().getDOI().get(3);
122+
123+
//When
124+
Optional<TDAI> dai = daiService.findDai(tdoi, "configRev");
125+
126+
//Then
127+
assertThat(dai.orElseThrow())
128+
.extracting(TDAI::getName, tdai -> tdai.getVal().size())
129+
.containsExactly("configRev", 1);
130+
}
131+
132+
@Test
133+
void findDai_in_sdi_by_name_should_return_dai() {
134+
//Given
135+
SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std");
136+
TSDI tsdi = (TSDI) std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst().getLN().getFirst().getDOI().getFirst().getSDIOrDAI().getFirst();
137+
138+
//When
139+
Optional<TDAI> dai = daiService.findDai(tsdi, "multiplier");
140+
141+
//Then
142+
assertThat(dai.orElseThrow())
143+
.extracting(TDAI::getName, tdai -> tdai.getVal().size())
144+
.containsExactly("multiplier", 1);
145+
}
146+
}

0 commit comments

Comments
 (0)