Skip to content

Commit b3cd832

Browse files
committed
fix(177): filter binding info list from DTT with pLN too
Signed-off-by: Aliou DIAITE <[email protected]>
1 parent c84dc9f commit b3cd832

File tree

19 files changed

+779
-278
lines changed

19 files changed

+779
-278
lines changed

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
import lombok.NoArgsConstructor;
99
import lombok.Setter;
1010
import org.apache.commons.lang3.StringUtils;
11-
import org.lfenergy.compas.scl2007b4.model.TExtRef;
12-
import org.lfenergy.compas.scl2007b4.model.TLLN0Enum;
13-
import org.lfenergy.compas.scl2007b4.model.TServiceType;
11+
import org.lfenergy.compas.scl2007b4.model.*;
12+
import org.lfenergy.compas.sct.commons.exception.ScdException;
13+
import org.lfenergy.compas.sct.commons.scl.dtt.DATypeAdapter;
14+
import org.lfenergy.compas.sct.commons.scl.dtt.DOTypeAdapter;
15+
import org.lfenergy.compas.sct.commons.scl.dtt.DataTypeTemplateAdapter;
1416

1517
import java.util.Comparator;
1618
import java.util.Objects;
@@ -181,4 +183,29 @@ public String toString() {
181183
'}';
182184

183185
}
186+
187+
/**
188+
* updates bindingInfo from given data
189+
* @param signalInfo contains DAType info to set
190+
* @param doTypeInfo contains DOType info leading to DA
191+
* @throws ScdException thrown when inconsistency between DOType and DAType
192+
*/
193+
public void updateDAInfos(ExtRefSignalInfo signalInfo, DataTypeTemplateAdapter.DOTypeInfo doTypeInfo) throws ScdException {
194+
DaTypeName daTypeName = new DaTypeName(signalInfo.getPDA());
195+
String extDaName = daTypeName.getName();
196+
DOTypeAdapter lastDoTypeAdapter = doTypeInfo.getDoTypeAdapter();
197+
TDA da = lastDoTypeAdapter.getDAByName(extDaName).orElseThrow(() ->
198+
new ScdException(String.format("%s: Unknown DA (%s) in DOType (%s) ", doTypeInfo.getDoTypeName(), extDaName, doTypeInfo.getDoTypeId())));
199+
if (da.getBType() != TPredefinedBasicTypeEnum.STRUCT && !daTypeName.getStructNames().isEmpty()
200+
|| da.getBType() == TPredefinedBasicTypeEnum.STRUCT && daTypeName.getStructNames().isEmpty()) {
201+
throw new ScdException(String.format("Invalid ExtRef signal: no coherence between pDO(%s) and pDA(%s)",
202+
signalInfo.getPDO(), signalInfo.getPDA()));
203+
}
204+
String daTypeId = da.getType();
205+
DATypeAdapter daTypeAdapter = lastDoTypeAdapter.getParentAdapter().getDATypeAdapterById(daTypeId).orElseThrow(() ->
206+
new IllegalArgumentException(String.format("%s: Unknown DA (%s), or no reference to its type", daTypeName, extDaName)));
207+
daTypeAdapter.check(daTypeName);
208+
daTypeName.setFc(da.getFc());
209+
this.daName = daTypeName;
210+
}
184211
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,7 @@ public static List<ExtRefBindingInfo> getExtRefBinders(SCL scd, String iedName,
264264
.build();
265265

266266
// check for signal existence
267-
// The below throws exception if the signal doesn't exist
268-
//TODO: create method which purpose is only ckecking instead of this one
269-
abstractLNAdapter.getExtRefsBySignalInfo(signalInfo);
267+
abstractLNAdapter.isExtRefExist(signalInfo);
270268

271269
// find potential binders for the signalInfo
272270
return sclRootAdapter.streamIEDAdapters()

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/dtt/DOTypeAdapter.java

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import java.util.*;
1616
import java.util.stream.Collectors;
17+
import java.util.stream.Stream;
1718

1819
/**
1920
* A representation of the model object
@@ -195,13 +196,7 @@ protected String elementXPath() {
195196
* @return <em>Boolean</em> value of check result
196197
*/
197198
public boolean containsDAWithDAName(String da){
198-
return currentElem.getSDOOrDA()
199-
.stream()
200-
.filter(unNaming -> unNaming.getClass().equals(TDA.class))
201-
.map(TDA.class::cast)
202-
.anyMatch(
203-
tda -> tda.getName().equals(da)
204-
);
199+
return getTdaStream().anyMatch(tda -> tda.getName().equals(da));
205200
}
206201

207202
/**
@@ -210,10 +205,7 @@ public boolean containsDAWithDAName(String da){
210205
* @return <em>Boolean</em> value of check result
211206
*/
212207
public boolean containsDAWithEnumTypeId(String enumTypeId) {
213-
return currentElem.getSDOOrDA()
214-
.stream()
215-
.filter(unNaming -> unNaming.getClass().equals(TDA.class))
216-
.map(TDA.class::cast)
208+
return getTdaStream()
217209
.anyMatch(
218210
tda -> tda.getBType().equals(TPredefinedBasicTypeEnum.ENUM) &&
219211
tda.getType().equals(enumTypeId)
@@ -227,7 +219,7 @@ public boolean containsDAWithEnumTypeId(String enumTypeId) {
227219
* @throws ScdException when inconsistency are found in th SCL's
228220
* DataTypeTemplate (unknown reference for example). Which should normally not happens.
229221
*/
230-
Pair<String,DOTypeAdapter> findPathDoType2DA(String daName) throws ScdException {
222+
public Pair<String,DOTypeAdapter> findPathDoTypeToDA(String daName) throws ScdException {
231223
if(containsDAWithDAName(daName)){
232224
// Attention : Do this check before calling this function
233225
// It is not interesting to no have the DO/SDO that references this DoType
@@ -266,7 +258,7 @@ Pair<String,DOTypeAdapter> findPathDoType2DA(String daName) throws ScdException
266258
* @throws ScdException when inconsistency are found in th SCL's
267259
* DataTypeTemplate (unknown reference for example). Which should normally not happens.
268260
*/
269-
Pair<String,DOTypeAdapter> findPathSDO2DA(String sdoName, String daName) throws ScdException {
261+
Pair<String,DOTypeAdapter> findPathSDOToDA(String sdoName, String daName) throws ScdException {
270262
String errMsg = String.format("No coherence or path between DO/SDO(%s) and DA(%s)", sdoName,daName);
271263
Optional<TSDO> opSdo = getSDOByName(sdoName);
272264
if(opSdo.isEmpty()) {
@@ -280,7 +272,7 @@ Pair<String,DOTypeAdapter> findPathSDO2DA(String sdoName, String daName) throws
280272
if(doTypeAdapter.containsDAWithDAName(daName)){
281273
return Pair.of(opSdo.get().getName(),doTypeAdapter);
282274
}
283-
return doTypeAdapter.findPathDoType2DA(daName);
275+
return doTypeAdapter.findPathDoTypeToDA(daName);
284276
}
285277

286278
/**
@@ -289,10 +281,7 @@ Pair<String,DOTypeAdapter> findPathSDO2DA(String sdoName, String daName) throws
289281
* @return <em>Boolean</em> value of check result
290282
*/
291283
public boolean containsDAStructWithDATypeId(String daTypeId) {
292-
return currentElem.getSDOOrDA()
293-
.stream()
294-
.filter(unNaming -> unNaming.getClass().equals(TDA.class))
295-
.map(TDA.class::cast)
284+
return getTdaStream()
296285
.anyMatch(
297286
tda -> TPredefinedBasicTypeEnum.STRUCT.equals(tda.getBType()) &&
298287
tda.getType().equals(daTypeId)
@@ -422,12 +411,30 @@ public Optional<TSDO> getSDOByName(String sdoName) {
422411
* @return optional of <em>TDA</em> object or empty if unknown DA name
423412
*/
424413
public Optional<TDA> getDAByName(String name) {
425-
for(TUnNaming tUnNaming : currentElem.getSDOOrDA()){
426-
if(tUnNaming.getClass() == TDA.class && ((TDA)tUnNaming).getName().equals(name)){
427-
return Optional.of((TDA)tUnNaming);
428-
}
414+
TDOType tdoType = currentElem;
415+
if (!containsDAWithDAName(name)) {
416+
tdoType = findPathDoTypeToDA(name)
417+
.getValue()
418+
.getCurrentElem();
429419
}
430-
return Optional.empty();
420+
return tdoType.getSDOOrDA()
421+
.stream()
422+
.filter(unNaming -> unNaming.getClass().equals(TDA.class)
423+
&& ((TDA)unNaming).getName().equals(name))
424+
.map(TDA.class::cast)
425+
.findFirst();
426+
}
427+
428+
/**
429+
* Retrieves all TDA in DOType
430+
* @return stream of TDA
431+
*/
432+
private Stream<TDA> getTdaStream() {
433+
return getCurrentElem()
434+
.getSDOOrDA()
435+
.stream()
436+
.filter(unNaming -> unNaming.getClass().equals(TDA.class))
437+
.map(TDA.class::cast);
431438
}
432439

433440
/**

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/dtt/DataTypeTemplateAdapter.java

Lines changed: 22 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

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

7+
import lombok.Getter;
8+
import lombok.RequiredArgsConstructor;
79
import lombok.extern.slf4j.Slf4j;
810
import org.lfenergy.compas.scl2007b4.model.*;
9-
import org.lfenergy.compas.sct.commons.dto.DaTypeName;
1011
import org.lfenergy.compas.sct.commons.dto.DoTypeName;
1112
import org.lfenergy.compas.sct.commons.dto.ExtRefBindingInfo;
1213
import org.lfenergy.compas.sct.commons.dto.ExtRefSignalInfo;
@@ -214,10 +215,7 @@ public void importEnumType(String thisIEDName, DataTypeTemplateAdapter prvDttAda
214215
String newEnumId = prvEnumType.getId();
215216
Optional<EnumTypeAdapter> opRcvEnumTypeAdapter = this.getEnumTypeAdapterById(oldEnumId);
216217

217-
boolean isImportable = false;
218-
if(!opRcvEnumTypeAdapter.isPresent() || !opRcvEnumTypeAdapter.get().hasSameContentAs(prvEnumType)) {
219-
isImportable = true;
220-
}
218+
boolean isImportable = opRcvEnumTypeAdapter.isEmpty() || !opRcvEnumTypeAdapter.get().hasSameContentAs(prvEnumType);
221219

222220
if(isImportable && opRcvEnumTypeAdapter.isPresent()){
223221
// same ID, different content
@@ -235,10 +233,10 @@ public void importEnumType(String thisIEDName, DataTypeTemplateAdapter prvDttAda
235233
}
236234
}
237235

238-
// escalate on this DTT
236+
// escalate on this DTT and update all element linked to added EnumType
239237
pairOldAndNewEnumId.forEach((oldId, newId) -> {
240238
List<DATypeAdapter> daTypeAdapters = prvDttAdapter.findDATypesWhichBdaContainsEnumTypeId(oldId);
241-
var bdas = daTypeAdapters.stream()
239+
List<TBDA> bdas = daTypeAdapters.stream()
242240
.map(DATypeAdapter::getBdaAdapters)
243241
.flatMap(Collection::stream)
244242
.map(DATypeAdapter.BDAAdapter::getCurrentElem)
@@ -247,7 +245,7 @@ public void importEnumType(String thisIEDName, DataTypeTemplateAdapter prvDttAda
247245
.collect(Collectors.toList());
248246
bdas.forEach(tbda -> tbda.setType(newId));
249247
List<DOTypeAdapter> doTypeAdapters = prvDttAdapter.findDOTypesWhichDAContainsEnumTypeId(oldId);
250-
var tdas = doTypeAdapters.stream()
248+
List<TDA> tdas = doTypeAdapters.stream()
251249
.map(doTypeAdapter -> retrieveSdoOrDA(doTypeAdapter.getCurrentElem().getSDOOrDA(), TDA.class))
252250
.flatMap(Collection::stream)
253251
.filter(tda -> TPredefinedBasicTypeEnum.ENUM == tda.getBType()
@@ -549,9 +547,7 @@ protected List<LNodeTypeAdapter> findLNodeTypesFromDoWithDoTypeId(String doTypeI
549547
*/
550548
protected String generateDttId(String iedName,String dttId){
551549
final int MAX_LENGTH = 255;
552-
StringBuilder stringBuilder = new StringBuilder();
553-
stringBuilder.append(iedName).append("_").append(dttId);
554-
String str = stringBuilder.toString();
550+
String str = iedName + "_" + dttId;
555551
return str.length() <= MAX_LENGTH ? str : str.substring(0,MAX_LENGTH);
556552
}
557553

@@ -563,80 +559,35 @@ protected String generateDttId(String iedName,String dttId){
563559
* @throws ScdException
564560
*/
565561
public ExtRefBindingInfo getBinderResumedDTT(String lnType, ExtRefSignalInfo signalInfo) throws ScdException {
566-
567562
ExtRefBindingInfo binder = new ExtRefBindingInfo();
568-
569563
// LNodeType check
570564
LNodeTypeAdapter lNodeTypeAdapter = getLNodeTypeAdapterById(lnType)
571-
.orElseThrow(()-> new ScdException("Unknown LNodeType:" + lnType));
565+
.orElseThrow(() -> new ScdException("Unknown LNodeType:" + lnType));
572566
if(lNodeTypeAdapter.getLNClass() == null){
573567
log.error("Mandatory lnClass is missing in DTT. This should not happen for valid SCD");
574-
throw new IllegalArgumentException("lnClass is mandatory for LNodeType in DataTemplate:" + lnType);
568+
throw new IllegalArgumentException("lnClass is mandatory for LNodeType in DataTemplate : " + lnType);
575569
}
576-
577570
binder.setLnType(lnType);
578571
binder.setLnClass(lNodeTypeAdapter.getLNClass());
579-
580-
if(signalInfo.getPDO() == null) {
572+
if (signalInfo.getPDO() == null) {
581573
return binder;
582574
}
583575
// DoType check
584-
DoTypeName doName = new DoTypeName(signalInfo.getPDO());
585-
String extDoName = doName.getName();
586-
String doTypeId = lNodeTypeAdapter.getDOTypeId(extDoName)
587-
.orElseThrow(() ->new ScdException("Unknown doName :" + signalInfo.getPDO()));
588-
589-
DOTypeAdapter doTypeAdapter = getDOTypeAdapterById(doTypeId)
590-
.orElseThrow(
591-
() -> new IllegalArgumentException(
592-
String.format("%s: No referenced to DO id : %s", doName, doTypeId)
593-
)
594-
);
595-
596-
//doTypeAdapter.completeStructuredData(doName);
597-
doTypeAdapter.checkAndCompleteStructData(doName);
598-
binder.setDoName(doName);
599-
600-
if(signalInfo.getPDA() == null){
576+
DOTypeInfo doTypeInfo = lNodeTypeAdapter.findMatchingDOType(signalInfo);
577+
binder.setDoName(new DoTypeName(signalInfo.getPDO()));
578+
if (signalInfo.getPDA() == null) {
601579
return binder;
602580
}
603-
604581
// DaType check
605-
DaTypeName daName = new DaTypeName(signalInfo.getPDA());
606-
String extDaName = daName.getName();
607-
DOTypeAdapter lastDoTypeAdapter = doTypeAdapter;
608-
if(!doTypeAdapter.containsDAWithDAName(extDaName)){
609-
var pair = doTypeAdapter.findPathDoType2DA(extDaName);
610-
lastDoTypeAdapter = pair.getValue();
611-
}
612-
613-
TDA da = lastDoTypeAdapter.getDAByName(extDaName)
614-
.orElseThrow(
615-
()-> new ScdException(
616-
String.format("%s: Unknown DA (%s) in DOType (%s) ", doName, extDaName, doTypeId)
617-
)
618-
);
619-
if(da.getBType() != TPredefinedBasicTypeEnum.STRUCT && !daName.getStructNames().isEmpty() ){
620-
throw new ScdException(
621-
String.format(
622-
"Invalid ExtRef signal: no coherence between pDO(%s) and pDA(%s)",
623-
signalInfo.getPDO(),signalInfo.getPDA()
624-
)
625-
);
626-
}
627-
628-
if(da.getBType() == TPredefinedBasicTypeEnum.STRUCT && !daName.getStructNames().isEmpty()){
629-
String daTypeId = da.getType();
630-
DATypeAdapter daTypeAdapter = getDATypeAdapterById(daTypeId)
631-
.orElseThrow(
632-
() -> new IllegalArgumentException(
633-
String.format("%s: Unknown DA (%s), or no reference to its type", daName, extDaName)
634-
)
635-
);
636-
daTypeAdapter.check(daName);
637-
daName.setFc(da.getFc());
638-
binder.setDaName(daName);
639-
}
582+
binder.updateDAInfos(signalInfo, doTypeInfo);
640583
return binder;
641584
}
585+
586+
@RequiredArgsConstructor
587+
@Getter
588+
public static class DOTypeInfo {
589+
private final DoTypeName doTypeName;
590+
private final String doTypeId;
591+
private final DOTypeAdapter doTypeAdapter;
592+
}
642593
}

sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/dtt/LNodeTypeAdapter.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.lfenergy.compas.scl2007b4.model.TPredefinedBasicTypeEnum;
1313
import org.lfenergy.compas.sct.commons.dto.DaTypeName;
1414
import org.lfenergy.compas.sct.commons.dto.DoTypeName;
15+
import org.lfenergy.compas.sct.commons.dto.ExtRefSignalInfo;
1516
import org.lfenergy.compas.sct.commons.dto.ResumedDataTemplate;
1617
import org.lfenergy.compas.sct.commons.exception.ScdException;
1718
import org.lfenergy.compas.sct.commons.scl.SclElementAdapter;
@@ -229,7 +230,7 @@ Pair<String,DOTypeAdapter> findPathFromDo2DA(String doName, String daName) throw
229230
if(doTypeAdapter.containsDAWithDAName(doName)){
230231
return Pair.of(doName,doTypeAdapter);
231232
}
232-
return doTypeAdapter.findPathDoType2DA(daName);
233+
return doTypeAdapter.findPathDoTypeToDA(daName);
233234
}
234235

235236

@@ -267,7 +268,7 @@ public void check(@NonNull DoTypeName doTypeName, @NonNull DaTypeName daTypeName
267268
if(adapterPair.getRight().containsDAWithDAName(daTypeName.getName())){
268269
lastDoTypeAdapter = adapterPair.getValue();
269270
} else {
270-
adapterPair = adapterPair.getRight().findPathDoType2DA(daTypeName.getName());
271+
adapterPair = adapterPair.getRight().findPathDoTypeToDA(daTypeName.getName());
271272
lastDoTypeAdapter = adapterPair.getValue();
272273
}
273274
}
@@ -343,4 +344,21 @@ public List<ResumedDataTemplate> getResumedDTTByDoName(DoTypeName doTypeName) {
343344
public String getId() {
344345
return currentElem.getId();
345346
}
347+
348+
/**
349+
* Find binded DOType info
350+
* @param signalInfo
351+
* @return DOType info as object contening name, id and adapter
352+
* @throws ScdException throws when DO unknown
353+
*/
354+
public DataTypeTemplateAdapter.DOTypeInfo findMatchingDOType(ExtRefSignalInfo signalInfo) throws ScdException{
355+
DoTypeName doName = new DoTypeName(signalInfo.getPDO());
356+
String extDoName = doName.getName();
357+
String doTypeId = getDOTypeId(extDoName).orElseThrow(() ->
358+
new IllegalArgumentException("Unknown doName :" + signalInfo.getPDO()));
359+
DOTypeAdapter doTypeAdapter = this.getParentAdapter().getDOTypeAdapterById(doTypeId).orElseThrow(() ->
360+
new IllegalArgumentException(String.format("%s: No referenced to DO id : %s, scl file not valid", doName, doTypeId)));
361+
doTypeAdapter.checkAndCompleteStructData(doName);
362+
return new DataTypeTemplateAdapter.DOTypeInfo(doName, doTypeId, doTypeAdapter);
363+
}
346364
}

0 commit comments

Comments
 (0)