Skip to content

Commit

Permalink
feat(): refactor DTT - manage DO and DA in DataTypeTemplate / DOI, SD…
Browse files Browse the repository at this point in the history
…I and DAI in LN

Signed-off-by: Samir Romdhani <[email protected]>
  • Loading branch information
samirromdhani committed Feb 27, 2024
1 parent 7529951 commit 60af373
Show file tree
Hide file tree
Showing 9 changed files with 816 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// SPDX-FileCopyrightText: 2024 RTE FRANCE
//
// SPDX-License-Identifier: Apache-2.0

package org.lfenergy.compas.sct.commons;

import org.lfenergy.compas.scl2007b4.model.TBDA;
import org.lfenergy.compas.scl2007b4.model.TDAType;

import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class BDAService {

public Stream<TBDA> getBDAs(TDAType tdaType) {
return tdaType.getBDA().stream();
}

public Stream<TBDA> getFilteredSDOOrDAs(TDAType tdaType, Predicate<TBDA> tTBDAPredicate) {
return getBDAs(tdaType).filter(tTBDAPredicate);
}

public Optional<TBDA> findBDA(TDAType tdaType, Predicate<TBDA> tBDAPredicate) {
return getFilteredSDOOrDAs(tdaType, tBDAPredicate).findFirst();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// SPDX-FileCopyrightText: 2024 RTE FRANCE
//
// SPDX-License-Identifier: Apache-2.0

package org.lfenergy.compas.sct.commons;

import org.lfenergy.compas.scl2007b4.model.TDAType;
import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates;

import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class DaTypeService {

public Stream<TDAType> getDaTypes(TDataTypeTemplates tDataTypeTemplates) {
return tDataTypeTemplates.getDAType().stream();
}

public Stream<TDAType> getFilteredDaTypes(TDataTypeTemplates tDataTypeTemplates, Predicate<TDAType> tdaTypePredicate) {
return getDaTypes(tDataTypeTemplates).filter(tdaTypePredicate);
}

public Optional<TDAType> findDaType(TDataTypeTemplates tDataTypeTemplates, Predicate<TDAType> tdaTypePredicate) {
return getFilteredDaTypes(tDataTypeTemplates, tdaTypePredicate).findFirst();
}

}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,20 @@
package org.lfenergy.compas.sct.commons;

import org.lfenergy.compas.scl2007b4.model.*;
import org.lfenergy.compas.sct.commons.api.LNEditor;
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.util.ActiveStatus;

import java.util.Collection;
import java.util.Optional;
import java.util.*;
import java.util.stream.Stream;

import static org.lfenergy.compas.sct.commons.util.CommonConstants.MOD_DO_NAME;
import static org.lfenergy.compas.sct.commons.util.CommonConstants.STVAL_DA_NAME;
import static org.lfenergy.compas.sct.commons.util.SclConstructorHelper.newVal;

public class LnService {
public class LnService implements LNEditor {

public Stream<TAnyLN> getAnylns(TLDevice tlDevice) {
return Stream.concat(Stream.of(tlDevice.getLN0()), tlDevice.getLN().stream());
Expand Down Expand Up @@ -61,4 +65,166 @@ public Stream<TAnyLN> getActiveLns(TLDevice tlDevice) {
Stream<LN0> ln0Stream = Stream.of(ln0).filter(ln02 -> getDaiModStval(ln02).map(ActiveStatus.ON::equals).orElse(false));
return Stream.concat(ln0Stream, tlnStream);
}

public boolean isDoObjectsInstanceAndDataAttributesInstanceExists(TAnyLN tAnyLN, DoTypeName doTypeName, DaTypeName daTypeName) {
return tAnyLN.getDOI().stream().filter(doi -> doTypeName.getName().equals(doi.getName()))
.findFirst()
.map(doi -> {
LinkedList<String> structNamesList = new LinkedList<>(doTypeName.getStructNames());
structNamesList.addLast(daTypeName.getName());
daTypeName.getStructNames().forEach(structNamesList::addLast);
if(structNamesList.size() > 1) {
String firstSDIName = structNamesList.remove();
return doi.getSDIOrDAI().stream()
.filter(sdi -> sdi.getClass().equals(TSDI.class))
.map(TSDI.class::cast)
.filter(tsdi -> tsdi.getName().equals(firstSDIName))
.findFirst()
.map(intermediateSdi -> findSDIByStructName(intermediateSdi, structNamesList))
.stream()
.findFirst()
.flatMap(lastDsi -> {
if (structNamesList.size() == 1) {
return lastDsi.getSDIOrDAI().stream()
.filter(dai -> dai.getClass().equals(TDAI.class))
.map(TDAI.class::cast)
.filter(dai -> dai.getName().equals(structNamesList.get(0)))
.findFirst();
}
return Optional.empty();
})
.isPresent();
} else if(structNamesList.size() == 1){
return doi.getSDIOrDAI().stream()
.filter(unNaming -> unNaming.getClass().equals(TDAI.class))
.map(TDAI.class::cast)
.anyMatch(dai -> dai.getName().equals(structNamesList.get(0)));
}
return false;
})
.orElse(false);
}

public void updateOrCreateDoObjectsAndDataAttributesInstances(TAnyLN tAnyLN, DataAttributeRef dataAttributeRef) {
createDoiSdiDaiChainIfNotExists(tAnyLN, dataAttributeRef.getDoName(), dataAttributeRef.getDaName())
.ifPresent(tdai -> {
for (Map.Entry<Long, String> mapVal : dataAttributeRef.getDaName().getDaiValues().entrySet()) {
if (mapVal.getKey() != null && mapVal.getKey() != 0L) {
tdai.getVal().stream()
.filter(tValElem -> tValElem.isSetSGroup() && mapVal.getKey().equals(tValElem.getSGroup()))
.findFirst()
.ifPresentOrElse(
tVal -> tVal.setValue(mapVal.getValue()),
() -> tdai.getVal().add(newVal(mapVal.getValue(), mapVal.getKey())));
} else {
tdai.getVal().stream().findFirst()
.ifPresentOrElse(
tVal -> tVal.setValue(mapVal.getValue()),
() -> tdai.getVal().add(newVal(mapVal.getValue())));
}
}
});
}

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 TSDI findOrCreateSDIByStructName(TSDI tsdi, List<String> structNames) {
structNames.remove(0);
if(structNames.isEmpty() || structNames.size() == 1) return tsdi;
return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(tsdi, structNames.get(0)), structNames);
}

private Optional<TDAI> createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DoTypeName doTypeName, DaTypeName daTypeName) {
LinkedList<String> structNamesList = new LinkedList<>();
structNamesList.addLast(doTypeName.getName());
doTypeName.getStructNames().forEach(structNamesList::addLast);
structNamesList.addLast(daTypeName.getName());
daTypeName.getStructNames().forEach(structNamesList::addLast);

String doiName = structNamesList.remove();
TDOI doi = tAnyLN.getDOI().stream().filter(tdoi -> tdoi.getName().equals(doiName))
.findFirst()
.orElseGet(() -> {
TDOI tdoi = new TDOI();
tdoi.setName(doiName);
tAnyLN.getDOI().add(tdoi);
return tdoi;
});
if(structNamesList.size() > 1) {
TSDI lastDsi = findOrCreateSDIByStructName(findOrCreateSDIFromDOI(doi, structNamesList.get(0)), structNamesList);
if (structNamesList.size() == 1) {
return Optional.of(findOrCreateDAIFromSDI(lastDsi, structNamesList.get(0)));
}
}
else if(structNamesList.size() == 1){
return Optional.of(doi.getSDIOrDAI().stream()
.filter(dai -> dai.getClass().equals(TDAI.class))
.map(TDAI.class::cast)
.filter(tdai -> tdai.getName().equals(structNamesList.get(0)))
.findFirst()
.orElseGet(() -> {
TDAI tdai = new TDAI();
tdai.setName(structNamesList.get(0));
doi.getSDIOrDAI().add(tdai);
return tdai;
}));
}
return Optional.empty();
}

private TDAI findOrCreateDAIFromSDI(TSDI sdi, String daiName) {
return sdi.getSDIOrDAI().stream()
.filter(unNaming -> unNaming.getClass().equals(TDAI.class))
.map(TDAI.class::cast)
.filter(tdai -> tdai.getName().equals(daiName))
.findFirst()
.orElseGet(() -> {
TDAI tdai = new TDAI();
tdai.setName(daiName);
sdi.getSDIOrDAI().add(tdai);
return tdai;
});
}


private TSDI findOrCreateSDIFromDOI(TDOI doi, String sdiName) {
return doi.getSDIOrDAI().stream()
.filter(sdi -> sdi.getClass().equals(TSDI.class))
.map(TSDI.class::cast)
.filter(tsdi -> tsdi.getName().equals(sdiName))
.findFirst()
.orElseGet(() -> {
TSDI tsdi = new TSDI();
tsdi.setName(sdiName);
doi.getSDIOrDAI().add(tsdi);
return tsdi;
});
}

private TSDI findOrCreateSDIFromSDI(TSDI sdi, String sdiName) {
return sdi.getSDIOrDAI().stream()
.filter(unNaming -> unNaming.getClass().equals(TSDI.class))
.map(TSDI.class::cast)
.filter(tsdi -> tsdi.getName().equals(sdiName))
.findFirst()
.orElseGet(() -> {
TSDI tsdi = new TSDI();
tsdi.setName(sdiName);
sdi.getSDIOrDAI().add(tsdi);
return tsdi;
});
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// SPDX-FileCopyrightText: 2024 RTE FRANCE
//
// SPDX-License-Identifier: Apache-2.0

package org.lfenergy.compas.sct.commons;

import org.lfenergy.compas.scl2007b4.model.*;

import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class SDOOrDAService {

public <T> Stream<T> getSDOOrDAs(TDOType tdoType, Class<T> clazz) {
return tdoType.getSDOOrDA().stream()
.filter(unNaming -> unNaming.getClass().equals(clazz))
.map(clazz::cast);
}

public <T> Stream<T> getFilteredSDOOrDAs(TDOType tdoType, Class<T> clazz, Predicate<T> tSDOOrDAPredicate) {
return getSDOOrDAs(tdoType, clazz).filter(tSDOOrDAPredicate);
}

public <T> Optional<T> findSDOOrDA(TDOType tdoType, Class<T> clazz, Predicate<T> tSDOOrDAPredicate) {
return getFilteredSDOOrDAs(tdoType, clazz, tSDOOrDAPredicate).findFirst();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// SPDX-FileCopyrightText: 2024 RTE FRANCE
//
// SPDX-License-Identifier: Apache-2.0

package org.lfenergy.compas.sct.commons.api;

import org.lfenergy.compas.scl2007b4.model.TDataTypeTemplates;
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.dto.SclReportItem;

import java.util.List;

public interface DataTypeTemplateReader {

boolean isDoModAndDaStValExist(TDataTypeTemplates dtt, String lNodeTypeId);

List<SclReportItem> isDataObjectsAndDataAttributesExists(TDataTypeTemplates dtt, String lNodeTypeId, String dataRef);

List<SclReportItem> verifyDataObjectsAndDataAttributes(TDataTypeTemplates dtt, String lNodeTypeId, DoTypeName doTypeName, DaTypeName daTypeName);

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

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-FileCopyrightText: 2024 RTE FRANCE
//
// SPDX-License-Identifier: Apache-2.0

package org.lfenergy.compas.sct.commons.api;

import org.lfenergy.compas.scl2007b4.model.TAnyLN;
import org.lfenergy.compas.sct.commons.dto.DaTypeName;
import org.lfenergy.compas.sct.commons.dto.DataAttributeRef;
import org.lfenergy.compas.sct.commons.dto.DoTypeName;

public interface LNEditor {

boolean isDoObjectsInstanceAndDataAttributesInstanceExists(TAnyLN tAnyLN, DoTypeName doTypeName, DaTypeName daTypeName);

void updateOrCreateDoObjectsAndDataAttributesInstances(TAnyLN tAnyLN, DataAttributeRef dataAttributeRef);
}
Loading

0 comments on commit 60af373

Please sign in to comment.