Skip to content

Commit

Permalink
feat(): [refactor DTT] - solve DO/SDO/SDO/../ and DA/BDA/BDA.. in Dat…
Browse files Browse the repository at this point in the history
…aTypeTemplate

Signed-off-by: Samir Romdhani <[email protected]>
  • Loading branch information
samirromdhani committed Mar 1, 2024
1 parent bdcff39 commit ffd0757
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,15 @@

import org.lfenergy.compas.scl2007b4.model.*;
import org.lfenergy.compas.sct.commons.dto.DataAttributeRef;
import org.lfenergy.compas.sct.commons.dto.DataTypeName;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class DoTypeService {

final SDOOrDAService sdoOrDAService = new SDOOrDAService();
final DaTypeService daTypeService = new DaTypeService();

public Stream<TDOType> getDoTypes(TDataTypeTemplates tDataTypeTemplates) {
Expand All @@ -32,99 +29,105 @@ public Optional<TDOType> findDoType(TDataTypeTemplates tDataTypeTemplates, Predi
return getFilteredDoTypes(tDataTypeTemplates, tdoTypePredicate).findFirst();
}

public List<DataAttributeRef> getDataAttributeRefs(TDataTypeTemplates dtt,
TDOType tdoType,
DataAttributeRef dataRef) {
public List<DataAttributeRef> getDataAttributeRefs(TDataTypeTemplates dtt, TDOType tdoType, DataAttributeRef dataRef) {
List<DataAttributeRef> result = new ArrayList<>();
for (TUnNaming tUnNaming : tdoType.getSDOOrDA()) {
// clear struct data objects before processing each unNaming object
dataRef.getDoName().getStructNames().clear();
if (tUnNaming.getClass() == TDA.class) {
TDA tda = (TDA) tUnNaming;
dataRef.getDaName().setName(tda.getName());
if(tda.isSetFc()) dataRef.getDaName().setFc(tda.getFc());
if(tda.isSetType()) dataRef.getDaName().setType(tda.getType());
if(tda.isSetBType()) dataRef.getDaName().setBType(tda.getBType());
DataAttributeRef currentDataRef = new DataAttributeRef();
currentDataRef.setDoName(dataRef.getDoName());
currentDataRef.setDaName(dataRef.getDaName());
if(tda.isSetValImport()) dataRef.getDaName().setValImport(tda.isValImport());
DataAttributeRef dataAttributeRef = new DataAttributeRef();
dataAttributeRef.setDoName(dataRef.getDoName());
dataAttributeRef.setDaName(dataRef.getDaName());

// STRUCT type (BType=STRUCT) refer to BDA, otherwise it is DA
if(tda.isSetType() && tda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)) {
daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(tda.getType()))
.ifPresent(tdaType1 -> result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType1, currentDataRef)));
.ifPresent(nextDaType -> result.addAll(getDataAttributesFromBDA(dtt, nextDaType, dataAttributeRef)));

} else {
result.add(currentDataRef);
}
result.add(dataAttributeRef);
} else {
TSDO tsdo = (TSDO) tUnNaming;
dataRef.getDoName().getStructNames().add(tsdo.getName());
DataAttributeRef currentDataRef = new DataAttributeRef();
currentDataRef.setDoName(dataRef.getDoName());
currentDataRef.setDaName(dataRef.getDaName());
List<DataAttributeRef> dataRefsSDO = findDoType(dtt, tdoType1 -> tdoType1.getId().equals(tsdo.getType()))
.stream()
.flatMap(tdoType2 -> getDataAttributeRefsRECSDOAndComplete(dtt, tdoType2, currentDataRef).stream())
.toList();
result.addAll(dataRefsSDO);
DataAttributeRef newDataObjectRef = new DataAttributeRef();
newDataObjectRef.setDoName(dataRef.getDoName());
newDataObjectRef.setDaName(dataRef.getDaName());

findDoType(dtt, tdoType1 -> tdoType1.getId().equals(tsdo.getType()))
.ifPresent(nextDoType -> {
if(nextDoType.isSetCdc()) newDataObjectRef.getDoName().setCdc(nextDoType.getCdc());
result.addAll(getDataAttributeRefsFromSDO(dtt, nextDoType, newDataObjectRef));
});
}
}
return result;
}

