Skip to content

Commit 99e17f5

Browse files
authored
Merge pull request #251 from com-pas/fix/edit-inref-from-extref
feat(): fix DO inRef update for ExtRefs without iedName or ldInst or lnClass
2 parents e8b19b1 + dbb1ea3 commit 99e17f5

File tree

4 files changed

+77
-7
lines changed

4 files changed

+77
-7
lines changed

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/DOIAdapter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import java.util.Comparator;
1616
import java.util.List;
17+
import java.util.Objects;
1718
import java.util.Optional;
1819

1920

@@ -208,7 +209,7 @@ public Optional<SclReportItem> updateDaiFromExtRef(List<TExtRef> tExtRefs) {
208209
}
209210

210211
private static int extractDescSuffix(String desc) throws NumberFormatException {
211-
return Integer.parseInt(Utils.extractField(desc, "_", -1));
212+
return Integer.parseInt(Objects.requireNonNull(Utils.extractField(desc, "_", -1)));
212213
}
213214

214215
private String createInRefValNominalString(TExtRef extRef) {

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/LN0Adapter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,15 +264,16 @@ public List<SclReportItem> updateDoInRef() {
264264
&& doiAdapter.findDataAdapterByName(DAI_NAME_PURPOSE).isPresent())
265265
.map(doiAdapter -> doiAdapter.getDataAdapterByName(DAI_NAME_PURPOSE).getCurrentElem().getVal().stream()
266266
.findFirst()
267-
.map(tVal -> doiAdapter.updateDaiFromExtRef(getExtRefsByDesc(tVal.getValue())))
267+
.map(tVal -> doiAdapter.updateDaiFromExtRef(getBoundExtRefsByDesc(tVal.getValue())))
268268
.orElse(Optional.of(SclReportItem.warning(getXPath(), "The DOI %s can't be bound with an ExtRef".formatted(getXPath())))))
269269
.flatMap(Optional::stream)
270270
.toList();
271271
}
272272

273-
private List<TExtRef> getExtRefsByDesc(String desc) {
273+
private List<TExtRef> getBoundExtRefsByDesc(String desc) {
274274
return getExtRefs().stream()
275-
.filter(tExtRef -> tExtRef.isSetDesc() && tExtRef.getDesc().contains(desc))
275+
.filter(tExtRef -> tExtRef.isSetIedName() && tExtRef.isSetLdInst() && tExtRef.isSetLnClass() && tExtRef.isSetDoName() &&
276+
tExtRef.isSetDesc() && tExtRef.getDesc().contains(desc))
276277
.toList();
277278
}
278279
}

sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/SclServiceTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,9 +1114,12 @@ void updateDoInRef_shouldReturnUpdatedFile(String testName, String ldInst, Strin
11141114
@ParameterizedTest(name = "{0}")
11151115
@CsvSource({
11161116
"Test with only 1 ExtRef should not update srcTstCB,LD_WITH_1_InRef,InRef2,setTstRef",
1117-
"Test with only 1 ExtRef should not update setTstCB Value,LD_WITH_1_InRef,InRef2,setTstCB"
1117+
"Test with only 1 ExtRef should not update setTstCB Value,LD_WITH_1_InRef,InRef2,setTstCB",
1118+
"Test with only 1 ExtRef should not update DO when IedName not present,LD_WITH_1_InRef_ExtRef_Without_IedName,InRef4,setSrcRef",
1119+
"Test with only 1 ExtRef should not update DO when LdInst not present,LD_WITH_1_InRef_ExtRef_Without_LdInst,InRef5,setSrcRef",
1120+
"Test with only 1 ExtRef should not update DO when lnClass not present,LD_WITH_1_InRef_ExtRef_Without_LnClass,InRef6,setSrcRef"
11181121
})
1119-
void updateDoInRef_should_not_update_tst_DAI_When_only_1_ExtRef(String testName, String ldInst, String doName, String daName) {
1122+
void updateDoInRef_should_not_update_DAI(String testName, String ldInst, String doName, String daName) {
11201123
// Given
11211124
SCL givenScl = SclTestMarshaller.getSCLFromFile("/scd-test-update-inref/scd_update_inref_issue_231_test_ok.xml");
11221125

sct-commons/src/test/resources/scd-test-update-inref/scd_update_inref_issue_231_test_ok.xml

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,72 @@
6565
</Inputs>
6666
</LN0>
6767
</LDevice>
68-
68+
<!-- Case with ExtRef.desc suffix with "_1" but parameter iedName not present -->
69+
<LDevice inst="LD_WITH_1_InRef_ExtRef_Without_IedName" ldName="IED_NAME1LD_INST12">
70+
<LN0 lnClass="LLN0" inst="" lnType="LN11">
71+
<DOI name="InRef4">
72+
<DAI name="purpose">
73+
<Val>LD_WITH_1_Bad_InRef_DOI_InRef4</Val>
74+
</DAI>
75+
<DAI name="setSrcRef" valKind="RO" valImport="true"/>
76+
<DAI name="setSrcCB" valKind="RO" valImport="false">
77+
<Val>OLD_VAL</Val>
78+
</DAI>
79+
<DAI name="setTstRef" valKind="RO" valImport="false"/>
80+
<DAI name="setTstCB" valKind="RO" valImport="false"/>
81+
</DOI>
82+
<Inputs>
83+
<ExtRef desc="LD_WITH_1_InRef_DOI_EXTREF_WITHOUT_IEDNAME_InRef4_1"
84+
ldInst="LD_WITH_1_InRef" lnClass="ANCR"
85+
lnInst="1" prefix="PR" intAddr="INT_ADDR11" pDO="Do11.sdo11"
86+
doName="Do11.sdo11"/>
87+
</Inputs>
88+
</LN0>
89+
</LDevice>
90+
<!-- Case with ExtRef.desc suffix with "_1" but parameter ldInst not present -->
91+
<LDevice inst="LD_WITH_1_InRef_ExtRef_Without_LdInst" ldName="IED_NAME1LD_INST12">
92+
<LN0 lnClass="LLN0" inst="" lnType="LN11">
93+
<DOI name="InRef5">
94+
<DAI name="purpose">
95+
<Val>LD_WITH_1_Bad_InRef_DOI_InRef4</Val>
96+
</DAI>
97+
<DAI name="setSrcRef" valKind="RO" valImport="true"/>
98+
<DAI name="setSrcCB" valKind="RO" valImport="false">
99+
<Val>OLD_VAL</Val>
100+
</DAI>
101+
<DAI name="setTstRef" valKind="RO" valImport="false"/>
102+
<DAI name="setTstCB" valKind="RO" valImport="false"/>
103+
</DOI>
104+
<Inputs>
105+
<ExtRef iedName="IED_NAME1" desc="LD_WITH_1_InRef_DOI_EXTREF_WITHOUT_LDINST_InRef5_1"
106+
lnClass="ANCR"
107+
lnInst="1" prefix="PR" intAddr="INT_ADDR11" pDO="Do11.sdo11"
108+
doName="Do11.sdo11"/>
109+
</Inputs>
110+
</LN0>
111+
</LDevice>
112+
<!-- Case with ExtRef.desc suffix with "_1" but parameter lnClass not present -->
113+
<LDevice inst="LD_WITH_1_InRef_ExtRef_Without_LnClass" ldName="IED_NAME1LD_INST12">
114+
<LN0 lnClass="LLN0" inst="" lnType="LN11">
115+
<DOI name="InRef6">
116+
<DAI name="purpose">
117+
<Val>LD_WITH_1_Bad_InRef_DOI_InRef4</Val>
118+
</DAI>
119+
<DAI name="setSrcRef" valKind="RO" valImport="true"/>
120+
<DAI name="setSrcCB" valKind="RO" valImport="false">
121+
<Val>OLD_VAL</Val>
122+
</DAI>
123+
<DAI name="setTstRef" valKind="RO" valImport="false"/>
124+
<DAI name="setTstCB" valKind="RO" valImport="false"/>
125+
</DOI>
126+
<Inputs>
127+
<ExtRef iedName="IED_NAME1" desc="LD_WITH_1_InRef_DOI_EXTREF_WITHOUT_LNCLASS_InRef6_1"
128+
ldInst="LD_WITH_1_InRef"
129+
lnInst="1" prefix="PR" intAddr="INT_ADDR11" pDO="Do11.sdo11"
130+
doName="Do11.sdo11"/>
131+
</Inputs>
132+
</LN0>
133+
</LDevice>
69134
</Server>
70135
</AccessPoint>
71136
</IED>

0 commit comments

Comments
 (0)