Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
Signed-off-by: Samir Romdhani <[email protected]>
  • Loading branch information
samirromdhani committed Feb 29, 2024
1 parent 9a83821 commit bdcff39
Show file tree
Hide file tree
Showing 15 changed files with 420 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,13 @@ public DataAttributeRef getDataObjectsAndDataAttributes(TDataTypeTemplates dtt,
.orElseThrow(() -> new ScdException("No Data Attribute found with this reference %s for LNodeType.id (%s)".formatted(dataRef, lNodeTypeId)));
}

@Override
public List<DataAttributeRef> getAllDataObjectsAndDataAttributes(TDataTypeTemplates dtt) {
return dtt.getLNodeType().stream()
.flatMap(tlNodeType -> lnodeTypeService.getDataAttributeRefs(dtt, tlNodeType).stream())
.toList();
}

private <T extends TIDNaming> Optional<T> getDATypeByDaNameIfExist(TDataTypeTemplates dtt, TDOType tdoType, String daName) {
Optional<TDA> dai = sdoOrDAService.findSDOOrDA(tdoType, TDA.class, tda -> tda.getName().equals(daName));
if(dai.isPresent()){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,22 @@

package org.lfenergy.compas.sct.commons;

import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates;
import org.lfenergy.compas.scl2007b4.model.TDOType;
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) {
return tDataTypeTemplates.getDOType().stream();
}
Expand All @@ -25,4 +32,99 @@ public Optional<TDOType> findDoType(TDataTypeTemplates tDataTypeTemplates, Predi
return getFilteredDoTypes(tDataTypeTemplates, tdoTypePredicate).findFirst();
}

public List<DataAttributeRef> getDataAttributeRefs(TDataTypeTemplates dtt,
TDOType tdoType,
DataAttributeRef dataRef) {
List<DataAttributeRef> result = new ArrayList<>();
for (TUnNaming tUnNaming : tdoType.getSDOOrDA()) {
dataRef.getDoName().getStructNames().clear();
if (tUnNaming.getClass() == TDA.class) {
TDA tda = (TDA) tUnNaming;
dataRef.getDaName().setName(tda.getName());
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.isSetType() && tda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)) {
daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(tda.getType()))
.ifPresent(tdaType1 -> result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType1, currentDataRef)));

} else {
result.add(currentDataRef);
}
} 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);
}
}
return result;
}

private List<DataAttributeRef> getDataAttributeRefsRECSDOAndComplete(TDataTypeTemplates dtt, TDOType tdoType, DataAttributeRef deepDataRef) {
List<DataAttributeRef> result = new ArrayList<>();

// 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));
}
});
return result;
}

private List<DataAttributeRef> getDataAttributeRefsRECBDAAndComplete(TDataTypeTemplates dtt, TDAType tdaType1,
DataAttributeRef deepDaRef) {
List<DataAttributeRef> result = new ArrayList<>();
tdaType1.getBDA().forEach(bda -> {
if(bda.isSetType()) deepDaRef.getDaName().setType(bda.getType());
if(bda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT)){
DataAttributeRef currentDataRef = new DataAttributeRef();
currentDataRef.setDoName(deepDaRef.getDoName());
currentDataRef.setDaName(deepDaRef.getDaName());
currentDataRef.getDaName().getStructNames().add(bda.getName());
daTypeService.findDaType(dtt, tdaType -> tdaType.getId().equals(bda.getType()))
.ifPresent(tdaType2 -> result.addAll(getDataAttributeRefsRECBDAAndComplete(dtt, tdaType2, currentDataRef)));
} else {
DataAttributeRef currentDataRef = new DataAttributeRef();
currentDataRef.setDoName(deepDaRef.getDoName());
currentDataRef.setDaName(deepDaRef.getDaName());
currentDataRef.getDaName().getStructNames().add(bda.getName());
result.add(currentDataRef);
}
});
return result;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ public Stream<TAnyLN> getActiveLns(TLDevice tlDevice) {
return Stream.concat(ln0Stream, tlnStream);
}