private List<DataAttributeRef> getDataAttributeRefsRECSDOAndComplete(TDataTypeTemplates dtt, TDOType tdoType, DataAttributeRef deepDataRef) {
private List<DataAttributeRef> getDataAttributeRefsFromSDO(TDataTypeTemplates dtt, TDOType tdoType, DataAttributeRef dataObjectRef) {
List<DataAttributeRef> result = new ArrayList<>();
// DA -> BDA -> BDA..
tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TDA.class)).map(TDA.class::cast).toList()
.forEach(subDa -> {
dataObjectRef.getDaName().setName(subDa.getName());
if(subDa.isSetFc()) dataObjectRef.getDaName().setFc(subDa.getFc());
if(subDa.isSetType()) dataObjectRef.getDaName().setType(subDa.getType());
if(subDa.isSetBType()) dataObjectRef.getDaName().setBType(subDa.getBType());
if(subDa.isSetValImport()) dataObjectRef.getDaName().setValImport(subDa.isValImport());

// DA/BDA
List<TDA> tdas = tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TDA.class))
.map(TDA.class::cast).toList();
tdas.forEach(subDa -> {
if(subDa.isSetType() && subDa.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)){
daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(subDa.getType()))
.ifPresent(tdaType1 -> {
DataAttributeRef currentDataRef = new DataAttributeRef();
currentDataRef.setDoName(deepDataRef.getDoName());
currentDataRef.setDaName(deepDataRef.getDaName());
currentDataRef.getDaName().setName(subDa.getName());
result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType1, currentDataRef));
});
} else {
deepDataRef.getDaName().setName(subDa.getName());
result.add(deepDataRef);
}
});
// DO/SDO
List<TSDO> tsdos = tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TSDO.class))
.map(TSDO.class::cast).toList();
tsdos.forEach(subSdo -> {
deepDataRef.getDoName().getStructNames().add(subSdo.getName());
if(subSdo.isSetType()){
findDoType(dtt, tdoType1 -> tdoType1.getId().equals(subSdo.getType()))
.ifPresent(tdoType2 -> getDataAttributeRefsRECSDOAndComplete(dtt, tdoType2, deepDataRef));
}
});
// STRUCT type (BType=STRUCT) refer to BDA, otherwise it is DA
if(subDa.isSetType() && subDa.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)){
daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(subDa.getType()))
.ifPresent(nextDaType -> result.addAll(getDataAttributesFromBDA(dtt, nextDaType, dataObjectRef)));
} else {
DataAttributeRef newDataAttributeRef = new DataAttributeRef();
newDataAttributeRef.setDoName(dataObjectRef.getDoName());
newDataAttributeRef.setDaName(dataObjectRef.getDaName());
newDataAttributeRef.getDaName().setName(subDa.getName());
result.add(newDataAttributeRef);
}
});
// SDO -> SDO -> SDO..
tdoType.getSDOOrDA().stream().filter(tUnNaming -> tUnNaming.getClass().equals(TSDO.class)).map(TSDO.class::cast)
.forEach(subSdo -> {
if(subSdo.isSetType()){
dataObjectRef.getDoName().getStructNames().add(subSdo.getName());
findDoType(dtt, tdoType1 -> tdoType1.getId().equals(subSdo.getType()))
.ifPresent(nextDoType -> {
if(nextDoType.isSetCdc()) dataObjectRef.getDoName().setCdc(nextDoType.getCdc());
result.addAll(getDataAttributeRefsFromSDO(dtt, nextDoType, dataObjectRef));
});
}
});
return result;
}