@Override
public boolean isDOAndDAInstanceExists(TAnyLN tAnyLN, DoTypeName doTypeName, DaTypeName daTypeName) {
return tAnyLN.getDOI().stream().filter(doi -> doTypeName.getName().equals(doi.getName()))
.findFirst()
Expand Down Expand Up @@ -108,6 +109,7 @@ public boolean isDOAndDAInstanceExists(TAnyLN tAnyLN, DoTypeName doTypeName, DaT
.orElse(false);
}

@Override
public void updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DataAttributeRef dataAttributeRef) {
createDoiSdiDaiChainIfNotExists(tAnyLN, dataAttributeRef.getDoName(), dataAttributeRef.getDaName())
.ifPresent(tdai -> {
Expand Down Expand Up @@ -162,10 +164,11 @@ public List<SclReportItem> getDOAndDAInstances(TAnyLN tAnyLN, DataAttributeRef d
String.format("DAI.name=(%s) not found in SDI.name=(%s)",
structNamesList.get(0), lastDsi.getName())));
});
} else {
log.warn("Missing DataAttributes in SDI.name=({})", lastDsi.getName());
sclReportItems.add(SclReportItem.error(null,
String.format("missing DataAttribute in SDI.name=(%s)", lastDsi.getName())));
}
log.warn("Missing DataAttributes in SDI.name=({})", lastDsi.getName());
sclReportItems.add(SclReportItem.error(null,
String.format("missing DataAttribute in SDI.name=(%s)", lastDsi.getName())));
return sclReportItems;
})
.orElseGet(() -> {
Expand Down Expand Up @@ -243,60 +246,49 @@ public boolean iedHasConfSG(TIED tied, TLDevice tlDevice) {
return srv != null && srv.getSettingGroups() != null && srv.getSettingGroups().getConfSG() != null;
}

private TSDI findSDIByStructName(TSDI tsdi, List<String> structNames) {
if(structNames.isEmpty()) return tsdi;
return tsdi.getSDIOrDAI().stream()
.filter(sdi -> sdi.getClass().equals(TSDI.class))
.map(TSDI.class::cast)
.filter(sdi -> sdi.getName().equals(structNames.get(0)))
.findFirst()
.map(sdi1 -> {
structNames.remove(0);
return findSDIByStructName(sdi1, structNames);
})
.orElse(tsdi);
}

private Optional<TDAI> createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DoTypeName doTypeName, DaTypeName daTypeName) {
LinkedList<String> structInstances = new LinkedList<>(doTypeName.getStructNames());
structInstances.addLast(daTypeName.getName());
daTypeName.getStructNames().forEach(structInstances::addLast);
tAnyLN.getDOI().stream().filter(doi1 -> doi1.getName().equals(doTypeName.getName()))
TDOI doi = tAnyLN.getDOI().stream().filter(doi1 -> doi1.getName().equals(doTypeName.getName()))
.findFirst()
.ifPresentOrElse(tdoi -> {
System.out.println("present");
}, ()-> {
System.out.println("not present");
.orElseGet(()-> {
TDOI newDOI = new TDOI();
newDOI.setName(doTypeName.getName());
tAnyLN.getDOI().add(newDOI);
return newDOI;
});
TDOI doi = tAnyLN.getDOI().stream().filter(doi1 -> doi1.getName().equals(doTypeName.getName()))
.findFirst().get();
if(structInstances.size() > 1){
TSDI firstSDI = findOrCreateSDIFromDOI(doi, structInstances.getFirst());
TSDI lastSDI = findOrCreateSDIByStructName(firstSDI, structInstances);
if(structInstances.size() == 1){
TDAI newDAI = new TDAI();
newDAI.setName(structInstances.getFirst());
lastSDI.getSDIOrDAI().add(newDAI);
// tAnyLN.getDOI().add(doi);
return Optional.of(newDAI);
}
} else if(structInstances.size() == 1){
TDAI newDAI = new TDAI();
newDAI.setName(structInstances.getFirst());
doi.getSDIOrDAI().add(newDAI);
// tAnyLN.getDOI().add(doi);
return Optional.of(newDAI);
}
return Optional.empty();
}

private TSDI findOrCreateSDIByStructName(TSDI tsdi, LinkedList<String> structNames) {
structNames.remove();
if(structNames.isEmpty() || structNames.size() == 1) return tsdi;
return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(tsdi, structNames.getFirst()), structNames);
private TSDI findSDIByStructName(TSDI tsdi, LinkedList<String> sdiNames) {
if(sdiNames.isEmpty()) return tsdi;
return tsdi.getSDIOrDAI().stream()
.filter(sdi -> sdi.getClass().equals(TSDI.class))
.map(TSDI.class::cast)
.filter(sdi -> sdi.getName().equals(sdiNames.getFirst()))
.findFirst()
.map(sdi1 -> {
sdiNames.remove();
return findSDIByStructName(sdi1, sdiNames);
})
.orElse(tsdi);
}

private TSDI findOrCreateSDIFromDOI(TDOI doi, String sdiName) {
Expand Down Expand Up @@ -327,4 +319,18 @@ private TSDI findOrCreateSDIFromSDI(TSDI sdi, String sdiName) {
});
}

/**
*
* @param sdi TSDI
* @param structName start with doi name
* @return already existing TSDI or newly created TSDI from given TSDI
*/
private TSDI findOrCreateSDIByStructName(TSDI sdi, LinkedList<String> structName) {
structName.remove();
if(structName.isEmpty() || structName.size() == 1) return sdi;
return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(sdi, structName.getFirst()), structName);
}



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

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;
import java.util.stream.Stream;

public class LnodeTypeService {

private DoTypeService doTypeService = new DoTypeService();

public Stream<TLNodeType> getLnodeTypes(TDataTypeTemplates tDataTypeTemplates) {
return tDataTypeTemplates.getLNodeType().stream();
}
Expand All @@ -25,4 +34,20 @@ public Optional<TLNodeType> findLnodeType(TDataTypeTemplates tDataTypeTemplates,
return getFilteredLnodeTypes(tDataTypeTemplates, tlNodeTypePredicate).findFirst();
}

public List<DataAttributeRef> getDataAttributeRefs(TDataTypeTemplates dtt,
TLNodeType tlNodeType) {
DataAttributeRef dataRef = new DataAttributeRef();
dataRef.setDoName(new DoTypeName());
dataRef.setDaName(new DaTypeName());
return tlNodeType.getDO().stream()
.flatMap(tdo -> {
dataRef.getDoName().setName(tdo.getName());
return doTypeService.findDoType(dtt, tdoType -> tdoType.getId().equals(tdo.getType()))
.stream().flatMap(tdoType -> {
dataRef.getDoName().setCdc(tdoType.getCdc());
return doTypeService.getDataAttributeRefs(dtt, tdoType, dataRef).stream();
});
})
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
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 @@ -18,9 +20,16 @@

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

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 {
SclRootAdapter sclRootAdapter = new SclRootAdapter(scd);
Expand Down Expand Up @@ -99,6 +108,26 @@ public Set<DataAttributeRef> getDAI(SCL scd, String iedName, String ldInst, Data
return lDeviceAdapter.getDAI(dataAttributeRef, updatable);
}

@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();
}

@Override
public Set<EnumValDTO> getEnumTypeValues(SCL scd, String idEnum) throws ScdException {
SclRootAdapter sclRootAdapter = new SclRootAdapter(scd);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ public interface DataTypeTemplateReader {

DataAttributeRef getDataObjectsAndDataAttributes(TDataTypeTemplates dtt, String lNodeTypeId, String dataRef);

List<DataAttributeRef> getAllDataObjectsAndDataAttributes(TDataTypeTemplates dtt);

}
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ public interface SclElementsProvider {
* @throws ScdException SCD illegal arguments exception, missing mandatory data
*/
Set<DataAttributeRef> getDAI(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException;
List<DataAttributeRef> getDAI2(SCL scd, String iedName, String ldInst, DataAttributeRef dataAttributeRef, boolean updatable) throws ScdException;

/**
* Gets EnumTypes values of ID <em>idEnum</em> from DataTypeTemplate of SCL file
Expand Down
Loading

0 comments on commit bdcff39

Please sign in to comment.