private List<DataAttributeRef> getDataAttributeRefsRECBDAAndComplete(TDataTypeTemplates dtt, TDAType tdaType1,
DataAttributeRef deepDaRef) {
private List<DataAttributeRef> getDataAttributesFromBDA(TDataTypeTemplates dtt, TDAType tdaType1, DataAttributeRef dataAttributeRef) {
List<DataAttributeRef> result = new ArrayList<>();
// BDA -> BDA -> BDA..
tdaType1.getBDA().forEach(bda -> {
if(bda.isSetType()) deepDaRef.getDaName().setType(bda.getType());
if(bda.isSetType()) dataAttributeRef.getDaName().setType(bda.getType());
if(bda.isSetBType()) dataAttributeRef.getDaName().setBType(bda.getBType());
if(bda.isSetValImport()) dataAttributeRef.getDaName().setValImport(bda.isValImport());

// STRUCT type (BType=STRUCT) refer to complex BDA object, otherwise it is kind of DA object
if(bda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)){
DataAttributeRef currentDataRef = new DataAttributeRef();
currentDataRef.setDoName(deepDaRef.getDoName());
currentDataRef.setDaName(deepDaRef.getDaName());
currentDataRef.getDaName().getStructNames().add(bda.getName());
dataAttributeRef.getDaName().getStructNames().add(bda.getName());
daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(bda.getType()))
.ifPresent(tdaType2 -> result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType2, currentDataRef)));
.ifPresent(nextDaType -> result.addAll(getDataAttributesFromBDA(dtt, nextDaType, dataAttributeRef)));
} else {
DataAttributeRef currentDataRef = new DataAttributeRef();
currentDataRef.setDoName(deepDaRef.getDoName());
currentDataRef.setDaName(deepDaRef.getDaName());
currentDataRef.getDaName().getStructNames().add(bda.getName());
result.add(currentDataRef);
DataAttributeRef newDataAttributeRef = new DataAttributeRef();
newDataAttributeRef.setDoName(dataAttributeRef.getDoName());
newDataAttributeRef.setDaName(dataAttributeRef.getDaName());
newDataAttributeRef.getDaName().getStructNames().add(bda.getName());
result.add(newDataAttributeRef);
}
});
return result;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,4 @@ private TSDI findOrCreateSDIByStructName(TSDI sdi, LinkedList<String> structName
return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(sdi, structName.getFirst()), structName);
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,12 @@

package org.lfenergy.compas.sct.commons;

import org.lfenergy.compas.scl2007b4.model.TDOType;
import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates;
import org.lfenergy.compas.scl2007b4.model.TLNodeType;
import org.lfenergy.compas.sct.commons.dto.DaTypeName;
import org.lfenergy.compas.sct.commons.dto.DataAttributeRef;
import org.lfenergy.compas.sct.commons.dto.DoTypeName;
import org.lfenergy.compas.sct.commons.scl.dtt.DOTypeAdapter;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
package org.lfenergy.compas.sct.commons;

import org.lfenergy.compas.scl2007b4.model.*;
import org.lfenergy.compas.sct.commons.api.DataTypeTemplateReader;
import org.lfenergy.compas.sct.commons.api.LNEditor;
import org.lfenergy.compas.sct.commons.api.SclElementsProvider;
import org.lfenergy.compas.sct.commons.dto.*;
import org.lfenergy.compas.sct.commons.exception.ScdException;
Expand All @@ -26,9 +24,7 @@ public class SclElementsProviderService implements SclElementsProvider {

private final IedService iedService = new IedService();
private final LdeviceService ldeviceService = new LdeviceService();
private final DataTypeTemplateReader dttReader = new DataTypeTemplatesService();
private final LnodeTypeService lnodeTypeService = new LnodeTypeService();
private final LNEditor lnEditor = new LnService();

@Override
public List<SubNetworkDTO> getSubnetwork(SCL scd) throws ScdException {
Expand Down Expand Up @@ -110,22 +106,27 @@ public Set<DataAttributeRef> getDAI(SCL scd, String iedName, String ldInst, Data

@Override
public List<DataAttributeRef> getDAI2(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException {
// return iedService.findIed(scd, tied -> tied.getName().equals(iedName))
// .flatMap(tied -> ldeviceService.findLdevice(tied, tlDevice1 -> tlDevice1.getInst().equals(ldInst)))
// .stream()
// .flatMap(tlDevice -> Stream.of((TAnyLN)tlDevice.getLN().stream(), (TAnyLN)tlDevice.getLN0())
// .flatMap(tAnyLN1 -> lnodeTypeService.findLnodeType(scd.getDataTypeTemplates(), tlNodeType -> tlNodeType.getId().equals(tAnyLN1.getLnType()))
// .stream()
// .flatMap(tlNodeType -> lnodeTypeService.getDataAttributeRefs(scd.getDataTypeTemplates(), tlNodeType).stream()))).toList();
return iedService.findIed(scd, tied -> tied.getName().equals(iedName))
.flatMap(tied -> ldeviceService.findLdevice(tied, tlDevice1 -> tlDevice1.getInst().equals(ldInst)))
.stream()
.flatMap(tlDevice -> tlDevice.getLN()
.stream()
.flatMap(tAnyLN1 -> lnodeTypeService.findLnodeType(scd.getDataTypeTemplates(), tlNodeType -> tlNodeType.getId().equals(tAnyLN1.getLnType()))
.stream()
.flatMap(tlNodeType -> lnodeTypeService.getDataAttributeRefs(scd.getDataTypeTemplates(), tlNodeType)
.stream()))).toList();
.flatMap(tlDevice ->
Stream.of(tlDevice.getLN().stream(), tlDevice.getLN0())
.flatMap(tAnyLN -> {
String lnType = null;
if(tAnyLN instanceof TLN0 ln0){
lnType = ln0.getLnType();
}
if(tAnyLN instanceof TLN ln ){
lnType = ln.getLnType();
}
String finalLnType = lnType;
return lnodeTypeService.findLnodeType(scd.getDataTypeTemplates(),
tlNodeType -> tlNodeType.getId().equals(finalLnType))
.stream()
.flatMap(tlNodeType -> lnodeTypeService.getDataAttributeRefs(
scd.getDataTypeTemplates(), tlNodeType)
.stream());
})).toList();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ void getAllDataObjectsAndDataAttributes_should_return_all_dataReference() {
DataTypeTemplatesService dttService = new DataTypeTemplatesService();
List<DataAttributeRef> dataRef = dttService.getAllDataObjectsAndDataAttributes(dtt);
// Then
assertThat(dataRef).hasSize(6);
assertThat(dataRef).hasSize(8);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,11 @@ void getDataAttributeRefs_should_return_expected_dataReference() {
//When
List<DataAttributeRef> list = doTypeService.getDataAttributeRefs(dtt, tdoType, dataRef);
//Then
assertThat(list).hasSize(6);
assertThat(list).hasSize(8);
assertThat(list.stream().map(DataAttributeRef::getDoRef))
.containsExactly(
"firstDONAME.unused",
"firstDONAME.unused.otherSdo",
"firstDONAME.unused.otherSdo.otherSdo2",
"firstDONAME.sdo2",
"firstDONAME.sdo2",
Expand All @@ -102,6 +104,8 @@ void getDataAttributeRefs_should_return_expected_dataReference() {
"firstDONAME");
assertThat(list.stream().map(DataAttributeRef::getDaRef))
.containsExactly(
"unused",
"unused",
"danameForotherSdo2",
"da1",
"da2.bda1sample",
Expand All @@ -110,4 +114,24 @@ void getDataAttributeRefs_should_return_expected_dataReference() {
"daname");
}

}
@Test
void getDataAttributeRefs_should_return_all_dai() {
// GIVEN
SCL scd = SclTestMarshaller.getSCLFromFile("/scl-srv-import-ieds/ied_1_test.xml");
TDataTypeTemplates dtt = scd.getDataTypeTemplates();

DoTypeService doTypeService = new DoTypeService();
TDOType tdoType = doTypeService.findDoType(dtt, tdoType1 -> tdoType1.getId()
.equals("DO11")).get();
DataAttributeRef dataRef = new DataAttributeRef();
DoTypeName doTypeName = new DoTypeName();
doTypeName.setName("firstDONAME");
DaTypeName daTypeName = new DaTypeName();
dataRef.setDoName(doTypeName);
dataRef.setDaName(daTypeName);
// When
List<DataAttributeRef> list = doTypeService.getDataAttributeRefs(dtt, tdoType, dataRef);
// Then
assertThat(list).hasSize(811);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -387,4 +387,4 @@ private TAnyLN initDOAndDAInstances(LinkedList<String> doInstances, LinkedList<S
}


}
}
Loading

0 comments on commit ffd0757

Please sign in to comment.