From 8b0ef752ca8dd958e50e964851538f25d734a19d Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Mon, 19 Apr 2021 13:26:18 +0200 Subject: [PATCH 01/24] RSR-31 / Create a new SCD file with Header EPIC RSR-51 / RSR-6 : S79 : Add DataTypeTemplates from ICD to current SCD EPIC RSR-51 / RSR-60 : Add a new IED from ICD to current SCD EPIC RSR-51 / RSR-64 : Associate a list of Connected Access Point (ConnectedAP) to a SubNetwork RSR-86 COMPAS List for a given signal ExtRef, all possible IED, LDevice, LN and DO that can be defined as source RSR-81 COMPAS List all External References signals ExtRef belonging to an IED and LDevice.inst of an SCD file Signed-off-by: SYLLA MOHAMED --- .gitignore | 33 + pom.xml | 99 +++ sct-coverage/pom.xml | 49 ++ sct-data/pom.xml | 29 + .../exception/CompasDataAccessException.java | 13 + .../compas/sct/model/IAccessPointDTO.java | 13 + .../compas/sct/model/IConnectedApDTO.java | 9 + .../compas/sct/model/IControlBlockDTO.java | 5 + .../lfenergy/compas/sct/model/IExtRefDTO.java | 96 +++ .../lfenergy/compas/sct/model/IIedDTO.java | 12 + .../compas/sct/model/ILDeviceDTO.java | 16 + .../lfenergy/compas/sct/model/ILNodeDTO.java | 20 + .../org/lfenergy/compas/sct/model/IScd.java | 7 + .../compas/sct/model/IScdCrudRepository.java | 15 + .../lfenergy/compas/sct/model/IScdModel.java | 6 + .../lfenergy/compas/sct/model/IServerDTO.java | 7 + .../compas/sct/model/ISubNetworkDTO.java | 13 + .../compas/sct/model/dto/ConnectedApDTO.java | 42 ++ .../compas/sct/model/dto/ExtRefDTO.java | 69 ++ .../lfenergy/compas/sct/model/dto/IedDTO.java | 28 + .../compas/sct/model/dto/ItemsDTO.java | 11 + .../compas/sct/model/dto/LDeviceDTO.java | 34 + .../compas/sct/model/dto/LNodeDTO.java | 62 ++ .../sct/model/dto/ResumedDataTemplate.java | 31 + .../lfenergy/compas/sct/model/dto/ScdDTO.java | 51 ++ .../compas/sct/model/dto/SubNetworkDTO.java | 91 +++ .../compas/sct/model/entity/SimpleScd.java | 70 ++ .../compas/sct/model/entity/package-info.java | 11 + .../AbstractScdSQLCrudRepository.java | 39 + .../sct/repository/H2XMLTypeMapper.java | 30 + .../sct/repository/PostgreSqlXmlDialect.java | 14 + .../sct/repository/PostgresXMLTypeMapper.java | 53 ++ .../sct/repository/ScdBaseXRepository.java | 44 ++ .../sct/repository/ScdJpaRepository.java | 14 + .../sct/repository/SimpleScdRepository.java | 66 ++ .../sct/repository/SqlXmlTypeMapper.java | 51 ++ .../compas/sct/ApplicationContextTest.java | 28 + .../CompasDataAccessExceptionTest.java | 19 + .../sct/model/dto/ConnectedApDTOTest.java | 27 + .../compas/sct/model/dto/ExtRefDTOTest.java | 25 + .../compas/sct/model/dto/IedDTOTest.java | 19 + .../compas/sct/model/dto/LDeviceDTOTest.java | 26 + .../compas/sct/model/dto/LNodeDTOTest.java | 62 ++ .../model/dto/ResumedDataTemplateTest.java | 35 + .../compas/sct/model/dto/ScdDTOTest.java | 41 ++ .../sct/model/dto/SubNetworkDTOTest.java | 28 + .../sct/model/entity/SimpleScdTest.java | 34 + .../compas/sct/model/entity/package-info.java | 9 + .../sct/repository/H2XMLTypeMapperTest.java | 41 ++ .../repository/PostgresXMLTypeMapperTest.java | 53 ++ .../repository/SimpleScdRepositoryTest.java | 120 ++++ .../lfenergy/compas/sct/testhelper/DTO.java | 228 ++++++ sct-data/src/test/resources/application.yml | 24 + .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 64 ++ .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 62 ++ .../Icd_With_Identical_DTT.xml | 69 ++ .../IEDImportHelper/icd_import_ied_test.xml | 94 +++ .../scl/SCD/scd_ied_receiver_test.xml | 69 ++ .../resources/scl/SCD/scd_with_dtt_test.xml | 69 ++ .../resources/scl/SCD/scd_with_ieds_test.xml | 101 +++ sct-service/pom.xml | 37 + .../sct/config/XMLMarshallerConfig.java | 18 + .../compas/sct/config/XSDFileProperties.java | 28 + .../sct/service/AbstractSqlScdService.java | 50 ++ .../compas/sct/service/ISCDService.java | 110 +++ .../sct/service/SimpleSqlScdService.java | 218 ++++++ .../service/scl/SclCommunicationManager.java | 75 ++ .../service/scl/SclDataTemplateManager.java | 665 ++++++++++++++++++ .../sct/service/scl/SclHeaderManager.java | 60 ++ .../compas/sct/service/scl/SclIEDManager.java | 221 ++++++ .../compas/sct/service/scl/SclManager.java | 60 ++ .../src/main/resources/icd/icd_test.xml | 101 +++ .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 64 ++ .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 62 ++ .../Icd_With_Identical_DTT.xml | 69 ++ .../IEDImportHelper/icd_import_ied_test.xml | 82 +++ .../scl/SCD/scd_ied_receiver_test.xml | 69 ++ .../resources/scl/SCD/scd_with_dtt_test.xml | 69 ++ .../resources/scl/SCD/scd_with_ieds_test.xml | 109 +++ .../compas/sct/ApplicationContextTest.java | 23 + .../compas/sct/model/entity/package-info.java | 9 + .../sct/service/SqlScdServiceAndDBTest.java | 269 +++++++ .../scl/SclCommunicationManagerTest.java | 87 +++ .../scl/SclDataTemplateManagerTest.java | 566 +++++++++++++++ .../sct/service/scl/SclHeaderManagerTest.java | 71 ++ .../sct/service/scl/SclIEDManagerTest.java | 282 ++++++++ .../sct/service/scl/SclManagerTest.java | 5 + .../src/test/resources/application.yml | 9 + .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 64 ++ .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 62 ++ .../Icd_With_Identical_DTT.xml | 69 ++ .../IEDImportHelper/icd_import_ied_test.xml | 94 +++ .../scl/SCD/scd_ied_receiver_test.xml | 69 ++ .../resources/scl/SCD/scd_with_dtt_test.xml | 69 ++ .../resources/scl/SCD/scd_with_ieds_test.xml | 102 +++ 95 files changed, 6617 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 sct-coverage/pom.xml create mode 100644 sct-data/pom.xml create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java create mode 100644 sct-data/src/test/resources/application.yml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml create mode 100644 sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml create mode 100644 sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml create mode 100644 sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml create mode 100644 sct-service/pom.xml create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java create mode 100644 sct-service/src/main/resources/icd/icd_test.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml create mode 100644 sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml create mode 100644 sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml create mode 100644 sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java create mode 100644 sct-service/src/test/resources/application.yml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml create mode 100644 sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml create mode 100644 sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml create mode 100644 sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a2e922f9b --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +.scannerwork +sonar-project.properties +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..18dabdcdb --- /dev/null +++ b/pom.xml @@ -0,0 +1,99 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.2 + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + pom + COMPAS-SCT + + + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + test + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + org.lfenergy.compas + core-commons + ${compas.core.version} + + + + sct-data + sct-service + sct-coverage + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + org.jacoco + jacoco-maven-plugin + 0.8.6 + + + + + + + org.jacoco + jacoco-maven-plugin + + + prepare-agent + + prepare-agent + + + + + + + \ No newline at end of file diff --git a/sct-coverage/pom.xml b/sct-coverage/pom.xml new file mode 100644 index 000000000..6a18222e1 --- /dev/null +++ b/sct-coverage/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + ../pom.xml + + + sct-coverage + SCT-Coverage + + + true + + + + org.lfenergy.compas + sct-data + ${project.version} + + + org.lfenergy.compas + sct-service + ${project.version} + + + + + + org.jacoco + jacoco-maven-plugin + + + report-aggregate + test + + report-aggregate + + + + + + + \ No newline at end of file diff --git a/sct-data/pom.xml b/sct-data/pom.xml new file mode 100644 index 000000000..eb62c042f --- /dev/null +++ b/sct-data/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + + + sct-data + + SCT DATA + + \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java b/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java new file mode 100644 index 000000000..9bec65351 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java @@ -0,0 +1,13 @@ +package org.lfenergy.compas.sct.exception; + + +public class CompasDataAccessException extends Exception { + + public CompasDataAccessException(String message) { + super(message); + } + + public CompasDataAccessException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java new file mode 100644 index 000000000..adfa0cdae --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java @@ -0,0 +1,13 @@ +package org.lfenergy.compas.sct.model; + +import lombok.NonNull; + +import java.util.Set; + +public interface IAccessPointDTO { + String getName(); + void setName(String name); + void addLDevice(@NonNull T ld); + + @NonNull Set getLDevices(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java new file mode 100644 index 000000000..2a47d0f5d --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java @@ -0,0 +1,9 @@ +package org.lfenergy.compas.sct.model; + +public interface IConnectedApDTO { + String getIedName(); + String getApName(); + + void setIedName(String name); + void setApName(String name); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java new file mode 100644 index 000000000..9847c0b71 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java @@ -0,0 +1,5 @@ +package org.lfenergy.compas.sct.model; + +public interface IControlBlockDTO { + +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java new file mode 100644 index 000000000..c8e89851c --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java @@ -0,0 +1,96 @@ +package org.lfenergy.compas.sct.model; + + +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TServiceType; + +public interface IExtRefDTO { + + String getDesc(); + String getPDO(); + String getPLN(); + String getPDA(); + String getIntAddr(); + String getLdInst(); + String getIedName(); + String getPrefix(); + String getLnClass(); + String getLnInst(); + String getDoName(); + String getDaName(); + TServiceType getServiceType(); + String getSrcLDInst(); + String getSrcPrefix(); + String getSrcLNClass(); + String getSrcLNInst(); + String getSrcCBName(); + TServiceType getPServT(); + + void setDesc(String desc); + void setPDO(String pdo); + void setPLN(String pln); + void setPDA(String pda); + void setIntAddr(String intAddr); + void setLdInst(String ldInst); + void setIedName(String iedName); + void setPrefix(String prefix); + void setLnClass(String lnClass); + void setLnInst(String lnInst); + void setDoName(String doName); + void setDaName(String daName); + void setServiceType(TServiceType serviceType); + void setSrcLDInst(String srcLDInst); + void setSrcPrefix(String srcPrefix); + void setSrcLNClass( String srcLNClass); + void setSrcLNInst(String srcLNCInst); + void setSrcCBName(String srcCBName); + void setPServT(TServiceType pServT); + + default boolean isIdentical(IExtRefDTO other){ + + if(this.getDesc() != null && !getDesc().equals(other.getDesc())) return false; + if(this.getPDO() != null && !getPDO().equals(other.getPDO())) return false; + if(this.getPDA() != null && !getPDA().equals(other.getPDA())) return false; + if(this.getPLN() != null && !getPLN().equals(other.getPLN())) return false; + if(this.getIedName() != null && !getIedName().equals(other.getIedName())) return false; + if(this.getIntAddr() != null && !getIntAddr().equals(other.getIntAddr())) return false; + if(this.getLdInst() != null && !getLdInst().equals(other.getLdInst())) return false; + if(this.getPrefix() != null && !getPrefix().equals(other.getPrefix())) return false; + if(this.getLnClass() != null && !getLnClass().equals(other.getLnClass())) return false; + if(this.getLnInst() != null && !getLnInst().equals(other.getLnInst())) return false; + if(this.getDoName() != null && !getDoName().equals(other.getDoName())) return false; + if(this.getDaName() != null && !getDaName().equals(other.getDaName())) return false; + if(this.getSrcLNClass() != null && !getSrcLNClass().equals(other.getSrcLNClass())) return false; + if(this.getSrcLNInst() != null && !getSrcLNInst().equals(other.getSrcLNInst())) return false; + if(this.getSrcCBName() != null && !getSrcCBName().equals(other.getSrcCBName())) return false; + if(this.getSrcLDInst() != null && !getSrcLDInst().equals(other.getSrcLDInst())) return false; + if(this.getPServT() != null && !getPServT().equals(other.getPServT())) return false; + if(this.getServiceType() != null && !getServiceType().equals(other.getServiceType())) return false; + + return true; + } + + default boolean isIdentical(TExtRef other){ + + if(this.getDesc() != null && !getDesc().equals(other.getDesc())) return false; + if(this.getPDO() != null && !getPDO().equals(other.getPDO())) return false; + if(this.getPDA() != null && !getPDA().equals(other.getPDA())) return false; + if(this.getPLN() != null && !other.getPLN().contains(getPLN())) return false; + if(this.getIedName() != null && !getIedName().equals(other.getIedName())) return false; + if(this.getIntAddr() != null && !getIntAddr().equals(other.getIntAddr())) return false; + if(this.getLdInst() != null && !getLdInst().equals(other.getLdInst())) return false; + if(this.getPrefix() != null && !getPrefix().equals(other.getPrefix())) return false; + if(this.getLnClass() != null && !other.getLnClass().contains(getLnClass())) return false; + if(this.getLnInst() != null && !getLnInst().equals(other.getLnInst())) return false; + if(this.getDoName() != null && !getDoName().equals(other.getDoName())) return false; + if(this.getDaName() != null && !getDaName().equals(other.getDaName())) return false; + if(this.getSrcLNClass() != null && !other.getSrcLNClass().contains(getSrcLNClass())) return false; + if(this.getSrcLNInst() != null && !getSrcLNInst().equals(other.getSrcLNInst())) return false; + if(this.getSrcCBName() != null && !getSrcCBName().equals(other.getSrcCBName())) return false; + if(this.getSrcLDInst() != null && !getSrcLDInst().equals(other.getSrcLDInst())) return false; + if(this.getPServT() != null && !getPServT().equals(other.getPServT())) return false; + if(this.getServiceType() != null && !getServiceType().equals(other.getServiceType())) return false; + + return true; + } +} \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java new file mode 100644 index 000000000..d980a1087 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java @@ -0,0 +1,12 @@ +package org.lfenergy.compas.sct.model; + +import lombok.NonNull; + +import java.util.Set; + +public interface IIedDTO { + String getName(); + void setName(String name); + void addLDevice(T ld); + @NonNull Set getLDevices(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java new file mode 100644 index 000000000..965e3b20a --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java @@ -0,0 +1,16 @@ +package org.lfenergy.compas.sct.model; + +import org.springframework.lang.NonNull; + +import java.util.Set; + +public interface ILDeviceDTO { + String getLdInst(); + String getLdName(); + + void setLdName(String ldName); + void setLdInst(String inst); + + void addLNode(@NonNull T ln); + Set getLNodes(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java new file mode 100644 index 000000000..adda1c02c --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java @@ -0,0 +1,20 @@ +package org.lfenergy.compas.sct.model; + +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; + +import java.util.Set; + +public interface ILNodeDTO { + String getInst(); + String getLNodeClass(); + String getLNodeType(); + Set getExtRefs(); + Set getResumedDataTemplates(); + + void addExtRef(T extRef); + void addResumedDataTemplate(ResumedDataTemplate dtt); + + void setInst(String inst); + void setLNodeClass(String lnClass); + void setLNodeType(String lnType); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java new file mode 100644 index 000000000..c5fad6533 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java @@ -0,0 +1,7 @@ +package org.lfenergy.compas.sct.model; + +public interface IScd { + ID getId(); + byte[] getRawXml(); + ID getHeaderId(); +} \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java new file mode 100644 index 000000000..b0de05833 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java @@ -0,0 +1,15 @@ +package org.lfenergy.compas.sct.model; + +import org.lfenergy.compas.sct.exception.CompasDataAccessException; + +import java.util.Optional; + +public interface IScdCrudRepository { + S save(S s) throws CompasDataAccessException; + S update(S s) throws CompasDataAccessException; + Optional findById(ID id); + boolean existsById(ID id) ; + boolean existsByHeaderId(ID id) ; + long count() ; + void deleteById(ID id) throws CompasDataAccessException; +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java new file mode 100644 index 000000000..d2ddaf07e --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java @@ -0,0 +1,6 @@ +package org.lfenergy.compas.sct.model; + +public interface IScdModel { + ID getId(); + byte[] getRawXml(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java new file mode 100644 index 000000000..13848b5ef --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java @@ -0,0 +1,7 @@ +package org.lfenergy.compas.sct.model; + +import java.util.Set; + +public interface IServerDTO { + Set getLDevices(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java new file mode 100644 index 000000000..dd2598491 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java @@ -0,0 +1,13 @@ +package org.lfenergy.compas.sct.model; + +import java.util.Set; + +public interface ISubNetworkDTO { + String getName(); + String getType(); + Set getConnectedAPs(); + void addConnectedAPs(T cap); + + void setName(String name); + void setType(String type); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java new file mode 100644 index 000000000..f739444b8 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java @@ -0,0 +1,42 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.sct.model.IConnectedApDTO; + +import java.util.Objects; + +@Setter +@Getter +@NoArgsConstructor +public class ConnectedApDTO implements IConnectedApDTO { + private String iedName; + private String apName; + + public ConnectedApDTO(String iedName, String apName) { + this.iedName = iedName; + this.apName = apName; + } + + public ConnectedApDTO(TConnectedAP tConnectedAP) { + this.iedName = tConnectedAP.getIedName(); + this.apName = tConnectedAP.getApName(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || o.getClass() != this.getClass()) return false; + ConnectedApDTO that = (ConnectedApDTO) o; + return Objects.equals(iedName, that.iedName) && + Objects.equals(apName, that.apName); + } + + @Override + public int hashCode() { + return Objects.hash(iedName, apName); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java new file mode 100644 index 000000000..fa5b99b2a --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java @@ -0,0 +1,69 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TServiceType; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.springframework.lang.NonNull; + + +@Setter +@Getter +@NoArgsConstructor +public class ExtRefDTO implements IExtRefDTO { + private String iedName; + private String ldInst; + private String prefix; + private String lnClass; + private String lnInst; + private String doName; + private String daName; + private TServiceType serviceType; + private String srcLDInst; + private String srcPrefix; + private String srcLNClass; + private String srcLNInst; + private String srcCBName; + private String desc; + private String pLN; + private String pDO; + private String pDA; + private String intAddr; + private TServiceType pServT; + + public ExtRefDTO(@NonNull TExtRef tExtRef) { + iedName = tExtRef.getIedName(); + ldInst = tExtRef.getLdInst(); + prefix = tExtRef.getPrefix(); + if(!tExtRef.getLnClass().isEmpty()) { + this.lnClass = tExtRef.getLnClass().get(0); + } + lnInst = tExtRef.getLnInst(); + doName = tExtRef.getDoName(); + daName = tExtRef.getDaName(); + if(tExtRef.getServiceType() != null) { + serviceType = tExtRef.getServiceType(); + } + srcLDInst = tExtRef.getSrcLDInst(); + srcPrefix = tExtRef.getSrcPrefix(); + srcLNInst = tExtRef.getSrcLNInst(); + srcCBName = tExtRef.getSrcCBName(); + desc = tExtRef.getDesc(); + if(!tExtRef.getPLN().isEmpty()) { + pLN = tExtRef.getPLN().get(0); + } + if(!tExtRef.getSrcLNClass().isEmpty()){ + srcLNClass = tExtRef.getSrcLNClass().get(0); + } + pDO = tExtRef.getPDO(); + pDA = tExtRef.getPDA(); + intAddr = tExtRef.getIntAddr(); + if(tExtRef.getPServT() != null) { + pServT = tExtRef.getPServT(); + } + } +} + diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java new file mode 100644 index 000000000..f8aa7141b --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.sct.model.IIedDTO; +import org.lfenergy.compas.sct.model.ILDeviceDTO; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class IedDTO implements IIedDTO { + private String name; + private Set lDevices = new HashSet<>(); + + @Override + public Set getLDevices() { + return Set.of(lDevices.toArray(new LDeviceDTO[0])); + } + + @Override + public void addLDevice(T ld) { + lDevices.add((LDeviceDTO)ld); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java new file mode 100644 index 000000000..1d894b039 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java @@ -0,0 +1,11 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; + +import java.util.HashSet; +import java.util.Set; + +@Getter +public class ItemsDTO { + private Set items = new HashSet<>(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java new file mode 100644 index 000000000..224edae5e --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java @@ -0,0 +1,34 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.sct.model.ILDeviceDTO; +import org.lfenergy.compas.sct.model.ILNodeDTO; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class LDeviceDTO implements ILDeviceDTO { + private String ldInst; + private String ldName; + private Set lNodes = new HashSet<>(); + + @Override + public Set getLNodes() { + return Set.of(lNodes.toArray(new LNodeDTO[0])); + } + + @Override + public void addLNode(T ln) { + lNodes.add((LNodeDTO) ln); + } + + public void addAll(Set lns) { + lNodes.addAll(lns); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java new file mode 100644 index 000000000..26a963882 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java @@ -0,0 +1,62 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.sct.model.IControlBlockDTO; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.ILNodeDTO; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class LNodeDTO implements ILNodeDTO { + private String inst; + private String lNodeClass; + private String lNodeType; + private Set extRefs = new HashSet<>(); + private Set resumedDataTemplates = new HashSet<>(); + + public LNodeDTO(String inst, String lNClass, String lNType) { + this.inst = inst; + this.lNodeClass = lNClass; + this.lNodeType = lNType; + + } + + public static LNodeDTO extractData(TLN ln) { + String lnClass = ln.getLnClass().isEmpty() ? "" : ln.getLnClass().get(0); + LNodeDTO lNodeDTO = new LNodeDTO(ln.getInst(),lnClass,ln.getLnType()); + if(ln.getInputs() != null){ + ln.getInputs().getExtRef().forEach(tExtRef -> { + ExtRefDTO extRefDTO = new ExtRefDTO(tExtRef); + lNodeDTO.addExtRef(extRefDTO); + }); + } + return lNodeDTO; + } + + @Override + public Set getExtRefs() { + return Set.of(extRefs.toArray(new ExtRefDTO[0])); + } + + @Override + public void addExtRef(T extRef) { + extRefs.add((ExtRefDTO) extRef); + } + + @Override + public void addResumedDataTemplate(ResumedDataTemplate dtt) { + resumedDataTemplates.add(dtt); + } + + @Override + public Set getResumedDataTemplates(){ + return Set.of(resumedDataTemplates.toArray(new ResumedDataTemplate[0])); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java new file mode 100644 index 000000000..26a6796cb --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java @@ -0,0 +1,31 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.Setter; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; + +@Getter +@Setter +public class ResumedDataTemplate { + + private String lnType; + private String lnClass; + private String doName; // doName[.sdoName[.sdoName]] + private TPredefinedCDCEnum cdc; + private String daName; // doName[.bdaName[.bdaName]] + private TFCEnum fc; + + @Override + public String toString() { + return "ResumedDataTemplate{" + + "lnType='" + lnType + '\'' + + ", lnClass='" + lnClass + '\'' + + ", doName='" + doName + '\'' + + ", cdc='" + cdc + '\'' + + ", daName='" + daName + '\'' + + ", fc=" + fc + + '}'; + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java new file mode 100644 index 000000000..4e0a1f7cc --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java @@ -0,0 +1,51 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Objects; +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +public class ScdDTO { + private UUID id; + private String fileName; + private UUID headerId; + private String headerRevision; + private String headerVersion; + private String who; + private String what; + private String why; + + public ScdDTO(UUID id, String fileName, UUID headerId, String headerRevision, String headerVersion) { + this.id = id; + this.fileName = fileName; + this.headerId = headerId; + this.headerRevision = headerRevision; + this.headerVersion = headerVersion; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if(o == null) return false; + if (this.getClass() != o.getClass()) return false; + ScdDTO scdDTO = (ScdDTO) o; + return Objects.equals(id, scdDTO.id) && + Objects.equals(fileName, scdDTO.fileName) && + Objects.equals(headerId, scdDTO.headerId) && + Objects.equals(headerRevision, scdDTO.headerRevision) && + Objects.equals(headerVersion, scdDTO.headerVersion) && + Objects.equals(who, scdDTO.who) && + Objects.equals(what, scdDTO.what) && + Objects.equals(why, scdDTO.why); + } + + @Override + public int hashCode() { + return Objects.hash(id, fileName, headerId, headerRevision, headerVersion, who, what, why); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java new file mode 100644 index 000000000..f3fb46187 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java @@ -0,0 +1,91 @@ +package org.lfenergy.compas.sct.model.dto; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.sct.model.IConnectedApDTO; +import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.springframework.lang.NonNull; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class SubNetworkDTO implements ISubNetworkDTO { + + private String name; + private SubnetworkType type; + private Set connectedAPs = new HashSet<>(); + + public SubNetworkDTO(String name, String type) { + this.name = name; + this.type = SubnetworkType.fromValue(type); + } + + public SubNetworkDTO(@NonNull TSubNetwork subNetwork) { + this.name = subNetwork.getName(); + this.type = SubnetworkType.fromValue(subNetwork.getType()); + subNetwork.getConnectedAP().forEach(tConnectedAP -> { + connectedAPs.add(new ConnectedApDTO(tConnectedAP)); + }); + } + + @Override + public Set getConnectedAPs() { + return Set.of(connectedAPs.toArray(new ConnectedApDTO[0])); + } + + public String getType(){ + return this.type.value; + } + + @Override + public void addConnectedAPs(T cap) { + connectedAPs.add((ConnectedApDTO) cap); + } + + @Override + public void setType(String type) { + this.type = SubnetworkType.fromValue(type); + } + + + public enum SubnetworkType { + IP("IP"), // 0 + MMS("8-MMS"), // 1 + PHYSICAL("PHYSICAL"); // 2 + + + private final String value; + + SubnetworkType(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static SubnetworkType fromValue(String text) { + if(text.equalsIgnoreCase("8-MMS") ) { + return MMS; + } + + for (SubnetworkType b : SubnetworkType.values()) { + if (String.valueOf(b.value).equalsIgnoreCase(text)) { + return b; + } + } + return null; + } + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java new file mode 100644 index 000000000..08d741c5d --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java @@ -0,0 +1,70 @@ +package org.lfenergy.compas.sct.model.entity; + +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; +import org.lfenergy.compas.sct.model.IScd; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Objects; +import java.util.UUID; + + +@Getter +@Setter +@Entity +@Table(name = "SCD") +public class SimpleScd implements IScd, Serializable { + + @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator( + name = "UUID", + strategy = "org.hibernate.id.UUIDGenerator" + ) + @Column(name = "ID") + private UUID id; + + @Column(name="RAW_XML") + @Lob + @Type(type = "xmltype") + private byte[] rawXml; + + @Column(name = "FILE_NAME",unique = true) + private String fileName; + + @Column(name = "HEADER_ID") + private UUID headerId; + + @Column(name = "HEADER_VERSION") + private String headerVersion; + + @Column(name = "HEADER_REVISION") + private String headerRevision; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if(o == null) return false; + if (o.getClass() != getClass()) return false; + SimpleScd simpleScd = (SimpleScd) o; + return Objects.equals(id, simpleScd.id) && + Objects.equals(fileName, simpleScd.fileName) && + Objects.equals(headerId, simpleScd.headerId) && + Objects.equals(headerVersion, simpleScd.headerVersion) && + Objects.equals(headerRevision, simpleScd.headerRevision); + } + + @Override + public int hashCode() { + return Objects.hash(id, fileName, headerId, headerVersion, headerRevision); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java new file mode 100644 index 000000000..9ed174c44 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -0,0 +1,11 @@ + + +@TypeDef( + name = "xmltype", + defaultForType = byte[].class, + typeClass = PostgresXMLTypeMapper.class +) +package org.lfenergy.compas.sct.model.entity; + +import org.hibernate.annotations.TypeDef; +import org.lfenergy.compas.sct.repository.PostgresXMLTypeMapper; \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java new file mode 100644 index 000000000..f226a964c --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java @@ -0,0 +1,39 @@ +package org.lfenergy.compas.sct.repository; + +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.sct.model.IScd; +import org.lfenergy.compas.sct.model.IScdCrudRepository; + +/** + * Abstract DAO for SQL-like DB + * @param Entity model type + * @param Entity identifier type + */ +@Slf4j +public abstract class AbstractScdSQLCrudRepository, ID> implements IScdCrudRepository { + + protected Class genericType; + + public AbstractScdSQLCrudRepository(Class genericType) { + this.genericType = genericType; + } + + /** + * Get new unique identifier + * @param value object for whom to determine an identifier + * @return unique identifier + */ + public ID getNextID(T value){ + ID id = value.getHeaderId(); + if(id == null || existsByHeaderId(id)){ + id = getNextID(); + } + return id; + } + + /** + * Get new unique identifier + * @return unique identifier + */ + public abstract ID getNextID(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java new file mode 100644 index 000000000..7673f7cb8 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java @@ -0,0 +1,30 @@ +package org.lfenergy.compas.sct.repository; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; + +public class H2XMLTypeMapper extends SqlXmlTypeMapper { + private final int[] SQL_TYPES = new int[] { Types.BINARY }; + + public static final H2XMLTypeMapper INSTANCE = new H2XMLTypeMapper(); + + @Override + public int[] sqlTypes() { + return SQL_TYPES.clone() ; + } + + @Override + public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException { + return resultSet.getBytes(names[0]); + } + + @Override + public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException { + preparedStatement.setBytes(index,(byte[]) value); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java new file mode 100644 index 000000000..fc7c9002a --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java @@ -0,0 +1,14 @@ +package org.lfenergy.compas.sct.repository; + +import org.hibernate.dialect.PostgreSQL95Dialect; + +import java.sql.Types; + +public class PostgreSqlXmlDialect extends PostgreSQL95Dialect{ + + public PostgreSqlXmlDialect() { + super(); + registerColumnType(Types.SQLXML, "XML"); + registerHibernateType(Types.OTHER, "pg-uuid"); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java new file mode 100644 index 000000000..74ff3c99d --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java @@ -0,0 +1,53 @@ +package org.lfenergy.compas.sct.repository; + +import lombok.extern.slf4j.Slf4j; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; + +import java.sql.*; + +@Slf4j +public class PostgresXMLTypeMapper extends SqlXmlTypeMapper { + private final int[] SQL_TYPES = new int[] { Types.SQLXML }; + + public static final PostgresXMLTypeMapper INSTANCE = new PostgresXMLTypeMapper(); + + public PostgresXMLTypeMapper() { + super(); + } + + @Override + public int[] sqlTypes() { + return SQL_TYPES.clone(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException { + byte[] rawXml = null; + SQLXML sqlxml = null; + try { + sqlxml = rs.getSQLXML(names[0]); + if(sqlxml != null) { + rawXml = sqlxml.getString().trim().getBytes(); + } + } finally { + if (null != sqlxml) { + sqlxml.free(); + } + } + return rawXml; + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor ssci) throws HibernateException, SQLException { + + SQLXML xmlType = st.getConnection().createSQLXML(); + if (value != null && value.getClass() == byte[].class) { + xmlType.setString(new String((byte[]) value)); + st.setObject(index, xmlType); + } else { + log.debug("Binding null to parameter {} ",index); + st.setNull(index,Types.SQLXML); + } + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java new file mode 100644 index 000000000..6c266c274 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java @@ -0,0 +1,44 @@ +package org.lfenergy.compas.sct.repository; + +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.IScdCrudRepository; + +import java.util.Optional; + +public class ScdBaseXRepository implements IScdCrudRepository { + private static final String NOT_IMPLEMENTED_YET = "Not implemented yet!"; + @Override + public S save(S s) throws CompasDataAccessException { + throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); + } + + @Override + public S update(S s) throws CompasDataAccessException { + throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); + } + + @Override + public Optional findById(ID id) { + return Optional.empty(); + } + + @Override + public boolean existsById(ID id) { + return false; + } + + @Override + public boolean existsByHeaderId(ID id) { + return false; + } + + @Override + public long count() { + return 0; + } + + @Override + public void deleteById(ID id) throws CompasDataAccessException { + throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java new file mode 100644 index 000000000..d89568362 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java @@ -0,0 +1,14 @@ +package org.lfenergy.compas.sct.repository; + +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + + +@Repository +public interface ScdJpaRepository extends JpaRepository { + + boolean existsByHeaderId(UUID id); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java new file mode 100644 index 000000000..93a8fde86 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java @@ -0,0 +1,66 @@ +package org.lfenergy.compas.sct.repository; + + +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + + +@Slf4j +@Repository +public class SimpleScdRepository extends AbstractScdSQLCrudRepository { + + public final ScdJpaRepository scdJpaRepository; + + @Autowired + public SimpleScdRepository(ScdJpaRepository scdJpaRepository) { + super(SimpleScd.class); + this.scdJpaRepository = scdJpaRepository; + } + + @Override + public UUID getNextID() { + return UUID.randomUUID(); + } + + @Override + public SimpleScd save(SimpleScd simpleScd) throws CompasDataAccessException { + return scdJpaRepository.save(simpleScd); + } + + + @Override + public SimpleScd update(SimpleScd simpleScd) throws CompasDataAccessException { + return scdJpaRepository.save(simpleScd); + } + + @Override + public Optional findById(UUID uuid) { + return scdJpaRepository.findById(uuid); + } + + @Override + public boolean existsById(UUID uuid) { + return scdJpaRepository.existsById(uuid); + } + + @Override + public boolean existsByHeaderId(UUID uuid) { + return scdJpaRepository.existsByHeaderId(uuid); + } + + @Override + public long count() { + return scdJpaRepository.count(); + } + + @Override + public void deleteById(UUID uuid) { + scdJpaRepository.deleteById(uuid); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java new file mode 100644 index 000000000..637ed86e1 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java @@ -0,0 +1,51 @@ +package org.lfenergy.compas.sct.repository; + +import org.hibernate.HibernateException; +import org.hibernate.usertype.UserType; + +import java.io.Serializable; +import java.util.Objects; + + +public abstract class SqlXmlTypeMapper implements UserType, Serializable { + + @Override + public Class returnedClass() { + return byte[].class; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + return Objects.equals(x,y); + } + + @Override + public int hashCode(Object x) throws HibernateException { + return Objects.hashCode(x); + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + return value; + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable) value; + } + + @Override + public Object assemble(Serializable serializable, Object owner) throws HibernateException { + return serializable; + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return deepCopy(original); + } +} diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java new file mode 100644 index 000000000..96295914e --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; + +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootTest +@ActiveProfiles("test") +public class ApplicationContextTest { + + @Test + public void contextLoads() { + // do nothing + } + + @SpringBootApplication + @EnableJpaRepositories + @EnableTransactionManagement + public static class Context { + + } +} diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java new file mode 100644 index 000000000..248afdc0f --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java @@ -0,0 +1,19 @@ +package org.lfenergy.compas.sct.exception; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +class CompasDataAccessExceptionTest { + + @Test + void testConstructor(){ + CompasDataAccessException compasDAOException = new CompasDataAccessException("Exception message"); + + assertEquals("Exception message", compasDAOException.getMessage()); + compasDAOException = new CompasDataAccessException("Exception message", + new RuntimeException("Please check me")); + + assertEquals(compasDAOException.getCause().getClass(),RuntimeException.class); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java new file mode 100644 index 000000000..424b4f8f3 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java @@ -0,0 +1,27 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class ConnectedApDTOTest { + + @Test + public void testConstruction(){ + ConnectedApDTO connectedApDTO = DTO.createCapDTO(false); + ConnectedApDTO connectedApDTO1 = DTO.createCapDTO(true); + ConnectedApDTO connectedApDTO2 = new ConnectedApDTO(DTO.createCap()); + assertAll("CAP", + () -> assertEquals(DTO.IED_NAME, connectedApDTO.getIedName()), + () -> assertEquals(DTO.AP_NAME, connectedApDTO.getApName()), + () -> assertEquals(DTO.AP_NAME, connectedApDTO2.getApName()), + () -> assertEquals(connectedApDTO1, connectedApDTO), + () -> assertFalse(connectedApDTO.equals(null)), + () -> assertFalse(connectedApDTO.equals("TOTO")), + () -> assertEquals(connectedApDTO.hashCode(), connectedApDTO1.hashCode()) + ); + + + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java new file mode 100644 index 000000000..91cfd70a1 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java @@ -0,0 +1,25 @@ +package org.lfenergy.compas.sct.model.dto; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.sct.testhelper.DTO; + +class ExtRefDTOTest { + + @Test + void testIsIdentical(){ + ExtRefDTO extRefDTO = DTO.createExtRefDTO(); + ExtRefDTO extRefDTO_bis = new ExtRefDTO(DTO.createExtRef()); + assertTrue(extRefDTO.isIdentical(DTO.createExtRef())); + assertTrue(extRefDTO.isIdentical(extRefDTO_bis)); + assertFalse(extRefDTO.isIdentical(new TExtRef())); + assertFalse(extRefDTO.isIdentical(new ExtRefDTO())); + + extRefDTO_bis.setIntAddr(DTO.INT_ADDR + "_1"); + assertFalse(extRefDTO.isIdentical(extRefDTO_bis)); + extRefDTO_bis.setPLN(DTO.P_LN + "_1"); + assertFalse(extRefDTO.isIdentical(extRefDTO_bis)); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java new file mode 100644 index 000000000..ffc323bee --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java @@ -0,0 +1,19 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class IedDTOTest { + + @Test + public void testConstruction(){ + IedDTO iedDTO = DTO.createIedDTO(); + + assertAll("IedDTO", + () -> assertEquals(DTO.IED_NAME, iedDTO.getName()), + () -> assertFalse(iedDTO.getLDevices().isEmpty()) + ); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java new file mode 100644 index 000000000..38ae12517 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java @@ -0,0 +1,26 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +class LDeviceDTOTest { + + @Test + public void testConstruction(){ + LDeviceDTO lDeviceDTO = DTO.createLdDTO(); + + assertAll("LD_DTO", + () -> assertEquals(DTO.LD_INST, lDeviceDTO.getLdInst()), + () -> assertEquals(DTO.LD_NAME, lDeviceDTO.getLdName()), + () -> assertFalse(lDeviceDTO.getLNodes().isEmpty()) + ); + + Set nodeDTOs = Set.of(DTO.createLNodeDTO(),DTO.createLNodeDTO()); + lDeviceDTO.addAll(nodeDTOs); + assertEquals(3,lDeviceDTO.getLNodes().size()); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java new file mode 100644 index 000000000..b7e0dcf4c --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java @@ -0,0 +1,62 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TInputs; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class LNodeDTOTest { + + + @Test + public void testConstruction(){ + LNodeDTO lNodeDTO = DTO.createLNodeDTO(); + lNodeDTO.addExtRef(DTO.createExtRefDTO()); + lNodeDTO.addResumedDataTemplate(new ResumedDataTemplate()); + + assertAll("LNodeDTO", + () -> assertEquals(DTO.LN_INST, lNodeDTO.getInst()), + () -> assertEquals(DTO.LN_CLASS, lNodeDTO.getLNodeClass()), + () -> assertEquals(DTO.LN_TYPE, lNodeDTO.getLNodeType()), + () -> assertFalse(lNodeDTO.getExtRefs().isEmpty()), + () -> assertFalse(lNodeDTO.getResumedDataTemplates().isEmpty()) + ); + LNodeDTO lNodeDTO1 = new LNodeDTO(); + lNodeDTO1.setInst(DTO.LN_INST); + lNodeDTO1.setLNodeClass(DTO.LN_CLASS); + lNodeDTO1.setLNodeType(DTO.LN_TYPE); + lNodeDTO1.setExtRefs(lNodeDTO.getExtRefs()); + lNodeDTO1.setResumedDataTemplates(lNodeDTO.getResumedDataTemplates()); + + assertAll("LNodeDTO1", + () -> assertEquals(DTO.LN_INST, lNodeDTO1.getInst()), + () -> assertEquals(DTO.LN_CLASS, lNodeDTO1.getLNodeClass()), + () -> assertEquals(DTO.LN_TYPE, lNodeDTO1.getLNodeType()), + () -> assertFalse(lNodeDTO1.getExtRefs().isEmpty()), + () -> assertFalse(lNodeDTO1.getResumedDataTemplates().isEmpty()) + ); + } + + @Test + public void testExtractData(){ + TLN tln = new TLN(); + tln.setInst(DTO.LN_INST); + tln.setLnType(DTO.LN_TYPE); + tln.getLnClass().add(DTO.LN_CLASS); + TExtRef tExtRef = DTO.createExtRef(); + TInputs tInputs = new TInputs(); + tInputs.getExtRef().add(tExtRef); + tln.setInputs(tInputs); + + LNodeDTO lNodeDTO = LNodeDTO.extractData(tln); + assertAll("LNodeDTO", + () -> assertEquals(DTO.LN_INST, lNodeDTO.getInst()), + () -> assertEquals(DTO.LN_CLASS, lNodeDTO.getLNodeClass()), + () -> assertEquals(DTO.LN_TYPE, lNodeDTO.getLNodeType()) + ); + assertTrue(!lNodeDTO.getExtRefs().isEmpty()); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java new file mode 100644 index 000000000..e701cefe9 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java @@ -0,0 +1,35 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; + +import static org.junit.jupiter.api.Assertions.*; + +class ResumedDataTemplateTest { + + + @Test + void testResumedDataTemplate(){ + ResumedDataTemplate rDTT = new ResumedDataTemplate(); + rDTT.setCdc(TPredefinedCDCEnum.WYE); + rDTT.setFc(TFCEnum.CF); + rDTT.setLnType("LN1"); + rDTT.setLnClass(TLLN0Enum.LLN_0.value()); + rDTT.setDoName("FACntRs1.res"); + rDTT.setDaName("d"); + + System.out.println(rDTT); + + assertAll("RDTT", + () -> assertEquals(TPredefinedCDCEnum.WYE, rDTT.getCdc()), + () -> assertEquals(TFCEnum.CF, rDTT.getFc()), + () -> assertEquals("LN1", rDTT.getLnType()), + () -> assertEquals(TLLN0Enum.LLN_0.value(), rDTT.getLnClass()), + () -> assertEquals("FACntRs1.res", rDTT.getDoName()), + () -> assertEquals("d", rDTT.getDaName()) + ); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java new file mode 100644 index 000000000..cca20c753 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java @@ -0,0 +1,41 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +class ScdDTOTest { + + + @Test + void testScdDTO(){ + UUID id = UUID.randomUUID(); + ScdDTO scdDTO = DTO.createScdDTO(id); + ScdDTO scdDTO2 = new ScdDTO(id,DTO.FILE_NAME,id,DTO.HEADER_REVISION,DTO.HEADER_VERSION); + + assertAll("scdDTO", + () -> assertEquals(id,scdDTO.getId()), + () -> assertEquals(DTO.HEADER_REVISION,scdDTO.getHeaderRevision()), + () -> assertEquals(DTO.HEADER_VERSION,scdDTO.getHeaderVersion()), + () -> assertEquals(DTO.FILE_NAME,scdDTO.getFileName()), + () -> assertEquals("WHO",scdDTO.getWho()), + () -> assertEquals("WHY",scdDTO.getWhy()), + () -> assertEquals("WHAT",scdDTO.getWhat()), + () -> assertEquals(DTO.FILE_NAME,scdDTO2.getFileName()), + () -> assertEquals(id,scdDTO.getHeaderId()) + ); + + ScdDTO scdDTO1 = DTO.createScdDTO(id); + + assertEquals(scdDTO1,scdDTO); + + scdDTO1.setFileName(scdDTO1.getFileName() + "_1"); + assertNotEquals(scdDTO1,scdDTO); + assertNotEquals(scdDTO1.hashCode(),scdDTO.hashCode()); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java new file mode 100644 index 000000000..fef619b00 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class SubNetworkDTOTest { + + @Test + public void testConstruction(){ + SubNetworkDTO subNetworkDTO = DTO.createSnDTO(false); + SubNetworkDTO subNetworkDTO1 = DTO.createSnDTO(true); + SubNetworkDTO subNetworkDTO2 = new SubNetworkDTO(DTO.createSn()); + + assertAll("SN", + () -> assertEquals(DTO.SN_NAME,subNetworkDTO.getName()), + () -> assertEquals(SubNetworkDTO.SubnetworkType.MMS.toString(),subNetworkDTO.getType()), + () -> assertFalse(subNetworkDTO.getConnectedAPs().isEmpty()), + () -> assertFalse(subNetworkDTO2.getConnectedAPs().isEmpty()), + () -> assertTrue(subNetworkDTO1.getConnectedAPs().isEmpty()) + ); + + assertNotNull(SubNetworkDTO.SubnetworkType.fromValue("IP")); + assertNull(SubNetworkDTO.SubnetworkType.fromValue("IPSEC")); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java new file mode 100644 index 000000000..598e1d3c9 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java @@ -0,0 +1,34 @@ +package org.lfenergy.compas.sct.model.entity; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +class SimpleScdTest { + @Test + void testScd(){ + UUID id = UUID.randomUUID(); + SimpleScd scd = DTO.createScd(id); + assertEquals(scd,scd); + + assertAll("SCD", + () -> assertEquals(id, scd.getId()), + () -> assertArrayEquals(DTO.DUMMY_PAYLOAD.getBytes(), scd.getRawXml()), + () -> assertEquals(DTO.HEADER_REVISION, scd.getHeaderRevision()), + () -> assertEquals(DTO.HEADER_VERSION, scd.getHeaderVersion()), + () -> assertEquals(id, scd.getHeaderId()) + ); + + SimpleScd scd1 = DTO.createScd(id); + assertEquals(scd1.hashCode(),scd.hashCode()); + assertEquals(scd1,scd); + //change + scd1.setFileName(scd1.getFileName() + "1"); + assertNotEquals(scd1.hashCode(),scd.hashCode()); + assertNotEquals(scd1,scd); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java new file mode 100644 index 000000000..548b9a3c0 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -0,0 +1,9 @@ +@TypeDef( + name = "xmltype", + defaultForType = byte[].class, + typeClass = H2XMLTypeMapper.class +) +package org.lfenergy.compas.sct.model.entity; + +import org.hibernate.annotations.TypeDef; +import org.lfenergy.compas.sct.repository.H2XMLTypeMapper; \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java new file mode 100644 index 000000000..a786fd16a --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java @@ -0,0 +1,41 @@ +package org.lfenergy.compas.sct.repository; + +import org.junit.jupiter.api.Test; + +import java.io.Serializable; + +import static org.junit.jupiter.api.Assertions.*; + +class H2XMLTypeMapperTest { + private H2XMLTypeMapper h2XMLTypeMapper = new H2XMLTypeMapper(); + + @Test + void testReturnedClass(){ + assertEquals(byte[].class,h2XMLTypeMapper.returnedClass()); + } + + @Test + void testEquals(){ + byte[] b1 = "hello".getBytes(); + byte[] b2 = "world".getBytes(); + assertTrue(h2XMLTypeMapper.equals(b1,b1)); + assertNotEquals(h2XMLTypeMapper.hashCode(b1),h2XMLTypeMapper.hashCode(b2)); + assertFalse(h2XMLTypeMapper.equals(b1,b2)); + } + + @Test + void testDisassemble(){ + byte[] b = "hello".getBytes(); + + assertNotNull(h2XMLTypeMapper.disassemble(b)); + assertTrue(Serializable.class.isInstance(h2XMLTypeMapper.disassemble(b))); + + // just for coverage ... assemble does nothing exceptional + Serializable bSer = h2XMLTypeMapper.disassemble(b); + h2XMLTypeMapper.assemble(bSer, new byte[]{}); + + } + + + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java new file mode 100644 index 000000000..549f80f5d --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java @@ -0,0 +1,53 @@ +package org.lfenergy.compas.sct.repository; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.SQLXML; +import java.sql.Types; + +import static org.junit.jupiter.api.Assertions.*; + +class PostgresXMLTypeMapperTest { + + private PostgresXMLTypeMapper xmlTypeMapper = new PostgresXMLTypeMapper(); + + @Test + void testSqlTypes() { + assertArrayEquals(new int[]{Types.SQLXML}, xmlTypeMapper.sqlTypes()); + } + + @Test + void testNullSafeSet() throws SQLException { + PreparedStatement mockPreparedStatement = Mockito.mock(PreparedStatement.class); + Connection mockConnection = Mockito.mock(Connection.class); + SQLXML mockXmlType = Mockito.mock(SQLXML.class); + + Mockito.when(mockPreparedStatement.getConnection()).thenReturn(mockConnection); + Mockito.when(mockConnection.createSQLXML()).thenReturn(mockXmlType); + byte[] b = "".getBytes(); + + xmlTypeMapper.nullSafeSet(mockPreparedStatement,b,1,null); + + xmlTypeMapper.nullSafeSet(mockPreparedStatement,null,1,null); + } + + @Test + void testNullSafeGet() throws SQLException { + ResultSet mockResultSet = Mockito.mock(ResultSet.class); + SQLXML mockXmlType = Mockito.mock(SQLXML.class); + + Mockito.when(mockResultSet.getSQLXML(ArgumentMatchers.anyString())).thenReturn(mockXmlType); + Mockito.when(mockXmlType.getString()).thenReturn(""); + byte[] expected = "".getBytes(); + byte[] res = (byte[]) xmlTypeMapper.nullSafeGet(mockResultSet,new String[]{"RAW_XML"},null,null); + + assertArrayEquals(res,expected); + + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java new file mode 100644 index 000000000..097e375be --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java @@ -0,0 +1,120 @@ +package org.lfenergy.compas.sct.repository; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.ApplicationContextTest; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = ApplicationContextTest.Context.class) +@ActiveProfiles("test") +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +class SimpleScdRepositoryTest { + + @Autowired + SimpleScdRepository simpleScdRepository; + + @Test + void testShouldReturnOKWhenGetNextID() { + assertNotNull(simpleScdRepository.getNextID()); + } + + @Test + void testShouldReturnOKWhenSave() throws CompasDataAccessException { + + SimpleScd simpleScd = createScd(null); + SimpleScd expectedScd = simpleScdRepository.save(simpleScd); + assertNotNull(expectedScd.getId()); + } + + @Test + void testShouldReturnOKWhenUpdate() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertNotNull(savedScd.getId()); + + savedScd.setHeaderRevision("2.0"); + SimpleScd expectedScd = simpleScdRepository.update(simpleScd); + assertEquals("2.0", savedScd.getHeaderRevision()); + } + + @Test + void testShouldReturnOKWhenFindById() throws CompasDataAccessException { + + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertNotNull(savedScd.getId()); + + SimpleScd expectedScd = simpleScdRepository.findById(savedScd.getId()) + .orElseThrow(() -> new CompasDataAccessException("Not found")); + assertEquals(expectedScd.getId(),savedScd.getId()); + + } + + @Test + void testShouldReturnNOKWhenFindByIdCauseUnknownId() throws CompasDataAccessException { + + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertNotNull(savedScd.getId()); + + assertThrows( CompasDataAccessException.class, () -> simpleScdRepository.findById(UUID.randomUUID()) + .orElseThrow(() -> new CompasDataAccessException("Not found"))); + } + + @Test + void existsById() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertTrue(simpleScdRepository.existsById(savedScd.getId())); + } + + @Test + void existsByHeaderId() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertTrue(simpleScdRepository.existsByHeaderId(savedScd.getHeaderId())); + } + + @Test + void count() { + } + + @Test + void deleteById() { + } + + @Test + void testGetNextID() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(UUID.randomUUID()); + assertEquals(simpleScd.getHeaderId(),simpleScdRepository.getNextID(simpleScd)); + + simpleScd = simpleScdRepository.save(simpleScd); + + UUID id = simpleScdRepository.getNextID(simpleScd); + assertNotEquals(id,simpleScd.getHeaderId()); + + SimpleScd anotherScd = createScd(null); + id = simpleScdRepository.getNextID(anotherScd); + assertNotNull(id); + assertNotEquals(id,simpleScd.getHeaderId()); + } + private SimpleScd createScd(UUID id){ + SimpleScd scd = new SimpleScd(); + scd.setId(id); + scd.setRawXml("blablabla".getBytes()); + scd.setFileName("FN"); + scd.setHeaderId(id); + scd.setHeaderRevision("RV"); + scd.setHeaderVersion("VR"); + + return scd; + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java new file mode 100644 index 000000000..8fc9073b3 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java @@ -0,0 +1,228 @@ +package org.lfenergy.compas.sct.testhelper; + +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; +import org.lfenergy.compas.scl.TServiceType; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.IedDTO; +import org.lfenergy.compas.sct.model.dto.LDeviceDTO; +import org.lfenergy.compas.sct.model.dto.LNodeDTO; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; +import org.lfenergy.compas.sct.model.dto.ScdDTO; +import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; +import org.lfenergy.compas.sct.model.entity.SimpleScd; + +import java.util.UUID; + +public class DTO { + + /*-----------------------------------------------*/ + /* Scd/ScdDTO */ + /*-----------------------------------------------*/ + public static final String HEADER_REVISION = "1.0"; + public static final String HEADER_VERSION = "1.0"; + public static final String FILE_NAME = "filename"; + public static final String DUMMY_PAYLOAD = "blablabla"; + + public static SimpleScd createScd(UUID id){ + SimpleScd scd = new SimpleScd(); + scd.setId(id); + scd.setRawXml(DUMMY_PAYLOAD.getBytes()); + scd.setFileName(FILE_NAME); + scd.setHeaderId(id); + scd.setHeaderRevision(HEADER_REVISION); + scd.setHeaderVersion(HEADER_VERSION); + + return scd; + } + public static ScdDTO createScdDTO(UUID id){ + ScdDTO scdDTO = new ScdDTO(); + scdDTO.setId(id); + scdDTO.setHeaderId(id); + scdDTO.setHeaderRevision(HEADER_REVISION); + scdDTO.setHeaderVersion(HEADER_VERSION); + scdDTO.setFileName(FILE_NAME); + scdDTO.setWhat("WHAT"); + scdDTO.setWhy("WHY"); + scdDTO.setWho("WHO"); + + return scdDTO; + } + + /*-----------------------------------------------*/ + /* ExtRefDTO */ + /*-----------------------------------------------*/ + public static final String DESC = "DESC"; + public static final String P_DA = "d"; + public static final String P_DO = "FACntRs1.res"; + public static final String P_LN = TLLN0Enum.LLN_0.value(); + public static final String P_SERV_T = "Report"; + public static final String INT_ADDR = "INT_ADDR"; + + public static final String IED_NAME = "IED_NAME"; + public static final String LD_INST= "PIOC"; + public static final String LN_INST= "LN"; + public static final String LN_CLASS= "LN_CLASS"; + public static final String DA_NAME = P_DA; + public static final String DO_NAME = P_DO; + public static final String PREFIX = "PR"; + public static final String SERVICE_TYPE = P_SERV_T; + + public static final String SRC_LD_INST= LD_INST; + public static final String SRC_LN_INST= LN_INST; + public static final String SRC_LN_CLASS= LN_CLASS; + public static final String SRC_PREFIX = PREFIX; + public static final String SRC_CB_NAME = "SRC_CB_NAME"; + + public static TExtRef createExtRef(){ + TExtRef tExtRef = new TExtRef(); + tExtRef.setDesc(DESC); + tExtRef.setPDA(P_DA); + tExtRef.setPDO(P_DO); + tExtRef.getPLN().add(P_LN); + tExtRef.setPServT(TServiceType.fromValue(P_SERV_T)); + tExtRef.setIntAddr(INT_ADDR); + + tExtRef.setIedName(IED_NAME); + tExtRef.setLdInst(LD_INST); + tExtRef.setLnInst(LN_INST); + tExtRef.getLnClass().add(LN_CLASS); + tExtRef.setDaName(DA_NAME); + tExtRef.setDoName(DO_NAME); + tExtRef.setPrefix(PREFIX); + tExtRef.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); + + tExtRef.setSrcLDInst(SRC_LD_INST); + tExtRef.setSrcLNInst(SRC_LN_INST); + tExtRef.getSrcLNClass().add(SRC_LN_CLASS); + tExtRef.setSrcPrefix(SRC_PREFIX); + tExtRef.setSrcCBName(SRC_CB_NAME); + + return tExtRef; + } + public static ExtRefDTO createExtRefDTO(){ + ExtRefDTO tExtRef = new ExtRefDTO(); + tExtRef.setDesc(DESC); + tExtRef.setPDA(P_DA); + tExtRef.setPDO(P_DO); + tExtRef.setPLN(P_LN); + tExtRef.setPServT(TServiceType.fromValue(P_SERV_T)); + tExtRef.setIntAddr(INT_ADDR); + + tExtRef.setIedName(IED_NAME); + tExtRef.setLdInst(LD_INST); + tExtRef.setLnInst(LN_INST); + tExtRef.setLnClass(LN_CLASS); + tExtRef.setDaName(DA_NAME); + tExtRef.setDoName(DO_NAME); + tExtRef.setPrefix(PREFIX); + tExtRef.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); + + tExtRef.setSrcLDInst(SRC_LD_INST); + tExtRef.setSrcLNInst(SRC_LN_INST); + tExtRef.setSrcLNClass(SRC_LN_CLASS); + tExtRef.setSrcPrefix(SRC_PREFIX); + tExtRef.setSrcCBName(SRC_CB_NAME); + + return tExtRef; + } + /*-----------------------------------------------*/ + /* ResumedDataTemplate */ + /*-----------------------------------------------*/ + public static final String CDC = TPredefinedCDCEnum.WYE.value(); + public static final String FC = TFCEnum.CF.value(); + public static ResumedDataTemplate createRTT(){ + ResumedDataTemplate rDTT = new ResumedDataTemplate(); + rDTT.setCdc(TPredefinedCDCEnum.fromValue(CDC)); + rDTT.setFc(TFCEnum.fromValue(FC)); + rDTT.setLnType(LN_TYPE); + rDTT.setLnClass(TLLN0Enum.LLN_0.value()); + rDTT.setDoName(DO_NAME); + rDTT.setDaName(DA_NAME); + + return rDTT; + } + + /*-----------------------------------------------*/ + /* LNodeDTO */ + /*-----------------------------------------------*/ + public static final String LN_TYPE = "LN_TYPE"; + public static LNodeDTO createLNodeDTO(){ + return new LNodeDTO(LN_INST,LN_CLASS,LN_TYPE); + } + /*-----------------------------------------------*/ + /* ConnectedAPDTO */ + /*-----------------------------------------------*/ + public static final String AP_NAME = "AP_NAME"; + public static ConnectedApDTO createCapDTO(boolean byStep){ + if(byStep){ + ConnectedApDTO cap = new ConnectedApDTO(); + cap.setApName(AP_NAME); + cap.setIedName(IED_NAME); + } + return new ConnectedApDTO(IED_NAME,AP_NAME); + } + public static TConnectedAP createCap(){ + + TConnectedAP cap = new TConnectedAP(); + cap.setApName(AP_NAME); + cap.setIedName(IED_NAME); + return cap; + } + /*-----------------------------------------------*/ + /* SubNetworkDTO */ + /*-----------------------------------------------*/ + public static final String SN_NAME = "SN_NAME"; + public static SubNetworkDTO createSnDTO(boolean byStep){ + SubNetworkDTO subNetworkDTO = null; + if(byStep){ + subNetworkDTO = new SubNetworkDTO(); + subNetworkDTO.setName(SN_NAME); + subNetworkDTO.setType("8-MMS"); + } else { + subNetworkDTO = new SubNetworkDTO(SN_NAME, SubNetworkDTO.SubnetworkType.MMS.toString()); + subNetworkDTO.addConnectedAPs(createCapDTO(true)); + } + return subNetworkDTO; + } + + public static TSubNetwork createSn(){ + TSubNetwork subNetwork = new TSubNetwork(); + + subNetwork.setName(SN_NAME); + subNetwork.setType("8-MMS"); + subNetwork.getConnectedAP().add(createCap()); + + return subNetwork; + } + /*-----------------------------------------------*/ + /* LDeviceDTO */ + /*-----------------------------------------------*/ + public static final String LD_NAME = "LDPO"; + public static LDeviceDTO createLdDTO(){ + + LDeviceDTO lDeviceDTO = new LDeviceDTO(); + lDeviceDTO.setLdInst(LD_INST); + lDeviceDTO.setLdName(LD_NAME); + + lDeviceDTO.addLNode(createLNodeDTO()); + + return lDeviceDTO; + } + /*-----------------------------------------------*/ + /* IedDTO */ + /*-----------------------------------------------*/ + + public static IedDTO createIedDTO(){ + + IedDTO iedDTO = new IedDTO(); + iedDTO.setName(IED_NAME); + iedDTO.addLDevice(createLdDTO()); + return iedDTO; + } +} diff --git a/sct-data/src/test/resources/application.yml b/sct-data/src/test/resources/application.yml new file mode 100644 index 000000000..b2e57c5be --- /dev/null +++ b/sct-data/src/test/resources/application.yml @@ -0,0 +1,24 @@ +## YAML Template. +--- +spring: + #profile + profiles: + active: test + jpa: + show-sql: true + database-platform: org.hibernate.dialect.H2Dialect + datasource: + platform: h2 + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 250 + prepStmtCacheSqlLimit: 2048 + url: "jdbc:h2:mem:compas;MODE=ORACLE;DB_CLOSE_ON_EXIT=FALSE" + driver-class-name: org.h2.Driver + hikari: + username: sa + password: + +logging: + level: + root: INFO \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml new file mode 100644 index 000000000..28c4e3bfd --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -0,0 +1,64 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml new file mode 100644 index 000000000..89569eb67 --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -0,0 +1,62 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml new file mode 100644 index 000000000..8dc3681f3 --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -0,0 +1,94 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml new file mode 100644 index 000000000..5a8a228b3 --- /dev/null +++ b/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml @@ -0,0 +1,101 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/pom.xml b/sct-service/pom.xml new file mode 100644 index 000000000..4a63515dc --- /dev/null +++ b/sct-service/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + + + sct-service + SCT SERVICE + + + + org.lfenergy.compas + sct-data + ${project.version} + + + + + \ No newline at end of file diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java new file mode 100644 index 000000000..d9a3a591e --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java @@ -0,0 +1,18 @@ +package org.lfenergy.compas.sct.config; + +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(XSDFileProperties.class) +public class XMLMarshallerConfig { + + @Bean + public MarshallerWrapper marshallerWrapper(XSDFileProperties xsdFileProperties) throws Exception { + MarshallerWrapper.Builder builder = new MarshallerWrapper.Builder(); + builder.withSchemaMap(xsdFileProperties.getPaths()); + return builder.build(); + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java new file mode 100644 index 000000000..2a37b6520 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct.config; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.commons.CommonConstants; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + +@Getter +@Setter +@NoArgsConstructor +@ConfigurationProperties("compas.scl.schema") +public class XSDFileProperties { + + private Map paths; + + @PostConstruct + public void init() { + if (this.paths == null || this.paths.isEmpty()) { + paths = new HashMap<>(); + paths.put(CommonConstants.XML_DEFAULT_NS_PREFIX, CommonConstants.XML_DEFAULT_XSD_PATH); + } + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java new file mode 100644 index 000000000..d9591f624 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java @@ -0,0 +1,50 @@ +package org.lfenergy.compas.sct.service; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.IScd; +import org.lfenergy.compas.sct.repository.AbstractScdSQLCrudRepository; +import org.lfenergy.compas.sct.service.scl.SclManager; + +import java.util.UUID; + +@Setter +@Getter +@Slf4j +public abstract class AbstractSqlScdService , R extends AbstractScdSQLCrudRepository> + implements ISCDService { + + protected R repository; + + public AbstractSqlScdService(R repository){ + this.repository = repository; + } + + @Override + public T findScd(UUID id) throws CompasDataAccessException { + return repository.findById(id) + .orElseThrow(() -> new CompasDataAccessException("Unknown SCD with id '" + id + "'")); + } + + public SCL initiateScl(String hVersion, String hRevision){ + UUID hId = UUID.randomUUID(); + return SclManager.initialize(hId.toString(),hVersion,hRevision); + } + + public T addElement(T scd) throws CompasDataAccessException { + return repository.save(scd); + } + + public T updateElement(T scd) throws CompasDataAccessException{ + return addElement(scd); + } + + public T addHistoryItem(UUID id, String who, String what, String why) throws ScdException, CompasDataAccessException { + T scdObj = findScd(id); + return addHistoryItem(scdObj,who,what, why); + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java new file mode 100644 index 000000000..e7791ed60 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java @@ -0,0 +1,110 @@ +package org.lfenergy.compas.sct.service; + +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.IIedDTO; +import org.lfenergy.compas.sct.model.IScd; +import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.springframework.lang.NonNull; + +import java.util.Set; +import java.util.UUID; + +public interface ISCDService> { + /** + * Find SCD object for given ID + * @param id object identifier + * @return SCD object identified + * @throws CompasDataAccessException Data access exception on error + */ + T findScd(UUID id) throws CompasDataAccessException; + + /** + * Initiate SCD object with a generated header ID (UUID) + * @param filename scd file name + * @param hVersion scd header version + * @param hRevision scd header revision + * @return the initiated scd + * @throws ScdException exception thrown on error + */ + T initiateSCD(@NonNull String filename, @NonNull String hVersion, @NonNull String hRevision) throws ScdException; + + /** + * Add history item to the scd + * @param scdObj scd representation in database + * @param who scd modifier + * @param when scd modification's date + * @param why scd modification's reason + * @return the modified scd + * @throws ScdException exception thrown on error + */ + T addHistoryItem(T scdObj, String who, String when, String why) throws ScdException; + + /** + * Add/rename IED from ICD file to SCD + * This method import the ICD's DataTemplate as well + * @param scdObj SCD object receiving the ICD + * @param iedName iedName ofr the ICD to import + * @param icd Objectified ICD + * @return Scd object with the IED imported + * @throws ScdException exception thrown on error + */ + T addIED(T scdObj, String iedName, SCL icd) throws ScdException; + + /** + * Add/rename IED from ICD file to SCD + * This method import the ICD's DataTemplate as well + * @param scdObj SCD object receiving the ICD + * @param iedName iedName ofr the ICD to import + * @param rawIcd raw ICD content + * @return Scd object with the IED imported + * @throws ScdException exception thrown on error + */ + T addIED(T scdObj, String iedName, byte[] rawIcd) throws ScdException; + + /** + * Extract External Reference signals for given IED, AccessPoint and LDevice. + * @param scdObj SCD object encapsulating the receiver SCD of the ICD + * @param iedName IED name + * @param ldInst the logical device + * @param DTO type parameter + * @return IED generic DTO + * @throws ScdException exception thrown on error + */ + D extractExtRefs(T scdObj, String iedName, String ldInst) throws ScdException; + + /** + * + * @param scdObj + * @param iedName + * @param ldInst + * @param filter + * @param + * @param + * @return + * @throws ScdException + */ + + Set extractExtRefSources(T scdObj, String iedName, + String ldInst, U filter) throws ScdException; + + /** + * + * @param scdObj + * @param + * @return + * @throws ScdException + */ + Set getSubnetwork(T scdObj) throws ScdException; + + /** + * + * @param scdObject + * @param subNetworkDTO + * @return + * @throws ScdException + */ + T addSubnetworks(T scdObject,Set subNetworkDTO) throws ScdException; +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java new file mode 100644 index 000000000..118a71fd3 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java @@ -0,0 +1,218 @@ +package org.lfenergy.compas.sct.service; + +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TLDevice; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.sct.model.IConnectedApDTO; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.IedDTO; +import org.lfenergy.compas.sct.model.dto.LDeviceDTO; +import org.lfenergy.compas.sct.model.dto.LNodeDTO; +import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.lfenergy.compas.sct.repository.SimpleScdRepository; +import org.lfenergy.compas.sct.service.scl.SclCommunicationManager; +import org.lfenergy.compas.sct.service.scl.SclDataTemplateManager; +import org.lfenergy.compas.sct.service.scl.SclHeaderManager; +import org.lfenergy.compas.sct.service.scl.SclIEDManager; +import org.lfenergy.compas.sct.service.scl.SclManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + + +@Slf4j +@Service +public class SimpleSqlScdService extends AbstractSqlScdService{ + + private final MarshallerWrapper marshallerWrapper; + @Autowired + public SimpleSqlScdService(SimpleScdRepository repository, MarshallerWrapper marshallerWrapper) { + super(repository); + this.marshallerWrapper = marshallerWrapper; + } + + @Override + public SimpleScd initiateSCD(@NonNull String filename, @NonNull String hVersion, @NonNull String hRevision) throws ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setFileName(filename); + SCL scd = initiateScl(hVersion,hRevision); + scdObj.setHeaderId(UUID.fromString(scd.getHeader().getId())); + scdObj.setHeaderVersion(hVersion); + scdObj.setHeaderRevision(hRevision); + String rawXml = marshallerWrapper.marshall(scd); + + scdObj.setRawXml(rawXml.getBytes()); + return scdObj; + } + + @Override + public SimpleScd addHistoryItem(SimpleScd scdObj, String who, String what, String why) throws ScdException { + byte[] raw = scdObj.getRawXml(); + SCL scd = marshallerWrapper.unmarshall(raw); + SclHeaderManager sclHeaderManager = new SclHeaderManager(scd); + scd = sclHeaderManager.addHistoryItem(who,what,why); + byte[] rawXml = marshallerWrapper.marshall(scd).getBytes(); + scdObj.setRawXml(rawXml); + return scdObj; + } + + @Override + public SimpleScd addIED(SimpleScd scdObj, String iedName, SCL icd) throws ScdException { + SCL scd = marshallerWrapper.unmarshall(scdObj.getRawXml()); + SclManager sclManager = new SclManager(scd); + sclManager.addIED(icd,iedName); + scdObj.setRawXml(marshallerWrapper.marshall(sclManager.getReceiver()).getBytes()); + return scdObj; + } + + @Override + public SimpleScd addIED(SimpleScd scdObj, String iedName, byte[] rawIcd) throws ScdException { + SCL icd = marshallerWrapper.unmarshall(rawIcd); + return addIED(scdObj,iedName,icd); + } + + @Override + public IedDTO extractExtRefs(SimpleScd scdObj, String iedName, String ldInst) throws ScdException { + SCL receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + + TIED ied = receiver.getIED() + .stream() + .filter(tied -> iedName.equals(tied.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown IED: " + iedName)); + + TLDevice lDevice = SclIEDManager.getIEDLDevice(ied,ldInst) + .orElseThrow(() -> new ScdException("Unknown LDevice " + iedName + "/" + ldInst)); + + IedDTO iedDTO = new IedDTO(); + iedDTO.setName(iedName); + + LDeviceDTO lDeviceDTO = new LDeviceDTO(); + lDeviceDTO.setLdInst(ldInst); + + List ln0ExtRefs = SclIEDManager.extractLN0ExtRefs(lDevice, null); + LNodeDTO lN0DTO = new LNodeDTO(); + lN0DTO.setLNodeClass(TLLN0Enum.LLN_0.value()); + ln0ExtRefs.forEach((TExtRef tExtRef) -> { + ExtRefDTO extRefDTO = new ExtRefDTO(tExtRef); + lN0DTO.addExtRef(extRefDTO); + }); + lDeviceDTO.addLNode(lN0DTO); + iedDTO.addLDevice(lDeviceDTO); + return iedDTO; + } + + @Override + public Set extractExtRefSources(SimpleScd scdObj, String iedName, String ldInst, IExtRefDTO extRef) throws ScdException { + SCL receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + sclIEDManager.getExtRef(iedName,ldInst,extRef); + + List ieds = receiver.getIED(); + Set iedDTOs = new HashSet<>(); + for(TIED tied : ieds){ + IedDTO iedDTO = new IedDTO(); + iedDTO.setName(tied.getName()); + List accessPoints = tied.getAccessPoint(); + for(TAccessPoint accessPoint : accessPoints){ + if(accessPoint.getServer() == null) continue; + List deviceList = accessPoint.getServer().getLDevice(); + for(TLDevice tlDevice : deviceList) { + Set lNodeDTOs = getExtRefSources(tlDevice,extRef, receiver.getDataTypeTemplates()); + LDeviceDTO lDeviceDTO = new LDeviceDTO(); + lDeviceDTO.setLdName(tlDevice.getLdName()); + lDeviceDTO.setLdInst(tlDevice.getInst()); + if(!lNodeDTOs.isEmpty()) { + lDeviceDTO.addAll(lNodeDTOs); + iedDTO.addLDevice(lDeviceDTO); + } + } + } + if(!iedDTO.getLDevices().isEmpty()) { + iedDTOs.add(iedDTO); + } + } + return iedDTOs; + } + + @Override + public Set getSubnetwork(SimpleScd scdObj) throws ScdException { + + Set subNetworks = new HashSet<>(); + SCL scl = marshallerWrapper.unmarshall(scdObj.getRawXml()); + if(scl.getCommunication() == null || scl.getCommunication().getSubNetwork().isEmpty()){ + return subNetworks; + } + List tSubNetworks = scl.getCommunication().getSubNetwork(); + tSubNetworks.forEach((TSubNetwork subNetwork) -> { + SubNetworkDTO subNetworkDTO = new SubNetworkDTO(subNetwork); + + subNetworks.add(subNetworkDTO); + }); + + return subNetworks; + } + + @Override + public SimpleScd addSubnetworks(SimpleScd scdObject, Set subNetworks) throws ScdException { + SCL receiver = marshallerWrapper.unmarshall(scdObject.getRawXml()); + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + for(ISubNetworkDTO subNetworkDTO : subNetworks) { + String snName = subNetworkDTO.getName(); + String snType = subNetworkDTO.getType(); + for (IConnectedApDTO accessPoint : subNetworkDTO.getConnectedAPs()) { + receiver = sclCommunicationManager.addSubnetwork(snName, snType, + accessPoint.getIedName(), accessPoint.getApName()); + } + } + scdObject.setRawXml(marshallerWrapper.marshall(receiver).getBytes()); + return scdObject; + } + + /*------------------------------------------------------*/ + /* Handy methods */ + /*------------------------------------------------------*/ + public Set getExtRefSources(TLDevice tlDevice, IExtRefDTO extRef, TDataTypeTemplates dtt) throws ScdException { + List lns = tlDevice.getLN(); + Set lNodeDTOs = new HashSet<>(); + for(TLN ln : lns){ + if(extRef.getPLN() != null && !ln.getLnClass().contains(extRef.getPLN())) continue; + LNodeDTO lNodeDTO = new LNodeDTO(); + lNodeDTO.setLNodeType(ln.getLnType()); + if(ln.getLnClass().isEmpty()){ + throw new ScdException("lnClass is mandatory"); + } + lNodeDTO.setLNodeClass(ln.getLnClass().get(0)); + lNodeDTO.setInst(ln.getInst()); + ResumedDataTemplate resumedDataTemplate = null; + try { + resumedDataTemplate = SclDataTemplateManager.getResumedDTT(ln.getLnType(), extRef, dtt); + } catch (ScdException e){ + // ln is not a source + } + if(resumedDataTemplate != null) { + lNodeDTO.addResumedDataTemplate(resumedDataTemplate); + lNodeDTOs.add(lNodeDTO); + } + } + return lNodeDTOs; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java new file mode 100644 index 000000000..a607be355 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java @@ -0,0 +1,75 @@ +package org.lfenergy.compas.sct.service.scl; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TCommunication; +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TSubNetwork; + +@Setter +@Getter +@NoArgsConstructor +public class SclCommunicationManager { + protected SCL receiver; + + public SclCommunicationManager(SCL receiver) { + this.receiver = receiver; + } + + public SCL addSubnetwork(String snName, String snType, String iedName, String apName) throws ScdException { + + TIED ied = receiver.getIED().stream() + .filter(tied -> tied.getName().equals(iedName)) + .findAny().orElseThrow(() -> new ScdException("Unknown IED:" + iedName)); + + boolean isFound = ied.getAccessPoint() + .stream() + .anyMatch(tAccessPoint -> tAccessPoint.getName().equals(apName)); + if(!isFound){ + throw new ScdException("Unknown AccessPoint :" + apName + " in IED :" + iedName); + } + + TCommunication communication = receiver.getCommunication(); + if(communication == null){ + communication = new TCommunication(); + receiver.setCommunication(communication); + } + addSubnetwork(communication,snName,snType,iedName,apName); + + return receiver; + } + + public TCommunication addSubnetwork(TCommunication communication, String snName, String snType,String iedName, String apName){ + + TSubNetwork subNetwork = communication.getSubNetwork() + .stream() + .filter(tSubNetwork -> tSubNetwork.getName().equals(snName)) + .findFirst().orElse(null); + if(subNetwork == null){ // create new subnetwork + subNetwork = new TSubNetwork(); + subNetwork.setName(snName); + subNetwork.setType(snType); + communication.getSubNetwork().add(subNetwork); + } + addConnectedAP(subNetwork,iedName,apName); + return communication; + } + + public TSubNetwork addConnectedAP(TSubNetwork subNetwork, String iedName, String apName){ + boolean isFound = subNetwork.getConnectedAP().stream() + .anyMatch(tConnectedAP -> + tConnectedAP.getApName().equals(apName) && tConnectedAP.getIedName().equals(iedName)); + + if(!isFound){ + TConnectedAP tConnectedAP = new TConnectedAP(); + tConnectedAP.setApName(apName); + tConnectedAP.setIedName(iedName); + subNetwork.getConnectedAP().add(tConnectedAP); + } + return subNetwork; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java new file mode 100644 index 000000000..eeccd178d --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java @@ -0,0 +1,665 @@ +package org.lfenergy.compas.sct.service.scl; + + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TBDA; +import org.lfenergy.compas.scl.TDA; +import org.lfenergy.compas.scl.TDAType; +import org.lfenergy.compas.scl.TDO; +import org.lfenergy.compas.scl.TDOType; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TEnumType; +import org.lfenergy.compas.scl.TEnumVal; +import org.lfenergy.compas.scl.TIDNaming; +import org.lfenergy.compas.scl.TLNodeType; +import org.lfenergy.compas.scl.TPredefinedBasicTypeEnum; +import org.lfenergy.compas.scl.TSDO; +import org.lfenergy.compas.scl.TUnNaming; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Getter +@Slf4j +public class SclDataTemplateManager { + + private final Map enumTypeToAdd = new HashMap<>(); + private final Map daTypeToAdd = new HashMap<>(); + private final Map doTypeToAdd = new HashMap<>(); + private final Map lNodeTypeToAdd = new HashMap<>(); + private final Map lNodeTypeTracker = new HashMap<>(); + + + public SCL importDTT(SCL provider, SCL receiver, String iedName){ + + computeImportableDTTFromEnumType(provider,receiver,iedName); + computeImportableDTTFromDAType(provider,receiver,iedName); + computeImportableDTTFromDOType(provider,receiver,iedName); + computeImportableDTTFromLNodeType(provider,receiver,iedName); + + if(receiver.getDataTypeTemplates() == null ){ + receiver.setDataTypeTemplates(new TDataTypeTemplates()); + } + //add importable enum + enumTypeToAdd.values().forEach(tEnumType -> receiver.getDataTypeTemplates().getEnumType().add(tEnumType)); + + //remove duplicate of enumTypeToAdd in daTypeToAdd + + //add importable DAType + daTypeToAdd.values().forEach(tdaType -> receiver.getDataTypeTemplates().getDAType().add(tdaType)); + //add importable DOType + doTypeToAdd.values().forEach(tdoType -> receiver.getDataTypeTemplates().getDOType().add(tdoType)); + //add importable LNodeType + lNodeTypeToAdd.values().forEach(tlNodeType -> receiver.getDataTypeTemplates().getLNodeType().add(tlNodeType)); + + return receiver; + } + + public Boolean isSameID(T rcv, T prd){ + return rcv.getId().equals(prd.getId()); + } + + public boolean isIdentical(TEnumType rcvEnumType,TEnumType prdEnumType, boolean idCheck){ + if(idCheck && !isSameID(rcvEnumType,prdEnumType)){ + return false; + } + List rcvEnumValList = rcvEnumType.getEnumVal(); + List prdEnumValList = prdEnumType.getEnumVal(); + if(rcvEnumValList.size() != prdEnumValList.size()) { + return false; + } + + for(TEnumVal prdEnumVal : prdEnumValList){ + boolean isIn = rcvEnumValList + .stream() + .anyMatch( + rcvEnumVal -> rcvEnumVal.getValue().equals(prdEnumVal.getValue()) && + rcvEnumVal.getOrd() == prdEnumVal.getOrd() + ); + if(!isIn) { + return false; + } + } + return true; + } + + public List findDATypesWhichBdaContainsEnumTypeId(SCL provider,String enumTypeId){ + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List daTypeList = provider.getDataTypeTemplates().getDAType(); + List result = new ArrayList<>(); + for(TDAType tdaType: daTypeList){ + boolean containsEnum = tdaType.getBDA() + .stream() + .anyMatch( + bda -> TPredefinedBasicTypeEnum.ENUM.equals(bda.getBType()) && + enumTypeId.equals(bda.getType()) + ); + if(containsEnum) { + result.add(tdaType); + } + } + return result; + } + + public List findDOTypesWhichDAContainsEnumTypeId(SCL provider,String enumTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List doTypeList = provider.getDataTypeTemplates().getDOType(); + List result = new ArrayList<>(); + for(TDOType tdoType: doTypeList){ + List tdaList = new ArrayList<>(); + for( TUnNaming unNaming : tdoType.getSDOOrDA()){ + if(unNaming instanceof TDA) { + tdaList.add((TDA)unNaming); + } + } + boolean containsEnum = tdaList.stream() + .anyMatch( + tda -> tda.getBType().equals(TPredefinedBasicTypeEnum.ENUM) && + tda.getType().equals(enumTypeId) + ); + if(containsEnum) { + result.add(tdoType); + } + } + return result; + } + + public boolean isIdentical(TDAType rcvDAType,TDAType prdDAType, boolean idCheck){ + if(idCheck && !isSameID(rcvDAType,prdDAType)){ + return false; + } + List rcvBdaList = rcvDAType.getBDA(); + List prdBdaList = prdDAType.getBDA(); + + if(rcvBdaList.size() != prdBdaList.size()) { + return false; + } + + int listSz = rcvBdaList.size(); + for(int i = 0; i < listSz; i++){ + if(!rcvBdaList.get(i).getBType().equals(prdBdaList.get(i).getBType()) || + !rcvBdaList.get(i).getName().equals(prdBdaList.get(i).getName())) { + return false; + } + + if(rcvBdaList.get(i).getBType().equals(TPredefinedBasicTypeEnum.ENUM) && + !rcvBdaList.get(i).getType().equals(prdBdaList.get(i).getType())) { + return false; + } + } + return true; + } + + public List findDATypesFromStructBdaWithDATypeId(SCL provider,String daTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List daTypeList = provider.getDataTypeTemplates().getDAType(); + List result = new ArrayList<>(); + for(TDAType tdaType: daTypeList){ + boolean containsEnum = tdaType.getBDA().stream() + .anyMatch( + bda -> bda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT) && + bda.getType().equals(daTypeId) + ); + if(containsEnum) { + result.add(tdaType); + } + } + return result; + } + + public List findDOTypesWhichDAContainsStructWithDATypeId(SCL provider,String daTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List doTypeList = provider.getDataTypeTemplates().getDOType(); + List result = new ArrayList<>(); + for(TDOType tdoType: doTypeList){ + List daList = new ArrayList<>(); + for( TUnNaming unNaming : tdoType.getSDOOrDA()){ + if(unNaming instanceof TDA) { + daList.add((TDA)unNaming); + } + } + boolean containsId = daList.stream() + .anyMatch( + tda -> TPredefinedBasicTypeEnum.STRUCT.equals(tda.getBType()) && + tda.getType().equals(daTypeId) + ); + if(containsId) { + result.add(tdoType); + } + } + return result; + } + + public static List retrieveSdoOrDO(List sdoOrDoList, Class clz){ + List sdoList = new ArrayList<>(); + for( TUnNaming unNaming : sdoOrDoList){ + if(unNaming.getClass().getName().equalsIgnoreCase(clz.getName())) { + sdoList.add((T)unNaming); + } + } + return sdoList; + } + + public boolean isIdentical(TDOType rcvDOType,TDOType prdDOType, boolean idCheck){ + if(idCheck && !isSameID(rcvDOType,prdDOType)) { + return false; + } + + List rcvTdaList = retrieveSdoOrDO(rcvDOType.getSDOOrDA(),TDA.class); + List prdTdaList = retrieveSdoOrDO(prdDOType.getSDOOrDA(),TDA.class); + List rcvSdoList = retrieveSdoOrDO(rcvDOType.getSDOOrDA(),TSDO.class); + List prdSdoList = retrieveSdoOrDO(prdDOType.getSDOOrDA(),TSDO.class); + + if(rcvTdaList.size() != prdTdaList.size() || rcvSdoList.size() != prdSdoList.size()) { + return false; + } + + // SDO + for(int i = 0; i < rcvSdoList.size(); i++){ + if(!rcvSdoList.get(i).getName().equals(prdSdoList.get(i).getName()) || + !rcvSdoList.get(i).getType().equals(prdSdoList.get(i).getType())) { + return false; + } + } + + // TDO + for(int i = 0; i < rcvTdaList.size(); i++){ + if(!rcvTdaList.get(i).getName().equals(prdTdaList.get(i).getName()) || + !rcvTdaList.get(i).getBType().equals(prdTdaList.get(i).getBType())) { + return false; + } + + if(rcvTdaList.get(i).getBType().equals(TPredefinedBasicTypeEnum.ENUM) && + !rcvTdaList.get(i).getType().equals(prdTdaList.get(i).getType())) { + return false; + } + } + + return true; + } + + public List findDOTypesFromSDOWithDOTypeId(SCL provider,String doTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List doTypeList = provider.getDataTypeTemplates().getDOType(); + List result = new ArrayList<>(); + for(TDOType tdoType: doTypeList){ + List sdoList = new ArrayList<>(); + for( TUnNaming unNaming : tdoType.getSDOOrDA()){ + if(unNaming.getClass() == TSDO.class) { + sdoList.add((TSDO)unNaming); + } + } + boolean containsId = sdoList.stream() + .anyMatch(sdo -> sdo.getType().equals(doTypeId)); + if(containsId) { + result.add(tdoType); + } + } + return result; + } + + public boolean isIdentical(TLNodeType rcvLNodeType, TLNodeType providerLNodeType, boolean idCheck) { + + if(idCheck && !isSameID(rcvLNodeType,providerLNodeType)) { + return false; + } + + List rcvTdoList = rcvLNodeType.getDO(); + List prdTdoList = providerLNodeType.getDO(); + if(rcvTdoList.size() != prdTdoList.size()) { + return false; + } + + for(TDO prdTdo : prdTdoList){ + boolean isIn = rcvLNodeType.getDO().stream() + .anyMatch(rcvTdo -> rcvTdo.getType().equals(prdTdo.getType()) + && rcvTdo.getName().equals(prdTdo.getName())); + if(!isIn) { + return false; + } + } + return true; + } + + public List findLNodeTypesFromDoWithDoTypeId(SCL provider,String doTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List lNodeTypes = provider.getDataTypeTemplates().getLNodeType(); + + List result = new ArrayList<>(); + for(TLNodeType lNodeType: lNodeTypes){ + + boolean containsId = lNodeType.getDO().stream() + .anyMatch(tdo -> tdo.getType().equals(doTypeId)); + if(containsId) { + result.add(lNodeType); + } + } + return result; + } + + public String generateDttId(String iedName,String dttId){ + final int MAX_LENGTH = 255; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(iedName).append("_").append(dttId); + String str = stringBuilder.toString(); + return str.length() <= MAX_LENGTH ? str : str.substring(0,MAX_LENGTH); + } + + public void computeImportableDTTFromEnumType(SCL provider, SCL receiver, String iedName){ + + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdEnumTypes = provider.getDataTypeTemplates().getEnumType(); + + List rcvEnumTypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvEnumTypes = receiver.getDataTypeTemplates().getEnumType(); + } + + //import EnumType + for(TEnumType prdEnumType : prdEnumTypes){ + //search prdEnumType in rcvEnumTypes + Optional opRcvEnumType = rcvEnumTypes + .stream() + .filter(enumType -> isSameID(enumType,prdEnumType)).findFirst(); + // same ID and same content + if(opRcvEnumType.isPresent() && isIdentical(opRcvEnumType.get(),prdEnumType,false)) { + continue; + } + + // not same ID or not same content + if (opRcvEnumType.isPresent() && isSameID(opRcvEnumType.get(),prdEnumType) ) { // same id and not same content + + List daTypeList = findDATypesWhichBdaContainsEnumTypeId(provider,prdEnumType.getId()); + List doTypeList = findDOTypesWhichDAContainsEnumTypeId(provider,prdEnumType.getId()); + // rename enumType Id + String newId = generateDttId(iedName,prdEnumType.getId()); + // escalate + daTypeList.forEach( + tdaType -> renameRef(tdaType,TPredefinedBasicTypeEnum.ENUM,prdEnumType.getId(),newId)); + doTypeList.forEach( + tdoType -> renameRef(tdoType,TPredefinedBasicTypeEnum.ENUM,prdEnumType.getId(),newId)); + enumTypeToAdd.remove(prdEnumType.getId()); // remove track on old ID if necessary + prdEnumType.setId(newId); + enumTypeToAdd.put(prdEnumType.getId(),prdEnumType); + } + enumTypeToAdd.put(prdEnumType.getId(),prdEnumType); + } + } + + + public void computeImportableDTTFromDAType(SCL provider,SCL receiver, String iedName){ + + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdDATypes = provider.getDataTypeTemplates().getDAType(); + + List rcvDATypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvDATypes = receiver.getDataTypeTemplates().getDAType(); + } + + for(TDAType prdDAType : prdDATypes) { + + //search prdEnumType in rcvEnumTypes + Optional opRcvDAType = rcvDATypes + .stream() + .filter(daType -> isSameID(daType,prdDAType)) + .findFirst(); + // same ID and same content + if(opRcvDAType.isPresent() && isIdentical(opRcvDAType.get(),prdDAType,false)) { + continue; + } + + // not same ID or not same content + if (opRcvDAType.isPresent() && isSameID(opRcvDAType.get(),prdDAType) ) { + + List daTypeList = findDATypesFromStructBdaWithDATypeId(provider,prdDAType.getId()); + List doTypeList = findDOTypesWhichDAContainsStructWithDATypeId(provider,prdDAType.getId()); + + // rename TDAType Id + String newId = generateDttId(iedName,prdDAType.getId()); + // escalate + daTypeList.forEach( + tdaType -> renameRef(tdaType,TPredefinedBasicTypeEnum.STRUCT,prdDAType.getId(),newId)); + doTypeList.forEach( + tdoType -> renameRef(tdoType,TPredefinedBasicTypeEnum.STRUCT,prdDAType.getId(),newId)); + + daTypeToAdd.remove(prdDAType.getId()); // remove track on old ID if necessary + prdDAType.setId(newId); + } + daTypeToAdd.put(prdDAType.getId(),prdDAType); + } + } + + public void computeImportableDTTFromDOType(SCL provider,SCL receiver, String iedName){ + + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdDOTypes = provider.getDataTypeTemplates().getDOType(); + + List rcvDOTypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvDOTypes = receiver.getDataTypeTemplates().getDOType(); + } + //Merge DOType + for(TDOType prdDOType : prdDOTypes) { + + //search prdEnumType in rcvEnumTypes + Optional opRcvDOType = rcvDOTypes + .stream() + .filter(daType -> isSameID(daType,prdDOType)) + .findFirst(); + // same ID and same content + if(opRcvDOType.isPresent() && isIdentical(opRcvDOType.get(),prdDOType,false)) { + continue; + } + // not same ID or not same content + if (opRcvDOType.isPresent() && isSameID(opRcvDOType.get(),prdDOType) ) { + + List doTypeList = findDOTypesFromSDOWithDOTypeId(provider,prdDOType.getId()); + List lNodeTypeList = findLNodeTypesFromDoWithDoTypeId(provider,prdDOType.getId()); + // rename TDAType Id + String newId = generateDttId(iedName,prdDOType.getId()); + // escalate + doTypeList.forEach(tdoType -> renameRef(tdoType,prdDOType.getId(),newId)); + lNodeTypeList.forEach(tlNodeType -> renameRef(tlNodeType,prdDOType.getId(),newId)); + + daTypeToAdd.remove(prdDOType.getId()); // remove track on old ID if necessary + + prdDOType.setId(newId); + } + doTypeToAdd.put(prdDOType.getId(),prdDOType); + } + } + + public void computeImportableDTTFromLNodeType(SCL provider, SCL receiver,String iedName){ + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdLNodeTypes = provider.getDataTypeTemplates().getLNodeType(); + + List rcvLNodeTypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvLNodeTypes = receiver.getDataTypeTemplates().getLNodeType(); + } + //Merge DAType + + for(TLNodeType prdLNodeType : prdLNodeTypes) { + //search prdEnumType in rcvEnumTypes + Optional opRcvLNodeType = rcvLNodeTypes + .stream() + .filter(daType -> isSameID(daType,prdLNodeType)) + .findFirst(); + // same ID and same content + if(opRcvLNodeType.isPresent() && isIdentical(opRcvLNodeType.get(),prdLNodeType,false)) { + continue; + } + + if (opRcvLNodeType.isPresent() && isSameID(opRcvLNodeType.get(),prdLNodeType) ) { + // rename TDAType Id + String newId = generateDttId(iedName,prdLNodeType.getId()); + lNodeTypeToAdd.remove(prdLNodeType.getId()); // remove track on old ID if necessary + lNodeTypeTracker.put(prdLNodeType.getId(),newId); + prdLNodeType.setId(newId); + } + lNodeTypeToAdd.put(prdLNodeType.getId(),prdLNodeType); + } + } + + public void renameRef(TDOType tdoType, String id, String newId) { + List sdoList = retrieveSdoOrDO(tdoType.getSDOOrDA(),TSDO.class); + Optional opSdo = sdoList.stream() + .filter(sdo -> sdo.getType().equals(id)) + .findFirst(); + if(opSdo.isPresent()){ + opSdo.get().setType(newId); + } + } + + public void renameRef(TLNodeType tlNode, String id, String newId) { + List doList = tlNode.getDO(); + Optional opDo = doList.stream() + .filter(tdo -> tdo.getType().equals(id)) + .findFirst(); + if(opDo.isPresent()){ + opDo.get().setType(newId); + } + } + + + public void renameRef(TDAType tdaType, TPredefinedBasicTypeEnum anEnum, String id, String newId) { + List bdaList = tdaType.getBDA(); + Optional opBda = bdaList.stream() + .filter(bda -> bda.getBType().equals(anEnum) && bda.getType().equals(id)) + .findFirst(); + if(opBda.isPresent()){ + opBda.get().setType(newId); + } + } + + public void renameRef(TDOType tdoType, TPredefinedBasicTypeEnum anEnum, String id, String newId) { + List tdaList = retrieveSdoOrDO(tdoType.getSDOOrDA(),TDA.class); + Optional opDa = tdaList.stream() + .filter(tda -> tda.getBType().equals(anEnum) && tda.getType().equals(id)) + .findFirst(); + if(opDa.isPresent()){ + opDa.get().setType(newId); + } + } + + public Map getEnumTypeToAdd() { + return Collections.unmodifiableMap(enumTypeToAdd); + } + + public Map getDaTypeToAdd() { + return Collections.unmodifiableMap(daTypeToAdd); + } + + public Map getDoTypeToAdd() { + return Collections.unmodifiableMap(doTypeToAdd); + } + + public Map getLNodeTypeToAdd() { + return Collections.unmodifiableMap(lNodeTypeToAdd); + } + + public Map getLNodeTypeTracker() { + return Collections.unmodifiableMap(lNodeTypeTracker); + } + + + public static ResumedDataTemplate getResumedDTT(String lnType, IExtRefDTO extRef, + TDataTypeTemplates dtt) throws ScdException { + ResumedDataTemplate resumedDataTemplate = new ResumedDataTemplate(); + TLNodeType nodeType = dtt.getLNodeType() + .stream() + .filter(tlNodeType -> lnType.equals(tlNodeType.getId())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown LNodeType:" + lnType)); + + resumedDataTemplate.setLnType(nodeType.getId()); + if(nodeType.getLnClass().isEmpty()){ + log.error("Mandatory lnClass is missing in DTT. This should not happen SCD DTT must be correct"); + throw new IllegalArgumentException("lnClass is mandatory for LNodeType in DataTemplate:" + lnType); + } + resumedDataTemplate.setLnType(nodeType.getId()); + resumedDataTemplate.setLnClass(nodeType.getLnClass().get(0)); + if(extRef.getPDO() == null) { + return resumedDataTemplate; + } + + String[] sp = extRef.getPDO().split("\\."); + String extDoName = sp[0]; + String extSdoName1 = sp.length > 1 ? sp[1] : null; + String extSdoName2 = sp.length > 2 ? sp[2] : null; + + String doTypeId = nodeType.getDO() + .stream() + .filter(tdo -> extDoName.equals(tdo.getName())) + .map(TDO::getType) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown doName :" + extRef.getPDO())); + + String finalDoTypeId = doTypeId; + TDOType tdoType = dtt.getDOType() + .stream() + .filter(doType -> doType.getId().equals(finalDoTypeId)) + .findFirst() + .orElseThrow(() -> new ScdException("No referenced for doName :" + extRef.getPDO())); + + resumedDataTemplate.setDoName(extDoName); + if(extSdoName1 != null){ + List sdos = SclDataTemplateManager.retrieveSdoOrDO(tdoType.getSDOOrDA(), TSDO.class); + String sdoTypeId = sdos.stream() + .filter(tsdo -> extSdoName1.equals(tsdo.getName())) + .map(TSDO::getType) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown doName.sdoName :" + extDoName + "." + extSdoName1)); + + tdoType = dtt.getDOType() + .stream() + .filter(doType -> doType.getId().equals(sdoTypeId)) + .findFirst() + .orElseThrow(() -> new ScdException("No referenced doName.sdoName :" + extDoName + "." + extSdoName1)); + + resumedDataTemplate.setDoName(extDoName + "." + extSdoName1); + } + resumedDataTemplate.setCdc(tdoType.getCdc()); + + + if(extRef.getPDA() == null){ + return resumedDataTemplate; + } + + sp = extRef.getPDA().split("\\."); + String extDaName = sp[0]; + String extBdaName1 = sp.length > 1 ? sp[1] : null; + String extBdaName2 = sp.length > 2 ? sp[2] : null; + + List das = SclDataTemplateManager.retrieveSdoOrDO(tdoType.getSDOOrDA(), TDA.class); + TDA da = das.stream() + .filter(tda ->extDaName.equals(tda.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown referenced daName :" + extDaName)); + + resumedDataTemplate.setDaName(extDaName); + resumedDataTemplate.setFc(da.getFc()); + if(TPredefinedBasicTypeEnum.STRUCT.equals(da.getBType()) && extBdaName1 != null){ + String daTypeId = da.getType(); + TDAType tdaType = dtt.getDAType() + .stream() + .filter(dat -> daTypeId.equals(dat.getId()) ) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown referenced daName.bdaName :" + extDaName + "." + extBdaName1)); + + TBDA bda = tdaType.getBDA() + .stream() + .filter(tbda -> extBdaName1.equals(tbda.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown daName.bdaName :" + extDaName + "." + extBdaName1)); + resumedDataTemplate.setDaName(extDaName + "." + extBdaName1); + } + + return resumedDataTemplate; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java new file mode 100644 index 000000000..f3c2f1bc6 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java @@ -0,0 +1,60 @@ +package org.lfenergy.compas.sct.service.scl; + +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THeader; +import org.lfenergy.compas.scl.THitem; +import org.springframework.lang.NonNull; +import org.springframework.util.Assert; + +import java.util.Date; + +public class SclHeaderManager { + + public static final String TOOL_ID = "COMPAS"; + + private SCL receiver; + + public SclHeaderManager(SCL receiver) { + this.receiver = receiver; + } + + public SCL addHeader(@NonNull String hId, @NonNull String hVersion, @NonNull String hRevision) throws ScdException { + if(receiver.getHeader() != null){ + throw new ScdException("SCL already contains header"); + } + + THeader tHeader = new THeader(); + tHeader.setRevision(hRevision); + tHeader.setVersion(hVersion); + tHeader.setId(hId); + tHeader.setToolID(TOOL_ID); + receiver.setHeader(tHeader); + + return receiver; + } + + public SCL addHistoryItem(String who, String what, String why){ + + THitem tHitem = new THitem(); + tHitem.setRevision(receiver.getHeader().getRevision()); + tHitem.setVersion(receiver.getHeader().getVersion()); + tHitem.setWho(who); + tHitem.setWhat(what); + tHitem.setWhen((new Date()).toString()); + tHitem.setWhy(why); + + THeader tHeader = receiver.getHeader(); + Assert.notNull(tHeader, "Stored SCD must have Header tag"); + Assert.notNull(tHeader.getId(), "Stored SCD Header must have a unique ID"); + + THeader.History history = tHeader.getHistory(); + if(history == null) { + history = new THeader.History(); + tHeader.setHistory(history); + } + history.getHitem().add(tHitem); + + return receiver; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java new file mode 100644 index 000000000..fe683d564 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java @@ -0,0 +1,221 @@ +package org.lfenergy.compas.sct.service.scl; + + +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.LN0; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TAnyLN; +import org.lfenergy.compas.scl.TDataSet; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TGSEControl; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TLDevice; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.scl.TLN0; +import org.lfenergy.compas.scl.TReportControl; +import org.lfenergy.compas.scl.TSampledValueControl; +import org.lfenergy.compas.scl.TServer; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public class SclIEDManager { + + private SCL receiver; + + public SclIEDManager(SCL receiver) { + this.receiver = receiver; + } + + public SCL addIed(SCL iedProvider, String iedName) throws ScdException { + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + receiver = sclDataTemplateManager.importDTT(iedProvider,receiver,iedName); + Map lNodeTypeTracker = sclDataTemplateManager.getLNodeTypeTracker(); + receiver = addIed(iedProvider,iedName,lNodeTypeTracker); + + return receiver; + } + + public SCL addIed(SCL iedProvider, String iedName, Map lNodeTypeTracker) throws ScdException { + if(iedProvider.getIED().isEmpty()) return receiver; + TIED tied = iedProvider.getIED().get(0); + return addIed(tied,iedName,lNodeTypeTracker); + } + + public SCL addIed(TIED providerIED,String iedName,Map lNodeTypeTracker) throws ScdException{ + + if(receiver.getIED().stream().anyMatch(tied -> tied.getName().equals(iedName))){ + throw new ScdException("SCL file already contains IED: " + iedName); + } + if(receiver.getDataTypeTemplates() == null){ + throw new ScdException("There is no DataTypeTemplates in the SCD file"); + } + + Set receiverLNodeTypeIds = receiver.getDataTypeTemplates().getLNodeType() + .stream() + .map(tlNodeType -> tlNodeType.getId()) + .collect(Collectors.toSet()); + + if(receiverLNodeTypeIds.isEmpty()){ + throw new ScdException("There is no LNodeType in the SCD file's DataTypeTemplates"); + } + + providerIED.setName(iedName); + // LDevices + String newLdName; + List accessPoints = providerIED.getAccessPoint(); + for(TAccessPoint accessPoint : accessPoints){ + TServer server = accessPoint.getServer(); + if(server == null) continue; + List lDevices = server.getLDevice(); + for(TLDevice lDevice : lDevices){ + newLdName = iedName + lDevice.getInst(); + if(newLdName.length() > 33){ + throw new ScdException(newLdName + "(IED.name + LDevice.inst) has more than 33 characters"); + } + // renaming ldName + lDevice.setLdName(newLdName); + // + TLN0 tln0 = lDevice.getLN0(); + updateLN(tln0,receiverLNodeTypeIds,lNodeTypeTracker); + + List lns = lDevice.getLN(); + for(TLN tln : lns){ + updateLN(tln,receiverLNodeTypeIds,lNodeTypeTracker); + } + } + } + + receiver.getIED().add(providerIED); + return receiver; + } + + public TAnyLN updateLN(@NonNull TAnyLN ln, @NonNull Set receiverLNodeTypeIds, + @NonNull Map lNodeTypeTracker) throws ScdException { + if( (!receiverLNodeTypeIds.contains(ln.getLnType()) && !lNodeTypeTracker.containsKey(ln.getLnType())) || + (lNodeTypeTracker.containsKey(ln.getLnType())) && + !receiverLNodeTypeIds.contains(lNodeTypeTracker.get(ln.getLnType()))){ + String lnInst = ln.getClass() == TLN.class ? ((TLN)ln).getInst() : TLLN0Enum.LLN_0.value(); + String errMsg = String.format("%s id (%s) missing in DataTypeTemplates",lnInst,ln.getLnType()); + throw new ScdException(errMsg); + } + + if(lNodeTypeTracker.containsKey(ln.getLnType())){ + ln.setLnType(lNodeTypeTracker.get(ln.getLnType())); + } + + return ln; + } + + + public TExtRef getExtRef(String iedName, String ldInst, IExtRefDTO filter) throws ScdException { + TIED ied = receiver.getIED() + .stream() + .filter(tied -> iedName.equals(tied.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown IED :" + iedName)); + + TLDevice ld = SclIEDManager.getIEDLDevice(ied,ldInst) + .orElseThrow(() -> new ScdException("Unknown LDevice " + iedName + "/" + ldInst)); + + List extRefs = extractLN0ExtRefs(ld,filter); + + if(extRefs.size() > 1){ + String msg = String.format("Multiple ExtRef[pDo(%s), intAddr(%s), desc(%s)] for [%s,%s]", + filter.getPDO(),filter.getIntAddr(), filter.getDesc(), iedName,ldInst); + throw new ScdException(msg); + } + + if(extRefs.isEmpty()){ + String msg = String.format("No ExtRef[pDo(%s), intAddr(%s), desc(%s)] for [%s,%s]", + filter.getPDO(),filter.getIntAddr(), filter.getDesc(), iedName,ldInst); + throw new ScdException(msg); + } + return extRefs.get(0); + } + + public static List getIEDLDevice(TIED tied){ + return tied.getAccessPoint() + .stream() + .filter(tAccessPoint -> tAccessPoint.getServer() != null) + .map(tAccessPoint -> tAccessPoint.getServer().getLDevice()) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + + public static Optional getLDeviceLN(TLDevice lDevice, String lnClass, @Nullable String lnInst){ + return lDevice.getLN() + .stream() + .filter(tln -> tln.getLnClass().contains(lnClass) && (lnInst == null || lnInst.equals(tln.getInst()))) + .findFirst(); + } + + public static Optional getIEDLDevice(TIED tied, String ldInst){ + return tied.getAccessPoint() + .stream() + .filter(tAccessPoint -> tAccessPoint.getServer() != null) + .map(tAccessPoint -> tAccessPoint.getServer().getLDevice()) + .flatMap(Collection::stream) + .filter(tlDevice -> ldInst.equals(tlDevice.getInst())) + .findFirst(); + } + + public static List extractLN0ExtRefs(TLDevice tlDevice, IExtRefDTO filter) { + if(tlDevice.getLN0().getInputs() == null) return new ArrayList<>(); + + if(filter == null) { + return tlDevice.getLN0().getInputs().getExtRef(); + } else { + return tlDevice.getLN0().getInputs().getExtRef() + .stream() + .filter(tExtRef -> { + + if (filter.getDesc() != null && !filter.getDesc().equals(tExtRef.getDesc())) { + return false; + } + if (filter.getPDO() != null && !tExtRef.getPDO().equals(filter.getPDO())) { + return false; + } + if (filter.getIntAddr() != null && !filter.getIntAddr().equals(tExtRef.getIntAddr())) { + return false; + } + return true; + }) + .collect(Collectors.toList()); + } + + } + + public static List extractLNExtRefs(TLDevice tlDevice, String lnClass, String lnInst, IExtRefDTO filter) throws ScdException { + TLN ln = tlDevice.getLN() + .stream() + .filter(tln -> tln.getLnClass().contains(lnClass)) + .collect(Collectors.toList()) + .stream() + .filter(tln -> lnInst.equals(tln.getInst())) + .findFirst() + .orElseThrow(() -> new ScdException(String.format("Unknown LN [lnClass(%s),inst(%s)] ",lnClass,lnInst))); + + + if(ln.getInputs() == null) return new ArrayList<>(); + + if(filter == null){ + return ln.getInputs().getExtRef(); + } else { + return ln.getInputs().getExtRef() + .stream() + .filter(tExtRef -> filter.isIdentical(tExtRef)) + .collect(Collectors.toList()); + } + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java new file mode 100644 index 000000000..0ba80b2f5 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java @@ -0,0 +1,60 @@ +package org.lfenergy.compas.sct.service.scl; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THeader; +import org.lfenergy.compas.scl.TIED; + +import java.util.Optional; + +@Getter +@NoArgsConstructor +public class SclManager { + private SCL receiver; + + public SclManager(SCL receiver) { + this.receiver = receiver; + } + + public SclManager(String hId, String hVersion, String hRevision){ + this.receiver = SclManager.initialize(hId,hVersion,hRevision); + } + + + + public Optional getIED(String iedName){ + return receiver.getIED().stream().filter(tied -> iedName.equals(tied.getName())).findFirst(); + } + + /** + * Add IED named iedName from a given SCL to recipient SCL + * @param provider SCL containing IED to add + * @param iedName IED name to be added + * @throws ScdException + */ + public void addIED(SCL provider, String iedName) throws ScdException { + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + sclIEDManager.addIed(provider,iedName); + } + + /*--------------------------------------------------------*/ + /* Static methods */ + /*--------------------------------------------------------*/ + + public static SCL initialize(String hId, String hVersion, String hRevision) { + + SCL scd = new SCL(); + scd.setRelease((short) 4); + scd.setVersion("2007"); + scd.setRevision("B"); + THeader tHeader = new THeader(); + tHeader.setRevision(hRevision); + tHeader.setVersion(hVersion); + tHeader.setId(hId); + scd.setHeader(tHeader); + + return scd; + } +} diff --git a/sct-service/src/main/resources/icd/icd_test.xml b/sct-service/src/main/resources/icd/icd_test.xml new file mode 100644 index 000000000..26222f7cf --- /dev/null +++ b/sct-service/src/main/resources/icd/icd_test.xml @@ -0,0 +1,101 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml new file mode 100644 index 000000000..28c4e3bfd --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -0,0 +1,64 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml new file mode 100644 index 000000000..89569eb67 --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -0,0 +1,62 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml new file mode 100644 index 000000000..03162c59a --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -0,0 +1,82 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml new file mode 100644 index 000000000..7ace9cbe2 --- /dev/null +++ b/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml @@ -0,0 +1,109 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java new file mode 100644 index 000000000..6e1aa11fa --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java @@ -0,0 +1,23 @@ +package org.lfenergy.compas.sct; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootTest +@ActiveProfiles("test") +public class ApplicationContextTest { + + @Test + public void contextLoads() { + // do nothing + } + + @SpringBootApplication + public static class Context { + + } +} diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java new file mode 100644 index 000000000..909557105 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -0,0 +1,9 @@ +@TypeDef( + name = "xmltype", + defaultForType = byte[].class, + typeClass = H2XMLTypeMapper.class +) +package org.lfenergy.compas.sct.model.entity; +import org.hibernate.annotations.TypeDef; +import org.lfenergy.compas.sct.repository.H2XMLTypeMapper; + diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java new file mode 100644 index 000000000..1757f8f38 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java @@ -0,0 +1,269 @@ +package org.lfenergy.compas.sct.service; + +import org.checkerframework.checker.units.qual.C; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THeader; +import org.lfenergy.compas.scl.THitem; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.IedDTO; +import org.lfenergy.compas.sct.model.dto.ScdDTO; +import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.lfenergy.compas.sct.repository.SimpleScdRepository; +import org.mockito.InjectMocks; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.xml.transform.Result; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; + +@ExtendWith(SpringExtension.class) +class SqlScdServiceAndDBTest { + private final String FILE_NAME = "file.scd"; + private final String H_VERSION = "1.0"; + private final String H_REVISION = "1.0"; + private static final String WHO = "who"; + private static final String WHAT = "what"; + private static final String WHY = "why"; + private final UUID ID = UUID.randomUUID(); + + private static final String IED_NAME = "IED_NAME"; + + private static final String SCD_IED_RCV_FILE = "scl/SCD/scd_ied_receiver_test.xml"; + private static final String SCD_WITH_IEDS_FILE = "scl/SCD/scd_with_ieds_test.xml"; + private static final String ICD_IMPORT_FILE = "scl/IEDImportHelper/icd_import_ied_test.xml"; + + @InjectMocks + private SimpleSqlScdService simpleSqlScdService; + + @MockBean + private SimpleScdRepository simpleScdRepository; + + + private MarshallerWrapper marshallerWrapper; + + private DefaultResourceLoader defaultResourceLoader; + + + @BeforeEach + public void setUp(){ + MockitoAnnotations.openMocks( this ); + + try { + marshallerWrapper = (new MarshallerWrapper.Builder()).build(); + } catch (Exception e) { + e.printStackTrace(); + } + simpleSqlScdService = new SimpleSqlScdService(simpleScdRepository,marshallerWrapper); + defaultResourceLoader = new DefaultResourceLoader(); + } + + @Test + public void shouldReturnOKWhenInitiateSCD() throws CompasDataAccessException, ScdException { + + SimpleScd expected = new SimpleScd(); + expected.setFileName(FILE_NAME); + expected.setRawXml(createSCD(ID, H_REVISION, H_VERSION)); + + SimpleScd result = simpleSqlScdService.initiateSCD(FILE_NAME, H_VERSION, H_REVISION); + + SCL scd = marshallerWrapper.unmarshall(result.getRawXml()); + + assertEquals(FILE_NAME,result.getFileName()); + assertEquals(H_REVISION,scd.getHeader().getRevision()); + assertEquals(H_VERSION,scd.getHeader().getVersion()); + } + + @Test + public void shouldReturnOKWhenAddHistoryItem() throws ScdException, CompasDataAccessException { + SimpleScd storedSimpleSCD = new SimpleScd(); + storedSimpleSCD.setFileName(FILE_NAME); + storedSimpleSCD.setId(ID); + storedSimpleSCD.setRawXml(createSCD(ID, H_REVISION, H_VERSION)); + + SCL storedScd = marshallerWrapper.unmarshall(createSCD(ID, H_REVISION, H_VERSION)); + + SimpleScd expected = new SimpleScd(); + expected.setFileName(FILE_NAME); + expected.setId(ID); + + SCL expectedScd = marshallerWrapper.unmarshall(createSCD(ID, H_REVISION, H_VERSION)); + + THeader.History history = new THeader.History(); + THitem tHitem = new THitem(); + tHitem.setVersion("1.0"); + tHitem.setRevision("1.0"); + tHitem.setWhat("what"); + tHitem.setWho("who"); + tHitem.setWhy("why"); + tHitem.setWhen(LocalDateTime.now().toString()); + history.getHitem().add(tHitem); + expectedScd.getHeader().setHistory(history); + expected.setRawXml(marshallerWrapper.marshall(expectedScd).getBytes()); + + Mockito.when(simpleScdRepository.findById(ID)).thenReturn(Optional.of(storedSimpleSCD)); + Mockito.when(simpleScdRepository.save(any(SimpleScd.class))).thenReturn(expected); + + + SimpleScd result = simpleSqlScdService.addHistoryItem(ID,"who","what", "why"); + assertNotNull(result); + SCL resultScd = marshallerWrapper.unmarshall(result.getRawXml()); + + assertAll( + () -> assertNotNull(resultScd), + () -> assertNotNull(resultScd.getHeader()), + () -> assertNotNull(resultScd.getHeader().getHistory()) + ); + List hItems = resultScd.getHeader().getHistory().getHitem(); + + assertFalse(hItems.isEmpty()); + THitem hItem = hItems.get(0); + assertAll( + () -> assertNotNull(hItem), + () -> assertEquals("who",hItem.getWho()), + () -> assertEquals("what",hItem.getWhat()), + () -> assertEquals("why",hItem.getWhy()) + ); + } + + + @Test + public void shouldReturnOKWhenInitiateScdAndAddHistory() throws ScdException { + SimpleScd result = simpleSqlScdService.initiateSCD(FILE_NAME, H_VERSION, H_REVISION); + SCL resultScd = marshallerWrapper.unmarshall(result.getRawXml()); + + assertNotNull(result); + assertNotNull(resultScd.getHeader()); + assertNotNull(UUID.fromString(resultScd.getHeader().getId())); + + result = simpleSqlScdService.addHistoryItem(result,"who","what","why"); + resultScd = marshallerWrapper.unmarshall(result.getRawXml()); + THeader.History history = resultScd.getHeader().getHistory(); + assertNotNull(history); + assertFalse(history.getHitem().isEmpty()); + THitem tHitem = history.getHitem().get(0); + assertEquals(H_REVISION,tHitem.getRevision()); + assertEquals(H_VERSION,tHitem.getVersion()); + assertEquals(WHO,tHitem.getWho()); + } + @Test + void testAddIED() throws IOException, ScdException { + + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_IED_RCV_FILE)); + + scdObj = simpleSqlScdService.addIED(scdObj,IED_NAME,iedProvider); + SCL res_receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + + assertNotNull(res_receiver); + assertFalse(res_receiver.getIED().isEmpty()); + + } + + @Test + void testGetSubnetworks() throws IOException, ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + + Set subnetworks = simpleSqlScdService.getSubnetwork(scdObj); + assertEquals(1,subnetworks.size()); + } + + @Test + void testExtractExtRefs() throws IOException, ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + + IedDTO iedDTO = simpleSqlScdService.extractExtRefs(scdObj,IED_NAME,"LDPO"); + assertEquals(IED_NAME,iedDTO.getName()); + assertEquals(1,iedDTO.getLDevices().size()); + } + + @Test + public void testAddSubnetwork() throws IOException, ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + + SubNetworkDTO subNetworkDTO = new SubNetworkDTO("SN","IP"); + subNetworkDTO.addConnectedAPs(new ConnectedApDTO(IED_NAME,"AP_NAME")); + + scdObj = simpleSqlScdService.addSubnetworks(scdObj,Set.of(subNetworkDTO)); + SCL res_receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + assertNotNull(res_receiver.getCommunication()); + assertFalse(res_receiver.getCommunication().getSubNetwork().isEmpty()); + } + + @Test + void testExtractExtRefSources() throws IOException, ScdException { + + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("INTADDR3"); + extRef.setPDO("Op.res"); + extRef.setDesc("DESC3"); + + Set iedDTOs = simpleSqlScdService.extractExtRefSources(scdObj,IED_NAME, "LDPO", extRef); + assertFalse(iedDTOs.isEmpty()); + + } + + + + private byte[] createSCD(UUID uuid, String hRevision, String hVersion){ + SCL scd = new SCL(); + scd.setVersion("2007"); + scd.setRevision("B"); + scd.setRelease((short) 4); + THeader tHeader = new THeader(); + tHeader.setRevision(hRevision); + tHeader.setVersion(hVersion); + tHeader.setId(uuid.toString()); + scd.setHeader(tHeader); + + return marshallerWrapper.marshall(scd).getBytes(StandardCharsets.UTF_8); + + } + + private byte[] getFileContent(String filename) throws IOException { + Resource resource = defaultResourceLoader.getResource("classpath:" + filename); + File file = resource.getFile(); + return Files.readAllBytes(file.toPath()); + } + + private SCL getSCLFromFile(String filename) throws IOException { + return marshallerWrapper.unmarshall(getFileContent(filename)); + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java new file mode 100644 index 000000000..116760f09 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java @@ -0,0 +1,87 @@ +package org.lfenergy.compas.sct.service.scl; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.exception.ScdException; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) +class SclCommunicationManagerTest { + + private static final String IED_NAME = "IED_NAME"; + private static final String AP_NAME = "AP_NAME"; + private static final String SUBNETWORK = "SUBNETWORK"; + + + @Test + void shouldReturnOKWhenAddSubnetworkCaseReceiverHasNoCommunication() throws ScdException { + SCL receiver = createSCLWithIEDAndAccessPoint(); + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + + receiver = sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME); + assertNotNull(receiver.getCommunication()); + assertNotNull(receiver.getCommunication().getSubNetwork()); + assertFalse(receiver.getCommunication().getSubNetwork().isEmpty()); + TSubNetwork subNetwork = receiver.getCommunication().getSubNetwork() + .stream() + .filter(sn -> sn.getName().equals(SUBNETWORK)) + .findFirst() + .orElse(null); + assertNotNull(subNetwork); + + TConnectedAP cAP = subNetwork.getConnectedAP() + .stream() + .filter(connectedAP -> connectedAP.getIedName().equals(IED_NAME) && connectedAP.getApName().equals(AP_NAME) ) + .findFirst() + .orElse(null); + assertNotNull(cAP); + + } + + + @Test + void ShouldReturnNOKWhenAddSubnetworkCauseUnknownIED() throws ScdException { + + SCL receiver = createMinimalSCL(); + + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + + assertThrows(ScdException.class, () -> sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME)); + + } + + @Test + void ShouldReturnNOKWhenAddSubnetworkCauseUnknownIEDAccessPoint() { + SCL receiver = createMinimalSCL(); + TIED ied = new TIED(); + ied.setName(IED_NAME); + receiver.getIED().add(ied); + + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + + assertThrows(ScdException.class, () -> sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME)); + } + + private SCL createMinimalSCL(){ + return SclManager.initialize("hID","hVersion","hRevision"); + } + + private SCL createSCLWithIEDAndAccessPoint(){ + SCL receiver = createMinimalSCL(); + TIED ied = new TIED(); + ied.setName(IED_NAME); + TAccessPoint accessPoint = new TAccessPoint(); + accessPoint.setName(AP_NAME); + ied.getAccessPoint().add(accessPoint); + + receiver.getIED().add(ied); + return receiver; + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java new file mode 100644 index 000000000..aed34dc33 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java @@ -0,0 +1,566 @@ +package org.lfenergy.compas.sct.service.scl; + + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TBDA; +import org.lfenergy.compas.scl.TDA; +import org.lfenergy.compas.scl.TDAType; +import org.lfenergy.compas.scl.TDOType; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TEnumType; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLNodeType; +import org.lfenergy.compas.scl.TPredefinedBasicTypeEnum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; + + +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; + +import java.io.InputStream; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SclDataTemplateManagerTest { + + private static final String SCD_FILE = "scl/SCD/scd_with_dtt_test.xml"; + private static final String ICD_WITH_IDENTICAL_DTT = "scl/IEDImportHelper/Icd_With_Identical_DTT.xml"; + private static final String ICD_WITH_DTT_DIFF_IDS = "scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml"; + private static final String ICD_WITH_DTT_DIFF_CONTENT = "scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml"; + + + //private MarshallerWrapper marshallerWrapper = createWrapper(); + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTEnumType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); + List prdEnumType = icd.getDataTypeTemplates().getEnumType(); + + assertFalse(rcvEnumType.isEmpty()); + assertFalse(prdEnumType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTEnumTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); + List prdEnumType = icd.getDataTypeTemplates().getEnumType(); + assertFalse(rcvEnumType.isEmpty()); + assertFalse(prdEnumType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTEnumTypeCauseContentsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); + List prdEnumType = icd.getDataTypeTemplates().getEnumType(); + assertFalse(rcvEnumType.isEmpty()); + assertFalse(prdEnumType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTDaType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); + List prdDaTypes = icd.getDataTypeTemplates().getDAType(); + + assertFalse(rcvDaTypes.isEmpty()); + assertFalse(prdDaTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDaTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); + List prdDaTypes = icd.getDataTypeTemplates().getDAType(); + + assertFalse(rcvDaTypes.isEmpty()); + assertFalse(prdDaTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDaTypeCauseContentsAreDifferent() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); + List prdDaTypes = icd.getDataTypeTemplates().getDAType(); + + assertFalse(rcvDaTypes.isEmpty()); + assertFalse(prdDaTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTDoType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); + List prdDoTypes = icd.getDataTypeTemplates().getDOType(); + + assertFalse(rcvDoTypes.isEmpty()); + assertFalse(prdDoTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDoTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); + List prdDoTypes = icd.getDataTypeTemplates().getDOType(); + + assertFalse(rcvDoTypes.isEmpty()); + assertFalse(prdDoTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDoTypeCauseContentsAreDifferent() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); + List prdDoTypes = icd.getDataTypeTemplates().getDOType(); + + assertFalse(rcvDoTypes.isEmpty()); + assertFalse(prdDoTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTLNodeType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); + List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); + + assertFalse(rcvLNodeType.isEmpty()); + assertFalse(prdLNodeType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTLNodeTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); + List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); + + assertFalse(rcvLNodeType.isEmpty()); + assertFalse(prdLNodeType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTLNodeTypeCauseContentsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); + List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); + + assertFalse(rcvLNodeType.isEmpty()); + assertFalse(prdLNodeType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnOKWhenFindDATypesWhichBdaContainsEnumTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + String enumTypeId = "RecCycModKind"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + List daTypeList = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(icd,enumTypeId); + + assertEquals(1,daTypeList.size()); + } + + @Test + void ShouldReturnOKWhenFindDOTypesWhichDAContainsEnumTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + String enumTypeId = "PhaseAngleReferenceKind"; + List doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(icd,enumTypeId); + assertEquals(1,doTypeList.size()); + + enumTypeId = "RecCycModKind"; + doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(icd,enumTypeId); + assertTrue(doTypeList.isEmpty()); + } + + @Test + void ShouldReturnOKWhenFindDATypesFromStructBdaWithDATypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String daTypeId = "DA3"; + List daTypeList = sclDataTemplateManager.findDATypesFromStructBdaWithDATypeId(icd,daTypeId); + + assertEquals(1,daTypeList.size()); + daTypeId = "DA1"; + + daTypeList = sclDataTemplateManager.findDATypesFromStructBdaWithDATypeId(icd,daTypeId); + assertTrue(daTypeList.isEmpty()); + } + + @Test + void ShouldReturnOKWhenFindDOTypesWhichDAContainsStructWithDATypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String daTypeId = "DA3"; + List doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsStructWithDATypeId(icd,daTypeId); + assertEquals(1,doTypeList.size()); + + } + + @Test + void ShouldReturnOKWhenFindDOTypesFromSDOWithDOTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String doTypeId = "DO4"; + List doTypeList = sclDataTemplateManager.findDOTypesFromSDOWithDOTypeId(icd,doTypeId); + assertEquals(2,doTypeList.size()); + + doTypeId = "UnknownDOID"; + doTypeList = sclDataTemplateManager.findDOTypesFromSDOWithDOTypeId(icd,doTypeId); + assertTrue(doTypeList.isEmpty()); + } + + @Test + void ShouldReturnOKWhenFindLNodeTypesFromDoWithDoTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String doTypeId = "DO1"; + List lNodeTypes = sclDataTemplateManager.findLNodeTypesFromDoWithDoTypeId(icd,doTypeId); + assertEquals(2,lNodeTypes.size()); + + doTypeId = "UnknownDOID"; + lNodeTypes = sclDataTemplateManager.findLNodeTypesFromDoWithDoTypeId(icd,doTypeId); + assertTrue(lNodeTypes.isEmpty()); + } + + @Test + void testComputeImportableDTTFromEnumTypeWithIdenticalIdsAndSameContent() throws Exception { + // identical id, same content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + String iedName = "IED_NAME"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); + + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDoTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().isEmpty()); + + } + + @Test + void testComputeImportableDTTFromEnumTypeWithIdenticalIdsAndDiffContent() throws Exception { + + // identical id, different content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + String iedName = "IED_NAME"; + String newExpectedEnumTypeID1 = iedName + "_PhaseAngleReferenceKind"; + String newExpectedEnumTypeID2 = iedName + "_RecCycModKind"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); + + assertEquals(2, sclDataTemplateManager.getEnumTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID1)); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID2)); + + List daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID1); + List doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID1); + assertTrue(daTypeListRefEnumID.isEmpty()); + assertEquals(1, doTypeListRefEnumID.size()); + List tdaList = sclDataTemplateManager.retrieveSdoOrDO(doTypeListRefEnumID.get(0).getSDOOrDA(), TDA.class); + assertFalse(tdaList.isEmpty()); + assertEquals(TPredefinedBasicTypeEnum.ENUM,tdaList.get(0).getBType()); + assertEquals(newExpectedEnumTypeID1,tdaList.get(0).getType()); + + daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID2); + doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID2); + + assertEquals(1, daTypeListRefEnumID.size()); + assertTrue(doTypeListRefEnumID.isEmpty()); + List bdaList = daTypeListRefEnumID.get(0).getBDA(); + assertTrue(!bdaList.isEmpty()); + Optional opBda = bdaList.stream() + .filter(tbda -> TPredefinedBasicTypeEnum.ENUM.equals(tbda.getBType()) + && newExpectedEnumTypeID2.equals(tbda.getType())) + .findFirst(); + assertTrue(opBda.isPresent()); + } + + @Test + void testComputeImportableDTTFromEnumTypeWithDiffIds() throws Exception { + // different id + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + String iedName = "IED_NAME"; + String newExpectedEnumTypeID1 = "MultiplierKind"; + String newExpectedEnumTypeID2 = "CtlModelKind"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); + + assertEquals(2, sclDataTemplateManager.getEnumTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID1)); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID2)); + + List daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID1); + List doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID1); + assertTrue( daTypeListRefEnumID.isEmpty()); + assertEquals(1, doTypeListRefEnumID.size()); + List tdaList = sclDataTemplateManager.retrieveSdoOrDO(doTypeListRefEnumID.get(0).getSDOOrDA(), TDA.class); + assertFalse(tdaList.isEmpty()); + assertEquals(TPredefinedBasicTypeEnum.ENUM,tdaList.get(0).getBType()); + assertEquals(newExpectedEnumTypeID1,tdaList.get(0).getType()); + + daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID2); + doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID2); + + assertEquals(1, daTypeListRefEnumID.size()); + assertFalse(!doTypeListRefEnumID.isEmpty()); + List bdaList = daTypeListRefEnumID.get(0).getBDA(); + assertTrue(!bdaList.isEmpty()); + Optional opBda = bdaList.stream() + .filter(tbda -> TPredefinedBasicTypeEnum.ENUM.equals(tbda.getBType()) + && newExpectedEnumTypeID2.equals(tbda.getType())) + .findFirst(); + assertTrue(opBda.isPresent()); + } + + @Test + void testComputeImportableDTTFromDATypeWithIdenticalIdsAndSameContent() throws Exception { + + // identical id, same content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + String iedName = "IED_NAME"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); + + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDoTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getLNodeTypeToAdd().isEmpty()); + + } + + @Test + void testComputeImportableDTTFromDATypeWithIdenticalIdsAndDiffContent() throws Exception { + // identical id, different content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + String iedName = "IED_NAME"; + String expectedDATypeID1 = iedName + "_DA1"; + String expectedDATypeID3 = iedName + "_DA3"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); + + assertEquals(2, sclDataTemplateManager.getDaTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID1)); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID3)); + } + + @Test + void testComputeImportableDTTFromDATypeWithDiffIds() throws Exception { + // identical id, different content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + String iedName = "IED_NAME"; + String expectedDATypeID1 = "DA11"; + String expectedDATypeID2 = "DA21"; + String expectedDATypeID3 = "DA31"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); + + assertEquals(3, sclDataTemplateManager.getDaTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID1)); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID2)); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID3)); + } + + @Test + void testComputeImportableDTTFromDOType(){ + + } + @Test + void testComputeImportableDTTFromLNodeType(){ + + } + + @Test + void testImportDTT() throws Exception { + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + String iedName = "IED_NAME"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + receiver = sclDataTemplateManager.importDTT(provider,receiver,iedName); + + System.out.print(createWrapper().marshall(receiver)); + } + + @Test + void testShouldReturnOKWhenGetResumedDTT() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN2"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res"); + extRef.setPDA("d"); + + ResumedDataTemplate res = SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt); + System.out.println(res); + assertEquals(lnType,res.getLnType()); + assertEquals(TLLN0Enum.LLN_0.value(),res.getLnClass()); + assertEquals(extRef.getPDO(),res.getDoName()); + assertEquals(extRef.getPDA(),res.getDaName()); + assertEquals(TPredefinedCDCEnum.WYE,res.getCdc()); + assertEquals(TFCEnum.CF,res.getFc()); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDoName() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN2"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs1.res"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnknownLnType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN210"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedSDoName() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN210"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res1"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDaName() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN210"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res1"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + private SCL getSCLFromFile(String filename) throws Exception { + MarshallerWrapper marshallerWrapper = createWrapper(); + InputStream is = getClass().getClassLoader().getResourceAsStream(filename); + return marshallerWrapper.unmarshall(is); + } + + private MarshallerWrapper createWrapper() throws Exception { + return (new MarshallerWrapper.Builder()).build(); + } + +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java new file mode 100644 index 000000000..7009c4538 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java @@ -0,0 +1,71 @@ +package org.lfenergy.compas.sct.service.scl; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THitem; +import org.lfenergy.compas.exception.ScdException; + + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + + +class SclHeaderManagerTest { + + private final String H_VERSION = "1.0"; + private final String TOOL_ID = "COMPAS"; + private final String H_REVISION = "1.0"; + private final UUID ID = UUID.randomUUID(); + + @Test + void testShouldReturnOKWhenAddHeader() throws ScdException { + SCL receiver = new SCL(); + SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); + assertNull(receiver.getHeader()); + sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); + assertAll("header", + () -> assertNotNull(receiver.getHeader()), + () -> assertEquals(ID.toString(),receiver.getHeader().getId()), + () -> assertNotNull(H_VERSION,receiver.getHeader().getVersion()), + () -> assertNotNull(H_REVISION,receiver.getHeader().getRevision()), + () -> assertNotNull(TOOL_ID,receiver.getHeader().getToolID()) + ); + } + + @Test + void testShouldReturnNOKWhenAddHeaderCauseHeaderExistAlready() throws ScdException { + + SCL receiver = new SCL(); + SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); + assertNull(receiver.getHeader()); + sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); + + assertThrows(ScdException.class, () -> sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION)); + } + + @Test + void testShouldReturnOKWhenAddHistoryItem() throws ScdException { + SCL receiver = new SCL(); + SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); + assertNull(receiver.getHeader()); + sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); + assertNotNull(receiver.getHeader()); + sclHeaderManager.addHistoryItem("who","what","why"); + + assertNotNull(receiver.getHeader().getHistory()); + assertEquals(1,receiver.getHeader().getHistory().getHitem().size()); + THitem tHitem = receiver.getHeader().getHistory().getHitem().get(0); + assertEquals("who",tHitem.getWho()); + assertEquals("what",tHitem.getWhat()); + assertEquals("why",tHitem.getWhy()); + assertNotNull(tHitem.getWhen()); + assertNotNull(receiver.getHeader().getRevision(),tHitem.getRevision()); + assertNotNull(receiver.getHeader().getVersion(),tHitem.getVersion()); + assertNotNull(tHitem.getWhen()); + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java new file mode 100644 index 000000000..8ebed00a7 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java @@ -0,0 +1,282 @@ +package org.lfenergy.compas.sct.service.scl; + + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TLDevice; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +class SclIEDManagerTest { + + private static final String SCD_IED_RCV_FILE = "scl/SCD/scd_ied_receiver_test.xml"; + private static final String SCD_WITH_IEDS_FILE = "scl/SCD/scd_with_ieds_test.xml"; + private static final String ICD_IMPORT_FILE = "scl/IEDImportHelper/icd_import_ied_test.xml"; + + private static final String IED_NAME = "IED_NAME"; + + + @Test + void addIed() { + } + + @Test + void shouldReturnOKWhenAddIed() throws ScdException { + SCL iedReceiver = getSCLFromFile(SCD_IED_RCV_FILE); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + //check prerequisite + assertFalse(iedReceiver.getIED().stream().anyMatch(tied -> tied.getName().equals(IED_NAME))); + Optional opIED = iedProvider.getIED().stream().filter(tied -> tied.getName().equals(IED_NAME)).findFirst(); + assertTrue(opIED.isPresent()); + TIED ied = opIED.get(); + assertFalse(ied.getAccessPoint().isEmpty()); + TAccessPoint accessPoint = ied.getAccessPoint().get(0); + assertEquals(1, accessPoint.getServer().getLDevice().size() ); + TLDevice lDevice = accessPoint.getServer().getLDevice().get(0); + assertEquals("LN2",lDevice.getLN0().getLnType()); + assertEquals(2,lDevice.getLN().size() ); + TLN ln = lDevice.getLN().get(0); + assertEquals("LN1",ln.getLnType() ); + + // import IED + SclIEDManager sclIEDManager = new SclIEDManager(iedReceiver); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + sclDataTemplateManager.importDTT(iedProvider,iedReceiver,IED_NAME); + Map lNodeTypeTracker = sclDataTemplateManager.getLNodeTypeTracker(); + assertFalse(lNodeTypeTracker.isEmpty()); + iedReceiver = sclIEDManager.addIed(iedProvider,IED_NAME,lNodeTypeTracker); + + opIED = iedReceiver.getIED().stream().filter(tied -> tied.getName().equals(IED_NAME)).findFirst(); + assertTrue(opIED.isPresent()); + ied = opIED.get(); + assertFalse(ied.getAccessPoint().isEmpty()); + accessPoint = ied.getAccessPoint().get(0); + assertNotNull(accessPoint.getServer()); + assertEquals(1, accessPoint.getServer().getLDevice().size()); + lDevice = accessPoint.getServer().getLDevice().get(0); + assertNotNull(lDevice.getLN0()); + assertEquals(IED_NAME + "_LN2",lDevice.getLN0().getLnType()); + assertEquals(2,lDevice.getLN().size()); + ln = lDevice.getLN().get(0); + assertEquals(IED_NAME + "_LN1", ln.getLnType()); + } + + @Test + void ShouldReturnNOKWhenAddIedCauseIEDAlreadyExistsInReceiver() { + SCL receiver = createMinimalSCL(); + TIED tied = new TIED(); + tied.setName(IED_NAME); + receiver.getIED().add(tied); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + + + assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); + + } + + @Test + void ShouldReturnNOKWhenAddIedCauseReceiverContainsDTTisNULL() { + SCL receiver = createMinimalSCL(); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + + assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); + } + + @Test + void ShouldReturnNOKWhenAddIedCauseReceiverContainsDTTHasNoLNodeType() { + + SCL receiver = createMinimalSCL(); + TDataTypeTemplates tDataTypeTemplates = new TDataTypeTemplates(); + receiver.setDataTypeTemplates(tDataTypeTemplates); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + + assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); + } + + @Test + void testGetLDevice(){ + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + assertFalse(scd.getIED().isEmpty()); + TIED ied = scd.getIED().get(0); + + List lds = SclIEDManager.getIEDLDevice(ied); + assertFalse(lds.isEmpty()); + } + @Test + void testGetSpecificLDevice(){ + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + assertFalse(scd.getIED().isEmpty()); + + TIED ied = scd.getIED() + .stream() + .filter(tied -> tied.getName().equals(IED_NAME)) + .findFirst() + .orElse(null); + assertNotNull(ied); + + TLDevice ld = SclIEDManager.getIEDLDevice(ied,"LDPO").orElse(null); + assertNotNull(ld); + } + + @Test + void ShouldReturnOKWhenUpdateLN() throws ScdException { + TLN ln = new TLN(); + ln.setInst("lnInst"); + ln.setLnType("lnType"); + String newLnType = "newLNType"; + Set receiverLNodeTypeIds = new HashSet<>(); + receiverLNodeTypeIds.add(newLnType); + Map tracker = new HashMap<>(); + tracker.put(ln.getLnType(),newLnType); + SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); + + ln = (TLN) sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker); + assertEquals(newLnType,ln.getLnType()); + + } + + @Test + void ShouldReturnNOKWhenUpdateLNCauseUnknownLNodeType() { + TLN ln = new TLN(); + ln.setInst("lnInst"); + ln.setLnType("lnType"); + Set receiverLNodeTypeIds = new HashSet<>(); + Map tracker = new HashMap<>(); + SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); + + assertThrows(ScdException.class, () -> sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker)); + + } + + @Test + void ShouldReturnNOKWhenUpdateLNCauseLNodeTypeBadlyRenamed() { + TLN ln = new TLN(); + ln.setInst("lnInst"); + ln.setLnType("lnType"); + String badNewLNType = "badNewLNType"; + Set receiverLNodeTypeIds = new HashSet<>(); + Map tracker = new HashMap<>(); + tracker.put(ln.getLnType(),badNewLNType); + SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); + + assertThrows(ScdException.class, () -> sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker)); + + } + + @Test + void testShouldReturnOKWhenGetExtRef() throws ScdException { + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + ExtRefDTO simpleExtRef = new ExtRefDTO(); + simpleExtRef.setIntAddr("INTADDR2"); + simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); + simpleExtRef.setPDO("Op"); + TExtRef extRef = sclIEDManager.getExtRef(IED_NAME,"LDPO",simpleExtRef); + assertEquals("DESC2",extRef.getDesc()); + + } + + @Test + void testShouldReturnNOKWhenGetExtRefNoThingFound() throws ScdException { + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + ExtRefDTO simpleExtRef = new ExtRefDTO(); + simpleExtRef.setIntAddr("INTADDR1"); + simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); + simpleExtRef.setPDO("Op"); + assertThrows(ScdException.class, () -> sclIEDManager.getExtRef(IED_NAME,"LDPO",simpleExtRef)); + } + + @Test + void testShouldReturnNOKWhenGetExtRefUnknownLD() throws ScdException { + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + ExtRefDTO simpleExtRef = new ExtRefDTO(); + simpleExtRef.setIntAddr("INTADDR1"); + simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); + simpleExtRef.setPDO("Op"); + assertThrows(ScdException.class, () -> sclIEDManager.getExtRef(IED_NAME,"LDPO1",simpleExtRef)); + } + @Test + void testExtractLN0ExtRefs(){ + + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + //prerequisite + assertFalse(scd.getIED().isEmpty()); + assertFalse(scd.getIED().get(0).getAccessPoint().isEmpty()); + assertNotNull(scd.getIED().get(0).getAccessPoint().get(0).getServer()); + assertFalse(scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().isEmpty()); + TLDevice lDevice = scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0); + List extRefs = sclIEDManager.extractLN0ExtRefs(lDevice, null); + + assertFalse(extRefs.isEmpty()); + } + + @Test + void testExtractLNExtRefs() throws ScdException { + + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + //prerequisite + assertFalse(scd.getIED().isEmpty()); + assertFalse(scd.getIED().get(0).getAccessPoint().isEmpty()); + assertNotNull(scd.getIED().get(0).getAccessPoint().get(0).getServer()); + assertFalse(scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().isEmpty()); + TLDevice lDevice = scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0); + assertEquals(2,lDevice.getLN().size()); + TLN tln = lDevice.getLN().get(0); + assertFalse(tln.getLnClass().isEmpty()); + String lnClass = tln.getLnClass().get(0); + List extRefs = sclIEDManager.extractLNExtRefs(lDevice,lnClass,tln.getInst(),null); + + assertFalse(extRefs.isEmpty()); + } + + private SCL createMinimalSCL(){ + return SclManager.initialize("hID","hVersion","hRevision"); + } + private MarshallerWrapper createWrapper() throws Exception { + return (new MarshallerWrapper.Builder()).build(); + } + + private SCL getSCLFromFile(String filename){ + MarshallerWrapper marshallerWrapper = null; + try { + marshallerWrapper = createWrapper(); + } catch (Exception e) { + fail("XML marshaller can't be created!"); + } + InputStream is = getClass().getClassLoader().getResourceAsStream(filename); + return marshallerWrapper.unmarshall(is); + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java new file mode 100644 index 000000000..59f79bcc2 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java @@ -0,0 +1,5 @@ +package org.lfenergy.compas.sct.service.scl; + +class SclManagerTest { + +} \ No newline at end of file diff --git a/sct-service/src/test/resources/application.yml b/sct-service/src/test/resources/application.yml new file mode 100644 index 000000000..1a68e38ed --- /dev/null +++ b/sct-service/src/test/resources/application.yml @@ -0,0 +1,9 @@ +## YAML Template. +--- +spring: + #profile + profiles: + active: test +logging: + level: + root: INFO \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml new file mode 100644 index 000000000..28c4e3bfd --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -0,0 +1,64 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml new file mode 100644 index 000000000..89569eb67 --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -0,0 +1,62 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml new file mode 100644 index 000000000..8dc3681f3 --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -0,0 +1,94 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml new file mode 100644 index 000000000..54613c43d --- /dev/null +++ b/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml @@ -0,0 +1,102 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file From f54fdda3b709b51afe5acc7d8f1e4c90596958c9 Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Mon, 19 Apr 2021 13:26:18 +0200 Subject: [PATCH 02/24] RSR-31 / Create a new SCD file with Header EPIC RSR-51 / RSR-6 : S79 : Add DataTypeTemplates from ICD to current SCD EPIC RSR-51 / RSR-60 : Add a new IED from ICD to current SCD EPIC RSR-51 / RSR-64 : Associate a list of Connected Access Point (ConnectedAP) to a SubNetwork RSR-86 COMPAS List for a given signal ExtRef, all possible IED, LDevice, LN and DO that can be defined as source RSR-81 COMPAS List all External References signals ExtRef belonging to an IED and LDevice.inst of an SCD file Signed-off-by: SYLLA MOHAMED --- .gitignore | 33 + pom.xml | 99 +++ sct-coverage/pom.xml | 49 ++ sct-data/pom.xml | 29 + .../exception/CompasDataAccessException.java | 13 + .../compas/sct/model/IAccessPointDTO.java | 13 + .../compas/sct/model/IConnectedApDTO.java | 9 + .../compas/sct/model/IControlBlockDTO.java | 5 + .../lfenergy/compas/sct/model/IExtRefDTO.java | 96 +++ .../lfenergy/compas/sct/model/IIedDTO.java | 12 + .../compas/sct/model/ILDeviceDTO.java | 16 + .../lfenergy/compas/sct/model/ILNodeDTO.java | 20 + .../org/lfenergy/compas/sct/model/IScd.java | 7 + .../compas/sct/model/IScdCrudRepository.java | 15 + .../lfenergy/compas/sct/model/IScdModel.java | 6 + .../lfenergy/compas/sct/model/IServerDTO.java | 7 + .../compas/sct/model/ISubNetworkDTO.java | 13 + .../compas/sct/model/dto/ConnectedApDTO.java | 42 ++ .../compas/sct/model/dto/ExtRefDTO.java | 69 ++ .../lfenergy/compas/sct/model/dto/IedDTO.java | 28 + .../compas/sct/model/dto/ItemsDTO.java | 11 + .../compas/sct/model/dto/LDeviceDTO.java | 34 + .../compas/sct/model/dto/LNodeDTO.java | 62 ++ .../sct/model/dto/ResumedDataTemplate.java | 31 + .../lfenergy/compas/sct/model/dto/ScdDTO.java | 51 ++ .../compas/sct/model/dto/SubNetworkDTO.java | 91 +++ .../compas/sct/model/entity/SimpleScd.java | 70 ++ .../compas/sct/model/entity/package-info.java | 11 + .../AbstractScdSQLCrudRepository.java | 39 + .../sct/repository/H2XMLTypeMapper.java | 30 + .../sct/repository/PostgreSqlXmlDialect.java | 14 + .../sct/repository/PostgresXMLTypeMapper.java | 53 ++ .../sct/repository/ScdBaseXRepository.java | 44 ++ .../sct/repository/ScdJpaRepository.java | 14 + .../sct/repository/SimpleScdRepository.java | 66 ++ .../sct/repository/SqlXmlTypeMapper.java | 51 ++ .../compas/sct/ApplicationContextTest.java | 28 + .../CompasDataAccessExceptionTest.java | 19 + .../sct/model/dto/ConnectedApDTOTest.java | 27 + .../compas/sct/model/dto/ExtRefDTOTest.java | 25 + .../compas/sct/model/dto/IedDTOTest.java | 19 + .../compas/sct/model/dto/LDeviceDTOTest.java | 26 + .../compas/sct/model/dto/LNodeDTOTest.java | 62 ++ .../model/dto/ResumedDataTemplateTest.java | 35 + .../compas/sct/model/dto/ScdDTOTest.java | 41 ++ .../sct/model/dto/SubNetworkDTOTest.java | 28 + .../sct/model/entity/SimpleScdTest.java | 34 + .../compas/sct/model/entity/package-info.java | 9 + .../sct/repository/H2XMLTypeMapperTest.java | 41 ++ .../repository/PostgresXMLTypeMapperTest.java | 53 ++ .../repository/SimpleScdRepositoryTest.java | 120 ++++ .../lfenergy/compas/sct/testhelper/DTO.java | 228 ++++++ sct-data/src/test/resources/application.yml | 24 + .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 64 ++ .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 62 ++ .../Icd_With_Identical_DTT.xml | 69 ++ .../IEDImportHelper/icd_import_ied_test.xml | 94 +++ .../scl/SCD/scd_ied_receiver_test.xml | 69 ++ .../resources/scl/SCD/scd_with_dtt_test.xml | 69 ++ .../resources/scl/SCD/scd_with_ieds_test.xml | 101 +++ sct-service/pom.xml | 37 + .../sct/config/XMLMarshallerConfig.java | 18 + .../compas/sct/config/XSDFileProperties.java | 28 + .../sct/service/AbstractSqlScdService.java | 50 ++ .../compas/sct/service/ISCDService.java | 110 +++ .../sct/service/SimpleSqlScdService.java | 218 ++++++ .../service/scl/SclCommunicationManager.java | 75 ++ .../service/scl/SclDataTemplateManager.java | 665 ++++++++++++++++++ .../sct/service/scl/SclHeaderManager.java | 60 ++ .../compas/sct/service/scl/SclIEDManager.java | 221 ++++++ .../compas/sct/service/scl/SclManager.java | 60 ++ .../src/main/resources/icd/icd_test.xml | 101 +++ .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 64 ++ .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 62 ++ .../Icd_With_Identical_DTT.xml | 69 ++ .../IEDImportHelper/icd_import_ied_test.xml | 82 +++ .../scl/SCD/scd_ied_receiver_test.xml | 69 ++ .../resources/scl/SCD/scd_with_dtt_test.xml | 69 ++ .../resources/scl/SCD/scd_with_ieds_test.xml | 109 +++ .../compas/sct/ApplicationContextTest.java | 23 + .../compas/sct/model/entity/package-info.java | 9 + .../sct/service/SqlScdServiceAndDBTest.java | 269 +++++++ .../scl/SclCommunicationManagerTest.java | 87 +++ .../scl/SclDataTemplateManagerTest.java | 566 +++++++++++++++ .../sct/service/scl/SclHeaderManagerTest.java | 71 ++ .../sct/service/scl/SclIEDManagerTest.java | 282 ++++++++ .../sct/service/scl/SclManagerTest.java | 5 + .../src/test/resources/application.yml | 9 + .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 64 ++ .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 62 ++ .../Icd_With_Identical_DTT.xml | 69 ++ .../IEDImportHelper/icd_import_ied_test.xml | 94 +++ .../scl/SCD/scd_ied_receiver_test.xml | 69 ++ .../resources/scl/SCD/scd_with_dtt_test.xml | 69 ++ .../resources/scl/SCD/scd_with_ieds_test.xml | 102 +++ 95 files changed, 6617 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 sct-coverage/pom.xml create mode 100644 sct-data/pom.xml create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java create mode 100644 sct-data/src/test/resources/application.yml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml create mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml create mode 100644 sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml create mode 100644 sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml create mode 100644 sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml create mode 100644 sct-service/pom.xml create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java create mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java create mode 100644 sct-service/src/main/resources/icd/icd_test.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml create mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml create mode 100644 sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml create mode 100644 sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml create mode 100644 sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java create mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java create mode 100644 sct-service/src/test/resources/application.yml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml create mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml create mode 100644 sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml create mode 100644 sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml create mode 100644 sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a2e922f9b --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +.scannerwork +sonar-project.properties +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..18dabdcdb --- /dev/null +++ b/pom.xml @@ -0,0 +1,99 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.2 + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + pom + COMPAS-SCT + + + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + test + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + org.lfenergy.compas + core-commons + ${compas.core.version} + + + + sct-data + sct-service + sct-coverage + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + org.jacoco + jacoco-maven-plugin + 0.8.6 + + + + + + + org.jacoco + jacoco-maven-plugin + + + prepare-agent + + prepare-agent + + + + + + + \ No newline at end of file diff --git a/sct-coverage/pom.xml b/sct-coverage/pom.xml new file mode 100644 index 000000000..6a18222e1 --- /dev/null +++ b/sct-coverage/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + ../pom.xml + + + sct-coverage + SCT-Coverage + + + true + + + + org.lfenergy.compas + sct-data + ${project.version} + + + org.lfenergy.compas + sct-service + ${project.version} + + + + + + org.jacoco + jacoco-maven-plugin + + + report-aggregate + test + + report-aggregate + + + + + + + \ No newline at end of file diff --git a/sct-data/pom.xml b/sct-data/pom.xml new file mode 100644 index 000000000..eb62c042f --- /dev/null +++ b/sct-data/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + + + sct-data + + SCT DATA + + \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java b/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java new file mode 100644 index 000000000..9bec65351 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java @@ -0,0 +1,13 @@ +package org.lfenergy.compas.sct.exception; + + +public class CompasDataAccessException extends Exception { + + public CompasDataAccessException(String message) { + super(message); + } + + public CompasDataAccessException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java new file mode 100644 index 000000000..adfa0cdae --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java @@ -0,0 +1,13 @@ +package org.lfenergy.compas.sct.model; + +import lombok.NonNull; + +import java.util.Set; + +public interface IAccessPointDTO { + String getName(); + void setName(String name); + void addLDevice(@NonNull T ld); + + @NonNull Set getLDevices(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java new file mode 100644 index 000000000..2a47d0f5d --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java @@ -0,0 +1,9 @@ +package org.lfenergy.compas.sct.model; + +public interface IConnectedApDTO { + String getIedName(); + String getApName(); + + void setIedName(String name); + void setApName(String name); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java new file mode 100644 index 000000000..9847c0b71 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java @@ -0,0 +1,5 @@ +package org.lfenergy.compas.sct.model; + +public interface IControlBlockDTO { + +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java new file mode 100644 index 000000000..c8e89851c --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java @@ -0,0 +1,96 @@ +package org.lfenergy.compas.sct.model; + + +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TServiceType; + +public interface IExtRefDTO { + + String getDesc(); + String getPDO(); + String getPLN(); + String getPDA(); + String getIntAddr(); + String getLdInst(); + String getIedName(); + String getPrefix(); + String getLnClass(); + String getLnInst(); + String getDoName(); + String getDaName(); + TServiceType getServiceType(); + String getSrcLDInst(); + String getSrcPrefix(); + String getSrcLNClass(); + String getSrcLNInst(); + String getSrcCBName(); + TServiceType getPServT(); + + void setDesc(String desc); + void setPDO(String pdo); + void setPLN(String pln); + void setPDA(String pda); + void setIntAddr(String intAddr); + void setLdInst(String ldInst); + void setIedName(String iedName); + void setPrefix(String prefix); + void setLnClass(String lnClass); + void setLnInst(String lnInst); + void setDoName(String doName); + void setDaName(String daName); + void setServiceType(TServiceType serviceType); + void setSrcLDInst(String srcLDInst); + void setSrcPrefix(String srcPrefix); + void setSrcLNClass( String srcLNClass); + void setSrcLNInst(String srcLNCInst); + void setSrcCBName(String srcCBName); + void setPServT(TServiceType pServT); + + default boolean isIdentical(IExtRefDTO other){ + + if(this.getDesc() != null && !getDesc().equals(other.getDesc())) return false; + if(this.getPDO() != null && !getPDO().equals(other.getPDO())) return false; + if(this.getPDA() != null && !getPDA().equals(other.getPDA())) return false; + if(this.getPLN() != null && !getPLN().equals(other.getPLN())) return false; + if(this.getIedName() != null && !getIedName().equals(other.getIedName())) return false; + if(this.getIntAddr() != null && !getIntAddr().equals(other.getIntAddr())) return false; + if(this.getLdInst() != null && !getLdInst().equals(other.getLdInst())) return false; + if(this.getPrefix() != null && !getPrefix().equals(other.getPrefix())) return false; + if(this.getLnClass() != null && !getLnClass().equals(other.getLnClass())) return false; + if(this.getLnInst() != null && !getLnInst().equals(other.getLnInst())) return false; + if(this.getDoName() != null && !getDoName().equals(other.getDoName())) return false; + if(this.getDaName() != null && !getDaName().equals(other.getDaName())) return false; + if(this.getSrcLNClass() != null && !getSrcLNClass().equals(other.getSrcLNClass())) return false; + if(this.getSrcLNInst() != null && !getSrcLNInst().equals(other.getSrcLNInst())) return false; + if(this.getSrcCBName() != null && !getSrcCBName().equals(other.getSrcCBName())) return false; + if(this.getSrcLDInst() != null && !getSrcLDInst().equals(other.getSrcLDInst())) return false; + if(this.getPServT() != null && !getPServT().equals(other.getPServT())) return false; + if(this.getServiceType() != null && !getServiceType().equals(other.getServiceType())) return false; + + return true; + } + + default boolean isIdentical(TExtRef other){ + + if(this.getDesc() != null && !getDesc().equals(other.getDesc())) return false; + if(this.getPDO() != null && !getPDO().equals(other.getPDO())) return false; + if(this.getPDA() != null && !getPDA().equals(other.getPDA())) return false; + if(this.getPLN() != null && !other.getPLN().contains(getPLN())) return false; + if(this.getIedName() != null && !getIedName().equals(other.getIedName())) return false; + if(this.getIntAddr() != null && !getIntAddr().equals(other.getIntAddr())) return false; + if(this.getLdInst() != null && !getLdInst().equals(other.getLdInst())) return false; + if(this.getPrefix() != null && !getPrefix().equals(other.getPrefix())) return false; + if(this.getLnClass() != null && !other.getLnClass().contains(getLnClass())) return false; + if(this.getLnInst() != null && !getLnInst().equals(other.getLnInst())) return false; + if(this.getDoName() != null && !getDoName().equals(other.getDoName())) return false; + if(this.getDaName() != null && !getDaName().equals(other.getDaName())) return false; + if(this.getSrcLNClass() != null && !other.getSrcLNClass().contains(getSrcLNClass())) return false; + if(this.getSrcLNInst() != null && !getSrcLNInst().equals(other.getSrcLNInst())) return false; + if(this.getSrcCBName() != null && !getSrcCBName().equals(other.getSrcCBName())) return false; + if(this.getSrcLDInst() != null && !getSrcLDInst().equals(other.getSrcLDInst())) return false; + if(this.getPServT() != null && !getPServT().equals(other.getPServT())) return false; + if(this.getServiceType() != null && !getServiceType().equals(other.getServiceType())) return false; + + return true; + } +} \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java new file mode 100644 index 000000000..d980a1087 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java @@ -0,0 +1,12 @@ +package org.lfenergy.compas.sct.model; + +import lombok.NonNull; + +import java.util.Set; + +public interface IIedDTO { + String getName(); + void setName(String name); + void addLDevice(T ld); + @NonNull Set getLDevices(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java new file mode 100644 index 000000000..965e3b20a --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java @@ -0,0 +1,16 @@ +package org.lfenergy.compas.sct.model; + +import org.springframework.lang.NonNull; + +import java.util.Set; + +public interface ILDeviceDTO { + String getLdInst(); + String getLdName(); + + void setLdName(String ldName); + void setLdInst(String inst); + + void addLNode(@NonNull T ln); + Set getLNodes(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java new file mode 100644 index 000000000..adda1c02c --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java @@ -0,0 +1,20 @@ +package org.lfenergy.compas.sct.model; + +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; + +import java.util.Set; + +public interface ILNodeDTO { + String getInst(); + String getLNodeClass(); + String getLNodeType(); + Set getExtRefs(); + Set getResumedDataTemplates(); + + void addExtRef(T extRef); + void addResumedDataTemplate(ResumedDataTemplate dtt); + + void setInst(String inst); + void setLNodeClass(String lnClass); + void setLNodeType(String lnType); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java new file mode 100644 index 000000000..c5fad6533 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java @@ -0,0 +1,7 @@ +package org.lfenergy.compas.sct.model; + +public interface IScd { + ID getId(); + byte[] getRawXml(); + ID getHeaderId(); +} \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java new file mode 100644 index 000000000..b0de05833 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java @@ -0,0 +1,15 @@ +package org.lfenergy.compas.sct.model; + +import org.lfenergy.compas.sct.exception.CompasDataAccessException; + +import java.util.Optional; + +public interface IScdCrudRepository { + S save(S s) throws CompasDataAccessException; + S update(S s) throws CompasDataAccessException; + Optional findById(ID id); + boolean existsById(ID id) ; + boolean existsByHeaderId(ID id) ; + long count() ; + void deleteById(ID id) throws CompasDataAccessException; +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java new file mode 100644 index 000000000..d2ddaf07e --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java @@ -0,0 +1,6 @@ +package org.lfenergy.compas.sct.model; + +public interface IScdModel { + ID getId(); + byte[] getRawXml(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java new file mode 100644 index 000000000..13848b5ef --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java @@ -0,0 +1,7 @@ +package org.lfenergy.compas.sct.model; + +import java.util.Set; + +public interface IServerDTO { + Set getLDevices(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java new file mode 100644 index 000000000..dd2598491 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java @@ -0,0 +1,13 @@ +package org.lfenergy.compas.sct.model; + +import java.util.Set; + +public interface ISubNetworkDTO { + String getName(); + String getType(); + Set getConnectedAPs(); + void addConnectedAPs(T cap); + + void setName(String name); + void setType(String type); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java new file mode 100644 index 000000000..f739444b8 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java @@ -0,0 +1,42 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.sct.model.IConnectedApDTO; + +import java.util.Objects; + +@Setter +@Getter +@NoArgsConstructor +public class ConnectedApDTO implements IConnectedApDTO { + private String iedName; + private String apName; + + public ConnectedApDTO(String iedName, String apName) { + this.iedName = iedName; + this.apName = apName; + } + + public ConnectedApDTO(TConnectedAP tConnectedAP) { + this.iedName = tConnectedAP.getIedName(); + this.apName = tConnectedAP.getApName(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || o.getClass() != this.getClass()) return false; + ConnectedApDTO that = (ConnectedApDTO) o; + return Objects.equals(iedName, that.iedName) && + Objects.equals(apName, that.apName); + } + + @Override + public int hashCode() { + return Objects.hash(iedName, apName); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java new file mode 100644 index 000000000..fa5b99b2a --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java @@ -0,0 +1,69 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TServiceType; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.springframework.lang.NonNull; + + +@Setter +@Getter +@NoArgsConstructor +public class ExtRefDTO implements IExtRefDTO { + private String iedName; + private String ldInst; + private String prefix; + private String lnClass; + private String lnInst; + private String doName; + private String daName; + private TServiceType serviceType; + private String srcLDInst; + private String srcPrefix; + private String srcLNClass; + private String srcLNInst; + private String srcCBName; + private String desc; + private String pLN; + private String pDO; + private String pDA; + private String intAddr; + private TServiceType pServT; + + public ExtRefDTO(@NonNull TExtRef tExtRef) { + iedName = tExtRef.getIedName(); + ldInst = tExtRef.getLdInst(); + prefix = tExtRef.getPrefix(); + if(!tExtRef.getLnClass().isEmpty()) { + this.lnClass = tExtRef.getLnClass().get(0); + } + lnInst = tExtRef.getLnInst(); + doName = tExtRef.getDoName(); + daName = tExtRef.getDaName(); + if(tExtRef.getServiceType() != null) { + serviceType = tExtRef.getServiceType(); + } + srcLDInst = tExtRef.getSrcLDInst(); + srcPrefix = tExtRef.getSrcPrefix(); + srcLNInst = tExtRef.getSrcLNInst(); + srcCBName = tExtRef.getSrcCBName(); + desc = tExtRef.getDesc(); + if(!tExtRef.getPLN().isEmpty()) { + pLN = tExtRef.getPLN().get(0); + } + if(!tExtRef.getSrcLNClass().isEmpty()){ + srcLNClass = tExtRef.getSrcLNClass().get(0); + } + pDO = tExtRef.getPDO(); + pDA = tExtRef.getPDA(); + intAddr = tExtRef.getIntAddr(); + if(tExtRef.getPServT() != null) { + pServT = tExtRef.getPServT(); + } + } +} + diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java new file mode 100644 index 000000000..f8aa7141b --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.sct.model.IIedDTO; +import org.lfenergy.compas.sct.model.ILDeviceDTO; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class IedDTO implements IIedDTO { + private String name; + private Set lDevices = new HashSet<>(); + + @Override + public Set getLDevices() { + return Set.of(lDevices.toArray(new LDeviceDTO[0])); + } + + @Override + public void addLDevice(T ld) { + lDevices.add((LDeviceDTO)ld); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java new file mode 100644 index 000000000..1d894b039 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java @@ -0,0 +1,11 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; + +import java.util.HashSet; +import java.util.Set; + +@Getter +public class ItemsDTO { + private Set items = new HashSet<>(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java new file mode 100644 index 000000000..224edae5e --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java @@ -0,0 +1,34 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.sct.model.ILDeviceDTO; +import org.lfenergy.compas.sct.model.ILNodeDTO; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class LDeviceDTO implements ILDeviceDTO { + private String ldInst; + private String ldName; + private Set lNodes = new HashSet<>(); + + @Override + public Set getLNodes() { + return Set.of(lNodes.toArray(new LNodeDTO[0])); + } + + @Override + public void addLNode(T ln) { + lNodes.add((LNodeDTO) ln); + } + + public void addAll(Set lns) { + lNodes.addAll(lns); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java new file mode 100644 index 000000000..26a963882 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java @@ -0,0 +1,62 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.sct.model.IControlBlockDTO; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.ILNodeDTO; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class LNodeDTO implements ILNodeDTO { + private String inst; + private String lNodeClass; + private String lNodeType; + private Set extRefs = new HashSet<>(); + private Set resumedDataTemplates = new HashSet<>(); + + public LNodeDTO(String inst, String lNClass, String lNType) { + this.inst = inst; + this.lNodeClass = lNClass; + this.lNodeType = lNType; + + } + + public static LNodeDTO extractData(TLN ln) { + String lnClass = ln.getLnClass().isEmpty() ? "" : ln.getLnClass().get(0); + LNodeDTO lNodeDTO = new LNodeDTO(ln.getInst(),lnClass,ln.getLnType()); + if(ln.getInputs() != null){ + ln.getInputs().getExtRef().forEach(tExtRef -> { + ExtRefDTO extRefDTO = new ExtRefDTO(tExtRef); + lNodeDTO.addExtRef(extRefDTO); + }); + } + return lNodeDTO; + } + + @Override + public Set getExtRefs() { + return Set.of(extRefs.toArray(new ExtRefDTO[0])); + } + + @Override + public void addExtRef(T extRef) { + extRefs.add((ExtRefDTO) extRef); + } + + @Override + public void addResumedDataTemplate(ResumedDataTemplate dtt) { + resumedDataTemplates.add(dtt); + } + + @Override + public Set getResumedDataTemplates(){ + return Set.of(resumedDataTemplates.toArray(new ResumedDataTemplate[0])); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java new file mode 100644 index 000000000..26a6796cb --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java @@ -0,0 +1,31 @@ +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.Setter; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; + +@Getter +@Setter +public class ResumedDataTemplate { + + private String lnType; + private String lnClass; + private String doName; // doName[.sdoName[.sdoName]] + private TPredefinedCDCEnum cdc; + private String daName; // doName[.bdaName[.bdaName]] + private TFCEnum fc; + + @Override + public String toString() { + return "ResumedDataTemplate{" + + "lnType='" + lnType + '\'' + + ", lnClass='" + lnClass + '\'' + + ", doName='" + doName + '\'' + + ", cdc='" + cdc + '\'' + + ", daName='" + daName + '\'' + + ", fc=" + fc + + '}'; + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java new file mode 100644 index 000000000..4e0a1f7cc --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java @@ -0,0 +1,51 @@ +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Objects; +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +public class ScdDTO { + private UUID id; + private String fileName; + private UUID headerId; + private String headerRevision; + private String headerVersion; + private String who; + private String what; + private String why; + + public ScdDTO(UUID id, String fileName, UUID headerId, String headerRevision, String headerVersion) { + this.id = id; + this.fileName = fileName; + this.headerId = headerId; + this.headerRevision = headerRevision; + this.headerVersion = headerVersion; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if(o == null) return false; + if (this.getClass() != o.getClass()) return false; + ScdDTO scdDTO = (ScdDTO) o; + return Objects.equals(id, scdDTO.id) && + Objects.equals(fileName, scdDTO.fileName) && + Objects.equals(headerId, scdDTO.headerId) && + Objects.equals(headerRevision, scdDTO.headerRevision) && + Objects.equals(headerVersion, scdDTO.headerVersion) && + Objects.equals(who, scdDTO.who) && + Objects.equals(what, scdDTO.what) && + Objects.equals(why, scdDTO.why); + } + + @Override + public int hashCode() { + return Objects.hash(id, fileName, headerId, headerRevision, headerVersion, who, what, why); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java new file mode 100644 index 000000000..f3fb46187 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java @@ -0,0 +1,91 @@ +package org.lfenergy.compas.sct.model.dto; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.sct.model.IConnectedApDTO; +import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.springframework.lang.NonNull; + +import java.util.HashSet; +import java.util.Set; + +@Setter +@Getter +@NoArgsConstructor +public class SubNetworkDTO implements ISubNetworkDTO { + + private String name; + private SubnetworkType type; + private Set connectedAPs = new HashSet<>(); + + public SubNetworkDTO(String name, String type) { + this.name = name; + this.type = SubnetworkType.fromValue(type); + } + + public SubNetworkDTO(@NonNull TSubNetwork subNetwork) { + this.name = subNetwork.getName(); + this.type = SubnetworkType.fromValue(subNetwork.getType()); + subNetwork.getConnectedAP().forEach(tConnectedAP -> { + connectedAPs.add(new ConnectedApDTO(tConnectedAP)); + }); + } + + @Override + public Set getConnectedAPs() { + return Set.of(connectedAPs.toArray(new ConnectedApDTO[0])); + } + + public String getType(){ + return this.type.value; + } + + @Override + public void addConnectedAPs(T cap) { + connectedAPs.add((ConnectedApDTO) cap); + } + + @Override + public void setType(String type) { + this.type = SubnetworkType.fromValue(type); + } + + + public enum SubnetworkType { + IP("IP"), // 0 + MMS("8-MMS"), // 1 + PHYSICAL("PHYSICAL"); // 2 + + + private final String value; + + SubnetworkType(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static SubnetworkType fromValue(String text) { + if(text.equalsIgnoreCase("8-MMS") ) { + return MMS; + } + + for (SubnetworkType b : SubnetworkType.values()) { + if (String.valueOf(b.value).equalsIgnoreCase(text)) { + return b; + } + } + return null; + } + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java new file mode 100644 index 000000000..08d741c5d --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java @@ -0,0 +1,70 @@ +package org.lfenergy.compas.sct.model.entity; + +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; +import org.lfenergy.compas.sct.model.IScd; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Objects; +import java.util.UUID; + + +@Getter +@Setter +@Entity +@Table(name = "SCD") +public class SimpleScd implements IScd, Serializable { + + @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator( + name = "UUID", + strategy = "org.hibernate.id.UUIDGenerator" + ) + @Column(name = "ID") + private UUID id; + + @Column(name="RAW_XML") + @Lob + @Type(type = "xmltype") + private byte[] rawXml; + + @Column(name = "FILE_NAME",unique = true) + private String fileName; + + @Column(name = "HEADER_ID") + private UUID headerId; + + @Column(name = "HEADER_VERSION") + private String headerVersion; + + @Column(name = "HEADER_REVISION") + private String headerRevision; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if(o == null) return false; + if (o.getClass() != getClass()) return false; + SimpleScd simpleScd = (SimpleScd) o; + return Objects.equals(id, simpleScd.id) && + Objects.equals(fileName, simpleScd.fileName) && + Objects.equals(headerId, simpleScd.headerId) && + Objects.equals(headerVersion, simpleScd.headerVersion) && + Objects.equals(headerRevision, simpleScd.headerRevision); + } + + @Override + public int hashCode() { + return Objects.hash(id, fileName, headerId, headerVersion, headerRevision); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java new file mode 100644 index 000000000..9ed174c44 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -0,0 +1,11 @@ + + +@TypeDef( + name = "xmltype", + defaultForType = byte[].class, + typeClass = PostgresXMLTypeMapper.class +) +package org.lfenergy.compas.sct.model.entity; + +import org.hibernate.annotations.TypeDef; +import org.lfenergy.compas.sct.repository.PostgresXMLTypeMapper; \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java new file mode 100644 index 000000000..f226a964c --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java @@ -0,0 +1,39 @@ +package org.lfenergy.compas.sct.repository; + +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.sct.model.IScd; +import org.lfenergy.compas.sct.model.IScdCrudRepository; + +/** + * Abstract DAO for SQL-like DB + * @param Entity model type + * @param Entity identifier type + */ +@Slf4j +public abstract class AbstractScdSQLCrudRepository, ID> implements IScdCrudRepository { + + protected Class genericType; + + public AbstractScdSQLCrudRepository(Class genericType) { + this.genericType = genericType; + } + + /** + * Get new unique identifier + * @param value object for whom to determine an identifier + * @return unique identifier + */ + public ID getNextID(T value){ + ID id = value.getHeaderId(); + if(id == null || existsByHeaderId(id)){ + id = getNextID(); + } + return id; + } + + /** + * Get new unique identifier + * @return unique identifier + */ + public abstract ID getNextID(); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java new file mode 100644 index 000000000..7673f7cb8 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java @@ -0,0 +1,30 @@ +package org.lfenergy.compas.sct.repository; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; + +public class H2XMLTypeMapper extends SqlXmlTypeMapper { + private final int[] SQL_TYPES = new int[] { Types.BINARY }; + + public static final H2XMLTypeMapper INSTANCE = new H2XMLTypeMapper(); + + @Override + public int[] sqlTypes() { + return SQL_TYPES.clone() ; + } + + @Override + public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException { + return resultSet.getBytes(names[0]); + } + + @Override + public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException { + preparedStatement.setBytes(index,(byte[]) value); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java new file mode 100644 index 000000000..fc7c9002a --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java @@ -0,0 +1,14 @@ +package org.lfenergy.compas.sct.repository; + +import org.hibernate.dialect.PostgreSQL95Dialect; + +import java.sql.Types; + +public class PostgreSqlXmlDialect extends PostgreSQL95Dialect{ + + public PostgreSqlXmlDialect() { + super(); + registerColumnType(Types.SQLXML, "XML"); + registerHibernateType(Types.OTHER, "pg-uuid"); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java new file mode 100644 index 000000000..74ff3c99d --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java @@ -0,0 +1,53 @@ +package org.lfenergy.compas.sct.repository; + +import lombok.extern.slf4j.Slf4j; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; + +import java.sql.*; + +@Slf4j +public class PostgresXMLTypeMapper extends SqlXmlTypeMapper { + private final int[] SQL_TYPES = new int[] { Types.SQLXML }; + + public static final PostgresXMLTypeMapper INSTANCE = new PostgresXMLTypeMapper(); + + public PostgresXMLTypeMapper() { + super(); + } + + @Override + public int[] sqlTypes() { + return SQL_TYPES.clone(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException { + byte[] rawXml = null; + SQLXML sqlxml = null; + try { + sqlxml = rs.getSQLXML(names[0]); + if(sqlxml != null) { + rawXml = sqlxml.getString().trim().getBytes(); + } + } finally { + if (null != sqlxml) { + sqlxml.free(); + } + } + return rawXml; + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor ssci) throws HibernateException, SQLException { + + SQLXML xmlType = st.getConnection().createSQLXML(); + if (value != null && value.getClass() == byte[].class) { + xmlType.setString(new String((byte[]) value)); + st.setObject(index, xmlType); + } else { + log.debug("Binding null to parameter {} ",index); + st.setNull(index,Types.SQLXML); + } + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java new file mode 100644 index 000000000..6c266c274 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java @@ -0,0 +1,44 @@ +package org.lfenergy.compas.sct.repository; + +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.IScdCrudRepository; + +import java.util.Optional; + +public class ScdBaseXRepository implements IScdCrudRepository { + private static final String NOT_IMPLEMENTED_YET = "Not implemented yet!"; + @Override + public S save(S s) throws CompasDataAccessException { + throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); + } + + @Override + public S update(S s) throws CompasDataAccessException { + throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); + } + + @Override + public Optional findById(ID id) { + return Optional.empty(); + } + + @Override + public boolean existsById(ID id) { + return false; + } + + @Override + public boolean existsByHeaderId(ID id) { + return false; + } + + @Override + public long count() { + return 0; + } + + @Override + public void deleteById(ID id) throws CompasDataAccessException { + throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java new file mode 100644 index 000000000..d89568362 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java @@ -0,0 +1,14 @@ +package org.lfenergy.compas.sct.repository; + +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + + +@Repository +public interface ScdJpaRepository extends JpaRepository { + + boolean existsByHeaderId(UUID id); +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java new file mode 100644 index 000000000..93a8fde86 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java @@ -0,0 +1,66 @@ +package org.lfenergy.compas.sct.repository; + + +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + + +@Slf4j +@Repository +public class SimpleScdRepository extends AbstractScdSQLCrudRepository { + + public final ScdJpaRepository scdJpaRepository; + + @Autowired + public SimpleScdRepository(ScdJpaRepository scdJpaRepository) { + super(SimpleScd.class); + this.scdJpaRepository = scdJpaRepository; + } + + @Override + public UUID getNextID() { + return UUID.randomUUID(); + } + + @Override + public SimpleScd save(SimpleScd simpleScd) throws CompasDataAccessException { + return scdJpaRepository.save(simpleScd); + } + + + @Override + public SimpleScd update(SimpleScd simpleScd) throws CompasDataAccessException { + return scdJpaRepository.save(simpleScd); + } + + @Override + public Optional findById(UUID uuid) { + return scdJpaRepository.findById(uuid); + } + + @Override + public boolean existsById(UUID uuid) { + return scdJpaRepository.existsById(uuid); + } + + @Override + public boolean existsByHeaderId(UUID uuid) { + return scdJpaRepository.existsByHeaderId(uuid); + } + + @Override + public long count() { + return scdJpaRepository.count(); + } + + @Override + public void deleteById(UUID uuid) { + scdJpaRepository.deleteById(uuid); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java new file mode 100644 index 000000000..637ed86e1 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java @@ -0,0 +1,51 @@ +package org.lfenergy.compas.sct.repository; + +import org.hibernate.HibernateException; +import org.hibernate.usertype.UserType; + +import java.io.Serializable; +import java.util.Objects; + + +public abstract class SqlXmlTypeMapper implements UserType, Serializable { + + @Override + public Class returnedClass() { + return byte[].class; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + return Objects.equals(x,y); + } + + @Override + public int hashCode(Object x) throws HibernateException { + return Objects.hashCode(x); + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + return value; + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable) value; + } + + @Override + public Object assemble(Serializable serializable, Object owner) throws HibernateException { + return serializable; + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return deepCopy(original); + } +} diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java new file mode 100644 index 000000000..96295914e --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; + +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootTest +@ActiveProfiles("test") +public class ApplicationContextTest { + + @Test + public void contextLoads() { + // do nothing + } + + @SpringBootApplication + @EnableJpaRepositories + @EnableTransactionManagement + public static class Context { + + } +} diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java new file mode 100644 index 000000000..248afdc0f --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java @@ -0,0 +1,19 @@ +package org.lfenergy.compas.sct.exception; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +class CompasDataAccessExceptionTest { + + @Test + void testConstructor(){ + CompasDataAccessException compasDAOException = new CompasDataAccessException("Exception message"); + + assertEquals("Exception message", compasDAOException.getMessage()); + compasDAOException = new CompasDataAccessException("Exception message", + new RuntimeException("Please check me")); + + assertEquals(compasDAOException.getCause().getClass(),RuntimeException.class); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java new file mode 100644 index 000000000..424b4f8f3 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java @@ -0,0 +1,27 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class ConnectedApDTOTest { + + @Test + public void testConstruction(){ + ConnectedApDTO connectedApDTO = DTO.createCapDTO(false); + ConnectedApDTO connectedApDTO1 = DTO.createCapDTO(true); + ConnectedApDTO connectedApDTO2 = new ConnectedApDTO(DTO.createCap()); + assertAll("CAP", + () -> assertEquals(DTO.IED_NAME, connectedApDTO.getIedName()), + () -> assertEquals(DTO.AP_NAME, connectedApDTO.getApName()), + () -> assertEquals(DTO.AP_NAME, connectedApDTO2.getApName()), + () -> assertEquals(connectedApDTO1, connectedApDTO), + () -> assertFalse(connectedApDTO.equals(null)), + () -> assertFalse(connectedApDTO.equals("TOTO")), + () -> assertEquals(connectedApDTO.hashCode(), connectedApDTO1.hashCode()) + ); + + + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java new file mode 100644 index 000000000..91cfd70a1 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java @@ -0,0 +1,25 @@ +package org.lfenergy.compas.sct.model.dto; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.sct.testhelper.DTO; + +class ExtRefDTOTest { + + @Test + void testIsIdentical(){ + ExtRefDTO extRefDTO = DTO.createExtRefDTO(); + ExtRefDTO extRefDTO_bis = new ExtRefDTO(DTO.createExtRef()); + assertTrue(extRefDTO.isIdentical(DTO.createExtRef())); + assertTrue(extRefDTO.isIdentical(extRefDTO_bis)); + assertFalse(extRefDTO.isIdentical(new TExtRef())); + assertFalse(extRefDTO.isIdentical(new ExtRefDTO())); + + extRefDTO_bis.setIntAddr(DTO.INT_ADDR + "_1"); + assertFalse(extRefDTO.isIdentical(extRefDTO_bis)); + extRefDTO_bis.setPLN(DTO.P_LN + "_1"); + assertFalse(extRefDTO.isIdentical(extRefDTO_bis)); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java new file mode 100644 index 000000000..ffc323bee --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java @@ -0,0 +1,19 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class IedDTOTest { + + @Test + public void testConstruction(){ + IedDTO iedDTO = DTO.createIedDTO(); + + assertAll("IedDTO", + () -> assertEquals(DTO.IED_NAME, iedDTO.getName()), + () -> assertFalse(iedDTO.getLDevices().isEmpty()) + ); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java new file mode 100644 index 000000000..38ae12517 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java @@ -0,0 +1,26 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +class LDeviceDTOTest { + + @Test + public void testConstruction(){ + LDeviceDTO lDeviceDTO = DTO.createLdDTO(); + + assertAll("LD_DTO", + () -> assertEquals(DTO.LD_INST, lDeviceDTO.getLdInst()), + () -> assertEquals(DTO.LD_NAME, lDeviceDTO.getLdName()), + () -> assertFalse(lDeviceDTO.getLNodes().isEmpty()) + ); + + Set nodeDTOs = Set.of(DTO.createLNodeDTO(),DTO.createLNodeDTO()); + lDeviceDTO.addAll(nodeDTOs); + assertEquals(3,lDeviceDTO.getLNodes().size()); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java new file mode 100644 index 000000000..b7e0dcf4c --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java @@ -0,0 +1,62 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TInputs; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class LNodeDTOTest { + + + @Test + public void testConstruction(){ + LNodeDTO lNodeDTO = DTO.createLNodeDTO(); + lNodeDTO.addExtRef(DTO.createExtRefDTO()); + lNodeDTO.addResumedDataTemplate(new ResumedDataTemplate()); + + assertAll("LNodeDTO", + () -> assertEquals(DTO.LN_INST, lNodeDTO.getInst()), + () -> assertEquals(DTO.LN_CLASS, lNodeDTO.getLNodeClass()), + () -> assertEquals(DTO.LN_TYPE, lNodeDTO.getLNodeType()), + () -> assertFalse(lNodeDTO.getExtRefs().isEmpty()), + () -> assertFalse(lNodeDTO.getResumedDataTemplates().isEmpty()) + ); + LNodeDTO lNodeDTO1 = new LNodeDTO(); + lNodeDTO1.setInst(DTO.LN_INST); + lNodeDTO1.setLNodeClass(DTO.LN_CLASS); + lNodeDTO1.setLNodeType(DTO.LN_TYPE); + lNodeDTO1.setExtRefs(lNodeDTO.getExtRefs()); + lNodeDTO1.setResumedDataTemplates(lNodeDTO.getResumedDataTemplates()); + + assertAll("LNodeDTO1", + () -> assertEquals(DTO.LN_INST, lNodeDTO1.getInst()), + () -> assertEquals(DTO.LN_CLASS, lNodeDTO1.getLNodeClass()), + () -> assertEquals(DTO.LN_TYPE, lNodeDTO1.getLNodeType()), + () -> assertFalse(lNodeDTO1.getExtRefs().isEmpty()), + () -> assertFalse(lNodeDTO1.getResumedDataTemplates().isEmpty()) + ); + } + + @Test + public void testExtractData(){ + TLN tln = new TLN(); + tln.setInst(DTO.LN_INST); + tln.setLnType(DTO.LN_TYPE); + tln.getLnClass().add(DTO.LN_CLASS); + TExtRef tExtRef = DTO.createExtRef(); + TInputs tInputs = new TInputs(); + tInputs.getExtRef().add(tExtRef); + tln.setInputs(tInputs); + + LNodeDTO lNodeDTO = LNodeDTO.extractData(tln); + assertAll("LNodeDTO", + () -> assertEquals(DTO.LN_INST, lNodeDTO.getInst()), + () -> assertEquals(DTO.LN_CLASS, lNodeDTO.getLNodeClass()), + () -> assertEquals(DTO.LN_TYPE, lNodeDTO.getLNodeType()) + ); + assertTrue(!lNodeDTO.getExtRefs().isEmpty()); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java new file mode 100644 index 000000000..e701cefe9 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java @@ -0,0 +1,35 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; + +import static org.junit.jupiter.api.Assertions.*; + +class ResumedDataTemplateTest { + + + @Test + void testResumedDataTemplate(){ + ResumedDataTemplate rDTT = new ResumedDataTemplate(); + rDTT.setCdc(TPredefinedCDCEnum.WYE); + rDTT.setFc(TFCEnum.CF); + rDTT.setLnType("LN1"); + rDTT.setLnClass(TLLN0Enum.LLN_0.value()); + rDTT.setDoName("FACntRs1.res"); + rDTT.setDaName("d"); + + System.out.println(rDTT); + + assertAll("RDTT", + () -> assertEquals(TPredefinedCDCEnum.WYE, rDTT.getCdc()), + () -> assertEquals(TFCEnum.CF, rDTT.getFc()), + () -> assertEquals("LN1", rDTT.getLnType()), + () -> assertEquals(TLLN0Enum.LLN_0.value(), rDTT.getLnClass()), + () -> assertEquals("FACntRs1.res", rDTT.getDoName()), + () -> assertEquals("d", rDTT.getDaName()) + ); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java new file mode 100644 index 000000000..cca20c753 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java @@ -0,0 +1,41 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +class ScdDTOTest { + + + @Test + void testScdDTO(){ + UUID id = UUID.randomUUID(); + ScdDTO scdDTO = DTO.createScdDTO(id); + ScdDTO scdDTO2 = new ScdDTO(id,DTO.FILE_NAME,id,DTO.HEADER_REVISION,DTO.HEADER_VERSION); + + assertAll("scdDTO", + () -> assertEquals(id,scdDTO.getId()), + () -> assertEquals(DTO.HEADER_REVISION,scdDTO.getHeaderRevision()), + () -> assertEquals(DTO.HEADER_VERSION,scdDTO.getHeaderVersion()), + () -> assertEquals(DTO.FILE_NAME,scdDTO.getFileName()), + () -> assertEquals("WHO",scdDTO.getWho()), + () -> assertEquals("WHY",scdDTO.getWhy()), + () -> assertEquals("WHAT",scdDTO.getWhat()), + () -> assertEquals(DTO.FILE_NAME,scdDTO2.getFileName()), + () -> assertEquals(id,scdDTO.getHeaderId()) + ); + + ScdDTO scdDTO1 = DTO.createScdDTO(id); + + assertEquals(scdDTO1,scdDTO); + + scdDTO1.setFileName(scdDTO1.getFileName() + "_1"); + assertNotEquals(scdDTO1,scdDTO); + assertNotEquals(scdDTO1.hashCode(),scdDTO.hashCode()); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java new file mode 100644 index 000000000..fef619b00 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class SubNetworkDTOTest { + + @Test + public void testConstruction(){ + SubNetworkDTO subNetworkDTO = DTO.createSnDTO(false); + SubNetworkDTO subNetworkDTO1 = DTO.createSnDTO(true); + SubNetworkDTO subNetworkDTO2 = new SubNetworkDTO(DTO.createSn()); + + assertAll("SN", + () -> assertEquals(DTO.SN_NAME,subNetworkDTO.getName()), + () -> assertEquals(SubNetworkDTO.SubnetworkType.MMS.toString(),subNetworkDTO.getType()), + () -> assertFalse(subNetworkDTO.getConnectedAPs().isEmpty()), + () -> assertFalse(subNetworkDTO2.getConnectedAPs().isEmpty()), + () -> assertTrue(subNetworkDTO1.getConnectedAPs().isEmpty()) + ); + + assertNotNull(SubNetworkDTO.SubnetworkType.fromValue("IP")); + assertNull(SubNetworkDTO.SubnetworkType.fromValue("IPSEC")); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java new file mode 100644 index 000000000..598e1d3c9 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java @@ -0,0 +1,34 @@ +package org.lfenergy.compas.sct.model.entity; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +class SimpleScdTest { + @Test + void testScd(){ + UUID id = UUID.randomUUID(); + SimpleScd scd = DTO.createScd(id); + assertEquals(scd,scd); + + assertAll("SCD", + () -> assertEquals(id, scd.getId()), + () -> assertArrayEquals(DTO.DUMMY_PAYLOAD.getBytes(), scd.getRawXml()), + () -> assertEquals(DTO.HEADER_REVISION, scd.getHeaderRevision()), + () -> assertEquals(DTO.HEADER_VERSION, scd.getHeaderVersion()), + () -> assertEquals(id, scd.getHeaderId()) + ); + + SimpleScd scd1 = DTO.createScd(id); + assertEquals(scd1.hashCode(),scd.hashCode()); + assertEquals(scd1,scd); + //change + scd1.setFileName(scd1.getFileName() + "1"); + assertNotEquals(scd1.hashCode(),scd.hashCode()); + assertNotEquals(scd1,scd); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java new file mode 100644 index 000000000..548b9a3c0 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -0,0 +1,9 @@ +@TypeDef( + name = "xmltype", + defaultForType = byte[].class, + typeClass = H2XMLTypeMapper.class +) +package org.lfenergy.compas.sct.model.entity; + +import org.hibernate.annotations.TypeDef; +import org.lfenergy.compas.sct.repository.H2XMLTypeMapper; \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java new file mode 100644 index 000000000..a786fd16a --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java @@ -0,0 +1,41 @@ +package org.lfenergy.compas.sct.repository; + +import org.junit.jupiter.api.Test; + +import java.io.Serializable; + +import static org.junit.jupiter.api.Assertions.*; + +class H2XMLTypeMapperTest { + private H2XMLTypeMapper h2XMLTypeMapper = new H2XMLTypeMapper(); + + @Test + void testReturnedClass(){ + assertEquals(byte[].class,h2XMLTypeMapper.returnedClass()); + } + + @Test + void testEquals(){ + byte[] b1 = "hello".getBytes(); + byte[] b2 = "world".getBytes(); + assertTrue(h2XMLTypeMapper.equals(b1,b1)); + assertNotEquals(h2XMLTypeMapper.hashCode(b1),h2XMLTypeMapper.hashCode(b2)); + assertFalse(h2XMLTypeMapper.equals(b1,b2)); + } + + @Test + void testDisassemble(){ + byte[] b = "hello".getBytes(); + + assertNotNull(h2XMLTypeMapper.disassemble(b)); + assertTrue(Serializable.class.isInstance(h2XMLTypeMapper.disassemble(b))); + + // just for coverage ... assemble does nothing exceptional + Serializable bSer = h2XMLTypeMapper.disassemble(b); + h2XMLTypeMapper.assemble(bSer, new byte[]{}); + + } + + + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java new file mode 100644 index 000000000..549f80f5d --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java @@ -0,0 +1,53 @@ +package org.lfenergy.compas.sct.repository; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.SQLXML; +import java.sql.Types; + +import static org.junit.jupiter.api.Assertions.*; + +class PostgresXMLTypeMapperTest { + + private PostgresXMLTypeMapper xmlTypeMapper = new PostgresXMLTypeMapper(); + + @Test + void testSqlTypes() { + assertArrayEquals(new int[]{Types.SQLXML}, xmlTypeMapper.sqlTypes()); + } + + @Test + void testNullSafeSet() throws SQLException { + PreparedStatement mockPreparedStatement = Mockito.mock(PreparedStatement.class); + Connection mockConnection = Mockito.mock(Connection.class); + SQLXML mockXmlType = Mockito.mock(SQLXML.class); + + Mockito.when(mockPreparedStatement.getConnection()).thenReturn(mockConnection); + Mockito.when(mockConnection.createSQLXML()).thenReturn(mockXmlType); + byte[] b = "".getBytes(); + + xmlTypeMapper.nullSafeSet(mockPreparedStatement,b,1,null); + + xmlTypeMapper.nullSafeSet(mockPreparedStatement,null,1,null); + } + + @Test + void testNullSafeGet() throws SQLException { + ResultSet mockResultSet = Mockito.mock(ResultSet.class); + SQLXML mockXmlType = Mockito.mock(SQLXML.class); + + Mockito.when(mockResultSet.getSQLXML(ArgumentMatchers.anyString())).thenReturn(mockXmlType); + Mockito.when(mockXmlType.getString()).thenReturn(""); + byte[] expected = "".getBytes(); + byte[] res = (byte[]) xmlTypeMapper.nullSafeGet(mockResultSet,new String[]{"RAW_XML"},null,null); + + assertArrayEquals(res,expected); + + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java new file mode 100644 index 000000000..097e375be --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java @@ -0,0 +1,120 @@ +package org.lfenergy.compas.sct.repository; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.ApplicationContextTest; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = ApplicationContextTest.Context.class) +@ActiveProfiles("test") +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +class SimpleScdRepositoryTest { + + @Autowired + SimpleScdRepository simpleScdRepository; + + @Test + void testShouldReturnOKWhenGetNextID() { + assertNotNull(simpleScdRepository.getNextID()); + } + + @Test + void testShouldReturnOKWhenSave() throws CompasDataAccessException { + + SimpleScd simpleScd = createScd(null); + SimpleScd expectedScd = simpleScdRepository.save(simpleScd); + assertNotNull(expectedScd.getId()); + } + + @Test + void testShouldReturnOKWhenUpdate() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertNotNull(savedScd.getId()); + + savedScd.setHeaderRevision("2.0"); + SimpleScd expectedScd = simpleScdRepository.update(simpleScd); + assertEquals("2.0", savedScd.getHeaderRevision()); + } + + @Test + void testShouldReturnOKWhenFindById() throws CompasDataAccessException { + + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertNotNull(savedScd.getId()); + + SimpleScd expectedScd = simpleScdRepository.findById(savedScd.getId()) + .orElseThrow(() -> new CompasDataAccessException("Not found")); + assertEquals(expectedScd.getId(),savedScd.getId()); + + } + + @Test + void testShouldReturnNOKWhenFindByIdCauseUnknownId() throws CompasDataAccessException { + + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertNotNull(savedScd.getId()); + + assertThrows( CompasDataAccessException.class, () -> simpleScdRepository.findById(UUID.randomUUID()) + .orElseThrow(() -> new CompasDataAccessException("Not found"))); + } + + @Test + void existsById() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertTrue(simpleScdRepository.existsById(savedScd.getId())); + } + + @Test + void existsByHeaderId() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(null); + SimpleScd savedScd = simpleScdRepository.save(simpleScd); + assertTrue(simpleScdRepository.existsByHeaderId(savedScd.getHeaderId())); + } + + @Test + void count() { + } + + @Test + void deleteById() { + } + + @Test + void testGetNextID() throws CompasDataAccessException { + SimpleScd simpleScd = createScd(UUID.randomUUID()); + assertEquals(simpleScd.getHeaderId(),simpleScdRepository.getNextID(simpleScd)); + + simpleScd = simpleScdRepository.save(simpleScd); + + UUID id = simpleScdRepository.getNextID(simpleScd); + assertNotEquals(id,simpleScd.getHeaderId()); + + SimpleScd anotherScd = createScd(null); + id = simpleScdRepository.getNextID(anotherScd); + assertNotNull(id); + assertNotEquals(id,simpleScd.getHeaderId()); + } + private SimpleScd createScd(UUID id){ + SimpleScd scd = new SimpleScd(); + scd.setId(id); + scd.setRawXml("blablabla".getBytes()); + scd.setFileName("FN"); + scd.setHeaderId(id); + scd.setHeaderRevision("RV"); + scd.setHeaderVersion("VR"); + + return scd; + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java new file mode 100644 index 000000000..8fc9073b3 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java @@ -0,0 +1,228 @@ +package org.lfenergy.compas.sct.testhelper; + +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; +import org.lfenergy.compas.scl.TServiceType; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.IedDTO; +import org.lfenergy.compas.sct.model.dto.LDeviceDTO; +import org.lfenergy.compas.sct.model.dto.LNodeDTO; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; +import org.lfenergy.compas.sct.model.dto.ScdDTO; +import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; +import org.lfenergy.compas.sct.model.entity.SimpleScd; + +import java.util.UUID; + +public class DTO { + + /*-----------------------------------------------*/ + /* Scd/ScdDTO */ + /*-----------------------------------------------*/ + public static final String HEADER_REVISION = "1.0"; + public static final String HEADER_VERSION = "1.0"; + public static final String FILE_NAME = "filename"; + public static final String DUMMY_PAYLOAD = "blablabla"; + + public static SimpleScd createScd(UUID id){ + SimpleScd scd = new SimpleScd(); + scd.setId(id); + scd.setRawXml(DUMMY_PAYLOAD.getBytes()); + scd.setFileName(FILE_NAME); + scd.setHeaderId(id); + scd.setHeaderRevision(HEADER_REVISION); + scd.setHeaderVersion(HEADER_VERSION); + + return scd; + } + public static ScdDTO createScdDTO(UUID id){ + ScdDTO scdDTO = new ScdDTO(); + scdDTO.setId(id); + scdDTO.setHeaderId(id); + scdDTO.setHeaderRevision(HEADER_REVISION); + scdDTO.setHeaderVersion(HEADER_VERSION); + scdDTO.setFileName(FILE_NAME); + scdDTO.setWhat("WHAT"); + scdDTO.setWhy("WHY"); + scdDTO.setWho("WHO"); + + return scdDTO; + } + + /*-----------------------------------------------*/ + /* ExtRefDTO */ + /*-----------------------------------------------*/ + public static final String DESC = "DESC"; + public static final String P_DA = "d"; + public static final String P_DO = "FACntRs1.res"; + public static final String P_LN = TLLN0Enum.LLN_0.value(); + public static final String P_SERV_T = "Report"; + public static final String INT_ADDR = "INT_ADDR"; + + public static final String IED_NAME = "IED_NAME"; + public static final String LD_INST= "PIOC"; + public static final String LN_INST= "LN"; + public static final String LN_CLASS= "LN_CLASS"; + public static final String DA_NAME = P_DA; + public static final String DO_NAME = P_DO; + public static final String PREFIX = "PR"; + public static final String SERVICE_TYPE = P_SERV_T; + + public static final String SRC_LD_INST= LD_INST; + public static final String SRC_LN_INST= LN_INST; + public static final String SRC_LN_CLASS= LN_CLASS; + public static final String SRC_PREFIX = PREFIX; + public static final String SRC_CB_NAME = "SRC_CB_NAME"; + + public static TExtRef createExtRef(){ + TExtRef tExtRef = new TExtRef(); + tExtRef.setDesc(DESC); + tExtRef.setPDA(P_DA); + tExtRef.setPDO(P_DO); + tExtRef.getPLN().add(P_LN); + tExtRef.setPServT(TServiceType.fromValue(P_SERV_T)); + tExtRef.setIntAddr(INT_ADDR); + + tExtRef.setIedName(IED_NAME); + tExtRef.setLdInst(LD_INST); + tExtRef.setLnInst(LN_INST); + tExtRef.getLnClass().add(LN_CLASS); + tExtRef.setDaName(DA_NAME); + tExtRef.setDoName(DO_NAME); + tExtRef.setPrefix(PREFIX); + tExtRef.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); + + tExtRef.setSrcLDInst(SRC_LD_INST); + tExtRef.setSrcLNInst(SRC_LN_INST); + tExtRef.getSrcLNClass().add(SRC_LN_CLASS); + tExtRef.setSrcPrefix(SRC_PREFIX); + tExtRef.setSrcCBName(SRC_CB_NAME); + + return tExtRef; + } + public static ExtRefDTO createExtRefDTO(){ + ExtRefDTO tExtRef = new ExtRefDTO(); + tExtRef.setDesc(DESC); + tExtRef.setPDA(P_DA); + tExtRef.setPDO(P_DO); + tExtRef.setPLN(P_LN); + tExtRef.setPServT(TServiceType.fromValue(P_SERV_T)); + tExtRef.setIntAddr(INT_ADDR); + + tExtRef.setIedName(IED_NAME); + tExtRef.setLdInst(LD_INST); + tExtRef.setLnInst(LN_INST); + tExtRef.setLnClass(LN_CLASS); + tExtRef.setDaName(DA_NAME); + tExtRef.setDoName(DO_NAME); + tExtRef.setPrefix(PREFIX); + tExtRef.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); + + tExtRef.setSrcLDInst(SRC_LD_INST); + tExtRef.setSrcLNInst(SRC_LN_INST); + tExtRef.setSrcLNClass(SRC_LN_CLASS); + tExtRef.setSrcPrefix(SRC_PREFIX); + tExtRef.setSrcCBName(SRC_CB_NAME); + + return tExtRef; + } + /*-----------------------------------------------*/ + /* ResumedDataTemplate */ + /*-----------------------------------------------*/ + public static final String CDC = TPredefinedCDCEnum.WYE.value(); + public static final String FC = TFCEnum.CF.value(); + public static ResumedDataTemplate createRTT(){ + ResumedDataTemplate rDTT = new ResumedDataTemplate(); + rDTT.setCdc(TPredefinedCDCEnum.fromValue(CDC)); + rDTT.setFc(TFCEnum.fromValue(FC)); + rDTT.setLnType(LN_TYPE); + rDTT.setLnClass(TLLN0Enum.LLN_0.value()); + rDTT.setDoName(DO_NAME); + rDTT.setDaName(DA_NAME); + + return rDTT; + } + + /*-----------------------------------------------*/ + /* LNodeDTO */ + /*-----------------------------------------------*/ + public static final String LN_TYPE = "LN_TYPE"; + public static LNodeDTO createLNodeDTO(){ + return new LNodeDTO(LN_INST,LN_CLASS,LN_TYPE); + } + /*-----------------------------------------------*/ + /* ConnectedAPDTO */ + /*-----------------------------------------------*/ + public static final String AP_NAME = "AP_NAME"; + public static ConnectedApDTO createCapDTO(boolean byStep){ + if(byStep){ + ConnectedApDTO cap = new ConnectedApDTO(); + cap.setApName(AP_NAME); + cap.setIedName(IED_NAME); + } + return new ConnectedApDTO(IED_NAME,AP_NAME); + } + public static TConnectedAP createCap(){ + + TConnectedAP cap = new TConnectedAP(); + cap.setApName(AP_NAME); + cap.setIedName(IED_NAME); + return cap; + } + /*-----------------------------------------------*/ + /* SubNetworkDTO */ + /*-----------------------------------------------*/ + public static final String SN_NAME = "SN_NAME"; + public static SubNetworkDTO createSnDTO(boolean byStep){ + SubNetworkDTO subNetworkDTO = null; + if(byStep){ + subNetworkDTO = new SubNetworkDTO(); + subNetworkDTO.setName(SN_NAME); + subNetworkDTO.setType("8-MMS"); + } else { + subNetworkDTO = new SubNetworkDTO(SN_NAME, SubNetworkDTO.SubnetworkType.MMS.toString()); + subNetworkDTO.addConnectedAPs(createCapDTO(true)); + } + return subNetworkDTO; + } + + public static TSubNetwork createSn(){ + TSubNetwork subNetwork = new TSubNetwork(); + + subNetwork.setName(SN_NAME); + subNetwork.setType("8-MMS"); + subNetwork.getConnectedAP().add(createCap()); + + return subNetwork; + } + /*-----------------------------------------------*/ + /* LDeviceDTO */ + /*-----------------------------------------------*/ + public static final String LD_NAME = "LDPO"; + public static LDeviceDTO createLdDTO(){ + + LDeviceDTO lDeviceDTO = new LDeviceDTO(); + lDeviceDTO.setLdInst(LD_INST); + lDeviceDTO.setLdName(LD_NAME); + + lDeviceDTO.addLNode(createLNodeDTO()); + + return lDeviceDTO; + } + /*-----------------------------------------------*/ + /* IedDTO */ + /*-----------------------------------------------*/ + + public static IedDTO createIedDTO(){ + + IedDTO iedDTO = new IedDTO(); + iedDTO.setName(IED_NAME); + iedDTO.addLDevice(createLdDTO()); + return iedDTO; + } +} diff --git a/sct-data/src/test/resources/application.yml b/sct-data/src/test/resources/application.yml new file mode 100644 index 000000000..b2e57c5be --- /dev/null +++ b/sct-data/src/test/resources/application.yml @@ -0,0 +1,24 @@ +## YAML Template. +--- +spring: + #profile + profiles: + active: test + jpa: + show-sql: true + database-platform: org.hibernate.dialect.H2Dialect + datasource: + platform: h2 + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 250 + prepStmtCacheSqlLimit: 2048 + url: "jdbc:h2:mem:compas;MODE=ORACLE;DB_CLOSE_ON_EXIT=FALSE" + driver-class-name: org.h2.Driver + hikari: + username: sa + password: + +logging: + level: + root: INFO \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml new file mode 100644 index 000000000..28c4e3bfd --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -0,0 +1,64 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml new file mode 100644 index 000000000..89569eb67 --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -0,0 +1,62 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml new file mode 100644 index 000000000..8dc3681f3 --- /dev/null +++ b/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -0,0 +1,94 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml new file mode 100644 index 000000000..5a8a228b3 --- /dev/null +++ b/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml @@ -0,0 +1,101 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/pom.xml b/sct-service/pom.xml new file mode 100644 index 000000000..4a63515dc --- /dev/null +++ b/sct-service/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + + org.lfenergy.compas + compas-sct + 1.0-SNAPSHOT + + + sct-service + SCT SERVICE + + + + org.lfenergy.compas + sct-data + ${project.version} + + + + + \ No newline at end of file diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java new file mode 100644 index 000000000..d9a3a591e --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java @@ -0,0 +1,18 @@ +package org.lfenergy.compas.sct.config; + +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(XSDFileProperties.class) +public class XMLMarshallerConfig { + + @Bean + public MarshallerWrapper marshallerWrapper(XSDFileProperties xsdFileProperties) throws Exception { + MarshallerWrapper.Builder builder = new MarshallerWrapper.Builder(); + builder.withSchemaMap(xsdFileProperties.getPaths()); + return builder.build(); + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java new file mode 100644 index 000000000..2a37b6520 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java @@ -0,0 +1,28 @@ +package org.lfenergy.compas.sct.config; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.commons.CommonConstants; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + +@Getter +@Setter +@NoArgsConstructor +@ConfigurationProperties("compas.scl.schema") +public class XSDFileProperties { + + private Map paths; + + @PostConstruct + public void init() { + if (this.paths == null || this.paths.isEmpty()) { + paths = new HashMap<>(); + paths.put(CommonConstants.XML_DEFAULT_NS_PREFIX, CommonConstants.XML_DEFAULT_XSD_PATH); + } + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java new file mode 100644 index 000000000..d9591f624 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java @@ -0,0 +1,50 @@ +package org.lfenergy.compas.sct.service; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.IScd; +import org.lfenergy.compas.sct.repository.AbstractScdSQLCrudRepository; +import org.lfenergy.compas.sct.service.scl.SclManager; + +import java.util.UUID; + +@Setter +@Getter +@Slf4j +public abstract class AbstractSqlScdService , R extends AbstractScdSQLCrudRepository> + implements ISCDService { + + protected R repository; + + public AbstractSqlScdService(R repository){ + this.repository = repository; + } + + @Override + public T findScd(UUID id) throws CompasDataAccessException { + return repository.findById(id) + .orElseThrow(() -> new CompasDataAccessException("Unknown SCD with id '" + id + "'")); + } + + public SCL initiateScl(String hVersion, String hRevision){ + UUID hId = UUID.randomUUID(); + return SclManager.initialize(hId.toString(),hVersion,hRevision); + } + + public T addElement(T scd) throws CompasDataAccessException { + return repository.save(scd); + } + + public T updateElement(T scd) throws CompasDataAccessException{ + return addElement(scd); + } + + public T addHistoryItem(UUID id, String who, String what, String why) throws ScdException, CompasDataAccessException { + T scdObj = findScd(id); + return addHistoryItem(scdObj,who,what, why); + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java new file mode 100644 index 000000000..e7791ed60 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java @@ -0,0 +1,110 @@ +package org.lfenergy.compas.sct.service; + +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.IIedDTO; +import org.lfenergy.compas.sct.model.IScd; +import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.springframework.lang.NonNull; + +import java.util.Set; +import java.util.UUID; + +public interface ISCDService> { + /** + * Find SCD object for given ID + * @param id object identifier + * @return SCD object identified + * @throws CompasDataAccessException Data access exception on error + */ + T findScd(UUID id) throws CompasDataAccessException; + + /** + * Initiate SCD object with a generated header ID (UUID) + * @param filename scd file name + * @param hVersion scd header version + * @param hRevision scd header revision + * @return the initiated scd + * @throws ScdException exception thrown on error + */ + T initiateSCD(@NonNull String filename, @NonNull String hVersion, @NonNull String hRevision) throws ScdException; + + /** + * Add history item to the scd + * @param scdObj scd representation in database + * @param who scd modifier + * @param when scd modification's date + * @param why scd modification's reason + * @return the modified scd + * @throws ScdException exception thrown on error + */ + T addHistoryItem(T scdObj, String who, String when, String why) throws ScdException; + + /** + * Add/rename IED from ICD file to SCD + * This method import the ICD's DataTemplate as well + * @param scdObj SCD object receiving the ICD + * @param iedName iedName ofr the ICD to import + * @param icd Objectified ICD + * @return Scd object with the IED imported + * @throws ScdException exception thrown on error + */ + T addIED(T scdObj, String iedName, SCL icd) throws ScdException; + + /** + * Add/rename IED from ICD file to SCD + * This method import the ICD's DataTemplate as well + * @param scdObj SCD object receiving the ICD + * @param iedName iedName ofr the ICD to import + * @param rawIcd raw ICD content + * @return Scd object with the IED imported + * @throws ScdException exception thrown on error + */ + T addIED(T scdObj, String iedName, byte[] rawIcd) throws ScdException; + + /** + * Extract External Reference signals for given IED, AccessPoint and LDevice. + * @param scdObj SCD object encapsulating the receiver SCD of the ICD + * @param iedName IED name + * @param ldInst the logical device + * @param DTO type parameter + * @return IED generic DTO + * @throws ScdException exception thrown on error + */ + D extractExtRefs(T scdObj, String iedName, String ldInst) throws ScdException; + + /** + * + * @param scdObj + * @param iedName + * @param ldInst + * @param filter + * @param + * @param + * @return + * @throws ScdException + */ + + Set extractExtRefSources(T scdObj, String iedName, + String ldInst, U filter) throws ScdException; + + /** + * + * @param scdObj + * @param + * @return + * @throws ScdException + */ + Set getSubnetwork(T scdObj) throws ScdException; + + /** + * + * @param scdObject + * @param subNetworkDTO + * @return + * @throws ScdException + */ + T addSubnetworks(T scdObject,Set subNetworkDTO) throws ScdException; +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java new file mode 100644 index 000000000..118a71fd3 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java @@ -0,0 +1,218 @@ +package org.lfenergy.compas.sct.service; + +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TLDevice; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.sct.model.IConnectedApDTO; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.IedDTO; +import org.lfenergy.compas.sct.model.dto.LDeviceDTO; +import org.lfenergy.compas.sct.model.dto.LNodeDTO; +import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.lfenergy.compas.sct.repository.SimpleScdRepository; +import org.lfenergy.compas.sct.service.scl.SclCommunicationManager; +import org.lfenergy.compas.sct.service.scl.SclDataTemplateManager; +import org.lfenergy.compas.sct.service.scl.SclHeaderManager; +import org.lfenergy.compas.sct.service.scl.SclIEDManager; +import org.lfenergy.compas.sct.service.scl.SclManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + + +@Slf4j +@Service +public class SimpleSqlScdService extends AbstractSqlScdService{ + + private final MarshallerWrapper marshallerWrapper; + @Autowired + public SimpleSqlScdService(SimpleScdRepository repository, MarshallerWrapper marshallerWrapper) { + super(repository); + this.marshallerWrapper = marshallerWrapper; + } + + @Override + public SimpleScd initiateSCD(@NonNull String filename, @NonNull String hVersion, @NonNull String hRevision) throws ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setFileName(filename); + SCL scd = initiateScl(hVersion,hRevision); + scdObj.setHeaderId(UUID.fromString(scd.getHeader().getId())); + scdObj.setHeaderVersion(hVersion); + scdObj.setHeaderRevision(hRevision); + String rawXml = marshallerWrapper.marshall(scd); + + scdObj.setRawXml(rawXml.getBytes()); + return scdObj; + } + + @Override + public SimpleScd addHistoryItem(SimpleScd scdObj, String who, String what, String why) throws ScdException { + byte[] raw = scdObj.getRawXml(); + SCL scd = marshallerWrapper.unmarshall(raw); + SclHeaderManager sclHeaderManager = new SclHeaderManager(scd); + scd = sclHeaderManager.addHistoryItem(who,what,why); + byte[] rawXml = marshallerWrapper.marshall(scd).getBytes(); + scdObj.setRawXml(rawXml); + return scdObj; + } + + @Override + public SimpleScd addIED(SimpleScd scdObj, String iedName, SCL icd) throws ScdException { + SCL scd = marshallerWrapper.unmarshall(scdObj.getRawXml()); + SclManager sclManager = new SclManager(scd); + sclManager.addIED(icd,iedName); + scdObj.setRawXml(marshallerWrapper.marshall(sclManager.getReceiver()).getBytes()); + return scdObj; + } + + @Override + public SimpleScd addIED(SimpleScd scdObj, String iedName, byte[] rawIcd) throws ScdException { + SCL icd = marshallerWrapper.unmarshall(rawIcd); + return addIED(scdObj,iedName,icd); + } + + @Override + public IedDTO extractExtRefs(SimpleScd scdObj, String iedName, String ldInst) throws ScdException { + SCL receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + + TIED ied = receiver.getIED() + .stream() + .filter(tied -> iedName.equals(tied.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown IED: " + iedName)); + + TLDevice lDevice = SclIEDManager.getIEDLDevice(ied,ldInst) + .orElseThrow(() -> new ScdException("Unknown LDevice " + iedName + "/" + ldInst)); + + IedDTO iedDTO = new IedDTO(); + iedDTO.setName(iedName); + + LDeviceDTO lDeviceDTO = new LDeviceDTO(); + lDeviceDTO.setLdInst(ldInst); + + List ln0ExtRefs = SclIEDManager.extractLN0ExtRefs(lDevice, null); + LNodeDTO lN0DTO = new LNodeDTO(); + lN0DTO.setLNodeClass(TLLN0Enum.LLN_0.value()); + ln0ExtRefs.forEach((TExtRef tExtRef) -> { + ExtRefDTO extRefDTO = new ExtRefDTO(tExtRef); + lN0DTO.addExtRef(extRefDTO); + }); + lDeviceDTO.addLNode(lN0DTO); + iedDTO.addLDevice(lDeviceDTO); + return iedDTO; + } + + @Override + public Set extractExtRefSources(SimpleScd scdObj, String iedName, String ldInst, IExtRefDTO extRef) throws ScdException { + SCL receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + sclIEDManager.getExtRef(iedName,ldInst,extRef); + + List ieds = receiver.getIED(); + Set iedDTOs = new HashSet<>(); + for(TIED tied : ieds){ + IedDTO iedDTO = new IedDTO(); + iedDTO.setName(tied.getName()); + List accessPoints = tied.getAccessPoint(); + for(TAccessPoint accessPoint : accessPoints){ + if(accessPoint.getServer() == null) continue; + List deviceList = accessPoint.getServer().getLDevice(); + for(TLDevice tlDevice : deviceList) { + Set lNodeDTOs = getExtRefSources(tlDevice,extRef, receiver.getDataTypeTemplates()); + LDeviceDTO lDeviceDTO = new LDeviceDTO(); + lDeviceDTO.setLdName(tlDevice.getLdName()); + lDeviceDTO.setLdInst(tlDevice.getInst()); + if(!lNodeDTOs.isEmpty()) { + lDeviceDTO.addAll(lNodeDTOs); + iedDTO.addLDevice(lDeviceDTO); + } + } + } + if(!iedDTO.getLDevices().isEmpty()) { + iedDTOs.add(iedDTO); + } + } + return iedDTOs; + } + + @Override + public Set getSubnetwork(SimpleScd scdObj) throws ScdException { + + Set subNetworks = new HashSet<>(); + SCL scl = marshallerWrapper.unmarshall(scdObj.getRawXml()); + if(scl.getCommunication() == null || scl.getCommunication().getSubNetwork().isEmpty()){ + return subNetworks; + } + List tSubNetworks = scl.getCommunication().getSubNetwork(); + tSubNetworks.forEach((TSubNetwork subNetwork) -> { + SubNetworkDTO subNetworkDTO = new SubNetworkDTO(subNetwork); + + subNetworks.add(subNetworkDTO); + }); + + return subNetworks; + } + + @Override + public SimpleScd addSubnetworks(SimpleScd scdObject, Set subNetworks) throws ScdException { + SCL receiver = marshallerWrapper.unmarshall(scdObject.getRawXml()); + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + for(ISubNetworkDTO subNetworkDTO : subNetworks) { + String snName = subNetworkDTO.getName(); + String snType = subNetworkDTO.getType(); + for (IConnectedApDTO accessPoint : subNetworkDTO.getConnectedAPs()) { + receiver = sclCommunicationManager.addSubnetwork(snName, snType, + accessPoint.getIedName(), accessPoint.getApName()); + } + } + scdObject.setRawXml(marshallerWrapper.marshall(receiver).getBytes()); + return scdObject; + } + + /*------------------------------------------------------*/ + /* Handy methods */ + /*------------------------------------------------------*/ + public Set getExtRefSources(TLDevice tlDevice, IExtRefDTO extRef, TDataTypeTemplates dtt) throws ScdException { + List lns = tlDevice.getLN(); + Set lNodeDTOs = new HashSet<>(); + for(TLN ln : lns){ + if(extRef.getPLN() != null && !ln.getLnClass().contains(extRef.getPLN())) continue; + LNodeDTO lNodeDTO = new LNodeDTO(); + lNodeDTO.setLNodeType(ln.getLnType()); + if(ln.getLnClass().isEmpty()){ + throw new ScdException("lnClass is mandatory"); + } + lNodeDTO.setLNodeClass(ln.getLnClass().get(0)); + lNodeDTO.setInst(ln.getInst()); + ResumedDataTemplate resumedDataTemplate = null; + try { + resumedDataTemplate = SclDataTemplateManager.getResumedDTT(ln.getLnType(), extRef, dtt); + } catch (ScdException e){ + // ln is not a source + } + if(resumedDataTemplate != null) { + lNodeDTO.addResumedDataTemplate(resumedDataTemplate); + lNodeDTOs.add(lNodeDTO); + } + } + return lNodeDTOs; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java new file mode 100644 index 000000000..a607be355 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java @@ -0,0 +1,75 @@ +package org.lfenergy.compas.sct.service.scl; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TCommunication; +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TSubNetwork; + +@Setter +@Getter +@NoArgsConstructor +public class SclCommunicationManager { + protected SCL receiver; + + public SclCommunicationManager(SCL receiver) { + this.receiver = receiver; + } + + public SCL addSubnetwork(String snName, String snType, String iedName, String apName) throws ScdException { + + TIED ied = receiver.getIED().stream() + .filter(tied -> tied.getName().equals(iedName)) + .findAny().orElseThrow(() -> new ScdException("Unknown IED:" + iedName)); + + boolean isFound = ied.getAccessPoint() + .stream() + .anyMatch(tAccessPoint -> tAccessPoint.getName().equals(apName)); + if(!isFound){ + throw new ScdException("Unknown AccessPoint :" + apName + " in IED :" + iedName); + } + + TCommunication communication = receiver.getCommunication(); + if(communication == null){ + communication = new TCommunication(); + receiver.setCommunication(communication); + } + addSubnetwork(communication,snName,snType,iedName,apName); + + return receiver; + } + + public TCommunication addSubnetwork(TCommunication communication, String snName, String snType,String iedName, String apName){ + + TSubNetwork subNetwork = communication.getSubNetwork() + .stream() + .filter(tSubNetwork -> tSubNetwork.getName().equals(snName)) + .findFirst().orElse(null); + if(subNetwork == null){ // create new subnetwork + subNetwork = new TSubNetwork(); + subNetwork.setName(snName); + subNetwork.setType(snType); + communication.getSubNetwork().add(subNetwork); + } + addConnectedAP(subNetwork,iedName,apName); + return communication; + } + + public TSubNetwork addConnectedAP(TSubNetwork subNetwork, String iedName, String apName){ + boolean isFound = subNetwork.getConnectedAP().stream() + .anyMatch(tConnectedAP -> + tConnectedAP.getApName().equals(apName) && tConnectedAP.getIedName().equals(iedName)); + + if(!isFound){ + TConnectedAP tConnectedAP = new TConnectedAP(); + tConnectedAP.setApName(apName); + tConnectedAP.setIedName(iedName); + subNetwork.getConnectedAP().add(tConnectedAP); + } + return subNetwork; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java new file mode 100644 index 000000000..eeccd178d --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java @@ -0,0 +1,665 @@ +package org.lfenergy.compas.sct.service.scl; + + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TBDA; +import org.lfenergy.compas.scl.TDA; +import org.lfenergy.compas.scl.TDAType; +import org.lfenergy.compas.scl.TDO; +import org.lfenergy.compas.scl.TDOType; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TEnumType; +import org.lfenergy.compas.scl.TEnumVal; +import org.lfenergy.compas.scl.TIDNaming; +import org.lfenergy.compas.scl.TLNodeType; +import org.lfenergy.compas.scl.TPredefinedBasicTypeEnum; +import org.lfenergy.compas.scl.TSDO; +import org.lfenergy.compas.scl.TUnNaming; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Getter +@Slf4j +public class SclDataTemplateManager { + + private final Map enumTypeToAdd = new HashMap<>(); + private final Map daTypeToAdd = new HashMap<>(); + private final Map doTypeToAdd = new HashMap<>(); + private final Map lNodeTypeToAdd = new HashMap<>(); + private final Map lNodeTypeTracker = new HashMap<>(); + + + public SCL importDTT(SCL provider, SCL receiver, String iedName){ + + computeImportableDTTFromEnumType(provider,receiver,iedName); + computeImportableDTTFromDAType(provider,receiver,iedName); + computeImportableDTTFromDOType(provider,receiver,iedName); + computeImportableDTTFromLNodeType(provider,receiver,iedName); + + if(receiver.getDataTypeTemplates() == null ){ + receiver.setDataTypeTemplates(new TDataTypeTemplates()); + } + //add importable enum + enumTypeToAdd.values().forEach(tEnumType -> receiver.getDataTypeTemplates().getEnumType().add(tEnumType)); + + //remove duplicate of enumTypeToAdd in daTypeToAdd + + //add importable DAType + daTypeToAdd.values().forEach(tdaType -> receiver.getDataTypeTemplates().getDAType().add(tdaType)); + //add importable DOType + doTypeToAdd.values().forEach(tdoType -> receiver.getDataTypeTemplates().getDOType().add(tdoType)); + //add importable LNodeType + lNodeTypeToAdd.values().forEach(tlNodeType -> receiver.getDataTypeTemplates().getLNodeType().add(tlNodeType)); + + return receiver; + } + + public Boolean isSameID(T rcv, T prd){ + return rcv.getId().equals(prd.getId()); + } + + public boolean isIdentical(TEnumType rcvEnumType,TEnumType prdEnumType, boolean idCheck){ + if(idCheck && !isSameID(rcvEnumType,prdEnumType)){ + return false; + } + List rcvEnumValList = rcvEnumType.getEnumVal(); + List prdEnumValList = prdEnumType.getEnumVal(); + if(rcvEnumValList.size() != prdEnumValList.size()) { + return false; + } + + for(TEnumVal prdEnumVal : prdEnumValList){ + boolean isIn = rcvEnumValList + .stream() + .anyMatch( + rcvEnumVal -> rcvEnumVal.getValue().equals(prdEnumVal.getValue()) && + rcvEnumVal.getOrd() == prdEnumVal.getOrd() + ); + if(!isIn) { + return false; + } + } + return true; + } + + public List findDATypesWhichBdaContainsEnumTypeId(SCL provider,String enumTypeId){ + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List daTypeList = provider.getDataTypeTemplates().getDAType(); + List result = new ArrayList<>(); + for(TDAType tdaType: daTypeList){ + boolean containsEnum = tdaType.getBDA() + .stream() + .anyMatch( + bda -> TPredefinedBasicTypeEnum.ENUM.equals(bda.getBType()) && + enumTypeId.equals(bda.getType()) + ); + if(containsEnum) { + result.add(tdaType); + } + } + return result; + } + + public List findDOTypesWhichDAContainsEnumTypeId(SCL provider,String enumTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List doTypeList = provider.getDataTypeTemplates().getDOType(); + List result = new ArrayList<>(); + for(TDOType tdoType: doTypeList){ + List tdaList = new ArrayList<>(); + for( TUnNaming unNaming : tdoType.getSDOOrDA()){ + if(unNaming instanceof TDA) { + tdaList.add((TDA)unNaming); + } + } + boolean containsEnum = tdaList.stream() + .anyMatch( + tda -> tda.getBType().equals(TPredefinedBasicTypeEnum.ENUM) && + tda.getType().equals(enumTypeId) + ); + if(containsEnum) { + result.add(tdoType); + } + } + return result; + } + + public boolean isIdentical(TDAType rcvDAType,TDAType prdDAType, boolean idCheck){ + if(idCheck && !isSameID(rcvDAType,prdDAType)){ + return false; + } + List rcvBdaList = rcvDAType.getBDA(); + List prdBdaList = prdDAType.getBDA(); + + if(rcvBdaList.size() != prdBdaList.size()) { + return false; + } + + int listSz = rcvBdaList.size(); + for(int i = 0; i < listSz; i++){ + if(!rcvBdaList.get(i).getBType().equals(prdBdaList.get(i).getBType()) || + !rcvBdaList.get(i).getName().equals(prdBdaList.get(i).getName())) { + return false; + } + + if(rcvBdaList.get(i).getBType().equals(TPredefinedBasicTypeEnum.ENUM) && + !rcvBdaList.get(i).getType().equals(prdBdaList.get(i).getType())) { + return false; + } + } + return true; + } + + public List findDATypesFromStructBdaWithDATypeId(SCL provider,String daTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List daTypeList = provider.getDataTypeTemplates().getDAType(); + List result = new ArrayList<>(); + for(TDAType tdaType: daTypeList){ + boolean containsEnum = tdaType.getBDA().stream() + .anyMatch( + bda -> bda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT) && + bda.getType().equals(daTypeId) + ); + if(containsEnum) { + result.add(tdaType); + } + } + return result; + } + + public List findDOTypesWhichDAContainsStructWithDATypeId(SCL provider,String daTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List doTypeList = provider.getDataTypeTemplates().getDOType(); + List result = new ArrayList<>(); + for(TDOType tdoType: doTypeList){ + List daList = new ArrayList<>(); + for( TUnNaming unNaming : tdoType.getSDOOrDA()){ + if(unNaming instanceof TDA) { + daList.add((TDA)unNaming); + } + } + boolean containsId = daList.stream() + .anyMatch( + tda -> TPredefinedBasicTypeEnum.STRUCT.equals(tda.getBType()) && + tda.getType().equals(daTypeId) + ); + if(containsId) { + result.add(tdoType); + } + } + return result; + } + + public static List retrieveSdoOrDO(List sdoOrDoList, Class clz){ + List sdoList = new ArrayList<>(); + for( TUnNaming unNaming : sdoOrDoList){ + if(unNaming.getClass().getName().equalsIgnoreCase(clz.getName())) { + sdoList.add((T)unNaming); + } + } + return sdoList; + } + + public boolean isIdentical(TDOType rcvDOType,TDOType prdDOType, boolean idCheck){ + if(idCheck && !isSameID(rcvDOType,prdDOType)) { + return false; + } + + List rcvTdaList = retrieveSdoOrDO(rcvDOType.getSDOOrDA(),TDA.class); + List prdTdaList = retrieveSdoOrDO(prdDOType.getSDOOrDA(),TDA.class); + List rcvSdoList = retrieveSdoOrDO(rcvDOType.getSDOOrDA(),TSDO.class); + List prdSdoList = retrieveSdoOrDO(prdDOType.getSDOOrDA(),TSDO.class); + + if(rcvTdaList.size() != prdTdaList.size() || rcvSdoList.size() != prdSdoList.size()) { + return false; + } + + // SDO + for(int i = 0; i < rcvSdoList.size(); i++){ + if(!rcvSdoList.get(i).getName().equals(prdSdoList.get(i).getName()) || + !rcvSdoList.get(i).getType().equals(prdSdoList.get(i).getType())) { + return false; + } + } + + // TDO + for(int i = 0; i < rcvTdaList.size(); i++){ + if(!rcvTdaList.get(i).getName().equals(prdTdaList.get(i).getName()) || + !rcvTdaList.get(i).getBType().equals(prdTdaList.get(i).getBType())) { + return false; + } + + if(rcvTdaList.get(i).getBType().equals(TPredefinedBasicTypeEnum.ENUM) && + !rcvTdaList.get(i).getType().equals(prdTdaList.get(i).getType())) { + return false; + } + } + + return true; + } + + public List findDOTypesFromSDOWithDOTypeId(SCL provider,String doTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List doTypeList = provider.getDataTypeTemplates().getDOType(); + List result = new ArrayList<>(); + for(TDOType tdoType: doTypeList){ + List sdoList = new ArrayList<>(); + for( TUnNaming unNaming : tdoType.getSDOOrDA()){ + if(unNaming.getClass() == TSDO.class) { + sdoList.add((TSDO)unNaming); + } + } + boolean containsId = sdoList.stream() + .anyMatch(sdo -> sdo.getType().equals(doTypeId)); + if(containsId) { + result.add(tdoType); + } + } + return result; + } + + public boolean isIdentical(TLNodeType rcvLNodeType, TLNodeType providerLNodeType, boolean idCheck) { + + if(idCheck && !isSameID(rcvLNodeType,providerLNodeType)) { + return false; + } + + List rcvTdoList = rcvLNodeType.getDO(); + List prdTdoList = providerLNodeType.getDO(); + if(rcvTdoList.size() != prdTdoList.size()) { + return false; + } + + for(TDO prdTdo : prdTdoList){ + boolean isIn = rcvLNodeType.getDO().stream() + .anyMatch(rcvTdo -> rcvTdo.getType().equals(prdTdo.getType()) + && rcvTdo.getName().equals(prdTdo.getName())); + if(!isIn) { + return false; + } + } + return true; + } + + public List findLNodeTypesFromDoWithDoTypeId(SCL provider,String doTypeId){ + + if(provider.getDataTypeTemplates() == null) { + return new ArrayList<>(); + } + + List lNodeTypes = provider.getDataTypeTemplates().getLNodeType(); + + List result = new ArrayList<>(); + for(TLNodeType lNodeType: lNodeTypes){ + + boolean containsId = lNodeType.getDO().stream() + .anyMatch(tdo -> tdo.getType().equals(doTypeId)); + if(containsId) { + result.add(lNodeType); + } + } + return result; + } + + public String generateDttId(String iedName,String dttId){ + final int MAX_LENGTH = 255; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(iedName).append("_").append(dttId); + String str = stringBuilder.toString(); + return str.length() <= MAX_LENGTH ? str : str.substring(0,MAX_LENGTH); + } + + public void computeImportableDTTFromEnumType(SCL provider, SCL receiver, String iedName){ + + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdEnumTypes = provider.getDataTypeTemplates().getEnumType(); + + List rcvEnumTypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvEnumTypes = receiver.getDataTypeTemplates().getEnumType(); + } + + //import EnumType + for(TEnumType prdEnumType : prdEnumTypes){ + //search prdEnumType in rcvEnumTypes + Optional opRcvEnumType = rcvEnumTypes + .stream() + .filter(enumType -> isSameID(enumType,prdEnumType)).findFirst(); + // same ID and same content + if(opRcvEnumType.isPresent() && isIdentical(opRcvEnumType.get(),prdEnumType,false)) { + continue; + } + + // not same ID or not same content + if (opRcvEnumType.isPresent() && isSameID(opRcvEnumType.get(),prdEnumType) ) { // same id and not same content + + List daTypeList = findDATypesWhichBdaContainsEnumTypeId(provider,prdEnumType.getId()); + List doTypeList = findDOTypesWhichDAContainsEnumTypeId(provider,prdEnumType.getId()); + // rename enumType Id + String newId = generateDttId(iedName,prdEnumType.getId()); + // escalate + daTypeList.forEach( + tdaType -> renameRef(tdaType,TPredefinedBasicTypeEnum.ENUM,prdEnumType.getId(),newId)); + doTypeList.forEach( + tdoType -> renameRef(tdoType,TPredefinedBasicTypeEnum.ENUM,prdEnumType.getId(),newId)); + enumTypeToAdd.remove(prdEnumType.getId()); // remove track on old ID if necessary + prdEnumType.setId(newId); + enumTypeToAdd.put(prdEnumType.getId(),prdEnumType); + } + enumTypeToAdd.put(prdEnumType.getId(),prdEnumType); + } + } + + + public void computeImportableDTTFromDAType(SCL provider,SCL receiver, String iedName){ + + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdDATypes = provider.getDataTypeTemplates().getDAType(); + + List rcvDATypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvDATypes = receiver.getDataTypeTemplates().getDAType(); + } + + for(TDAType prdDAType : prdDATypes) { + + //search prdEnumType in rcvEnumTypes + Optional opRcvDAType = rcvDATypes + .stream() + .filter(daType -> isSameID(daType,prdDAType)) + .findFirst(); + // same ID and same content + if(opRcvDAType.isPresent() && isIdentical(opRcvDAType.get(),prdDAType,false)) { + continue; + } + + // not same ID or not same content + if (opRcvDAType.isPresent() && isSameID(opRcvDAType.get(),prdDAType) ) { + + List daTypeList = findDATypesFromStructBdaWithDATypeId(provider,prdDAType.getId()); + List doTypeList = findDOTypesWhichDAContainsStructWithDATypeId(provider,prdDAType.getId()); + + // rename TDAType Id + String newId = generateDttId(iedName,prdDAType.getId()); + // escalate + daTypeList.forEach( + tdaType -> renameRef(tdaType,TPredefinedBasicTypeEnum.STRUCT,prdDAType.getId(),newId)); + doTypeList.forEach( + tdoType -> renameRef(tdoType,TPredefinedBasicTypeEnum.STRUCT,prdDAType.getId(),newId)); + + daTypeToAdd.remove(prdDAType.getId()); // remove track on old ID if necessary + prdDAType.setId(newId); + } + daTypeToAdd.put(prdDAType.getId(),prdDAType); + } + } + + public void computeImportableDTTFromDOType(SCL provider,SCL receiver, String iedName){ + + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdDOTypes = provider.getDataTypeTemplates().getDOType(); + + List rcvDOTypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvDOTypes = receiver.getDataTypeTemplates().getDOType(); + } + //Merge DOType + for(TDOType prdDOType : prdDOTypes) { + + //search prdEnumType in rcvEnumTypes + Optional opRcvDOType = rcvDOTypes + .stream() + .filter(daType -> isSameID(daType,prdDOType)) + .findFirst(); + // same ID and same content + if(opRcvDOType.isPresent() && isIdentical(opRcvDOType.get(),prdDOType,false)) { + continue; + } + // not same ID or not same content + if (opRcvDOType.isPresent() && isSameID(opRcvDOType.get(),prdDOType) ) { + + List doTypeList = findDOTypesFromSDOWithDOTypeId(provider,prdDOType.getId()); + List lNodeTypeList = findLNodeTypesFromDoWithDoTypeId(provider,prdDOType.getId()); + // rename TDAType Id + String newId = generateDttId(iedName,prdDOType.getId()); + // escalate + doTypeList.forEach(tdoType -> renameRef(tdoType,prdDOType.getId(),newId)); + lNodeTypeList.forEach(tlNodeType -> renameRef(tlNodeType,prdDOType.getId(),newId)); + + daTypeToAdd.remove(prdDOType.getId()); // remove track on old ID if necessary + + prdDOType.setId(newId); + } + doTypeToAdd.put(prdDOType.getId(),prdDOType); + } + } + + public void computeImportableDTTFromLNodeType(SCL provider, SCL receiver,String iedName){ + if(provider.getDataTypeTemplates() == null) { + return; + } + + List prdLNodeTypes = provider.getDataTypeTemplates().getLNodeType(); + + List rcvLNodeTypes = new ArrayList<>(); + if(receiver.getDataTypeTemplates() != null) { + rcvLNodeTypes = receiver.getDataTypeTemplates().getLNodeType(); + } + //Merge DAType + + for(TLNodeType prdLNodeType : prdLNodeTypes) { + //search prdEnumType in rcvEnumTypes + Optional opRcvLNodeType = rcvLNodeTypes + .stream() + .filter(daType -> isSameID(daType,prdLNodeType)) + .findFirst(); + // same ID and same content + if(opRcvLNodeType.isPresent() && isIdentical(opRcvLNodeType.get(),prdLNodeType,false)) { + continue; + } + + if (opRcvLNodeType.isPresent() && isSameID(opRcvLNodeType.get(),prdLNodeType) ) { + // rename TDAType Id + String newId = generateDttId(iedName,prdLNodeType.getId()); + lNodeTypeToAdd.remove(prdLNodeType.getId()); // remove track on old ID if necessary + lNodeTypeTracker.put(prdLNodeType.getId(),newId); + prdLNodeType.setId(newId); + } + lNodeTypeToAdd.put(prdLNodeType.getId(),prdLNodeType); + } + } + + public void renameRef(TDOType tdoType, String id, String newId) { + List sdoList = retrieveSdoOrDO(tdoType.getSDOOrDA(),TSDO.class); + Optional opSdo = sdoList.stream() + .filter(sdo -> sdo.getType().equals(id)) + .findFirst(); + if(opSdo.isPresent()){ + opSdo.get().setType(newId); + } + } + + public void renameRef(TLNodeType tlNode, String id, String newId) { + List doList = tlNode.getDO(); + Optional opDo = doList.stream() + .filter(tdo -> tdo.getType().equals(id)) + .findFirst(); + if(opDo.isPresent()){ + opDo.get().setType(newId); + } + } + + + public void renameRef(TDAType tdaType, TPredefinedBasicTypeEnum anEnum, String id, String newId) { + List bdaList = tdaType.getBDA(); + Optional opBda = bdaList.stream() + .filter(bda -> bda.getBType().equals(anEnum) && bda.getType().equals(id)) + .findFirst(); + if(opBda.isPresent()){ + opBda.get().setType(newId); + } + } + + public void renameRef(TDOType tdoType, TPredefinedBasicTypeEnum anEnum, String id, String newId) { + List tdaList = retrieveSdoOrDO(tdoType.getSDOOrDA(),TDA.class); + Optional opDa = tdaList.stream() + .filter(tda -> tda.getBType().equals(anEnum) && tda.getType().equals(id)) + .findFirst(); + if(opDa.isPresent()){ + opDa.get().setType(newId); + } + } + + public Map getEnumTypeToAdd() { + return Collections.unmodifiableMap(enumTypeToAdd); + } + + public Map getDaTypeToAdd() { + return Collections.unmodifiableMap(daTypeToAdd); + } + + public Map getDoTypeToAdd() { + return Collections.unmodifiableMap(doTypeToAdd); + } + + public Map getLNodeTypeToAdd() { + return Collections.unmodifiableMap(lNodeTypeToAdd); + } + + public Map getLNodeTypeTracker() { + return Collections.unmodifiableMap(lNodeTypeTracker); + } + + + public static ResumedDataTemplate getResumedDTT(String lnType, IExtRefDTO extRef, + TDataTypeTemplates dtt) throws ScdException { + ResumedDataTemplate resumedDataTemplate = new ResumedDataTemplate(); + TLNodeType nodeType = dtt.getLNodeType() + .stream() + .filter(tlNodeType -> lnType.equals(tlNodeType.getId())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown LNodeType:" + lnType)); + + resumedDataTemplate.setLnType(nodeType.getId()); + if(nodeType.getLnClass().isEmpty()){ + log.error("Mandatory lnClass is missing in DTT. This should not happen SCD DTT must be correct"); + throw new IllegalArgumentException("lnClass is mandatory for LNodeType in DataTemplate:" + lnType); + } + resumedDataTemplate.setLnType(nodeType.getId()); + resumedDataTemplate.setLnClass(nodeType.getLnClass().get(0)); + if(extRef.getPDO() == null) { + return resumedDataTemplate; + } + + String[] sp = extRef.getPDO().split("\\."); + String extDoName = sp[0]; + String extSdoName1 = sp.length > 1 ? sp[1] : null; + String extSdoName2 = sp.length > 2 ? sp[2] : null; + + String doTypeId = nodeType.getDO() + .stream() + .filter(tdo -> extDoName.equals(tdo.getName())) + .map(TDO::getType) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown doName :" + extRef.getPDO())); + + String finalDoTypeId = doTypeId; + TDOType tdoType = dtt.getDOType() + .stream() + .filter(doType -> doType.getId().equals(finalDoTypeId)) + .findFirst() + .orElseThrow(() -> new ScdException("No referenced for doName :" + extRef.getPDO())); + + resumedDataTemplate.setDoName(extDoName); + if(extSdoName1 != null){ + List sdos = SclDataTemplateManager.retrieveSdoOrDO(tdoType.getSDOOrDA(), TSDO.class); + String sdoTypeId = sdos.stream() + .filter(tsdo -> extSdoName1.equals(tsdo.getName())) + .map(TSDO::getType) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown doName.sdoName :" + extDoName + "." + extSdoName1)); + + tdoType = dtt.getDOType() + .stream() + .filter(doType -> doType.getId().equals(sdoTypeId)) + .findFirst() + .orElseThrow(() -> new ScdException("No referenced doName.sdoName :" + extDoName + "." + extSdoName1)); + + resumedDataTemplate.setDoName(extDoName + "." + extSdoName1); + } + resumedDataTemplate.setCdc(tdoType.getCdc()); + + + if(extRef.getPDA() == null){ + return resumedDataTemplate; + } + + sp = extRef.getPDA().split("\\."); + String extDaName = sp[0]; + String extBdaName1 = sp.length > 1 ? sp[1] : null; + String extBdaName2 = sp.length > 2 ? sp[2] : null; + + List das = SclDataTemplateManager.retrieveSdoOrDO(tdoType.getSDOOrDA(), TDA.class); + TDA da = das.stream() + .filter(tda ->extDaName.equals(tda.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown referenced daName :" + extDaName)); + + resumedDataTemplate.setDaName(extDaName); + resumedDataTemplate.setFc(da.getFc()); + if(TPredefinedBasicTypeEnum.STRUCT.equals(da.getBType()) && extBdaName1 != null){ + String daTypeId = da.getType(); + TDAType tdaType = dtt.getDAType() + .stream() + .filter(dat -> daTypeId.equals(dat.getId()) ) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown referenced daName.bdaName :" + extDaName + "." + extBdaName1)); + + TBDA bda = tdaType.getBDA() + .stream() + .filter(tbda -> extBdaName1.equals(tbda.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown daName.bdaName :" + extDaName + "." + extBdaName1)); + resumedDataTemplate.setDaName(extDaName + "." + extBdaName1); + } + + return resumedDataTemplate; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java new file mode 100644 index 000000000..f3c2f1bc6 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java @@ -0,0 +1,60 @@ +package org.lfenergy.compas.sct.service.scl; + +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THeader; +import org.lfenergy.compas.scl.THitem; +import org.springframework.lang.NonNull; +import org.springframework.util.Assert; + +import java.util.Date; + +public class SclHeaderManager { + + public static final String TOOL_ID = "COMPAS"; + + private SCL receiver; + + public SclHeaderManager(SCL receiver) { + this.receiver = receiver; + } + + public SCL addHeader(@NonNull String hId, @NonNull String hVersion, @NonNull String hRevision) throws ScdException { + if(receiver.getHeader() != null){ + throw new ScdException("SCL already contains header"); + } + + THeader tHeader = new THeader(); + tHeader.setRevision(hRevision); + tHeader.setVersion(hVersion); + tHeader.setId(hId); + tHeader.setToolID(TOOL_ID); + receiver.setHeader(tHeader); + + return receiver; + } + + public SCL addHistoryItem(String who, String what, String why){ + + THitem tHitem = new THitem(); + tHitem.setRevision(receiver.getHeader().getRevision()); + tHitem.setVersion(receiver.getHeader().getVersion()); + tHitem.setWho(who); + tHitem.setWhat(what); + tHitem.setWhen((new Date()).toString()); + tHitem.setWhy(why); + + THeader tHeader = receiver.getHeader(); + Assert.notNull(tHeader, "Stored SCD must have Header tag"); + Assert.notNull(tHeader.getId(), "Stored SCD Header must have a unique ID"); + + THeader.History history = tHeader.getHistory(); + if(history == null) { + history = new THeader.History(); + tHeader.setHistory(history); + } + history.getHitem().add(tHitem); + + return receiver; + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java new file mode 100644 index 000000000..fe683d564 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java @@ -0,0 +1,221 @@ +package org.lfenergy.compas.sct.service.scl; + + +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.LN0; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TAnyLN; +import org.lfenergy.compas.scl.TDataSet; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TGSEControl; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TLDevice; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.scl.TLN0; +import org.lfenergy.compas.scl.TReportControl; +import org.lfenergy.compas.scl.TSampledValueControl; +import org.lfenergy.compas.scl.TServer; +import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public class SclIEDManager { + + private SCL receiver; + + public SclIEDManager(SCL receiver) { + this.receiver = receiver; + } + + public SCL addIed(SCL iedProvider, String iedName) throws ScdException { + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + receiver = sclDataTemplateManager.importDTT(iedProvider,receiver,iedName); + Map lNodeTypeTracker = sclDataTemplateManager.getLNodeTypeTracker(); + receiver = addIed(iedProvider,iedName,lNodeTypeTracker); + + return receiver; + } + + public SCL addIed(SCL iedProvider, String iedName, Map lNodeTypeTracker) throws ScdException { + if(iedProvider.getIED().isEmpty()) return receiver; + TIED tied = iedProvider.getIED().get(0); + return addIed(tied,iedName,lNodeTypeTracker); + } + + public SCL addIed(TIED providerIED,String iedName,Map lNodeTypeTracker) throws ScdException{ + + if(receiver.getIED().stream().anyMatch(tied -> tied.getName().equals(iedName))){ + throw new ScdException("SCL file already contains IED: " + iedName); + } + if(receiver.getDataTypeTemplates() == null){ + throw new ScdException("There is no DataTypeTemplates in the SCD file"); + } + + Set receiverLNodeTypeIds = receiver.getDataTypeTemplates().getLNodeType() + .stream() + .map(tlNodeType -> tlNodeType.getId()) + .collect(Collectors.toSet()); + + if(receiverLNodeTypeIds.isEmpty()){ + throw new ScdException("There is no LNodeType in the SCD file's DataTypeTemplates"); + } + + providerIED.setName(iedName); + // LDevices + String newLdName; + List accessPoints = providerIED.getAccessPoint(); + for(TAccessPoint accessPoint : accessPoints){ + TServer server = accessPoint.getServer(); + if(server == null) continue; + List lDevices = server.getLDevice(); + for(TLDevice lDevice : lDevices){ + newLdName = iedName + lDevice.getInst(); + if(newLdName.length() > 33){ + throw new ScdException(newLdName + "(IED.name + LDevice.inst) has more than 33 characters"); + } + // renaming ldName + lDevice.setLdName(newLdName); + // + TLN0 tln0 = lDevice.getLN0(); + updateLN(tln0,receiverLNodeTypeIds,lNodeTypeTracker); + + List lns = lDevice.getLN(); + for(TLN tln : lns){ + updateLN(tln,receiverLNodeTypeIds,lNodeTypeTracker); + } + } + } + + receiver.getIED().add(providerIED); + return receiver; + } + + public TAnyLN updateLN(@NonNull TAnyLN ln, @NonNull Set receiverLNodeTypeIds, + @NonNull Map lNodeTypeTracker) throws ScdException { + if( (!receiverLNodeTypeIds.contains(ln.getLnType()) && !lNodeTypeTracker.containsKey(ln.getLnType())) || + (lNodeTypeTracker.containsKey(ln.getLnType())) && + !receiverLNodeTypeIds.contains(lNodeTypeTracker.get(ln.getLnType()))){ + String lnInst = ln.getClass() == TLN.class ? ((TLN)ln).getInst() : TLLN0Enum.LLN_0.value(); + String errMsg = String.format("%s id (%s) missing in DataTypeTemplates",lnInst,ln.getLnType()); + throw new ScdException(errMsg); + } + + if(lNodeTypeTracker.containsKey(ln.getLnType())){ + ln.setLnType(lNodeTypeTracker.get(ln.getLnType())); + } + + return ln; + } + + + public TExtRef getExtRef(String iedName, String ldInst, IExtRefDTO filter) throws ScdException { + TIED ied = receiver.getIED() + .stream() + .filter(tied -> iedName.equals(tied.getName())) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown IED :" + iedName)); + + TLDevice ld = SclIEDManager.getIEDLDevice(ied,ldInst) + .orElseThrow(() -> new ScdException("Unknown LDevice " + iedName + "/" + ldInst)); + + List extRefs = extractLN0ExtRefs(ld,filter); + + if(extRefs.size() > 1){ + String msg = String.format("Multiple ExtRef[pDo(%s), intAddr(%s), desc(%s)] for [%s,%s]", + filter.getPDO(),filter.getIntAddr(), filter.getDesc(), iedName,ldInst); + throw new ScdException(msg); + } + + if(extRefs.isEmpty()){ + String msg = String.format("No ExtRef[pDo(%s), intAddr(%s), desc(%s)] for [%s,%s]", + filter.getPDO(),filter.getIntAddr(), filter.getDesc(), iedName,ldInst); + throw new ScdException(msg); + } + return extRefs.get(0); + } + + public static List getIEDLDevice(TIED tied){ + return tied.getAccessPoint() + .stream() + .filter(tAccessPoint -> tAccessPoint.getServer() != null) + .map(tAccessPoint -> tAccessPoint.getServer().getLDevice()) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + + public static Optional getLDeviceLN(TLDevice lDevice, String lnClass, @Nullable String lnInst){ + return lDevice.getLN() + .stream() + .filter(tln -> tln.getLnClass().contains(lnClass) && (lnInst == null || lnInst.equals(tln.getInst()))) + .findFirst(); + } + + public static Optional getIEDLDevice(TIED tied, String ldInst){ + return tied.getAccessPoint() + .stream() + .filter(tAccessPoint -> tAccessPoint.getServer() != null) + .map(tAccessPoint -> tAccessPoint.getServer().getLDevice()) + .flatMap(Collection::stream) + .filter(tlDevice -> ldInst.equals(tlDevice.getInst())) + .findFirst(); + } + + public static List extractLN0ExtRefs(TLDevice tlDevice, IExtRefDTO filter) { + if(tlDevice.getLN0().getInputs() == null) return new ArrayList<>(); + + if(filter == null) { + return tlDevice.getLN0().getInputs().getExtRef(); + } else { + return tlDevice.getLN0().getInputs().getExtRef() + .stream() + .filter(tExtRef -> { + + if (filter.getDesc() != null && !filter.getDesc().equals(tExtRef.getDesc())) { + return false; + } + if (filter.getPDO() != null && !tExtRef.getPDO().equals(filter.getPDO())) { + return false; + } + if (filter.getIntAddr() != null && !filter.getIntAddr().equals(tExtRef.getIntAddr())) { + return false; + } + return true; + }) + .collect(Collectors.toList()); + } + + } + + public static List extractLNExtRefs(TLDevice tlDevice, String lnClass, String lnInst, IExtRefDTO filter) throws ScdException { + TLN ln = tlDevice.getLN() + .stream() + .filter(tln -> tln.getLnClass().contains(lnClass)) + .collect(Collectors.toList()) + .stream() + .filter(tln -> lnInst.equals(tln.getInst())) + .findFirst() + .orElseThrow(() -> new ScdException(String.format("Unknown LN [lnClass(%s),inst(%s)] ",lnClass,lnInst))); + + + if(ln.getInputs() == null) return new ArrayList<>(); + + if(filter == null){ + return ln.getInputs().getExtRef(); + } else { + return ln.getInputs().getExtRef() + .stream() + .filter(tExtRef -> filter.isIdentical(tExtRef)) + .collect(Collectors.toList()); + } + } +} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java new file mode 100644 index 000000000..0ba80b2f5 --- /dev/null +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java @@ -0,0 +1,60 @@ +package org.lfenergy.compas.sct.service.scl; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THeader; +import org.lfenergy.compas.scl.TIED; + +import java.util.Optional; + +@Getter +@NoArgsConstructor +public class SclManager { + private SCL receiver; + + public SclManager(SCL receiver) { + this.receiver = receiver; + } + + public SclManager(String hId, String hVersion, String hRevision){ + this.receiver = SclManager.initialize(hId,hVersion,hRevision); + } + + + + public Optional getIED(String iedName){ + return receiver.getIED().stream().filter(tied -> iedName.equals(tied.getName())).findFirst(); + } + + /** + * Add IED named iedName from a given SCL to recipient SCL + * @param provider SCL containing IED to add + * @param iedName IED name to be added + * @throws ScdException + */ + public void addIED(SCL provider, String iedName) throws ScdException { + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + sclIEDManager.addIed(provider,iedName); + } + + /*--------------------------------------------------------*/ + /* Static methods */ + /*--------------------------------------------------------*/ + + public static SCL initialize(String hId, String hVersion, String hRevision) { + + SCL scd = new SCL(); + scd.setRelease((short) 4); + scd.setVersion("2007"); + scd.setRevision("B"); + THeader tHeader = new THeader(); + tHeader.setRevision(hRevision); + tHeader.setVersion(hVersion); + tHeader.setId(hId); + scd.setHeader(tHeader); + + return scd; + } +} diff --git a/sct-service/src/main/resources/icd/icd_test.xml b/sct-service/src/main/resources/icd/icd_test.xml new file mode 100644 index 000000000..26222f7cf --- /dev/null +++ b/sct-service/src/main/resources/icd/icd_test.xml @@ -0,0 +1,101 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml new file mode 100644 index 000000000..28c4e3bfd --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -0,0 +1,64 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml new file mode 100644 index 000000000..89569eb67 --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -0,0 +1,62 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml new file mode 100644 index 000000000..03162c59a --- /dev/null +++ b/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -0,0 +1,82 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml new file mode 100644 index 000000000..7ace9cbe2 --- /dev/null +++ b/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml @@ -0,0 +1,109 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java new file mode 100644 index 000000000..6e1aa11fa --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java @@ -0,0 +1,23 @@ +package org.lfenergy.compas.sct; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootTest +@ActiveProfiles("test") +public class ApplicationContextTest { + + @Test + public void contextLoads() { + // do nothing + } + + @SpringBootApplication + public static class Context { + + } +} diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java new file mode 100644 index 000000000..909557105 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -0,0 +1,9 @@ +@TypeDef( + name = "xmltype", + defaultForType = byte[].class, + typeClass = H2XMLTypeMapper.class +) +package org.lfenergy.compas.sct.model.entity; +import org.hibernate.annotations.TypeDef; +import org.lfenergy.compas.sct.repository.H2XMLTypeMapper; + diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java new file mode 100644 index 000000000..1757f8f38 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java @@ -0,0 +1,269 @@ +package org.lfenergy.compas.sct.service; + +import org.checkerframework.checker.units.qual.C; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THeader; +import org.lfenergy.compas.scl.THitem; +import org.lfenergy.compas.sct.exception.CompasDataAccessException; +import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.IedDTO; +import org.lfenergy.compas.sct.model.dto.ScdDTO; +import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; +import org.lfenergy.compas.sct.model.entity.SimpleScd; +import org.lfenergy.compas.sct.repository.SimpleScdRepository; +import org.mockito.InjectMocks; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.xml.transform.Result; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; + +@ExtendWith(SpringExtension.class) +class SqlScdServiceAndDBTest { + private final String FILE_NAME = "file.scd"; + private final String H_VERSION = "1.0"; + private final String H_REVISION = "1.0"; + private static final String WHO = "who"; + private static final String WHAT = "what"; + private static final String WHY = "why"; + private final UUID ID = UUID.randomUUID(); + + private static final String IED_NAME = "IED_NAME"; + + private static final String SCD_IED_RCV_FILE = "scl/SCD/scd_ied_receiver_test.xml"; + private static final String SCD_WITH_IEDS_FILE = "scl/SCD/scd_with_ieds_test.xml"; + private static final String ICD_IMPORT_FILE = "scl/IEDImportHelper/icd_import_ied_test.xml"; + + @InjectMocks + private SimpleSqlScdService simpleSqlScdService; + + @MockBean + private SimpleScdRepository simpleScdRepository; + + + private MarshallerWrapper marshallerWrapper; + + private DefaultResourceLoader defaultResourceLoader; + + + @BeforeEach + public void setUp(){ + MockitoAnnotations.openMocks( this ); + + try { + marshallerWrapper = (new MarshallerWrapper.Builder()).build(); + } catch (Exception e) { + e.printStackTrace(); + } + simpleSqlScdService = new SimpleSqlScdService(simpleScdRepository,marshallerWrapper); + defaultResourceLoader = new DefaultResourceLoader(); + } + + @Test + public void shouldReturnOKWhenInitiateSCD() throws CompasDataAccessException, ScdException { + + SimpleScd expected = new SimpleScd(); + expected.setFileName(FILE_NAME); + expected.setRawXml(createSCD(ID, H_REVISION, H_VERSION)); + + SimpleScd result = simpleSqlScdService.initiateSCD(FILE_NAME, H_VERSION, H_REVISION); + + SCL scd = marshallerWrapper.unmarshall(result.getRawXml()); + + assertEquals(FILE_NAME,result.getFileName()); + assertEquals(H_REVISION,scd.getHeader().getRevision()); + assertEquals(H_VERSION,scd.getHeader().getVersion()); + } + + @Test + public void shouldReturnOKWhenAddHistoryItem() throws ScdException, CompasDataAccessException { + SimpleScd storedSimpleSCD = new SimpleScd(); + storedSimpleSCD.setFileName(FILE_NAME); + storedSimpleSCD.setId(ID); + storedSimpleSCD.setRawXml(createSCD(ID, H_REVISION, H_VERSION)); + + SCL storedScd = marshallerWrapper.unmarshall(createSCD(ID, H_REVISION, H_VERSION)); + + SimpleScd expected = new SimpleScd(); + expected.setFileName(FILE_NAME); + expected.setId(ID); + + SCL expectedScd = marshallerWrapper.unmarshall(createSCD(ID, H_REVISION, H_VERSION)); + + THeader.History history = new THeader.History(); + THitem tHitem = new THitem(); + tHitem.setVersion("1.0"); + tHitem.setRevision("1.0"); + tHitem.setWhat("what"); + tHitem.setWho("who"); + tHitem.setWhy("why"); + tHitem.setWhen(LocalDateTime.now().toString()); + history.getHitem().add(tHitem); + expectedScd.getHeader().setHistory(history); + expected.setRawXml(marshallerWrapper.marshall(expectedScd).getBytes()); + + Mockito.when(simpleScdRepository.findById(ID)).thenReturn(Optional.of(storedSimpleSCD)); + Mockito.when(simpleScdRepository.save(any(SimpleScd.class))).thenReturn(expected); + + + SimpleScd result = simpleSqlScdService.addHistoryItem(ID,"who","what", "why"); + assertNotNull(result); + SCL resultScd = marshallerWrapper.unmarshall(result.getRawXml()); + + assertAll( + () -> assertNotNull(resultScd), + () -> assertNotNull(resultScd.getHeader()), + () -> assertNotNull(resultScd.getHeader().getHistory()) + ); + List hItems = resultScd.getHeader().getHistory().getHitem(); + + assertFalse(hItems.isEmpty()); + THitem hItem = hItems.get(0); + assertAll( + () -> assertNotNull(hItem), + () -> assertEquals("who",hItem.getWho()), + () -> assertEquals("what",hItem.getWhat()), + () -> assertEquals("why",hItem.getWhy()) + ); + } + + + @Test + public void shouldReturnOKWhenInitiateScdAndAddHistory() throws ScdException { + SimpleScd result = simpleSqlScdService.initiateSCD(FILE_NAME, H_VERSION, H_REVISION); + SCL resultScd = marshallerWrapper.unmarshall(result.getRawXml()); + + assertNotNull(result); + assertNotNull(resultScd.getHeader()); + assertNotNull(UUID.fromString(resultScd.getHeader().getId())); + + result = simpleSqlScdService.addHistoryItem(result,"who","what","why"); + resultScd = marshallerWrapper.unmarshall(result.getRawXml()); + THeader.History history = resultScd.getHeader().getHistory(); + assertNotNull(history); + assertFalse(history.getHitem().isEmpty()); + THitem tHitem = history.getHitem().get(0); + assertEquals(H_REVISION,tHitem.getRevision()); + assertEquals(H_VERSION,tHitem.getVersion()); + assertEquals(WHO,tHitem.getWho()); + } + @Test + void testAddIED() throws IOException, ScdException { + + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_IED_RCV_FILE)); + + scdObj = simpleSqlScdService.addIED(scdObj,IED_NAME,iedProvider); + SCL res_receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + + assertNotNull(res_receiver); + assertFalse(res_receiver.getIED().isEmpty()); + + } + + @Test + void testGetSubnetworks() throws IOException, ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + + Set subnetworks = simpleSqlScdService.getSubnetwork(scdObj); + assertEquals(1,subnetworks.size()); + } + + @Test + void testExtractExtRefs() throws IOException, ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + + IedDTO iedDTO = simpleSqlScdService.extractExtRefs(scdObj,IED_NAME,"LDPO"); + assertEquals(IED_NAME,iedDTO.getName()); + assertEquals(1,iedDTO.getLDevices().size()); + } + + @Test + public void testAddSubnetwork() throws IOException, ScdException { + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + + SubNetworkDTO subNetworkDTO = new SubNetworkDTO("SN","IP"); + subNetworkDTO.addConnectedAPs(new ConnectedApDTO(IED_NAME,"AP_NAME")); + + scdObj = simpleSqlScdService.addSubnetworks(scdObj,Set.of(subNetworkDTO)); + SCL res_receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); + assertNotNull(res_receiver.getCommunication()); + assertFalse(res_receiver.getCommunication().getSubNetwork().isEmpty()); + } + + @Test + void testExtractExtRefSources() throws IOException, ScdException { + + SimpleScd scdObj = new SimpleScd(); + scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("INTADDR3"); + extRef.setPDO("Op.res"); + extRef.setDesc("DESC3"); + + Set iedDTOs = simpleSqlScdService.extractExtRefSources(scdObj,IED_NAME, "LDPO", extRef); + assertFalse(iedDTOs.isEmpty()); + + } + + + + private byte[] createSCD(UUID uuid, String hRevision, String hVersion){ + SCL scd = new SCL(); + scd.setVersion("2007"); + scd.setRevision("B"); + scd.setRelease((short) 4); + THeader tHeader = new THeader(); + tHeader.setRevision(hRevision); + tHeader.setVersion(hVersion); + tHeader.setId(uuid.toString()); + scd.setHeader(tHeader); + + return marshallerWrapper.marshall(scd).getBytes(StandardCharsets.UTF_8); + + } + + private byte[] getFileContent(String filename) throws IOException { + Resource resource = defaultResourceLoader.getResource("classpath:" + filename); + File file = resource.getFile(); + return Files.readAllBytes(file.toPath()); + } + + private SCL getSCLFromFile(String filename) throws IOException { + return marshallerWrapper.unmarshall(getFileContent(filename)); + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java new file mode 100644 index 000000000..116760f09 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java @@ -0,0 +1,87 @@ +package org.lfenergy.compas.sct.service.scl; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TConnectedAP; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TSubNetwork; +import org.lfenergy.compas.exception.ScdException; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) +class SclCommunicationManagerTest { + + private static final String IED_NAME = "IED_NAME"; + private static final String AP_NAME = "AP_NAME"; + private static final String SUBNETWORK = "SUBNETWORK"; + + + @Test + void shouldReturnOKWhenAddSubnetworkCaseReceiverHasNoCommunication() throws ScdException { + SCL receiver = createSCLWithIEDAndAccessPoint(); + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + + receiver = sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME); + assertNotNull(receiver.getCommunication()); + assertNotNull(receiver.getCommunication().getSubNetwork()); + assertFalse(receiver.getCommunication().getSubNetwork().isEmpty()); + TSubNetwork subNetwork = receiver.getCommunication().getSubNetwork() + .stream() + .filter(sn -> sn.getName().equals(SUBNETWORK)) + .findFirst() + .orElse(null); + assertNotNull(subNetwork); + + TConnectedAP cAP = subNetwork.getConnectedAP() + .stream() + .filter(connectedAP -> connectedAP.getIedName().equals(IED_NAME) && connectedAP.getApName().equals(AP_NAME) ) + .findFirst() + .orElse(null); + assertNotNull(cAP); + + } + + + @Test + void ShouldReturnNOKWhenAddSubnetworkCauseUnknownIED() throws ScdException { + + SCL receiver = createMinimalSCL(); + + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + + assertThrows(ScdException.class, () -> sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME)); + + } + + @Test + void ShouldReturnNOKWhenAddSubnetworkCauseUnknownIEDAccessPoint() { + SCL receiver = createMinimalSCL(); + TIED ied = new TIED(); + ied.setName(IED_NAME); + receiver.getIED().add(ied); + + SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); + + assertThrows(ScdException.class, () -> sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME)); + } + + private SCL createMinimalSCL(){ + return SclManager.initialize("hID","hVersion","hRevision"); + } + + private SCL createSCLWithIEDAndAccessPoint(){ + SCL receiver = createMinimalSCL(); + TIED ied = new TIED(); + ied.setName(IED_NAME); + TAccessPoint accessPoint = new TAccessPoint(); + accessPoint.setName(AP_NAME); + ied.getAccessPoint().add(accessPoint); + + receiver.getIED().add(ied); + return receiver; + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java new file mode 100644 index 000000000..aed34dc33 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java @@ -0,0 +1,566 @@ +package org.lfenergy.compas.sct.service.scl; + + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TBDA; +import org.lfenergy.compas.scl.TDA; +import org.lfenergy.compas.scl.TDAType; +import org.lfenergy.compas.scl.TDOType; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TEnumType; +import org.lfenergy.compas.scl.TFCEnum; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLNodeType; +import org.lfenergy.compas.scl.TPredefinedBasicTypeEnum; +import org.lfenergy.compas.scl.TPredefinedCDCEnum; + + +import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; + +import java.io.InputStream; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SclDataTemplateManagerTest { + + private static final String SCD_FILE = "scl/SCD/scd_with_dtt_test.xml"; + private static final String ICD_WITH_IDENTICAL_DTT = "scl/IEDImportHelper/Icd_With_Identical_DTT.xml"; + private static final String ICD_WITH_DTT_DIFF_IDS = "scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml"; + private static final String ICD_WITH_DTT_DIFF_CONTENT = "scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml"; + + + //private MarshallerWrapper marshallerWrapper = createWrapper(); + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTEnumType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); + List prdEnumType = icd.getDataTypeTemplates().getEnumType(); + + assertFalse(rcvEnumType.isEmpty()); + assertFalse(prdEnumType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTEnumTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); + List prdEnumType = icd.getDataTypeTemplates().getEnumType(); + assertFalse(rcvEnumType.isEmpty()); + assertFalse(prdEnumType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTEnumTypeCauseContentsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); + List prdEnumType = icd.getDataTypeTemplates().getEnumType(); + assertFalse(rcvEnumType.isEmpty()); + assertFalse(prdEnumType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTDaType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); + List prdDaTypes = icd.getDataTypeTemplates().getDAType(); + + assertFalse(rcvDaTypes.isEmpty()); + assertFalse(prdDaTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDaTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); + List prdDaTypes = icd.getDataTypeTemplates().getDAType(); + + assertFalse(rcvDaTypes.isEmpty()); + assertFalse(prdDaTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDaTypeCauseContentsAreDifferent() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); + List prdDaTypes = icd.getDataTypeTemplates().getDAType(); + + assertFalse(rcvDaTypes.isEmpty()); + assertFalse(prdDaTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTDoType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); + List prdDoTypes = icd.getDataTypeTemplates().getDOType(); + + assertFalse(rcvDoTypes.isEmpty()); + assertFalse(prdDoTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDoTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); + List prdDoTypes = icd.getDataTypeTemplates().getDOType(); + + assertFalse(rcvDoTypes.isEmpty()); + assertFalse(prdDoTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTDoTypeCauseContentsAreDifferent() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); + List prdDoTypes = icd.getDataTypeTemplates().getDOType(); + + assertFalse(rcvDoTypes.isEmpty()); + assertFalse(prdDoTypes.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnTrueWhenIsIdenticalForDTTLNodeType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); + List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); + + assertFalse(rcvLNodeType.isEmpty()); + assertFalse(prdLNodeType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); + assertTrue(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTLNodeTypeCauseIdsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); + List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); + + assertFalse(rcvLNodeType.isEmpty()); + assertFalse(prdLNodeType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnFalseWhenIsIdenticalForDTTLNodeTypeCauseContentsAreDifferent() throws Exception { + + SCL scd = getSCLFromFile(SCD_FILE); + SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); + List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); + + assertFalse(rcvLNodeType.isEmpty()); + assertFalse(prdLNodeType.isEmpty()); + boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); + assertFalse(isIdentical); + } + + @Test + void ShouldReturnOKWhenFindDATypesWhichBdaContainsEnumTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + String enumTypeId = "RecCycModKind"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + List daTypeList = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(icd,enumTypeId); + + assertEquals(1,daTypeList.size()); + } + + @Test + void ShouldReturnOKWhenFindDOTypesWhichDAContainsEnumTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + String enumTypeId = "PhaseAngleReferenceKind"; + List doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(icd,enumTypeId); + assertEquals(1,doTypeList.size()); + + enumTypeId = "RecCycModKind"; + doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(icd,enumTypeId); + assertTrue(doTypeList.isEmpty()); + } + + @Test + void ShouldReturnOKWhenFindDATypesFromStructBdaWithDATypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String daTypeId = "DA3"; + List daTypeList = sclDataTemplateManager.findDATypesFromStructBdaWithDATypeId(icd,daTypeId); + + assertEquals(1,daTypeList.size()); + daTypeId = "DA1"; + + daTypeList = sclDataTemplateManager.findDATypesFromStructBdaWithDATypeId(icd,daTypeId); + assertTrue(daTypeList.isEmpty()); + } + + @Test + void ShouldReturnOKWhenFindDOTypesWhichDAContainsStructWithDATypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String daTypeId = "DA3"; + List doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsStructWithDATypeId(icd,daTypeId); + assertEquals(1,doTypeList.size()); + + } + + @Test + void ShouldReturnOKWhenFindDOTypesFromSDOWithDOTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String doTypeId = "DO4"; + List doTypeList = sclDataTemplateManager.findDOTypesFromSDOWithDOTypeId(icd,doTypeId); + assertEquals(2,doTypeList.size()); + + doTypeId = "UnknownDOID"; + doTypeList = sclDataTemplateManager.findDOTypesFromSDOWithDOTypeId(icd,doTypeId); + assertTrue(doTypeList.isEmpty()); + } + + @Test + void ShouldReturnOKWhenFindLNodeTypesFromDoWithDoTypeId() throws Exception { + SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + String doTypeId = "DO1"; + List lNodeTypes = sclDataTemplateManager.findLNodeTypesFromDoWithDoTypeId(icd,doTypeId); + assertEquals(2,lNodeTypes.size()); + + doTypeId = "UnknownDOID"; + lNodeTypes = sclDataTemplateManager.findLNodeTypesFromDoWithDoTypeId(icd,doTypeId); + assertTrue(lNodeTypes.isEmpty()); + } + + @Test + void testComputeImportableDTTFromEnumTypeWithIdenticalIdsAndSameContent() throws Exception { + // identical id, same content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + String iedName = "IED_NAME"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); + + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDoTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().isEmpty()); + + } + + @Test + void testComputeImportableDTTFromEnumTypeWithIdenticalIdsAndDiffContent() throws Exception { + + // identical id, different content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + String iedName = "IED_NAME"; + String newExpectedEnumTypeID1 = iedName + "_PhaseAngleReferenceKind"; + String newExpectedEnumTypeID2 = iedName + "_RecCycModKind"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); + + assertEquals(2, sclDataTemplateManager.getEnumTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID1)); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID2)); + + List daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID1); + List doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID1); + assertTrue(daTypeListRefEnumID.isEmpty()); + assertEquals(1, doTypeListRefEnumID.size()); + List tdaList = sclDataTemplateManager.retrieveSdoOrDO(doTypeListRefEnumID.get(0).getSDOOrDA(), TDA.class); + assertFalse(tdaList.isEmpty()); + assertEquals(TPredefinedBasicTypeEnum.ENUM,tdaList.get(0).getBType()); + assertEquals(newExpectedEnumTypeID1,tdaList.get(0).getType()); + + daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID2); + doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID2); + + assertEquals(1, daTypeListRefEnumID.size()); + assertTrue(doTypeListRefEnumID.isEmpty()); + List bdaList = daTypeListRefEnumID.get(0).getBDA(); + assertTrue(!bdaList.isEmpty()); + Optional opBda = bdaList.stream() + .filter(tbda -> TPredefinedBasicTypeEnum.ENUM.equals(tbda.getBType()) + && newExpectedEnumTypeID2.equals(tbda.getType())) + .findFirst(); + assertTrue(opBda.isPresent()); + } + + @Test + void testComputeImportableDTTFromEnumTypeWithDiffIds() throws Exception { + // different id + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + String iedName = "IED_NAME"; + String newExpectedEnumTypeID1 = "MultiplierKind"; + String newExpectedEnumTypeID2 = "CtlModelKind"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); + + assertEquals(2, sclDataTemplateManager.getEnumTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID1)); + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID2)); + + List daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID1); + List doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID1); + assertTrue( daTypeListRefEnumID.isEmpty()); + assertEquals(1, doTypeListRefEnumID.size()); + List tdaList = sclDataTemplateManager.retrieveSdoOrDO(doTypeListRefEnumID.get(0).getSDOOrDA(), TDA.class); + assertFalse(tdaList.isEmpty()); + assertEquals(TPredefinedBasicTypeEnum.ENUM,tdaList.get(0).getBType()); + assertEquals(newExpectedEnumTypeID1,tdaList.get(0).getType()); + + daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID2); + doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID2); + + assertEquals(1, daTypeListRefEnumID.size()); + assertFalse(!doTypeListRefEnumID.isEmpty()); + List bdaList = daTypeListRefEnumID.get(0).getBDA(); + assertTrue(!bdaList.isEmpty()); + Optional opBda = bdaList.stream() + .filter(tbda -> TPredefinedBasicTypeEnum.ENUM.equals(tbda.getBType()) + && newExpectedEnumTypeID2.equals(tbda.getType())) + .findFirst(); + assertTrue(opBda.isPresent()); + } + + @Test + void testComputeImportableDTTFromDATypeWithIdenticalIdsAndSameContent() throws Exception { + + // identical id, same content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); + String iedName = "IED_NAME"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); + + assertTrue(sclDataTemplateManager.getEnumTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getDoTypeToAdd().isEmpty()); + assertTrue(sclDataTemplateManager.getLNodeTypeToAdd().isEmpty()); + + } + + @Test + void testComputeImportableDTTFromDATypeWithIdenticalIdsAndDiffContent() throws Exception { + // identical id, different content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + String iedName = "IED_NAME"; + String expectedDATypeID1 = iedName + "_DA1"; + String expectedDATypeID3 = iedName + "_DA3"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); + + assertEquals(2, sclDataTemplateManager.getDaTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID1)); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID3)); + } + + @Test + void testComputeImportableDTTFromDATypeWithDiffIds() throws Exception { + // identical id, different content + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); + String iedName = "IED_NAME"; + String expectedDATypeID1 = "DA11"; + String expectedDATypeID2 = "DA21"; + String expectedDATypeID3 = "DA31"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + + sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); + + assertEquals(3, sclDataTemplateManager.getDaTypeToAdd().size()); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID1)); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID2)); + assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID3)); + } + + @Test + void testComputeImportableDTTFromDOType(){ + + } + @Test + void testComputeImportableDTTFromLNodeType(){ + + } + + @Test + void testImportDTT() throws Exception { + SCL receiver = getSCLFromFile(SCD_FILE); + SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); + String iedName = "IED_NAME"; + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + receiver = sclDataTemplateManager.importDTT(provider,receiver,iedName); + + System.out.print(createWrapper().marshall(receiver)); + } + + @Test + void testShouldReturnOKWhenGetResumedDTT() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN2"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res"); + extRef.setPDA("d"); + + ResumedDataTemplate res = SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt); + System.out.println(res); + assertEquals(lnType,res.getLnType()); + assertEquals(TLLN0Enum.LLN_0.value(),res.getLnClass()); + assertEquals(extRef.getPDO(),res.getDoName()); + assertEquals(extRef.getPDA(),res.getDaName()); + assertEquals(TPredefinedCDCEnum.WYE,res.getCdc()); + assertEquals(TFCEnum.CF,res.getFc()); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDoName() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN2"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs1.res"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnknownLnType() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN210"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedSDoName() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN210"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res1"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + @Test + void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDaName() throws Exception { + SCL scd = getSCLFromFile(SCD_FILE); + TDataTypeTemplates dtt = scd.getDataTypeTemplates(); + String lnType = "LN210"; + ExtRefDTO extRef = new ExtRefDTO(); + extRef.setIntAddr("IntAddr"); + extRef.setPLN(TLLN0Enum.LLN_0.value()); + extRef.setPDO("FACntRs.res1"); + extRef.setPDA("d"); + + assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); + } + + private SCL getSCLFromFile(String filename) throws Exception { + MarshallerWrapper marshallerWrapper = createWrapper(); + InputStream is = getClass().getClassLoader().getResourceAsStream(filename); + return marshallerWrapper.unmarshall(is); + } + + private MarshallerWrapper createWrapper() throws Exception { + return (new MarshallerWrapper.Builder()).build(); + } + +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java new file mode 100644 index 000000000..7009c4538 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java @@ -0,0 +1,71 @@ +package org.lfenergy.compas.sct.service.scl; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.THitem; +import org.lfenergy.compas.exception.ScdException; + + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + + +class SclHeaderManagerTest { + + private final String H_VERSION = "1.0"; + private final String TOOL_ID = "COMPAS"; + private final String H_REVISION = "1.0"; + private final UUID ID = UUID.randomUUID(); + + @Test + void testShouldReturnOKWhenAddHeader() throws ScdException { + SCL receiver = new SCL(); + SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); + assertNull(receiver.getHeader()); + sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); + assertAll("header", + () -> assertNotNull(receiver.getHeader()), + () -> assertEquals(ID.toString(),receiver.getHeader().getId()), + () -> assertNotNull(H_VERSION,receiver.getHeader().getVersion()), + () -> assertNotNull(H_REVISION,receiver.getHeader().getRevision()), + () -> assertNotNull(TOOL_ID,receiver.getHeader().getToolID()) + ); + } + + @Test + void testShouldReturnNOKWhenAddHeaderCauseHeaderExistAlready() throws ScdException { + + SCL receiver = new SCL(); + SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); + assertNull(receiver.getHeader()); + sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); + + assertThrows(ScdException.class, () -> sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION)); + } + + @Test + void testShouldReturnOKWhenAddHistoryItem() throws ScdException { + SCL receiver = new SCL(); + SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); + assertNull(receiver.getHeader()); + sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); + assertNotNull(receiver.getHeader()); + sclHeaderManager.addHistoryItem("who","what","why"); + + assertNotNull(receiver.getHeader().getHistory()); + assertEquals(1,receiver.getHeader().getHistory().getHitem().size()); + THitem tHitem = receiver.getHeader().getHistory().getHitem().get(0); + assertEquals("who",tHitem.getWho()); + assertEquals("what",tHitem.getWhat()); + assertEquals("why",tHitem.getWhy()); + assertNotNull(tHitem.getWhen()); + assertNotNull(receiver.getHeader().getRevision(),tHitem.getRevision()); + assertNotNull(receiver.getHeader().getVersion(),tHitem.getVersion()); + assertNotNull(tHitem.getWhen()); + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java new file mode 100644 index 000000000..8ebed00a7 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java @@ -0,0 +1,282 @@ +package org.lfenergy.compas.sct.service.scl; + + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.commons.MarshallerWrapper; +import org.lfenergy.compas.exception.ScdException; +import org.lfenergy.compas.scl.SCL; +import org.lfenergy.compas.scl.TAccessPoint; +import org.lfenergy.compas.scl.TDataTypeTemplates; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TIED; +import org.lfenergy.compas.scl.TLDevice; +import org.lfenergy.compas.scl.TLLN0Enum; +import org.lfenergy.compas.scl.TLN; +import org.lfenergy.compas.sct.model.dto.ExtRefDTO; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +class SclIEDManagerTest { + + private static final String SCD_IED_RCV_FILE = "scl/SCD/scd_ied_receiver_test.xml"; + private static final String SCD_WITH_IEDS_FILE = "scl/SCD/scd_with_ieds_test.xml"; + private static final String ICD_IMPORT_FILE = "scl/IEDImportHelper/icd_import_ied_test.xml"; + + private static final String IED_NAME = "IED_NAME"; + + + @Test + void addIed() { + } + + @Test + void shouldReturnOKWhenAddIed() throws ScdException { + SCL iedReceiver = getSCLFromFile(SCD_IED_RCV_FILE); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + //check prerequisite + assertFalse(iedReceiver.getIED().stream().anyMatch(tied -> tied.getName().equals(IED_NAME))); + Optional opIED = iedProvider.getIED().stream().filter(tied -> tied.getName().equals(IED_NAME)).findFirst(); + assertTrue(opIED.isPresent()); + TIED ied = opIED.get(); + assertFalse(ied.getAccessPoint().isEmpty()); + TAccessPoint accessPoint = ied.getAccessPoint().get(0); + assertEquals(1, accessPoint.getServer().getLDevice().size() ); + TLDevice lDevice = accessPoint.getServer().getLDevice().get(0); + assertEquals("LN2",lDevice.getLN0().getLnType()); + assertEquals(2,lDevice.getLN().size() ); + TLN ln = lDevice.getLN().get(0); + assertEquals("LN1",ln.getLnType() ); + + // import IED + SclIEDManager sclIEDManager = new SclIEDManager(iedReceiver); + + SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); + sclDataTemplateManager.importDTT(iedProvider,iedReceiver,IED_NAME); + Map lNodeTypeTracker = sclDataTemplateManager.getLNodeTypeTracker(); + assertFalse(lNodeTypeTracker.isEmpty()); + iedReceiver = sclIEDManager.addIed(iedProvider,IED_NAME,lNodeTypeTracker); + + opIED = iedReceiver.getIED().stream().filter(tied -> tied.getName().equals(IED_NAME)).findFirst(); + assertTrue(opIED.isPresent()); + ied = opIED.get(); + assertFalse(ied.getAccessPoint().isEmpty()); + accessPoint = ied.getAccessPoint().get(0); + assertNotNull(accessPoint.getServer()); + assertEquals(1, accessPoint.getServer().getLDevice().size()); + lDevice = accessPoint.getServer().getLDevice().get(0); + assertNotNull(lDevice.getLN0()); + assertEquals(IED_NAME + "_LN2",lDevice.getLN0().getLnType()); + assertEquals(2,lDevice.getLN().size()); + ln = lDevice.getLN().get(0); + assertEquals(IED_NAME + "_LN1", ln.getLnType()); + } + + @Test + void ShouldReturnNOKWhenAddIedCauseIEDAlreadyExistsInReceiver() { + SCL receiver = createMinimalSCL(); + TIED tied = new TIED(); + tied.setName(IED_NAME); + receiver.getIED().add(tied); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + + + assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); + + } + + @Test + void ShouldReturnNOKWhenAddIedCauseReceiverContainsDTTisNULL() { + SCL receiver = createMinimalSCL(); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + + assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); + } + + @Test + void ShouldReturnNOKWhenAddIedCauseReceiverContainsDTTHasNoLNodeType() { + + SCL receiver = createMinimalSCL(); + TDataTypeTemplates tDataTypeTemplates = new TDataTypeTemplates(); + receiver.setDataTypeTemplates(tDataTypeTemplates); + SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); + + SclIEDManager sclIEDManager = new SclIEDManager(receiver); + + assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); + } + + @Test + void testGetLDevice(){ + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + assertFalse(scd.getIED().isEmpty()); + TIED ied = scd.getIED().get(0); + + List lds = SclIEDManager.getIEDLDevice(ied); + assertFalse(lds.isEmpty()); + } + @Test + void testGetSpecificLDevice(){ + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + assertFalse(scd.getIED().isEmpty()); + + TIED ied = scd.getIED() + .stream() + .filter(tied -> tied.getName().equals(IED_NAME)) + .findFirst() + .orElse(null); + assertNotNull(ied); + + TLDevice ld = SclIEDManager.getIEDLDevice(ied,"LDPO").orElse(null); + assertNotNull(ld); + } + + @Test + void ShouldReturnOKWhenUpdateLN() throws ScdException { + TLN ln = new TLN(); + ln.setInst("lnInst"); + ln.setLnType("lnType"); + String newLnType = "newLNType"; + Set receiverLNodeTypeIds = new HashSet<>(); + receiverLNodeTypeIds.add(newLnType); + Map tracker = new HashMap<>(); + tracker.put(ln.getLnType(),newLnType); + SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); + + ln = (TLN) sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker); + assertEquals(newLnType,ln.getLnType()); + + } + + @Test + void ShouldReturnNOKWhenUpdateLNCauseUnknownLNodeType() { + TLN ln = new TLN(); + ln.setInst("lnInst"); + ln.setLnType("lnType"); + Set receiverLNodeTypeIds = new HashSet<>(); + Map tracker = new HashMap<>(); + SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); + + assertThrows(ScdException.class, () -> sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker)); + + } + + @Test + void ShouldReturnNOKWhenUpdateLNCauseLNodeTypeBadlyRenamed() { + TLN ln = new TLN(); + ln.setInst("lnInst"); + ln.setLnType("lnType"); + String badNewLNType = "badNewLNType"; + Set receiverLNodeTypeIds = new HashSet<>(); + Map tracker = new HashMap<>(); + tracker.put(ln.getLnType(),badNewLNType); + SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); + + assertThrows(ScdException.class, () -> sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker)); + + } + + @Test + void testShouldReturnOKWhenGetExtRef() throws ScdException { + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + ExtRefDTO simpleExtRef = new ExtRefDTO(); + simpleExtRef.setIntAddr("INTADDR2"); + simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); + simpleExtRef.setPDO("Op"); + TExtRef extRef = sclIEDManager.getExtRef(IED_NAME,"LDPO",simpleExtRef); + assertEquals("DESC2",extRef.getDesc()); + + } + + @Test + void testShouldReturnNOKWhenGetExtRefNoThingFound() throws ScdException { + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + ExtRefDTO simpleExtRef = new ExtRefDTO(); + simpleExtRef.setIntAddr("INTADDR1"); + simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); + simpleExtRef.setPDO("Op"); + assertThrows(ScdException.class, () -> sclIEDManager.getExtRef(IED_NAME,"LDPO",simpleExtRef)); + } + + @Test + void testShouldReturnNOKWhenGetExtRefUnknownLD() throws ScdException { + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + ExtRefDTO simpleExtRef = new ExtRefDTO(); + simpleExtRef.setIntAddr("INTADDR1"); + simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); + simpleExtRef.setPDO("Op"); + assertThrows(ScdException.class, () -> sclIEDManager.getExtRef(IED_NAME,"LDPO1",simpleExtRef)); + } + @Test + void testExtractLN0ExtRefs(){ + + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + //prerequisite + assertFalse(scd.getIED().isEmpty()); + assertFalse(scd.getIED().get(0).getAccessPoint().isEmpty()); + assertNotNull(scd.getIED().get(0).getAccessPoint().get(0).getServer()); + assertFalse(scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().isEmpty()); + TLDevice lDevice = scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0); + List extRefs = sclIEDManager.extractLN0ExtRefs(lDevice, null); + + assertFalse(extRefs.isEmpty()); + } + + @Test + void testExtractLNExtRefs() throws ScdException { + + SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); + SclIEDManager sclIEDManager = new SclIEDManager(scd); + //prerequisite + assertFalse(scd.getIED().isEmpty()); + assertFalse(scd.getIED().get(0).getAccessPoint().isEmpty()); + assertNotNull(scd.getIED().get(0).getAccessPoint().get(0).getServer()); + assertFalse(scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().isEmpty()); + TLDevice lDevice = scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0); + assertEquals(2,lDevice.getLN().size()); + TLN tln = lDevice.getLN().get(0); + assertFalse(tln.getLnClass().isEmpty()); + String lnClass = tln.getLnClass().get(0); + List extRefs = sclIEDManager.extractLNExtRefs(lDevice,lnClass,tln.getInst(),null); + + assertFalse(extRefs.isEmpty()); + } + + private SCL createMinimalSCL(){ + return SclManager.initialize("hID","hVersion","hRevision"); + } + private MarshallerWrapper createWrapper() throws Exception { + return (new MarshallerWrapper.Builder()).build(); + } + + private SCL getSCLFromFile(String filename){ + MarshallerWrapper marshallerWrapper = null; + try { + marshallerWrapper = createWrapper(); + } catch (Exception e) { + fail("XML marshaller can't be created!"); + } + InputStream is = getClass().getClassLoader().getResourceAsStream(filename); + return marshallerWrapper.unmarshall(is); + } +} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java new file mode 100644 index 000000000..59f79bcc2 --- /dev/null +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java @@ -0,0 +1,5 @@ +package org.lfenergy.compas.sct.service.scl; + +class SclManagerTest { + +} \ No newline at end of file diff --git a/sct-service/src/test/resources/application.yml b/sct-service/src/test/resources/application.yml new file mode 100644 index 000000000..1a68e38ed --- /dev/null +++ b/sct-service/src/test/resources/application.yml @@ -0,0 +1,9 @@ +## YAML Template. +--- +spring: + #profile + profiles: + active: test +logging: + level: + root: INFO \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml new file mode 100644 index 000000000..28c4e3bfd --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -0,0 +1,64 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml new file mode 100644 index 000000000..89569eb67 --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -0,0 +1,62 @@ + + +
+ + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml new file mode 100644 index 000000000..9d709e644 --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml new file mode 100644 index 000000000..8dc3681f3 --- /dev/null +++ b/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -0,0 +1,94 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + AnotherValue + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + AnotherValue + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml new file mode 100644 index 000000000..07a11a198 --- /dev/null +++ b/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml new file mode 100644 index 000000000..54613c43d --- /dev/null +++ b/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml @@ -0,0 +1,102 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IEC 61850-7-3:2007B + + + + + + + + + + + + + + + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + + + IEC 61850-8-1:2003 + + + Completed + Cancelled + New adjustments + Under way + + + Va + Vb + Vc + Aa + Ab + Ac + Vab + Vbc + Vca + Vother + Aother + Synchrophasor + + + \ No newline at end of file From 12ea3660ad4061f0340927c9e66c444e9d280672 Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Mon, 19 Apr 2021 13:46:58 +0200 Subject: [PATCH 03/24] set java version for source and target in POMs Signed-off-by: SYLLA MOHAMED --- pom.xml | 4 ++++ sct-data/pom.xml | 13 ------------- sct-service/pom.xml | 14 -------------- 3 files changed, 4 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index 18dabdcdb..9d89e243f 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,10 @@ + + org.apache.maven.plugins + maven-compiler-plugin + org.jacoco jacoco-maven-plugin diff --git a/sct-data/pom.xml b/sct-data/pom.xml index eb62c042f..cd170a15b 100644 --- a/sct-data/pom.xml +++ b/sct-data/pom.xml @@ -3,18 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - - - org.apache.maven.plugins - maven-compiler-plugin - - 11 - 11 - - - - org.lfenergy.compas @@ -23,7 +11,6 @@ sct-data - SCT DATA \ No newline at end of file diff --git a/sct-service/pom.xml b/sct-service/pom.xml index 4a63515dc..e1d370726 100644 --- a/sct-service/pom.xml +++ b/sct-service/pom.xml @@ -3,19 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - - - org.apache.maven.plugins - maven-compiler-plugin - - 9 - 9 - - - - - org.lfenergy.compas compas-sct @@ -32,6 +19,5 @@ ${project.version} - \ No newline at end of file From d299740aed177d1700ddeeeb2caa072ab87b421f Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Mon, 19 Apr 2021 13:26:18 +0200 Subject: [PATCH 04/24] RSR-31 / Create a new SCD file with Header EPIC RSR-51 / RSR-6 : S79 : Add DataTypeTemplates from ICD to current SCD EPIC RSR-51 / RSR-60 : Add a new IED from ICD to current SCD EPIC RSR-51 / RSR-64 : Associate a list of Connected Access Point (ConnectedAP) to a SubNetwork RSR-86 COMPAS List for a given signal ExtRef, all possible IED, LDevice, LN and DO that can be defined as source RSR-81 COMPAS List all External References signals ExtRef belonging to an IED and LDevice.inst of an SCD file Signed-off-by: SYLLA MOHAMED From ebd8e46bc2b0899c26b60d0c2c026ea1c387481f Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Mon, 19 Apr 2021 14:15:57 +0200 Subject: [PATCH 05/24] set java version for source and target in POMs Signed-off-by: SYLLA MOHAMED --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 18dabdcdb..84d6264fb 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,8 @@ 1.0-SNAPSHOT + 11 + 11 From 05605c2b210d34cca9e74d69a2dac2fd2c441083 Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Mon, 19 Apr 2021 14:53:27 +0200 Subject: [PATCH 06/24] Add copyright to files Signed-off-by: SYLLA MOHAMED --- sct-data/pom.xml | 4 ++++ .../compas/sct/exception/CompasDataAccessException.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/IAccessPointDTO.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/IConnectedApDTO.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/IControlBlockDTO.java | 4 ++++ .../main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java | 4 ++++ .../src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java | 4 ++++ .../main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java | 4 ++++ .../main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java | 4 ++++ .../src/main/java/org/lfenergy/compas/sct/model/IScd.java | 4 ++++ .../org/lfenergy/compas/sct/model/IScdCrudRepository.java | 4 ++++ .../main/java/org/lfenergy/compas/sct/model/IScdModel.java | 4 ++++ .../main/java/org/lfenergy/compas/sct/model/IServerDTO.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java | 4 ++++ .../org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java | 4 ++++ .../main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java | 5 ++++- .../java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java | 4 ++++ .../lfenergy/compas/sct/model/dto/ResumedDataTemplate.java | 5 ++++- .../main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java | 4 ++++ .../org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/entity/SimpleScd.java | 4 ++++ .../org/lfenergy/compas/sct/model/entity/package-info.java | 4 ++++ .../compas/sct/repository/AbstractScdSQLCrudRepository.java | 4 ++++ .../org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java | 4 ++++ .../lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java | 4 ++++ .../compas/sct/repository/PostgresXMLTypeMapper.java | 4 ++++ .../lfenergy/compas/sct/repository/ScdBaseXRepository.java | 4 ++++ .../org/lfenergy/compas/sct/repository/ScdJpaRepository.java | 4 ++++ .../lfenergy/compas/sct/repository/SimpleScdRepository.java | 4 ++++ .../org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java | 4 ++++ .../java/org/lfenergy/compas/sct/ApplicationContextTest.java | 4 ++++ .../compas/sct/exception/CompasDataAccessExceptionTest.java | 4 ++++ .../lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java | 4 ++++ .../org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java | 4 ++++ .../org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java | 4 ++++ .../compas/sct/model/dto/ResumedDataTemplateTest.java | 4 ++++ .../java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java | 4 ++++ .../org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java | 4 ++++ .../org/lfenergy/compas/sct/model/entity/SimpleScdTest.java | 4 ++++ .../org/lfenergy/compas/sct/model/entity/package-info.java | 4 ++++ .../lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java | 4 ++++ .../compas/sct/repository/PostgresXMLTypeMapperTest.java | 4 ++++ .../compas/sct/repository/SimpleScdRepositoryTest.java | 4 ++++ .../test/java/org/lfenergy/compas/sct/testhelper/DTO.java | 4 ++++ .../resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 4 ++++ .../IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml | 4 ++++ .../resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml | 4 ++++ .../resources/scl/IEDImportHelper/icd_import_ied_test.xml | 4 ++++ .../src/test/resources/scl/SCD/scd_ied_receiver_test.xml | 4 ++++ sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml | 4 ++++ sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml | 4 ++++ sct-service/pom.xml | 4 ++++ .../org/lfenergy/compas/sct/config/XMLMarshallerConfig.java | 4 ++++ .../org/lfenergy/compas/sct/config/XSDFileProperties.java | 4 ++++ .../lfenergy/compas/sct/service/AbstractSqlScdService.java | 4 ++++ .../java/org/lfenergy/compas/sct/service/ISCDService.java | 4 ++++ .../org/lfenergy/compas/sct/service/SimpleSqlScdService.java | 4 ++++ .../compas/sct/service/scl/SclCommunicationManager.java | 4 ++++ .../compas/sct/service/scl/SclDataTemplateManager.java | 4 ++++ .../lfenergy/compas/sct/service/scl/SclHeaderManager.java | 4 ++++ .../org/lfenergy/compas/sct/service/scl/SclIEDManager.java | 4 ++++ .../java/org/lfenergy/compas/sct/service/scl/SclManager.java | 4 ++++ sct-service/src/main/resources/icd/icd_test.xml | 4 ++++ .../resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 4 ++++ .../IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml | 4 ++++ .../resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml | 4 ++++ .../resources/scl/IEDImportHelper/icd_import_ied_test.xml | 4 ++++ .../src/main/resources/scl/SCD/scd_ied_receiver_test.xml | 4 ++++ sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml | 4 ++++ .../src/main/resources/scl/SCD/scd_with_ieds_test.xml | 4 ++++ .../java/org/lfenergy/compas/sct/ApplicationContextTest.java | 4 ++++ .../org/lfenergy/compas/sct/model/entity/package-info.java | 4 ++++ .../lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java | 4 ++++ .../compas/sct/service/scl/SclCommunicationManagerTest.java | 4 ++++ .../compas/sct/service/scl/SclDataTemplateManagerTest.java | 4 ++++ .../compas/sct/service/scl/SclHeaderManagerTest.java | 4 ++++ .../lfenergy/compas/sct/service/scl/SclIEDManagerTest.java | 4 ++++ .../org/lfenergy/compas/sct/service/scl/SclManagerTest.java | 4 ++++ .../resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 4 ++++ .../IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml | 4 ++++ .../resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml | 4 ++++ .../resources/scl/IEDImportHelper/icd_import_ied_test.xml | 4 ++++ .../src/test/resources/scl/SCD/scd_ied_receiver_test.xml | 4 ++++ sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml | 4 ++++ .../src/test/resources/scl/SCD/scd_with_ieds_test.xml | 4 ++++ 90 files changed, 360 insertions(+), 2 deletions(-) diff --git a/sct-data/pom.xml b/sct-data/pom.xml index cd170a15b..b700e4b59 100644 --- a/sct-data/pom.xml +++ b/sct-data/pom.xml @@ -1,4 +1,8 @@ + + + + diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java b/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java index 9bec65351..bd441c207 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.exception; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java index adfa0cdae..4d8e72d91 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; import lombok.NonNull; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java index 2a47d0f5d..2b583de0b 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; public interface IConnectedApDTO { diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java index 9847c0b71..44917ae6c 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; public interface IControlBlockDTO { diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java index c8e89851c..91f46c318 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java index d980a1087..717ea13e5 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; import lombok.NonNull; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java index 965e3b20a..a9e9f3868 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; import org.springframework.lang.NonNull; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java index adda1c02c..4de0bc994 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java index c5fad6533..3e92310c5 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; public interface IScd { diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java index b0de05833..ac96b2757 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; import org.lfenergy.compas.sct.exception.CompasDataAccessException; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java index d2ddaf07e..ed1bd9eb5 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; public interface IScdModel { diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java index 13848b5ef..827948034 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; import java.util.Set; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java index dd2598491..f19c30d02 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model; import java.util.Set; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java index f739444b8..d0568f0ef 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java index fa5b99b2a..21ea77720 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java index f8aa7141b..f03c48284 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import lombok.Getter; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java index 1d894b039..bed5d8b60 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import lombok.Getter; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java index 224edae5e..9afcf3c79 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java @@ -1,5 +1,8 @@ -package org.lfenergy.compas.sct.model.dto; +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 +package org.lfenergy.compas.sct.model.dto; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java index 26a963882..ce1fa9aeb 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import lombok.Getter; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java index 26a6796cb..b3567a61c 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java @@ -1,5 +1,8 @@ -package org.lfenergy.compas.sct.model.dto; +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 +package org.lfenergy.compas.sct.model.dto; import lombok.Getter; import lombok.Setter; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java index 4e0a1f7cc..1b65524a9 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import lombok.Getter; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java index f3fb46187..f7872dc2b 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java index 08d741c5d..34e01cf66 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.entity; import lombok.Getter; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java index 9ed174c44..680fd2861 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -1,5 +1,9 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + @TypeDef( name = "xmltype", defaultForType = byte[].class, diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java index f226a964c..fdfa8d5d1 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import lombok.extern.slf4j.Slf4j; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java index 7673f7cb8..2f67e6fdf 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.hibernate.HibernateException; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java index fc7c9002a..a71cd0e86 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.hibernate.dialect.PostgreSQL95Dialect; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java index 74ff3c99d..f61f14877 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import lombok.extern.slf4j.Slf4j; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java index 6c266c274..38698398e 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.lfenergy.compas.sct.exception.CompasDataAccessException; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java index d89568362..de5f70bab 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.lfenergy.compas.sct.model.entity.SimpleScd; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java index 93a8fde86..01aad6a89 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java index 637ed86e1..57df3d2d4 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.hibernate.HibernateException; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java index 96295914e..5b723c901 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java index 248afdc0f..1911d6eb2 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.exception; import static org.junit.jupiter.api.Assertions.*; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java index 424b4f8f3..ddfab46bb 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java index 91cfd70a1..da31c1e6d 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import static org.junit.jupiter.api.Assertions.*; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java index ffc323bee..d1eb9f472 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java index 38ae12517..a98e9e545 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java index b7e0dcf4c..b70779179 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java index e701cefe9..c82cf704d 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java index cca20c753..cf4a203fb 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java index fef619b00..7891d0c35 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.dto; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java index 598e1d3c9..bd812a35d 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.model.entity; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java index 548b9a3c0..f2e6249c5 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + @TypeDef( name = "xmltype", defaultForType = byte[].class, diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java index a786fd16a..016180d84 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java index 549f80f5d..a51d9c4ba 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java index 097e375be..ca3060810 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.repository; import org.junit.jupiter.api.Test; diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java index 8fc9073b3..b85c80b34 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.testhelper; import org.lfenergy.compas.scl.TConnectedAP; diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml index 28c4e3bfd..31bf5f5da 100644 --- a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml index 89569eb67..18d328bf2 100644 --- a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml index 9d709e644..b81165384 100644 --- a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml +++ b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml index 8dc3681f3..4b68e1b4a 100644 --- a/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml +++ b/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml index 07a11a198..5883470f7 100644 --- a/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml +++ b/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml index 07a11a198..5883470f7 100644 --- a/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml +++ b/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml index 5a8a228b3..0e70ad0ea 100644 --- a/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml +++ b/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/pom.xml b/sct-service/pom.xml index e1d370726..5d383bac0 100644 --- a/sct-service/pom.xml +++ b/sct-service/pom.xml @@ -1,4 +1,8 @@ + + + + diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java index d9a3a591e..6f97e189a 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.config; import org.lfenergy.compas.commons.MarshallerWrapper; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java index 2a37b6520..2e6cb5971 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.config; import lombok.Getter; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java index d9591f624..214d6631c 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service; import lombok.Getter; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java index e7791ed60..bd6725246 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service; import org.lfenergy.compas.exception.ScdException; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java index 118a71fd3..97a98a52d 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service; import lombok.extern.slf4j.Slf4j; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java index a607be355..0c71cae16 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; import lombok.Getter; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java index eeccd178d..123d592fb 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java index f3c2f1bc6..06dee06d6 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; import org.lfenergy.compas.exception.ScdException; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java index fe683d564..87cd02537 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java index 0ba80b2f5..1d584afce 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; import lombok.Getter; diff --git a/sct-service/src/main/resources/icd/icd_test.xml b/sct-service/src/main/resources/icd/icd_test.xml index 26222f7cf..f9dd3d222 100644 --- a/sct-service/src/main/resources/icd/icd_test.xml +++ b/sct-service/src/main/resources/icd/icd_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml index 28c4e3bfd..31bf5f5da 100644 --- a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml index 89569eb67..18d328bf2 100644 --- a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml index 9d709e644..b81165384 100644 --- a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml +++ b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml index 03162c59a..6bdb012c9 100644 --- a/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml +++ b/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml index 9d709e644..b81165384 100644 --- a/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml +++ b/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml index 07a11a198..5883470f7 100644 --- a/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml +++ b/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml index 7ace9cbe2..485ee0299 100644 --- a/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml +++ b/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java index 6e1aa11fa..f002e1ae4 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct; import org.junit.jupiter.api.Test; diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java index 909557105..6f3e270f5 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + @TypeDef( name = "xmltype", defaultForType = byte[].class, diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java index 1757f8f38..2f0e3a349 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service; import org.checkerframework.checker.units.qual.C; diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java index 116760f09..e861ffdf0 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; import org.junit.jupiter.api.Test; diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java index aed34dc33..ffa659649 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java index 7009c4538..33b292ae0 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; import org.junit.jupiter.api.Test; diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java index 8ebed00a7..99b024e0c 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java index 59f79bcc2..b07efdd18 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.service.scl; class SclManagerTest { diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml index 28c4e3bfd..31bf5f5da 100644 --- a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml index 89569eb67..18d328bf2 100644 --- a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml index 9d709e644..b81165384 100644 --- a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml +++ b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml index 8dc3681f3..4b68e1b4a 100644 --- a/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml +++ b/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml index 07a11a198..5883470f7 100644 --- a/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml +++ b/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml index 07a11a198..5883470f7 100644 --- a/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml +++ b/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml @@ -1,4 +1,8 @@ + + + +
diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml index 54613c43d..d8e228508 100644 --- a/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml +++ b/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml @@ -1,4 +1,8 @@ + + + +
From 1ca10bb8e0de3b37341ba0326858c1bc28f1aac8 Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Thu, 22 Apr 2021 10:18:49 +0200 Subject: [PATCH 07/24] Restructure ExtRef info (signal, binding, source) Signed-off-by: SYLLA MOHAMED --- pom.xml | 3 + sct-coverage/pom.xml | 1 + sct-data/pom.xml | 4 + .../lfenergy/compas/sct/model/IExtRefDTO.java | 100 ------------------ .../lfenergy/compas/sct/model/ILNodeDTO.java | 5 +- .../sct/model/dto/ExtRefBindingInfo.java | 64 +++++++++++ .../compas/sct/model/dto/ExtRefDTO.java | 73 ------------- .../compas/sct/model/dto/ExtRefInfo.java | 44 ++++++++ .../sct/model/dto/ExtRefSignalInfo.java | 92 ++++++++++++++++ .../sct/model/dto/ExtRefSourceInfo.java | 48 +++++++++ .../compas/sct/model/dto/LNodeDTO.java | 14 ++- .../sct/model/dto/ExtRefBindingInfoTest.java | 50 +++++++++ .../compas/sct/model/dto/ExtRefDTOTest.java | 29 ----- .../compas/sct/model/dto/ExtRefInfoTest.java | 36 +++++++ .../sct/model/dto/ExtRefSignalInfoTest.java | 57 ++++++++++ .../sct/model/dto/ExtRefSourceInfoTest.java | 27 +++++ .../compas/sct/model/dto/LNodeDTOTest.java | 2 +- .../sct/model/entity/SimpleScdTest.java | 3 +- .../lfenergy/compas/sct/testhelper/DTO.java | 71 ++++++++----- sct-service/pom.xml | 3 + .../compas/sct/service/ISCDService.java | 7 +- .../sct/service/SimpleSqlScdService.java | 17 +-- .../service/scl/SclDataTemplateManager.java | 20 ++-- .../compas/sct/service/scl/SclIEDManager.java | 25 ++--- .../sct/service/SqlScdServiceAndDBTest.java | 17 +-- .../scl/SclDataTemplateManagerTest.java | 15 ++- .../sct/service/scl/SclIEDManagerTest.java | 8 +- 27 files changed, 533 insertions(+), 302 deletions(-) delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java create mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java create mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java diff --git a/pom.xml b/pom.xml index 660b53d85..707c9d546 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,9 @@ 1.0-SNAPSHOT 11 11 + sct-coverage/** + ../sct-coverage/target/site/jacoco-aggregate/jacoco.xml + ${basedir}/${aggregate.report.dir} diff --git a/sct-coverage/pom.xml b/sct-coverage/pom.xml index 6a18222e1..0ebf4e475 100644 --- a/sct-coverage/pom.xml +++ b/sct-coverage/pom.xml @@ -11,6 +11,7 @@ ../pom.xml + pom sct-coverage SCT-Coverage diff --git a/sct-data/pom.xml b/sct-data/pom.xml index b700e4b59..b67a60b2f 100644 --- a/sct-data/pom.xml +++ b/sct-data/pom.xml @@ -17,4 +17,8 @@ sct-data SCT DATA + + ${basedir}/${aggregate.report.dir} + + \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java deleted file mode 100644 index 91f46c318..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IExtRefDTO.java +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - - -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TServiceType; - -public interface IExtRefDTO { - - String getDesc(); - String getPDO(); - String getPLN(); - String getPDA(); - String getIntAddr(); - String getLdInst(); - String getIedName(); - String getPrefix(); - String getLnClass(); - String getLnInst(); - String getDoName(); - String getDaName(); - TServiceType getServiceType(); - String getSrcLDInst(); - String getSrcPrefix(); - String getSrcLNClass(); - String getSrcLNInst(); - String getSrcCBName(); - TServiceType getPServT(); - - void setDesc(String desc); - void setPDO(String pdo); - void setPLN(String pln); - void setPDA(String pda); - void setIntAddr(String intAddr); - void setLdInst(String ldInst); - void setIedName(String iedName); - void setPrefix(String prefix); - void setLnClass(String lnClass); - void setLnInst(String lnInst); - void setDoName(String doName); - void setDaName(String daName); - void setServiceType(TServiceType serviceType); - void setSrcLDInst(String srcLDInst); - void setSrcPrefix(String srcPrefix); - void setSrcLNClass( String srcLNClass); - void setSrcLNInst(String srcLNCInst); - void setSrcCBName(String srcCBName); - void setPServT(TServiceType pServT); - - default boolean isIdentical(IExtRefDTO other){ - - if(this.getDesc() != null && !getDesc().equals(other.getDesc())) return false; - if(this.getPDO() != null && !getPDO().equals(other.getPDO())) return false; - if(this.getPDA() != null && !getPDA().equals(other.getPDA())) return false; - if(this.getPLN() != null && !getPLN().equals(other.getPLN())) return false; - if(this.getIedName() != null && !getIedName().equals(other.getIedName())) return false; - if(this.getIntAddr() != null && !getIntAddr().equals(other.getIntAddr())) return false; - if(this.getLdInst() != null && !getLdInst().equals(other.getLdInst())) return false; - if(this.getPrefix() != null && !getPrefix().equals(other.getPrefix())) return false; - if(this.getLnClass() != null && !getLnClass().equals(other.getLnClass())) return false; - if(this.getLnInst() != null && !getLnInst().equals(other.getLnInst())) return false; - if(this.getDoName() != null && !getDoName().equals(other.getDoName())) return false; - if(this.getDaName() != null && !getDaName().equals(other.getDaName())) return false; - if(this.getSrcLNClass() != null && !getSrcLNClass().equals(other.getSrcLNClass())) return false; - if(this.getSrcLNInst() != null && !getSrcLNInst().equals(other.getSrcLNInst())) return false; - if(this.getSrcCBName() != null && !getSrcCBName().equals(other.getSrcCBName())) return false; - if(this.getSrcLDInst() != null && !getSrcLDInst().equals(other.getSrcLDInst())) return false; - if(this.getPServT() != null && !getPServT().equals(other.getPServT())) return false; - if(this.getServiceType() != null && !getServiceType().equals(other.getServiceType())) return false; - - return true; - } - - default boolean isIdentical(TExtRef other){ - - if(this.getDesc() != null && !getDesc().equals(other.getDesc())) return false; - if(this.getPDO() != null && !getPDO().equals(other.getPDO())) return false; - if(this.getPDA() != null && !getPDA().equals(other.getPDA())) return false; - if(this.getPLN() != null && !other.getPLN().contains(getPLN())) return false; - if(this.getIedName() != null && !getIedName().equals(other.getIedName())) return false; - if(this.getIntAddr() != null && !getIntAddr().equals(other.getIntAddr())) return false; - if(this.getLdInst() != null && !getLdInst().equals(other.getLdInst())) return false; - if(this.getPrefix() != null && !getPrefix().equals(other.getPrefix())) return false; - if(this.getLnClass() != null && !other.getLnClass().contains(getLnClass())) return false; - if(this.getLnInst() != null && !getLnInst().equals(other.getLnInst())) return false; - if(this.getDoName() != null && !getDoName().equals(other.getDoName())) return false; - if(this.getDaName() != null && !getDaName().equals(other.getDaName())) return false; - if(this.getSrcLNClass() != null && !other.getSrcLNClass().contains(getSrcLNClass())) return false; - if(this.getSrcLNInst() != null && !getSrcLNInst().equals(other.getSrcLNInst())) return false; - if(this.getSrcCBName() != null && !getSrcCBName().equals(other.getSrcCBName())) return false; - if(this.getSrcLDInst() != null && !getSrcLDInst().equals(other.getSrcLDInst())) return false; - if(this.getPServT() != null && !getPServT().equals(other.getPServT())) return false; - if(this.getServiceType() != null && !getServiceType().equals(other.getServiceType())) return false; - - return true; - } -} \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java index 4de0bc994..721f1ae7f 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java @@ -4,6 +4,7 @@ package org.lfenergy.compas.sct.model; +import org.lfenergy.compas.sct.model.dto.ExtRefInfo; import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; import java.util.Set; @@ -12,10 +13,10 @@ public interface ILNodeDTO { String getInst(); String getLNodeClass(); String getLNodeType(); - Set getExtRefs(); + Set getExtRefs(); Set getResumedDataTemplates(); - void addExtRef(T extRef); + void addExtRef(ExtRefInfo extRef); void addResumedDataTemplate(ResumedDataTemplate dtt); void setInst(String inst); diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java new file mode 100644 index 000000000..0b8113348 --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TServiceType; + +import java.util.Objects; + +@Getter +@Setter +@NoArgsConstructor +public class ExtRefBindingInfo { + + private String iedName; + private String ldInst; + private String prefix; + private String lnClass; + private String lnInst; + private String doName; + private String daName; + private TServiceType serviceType; + + public ExtRefBindingInfo(TExtRef tExtRef){ + iedName = tExtRef.getIedName(); + ldInst = tExtRef.getLdInst(); + prefix = tExtRef.getPrefix(); + if(!tExtRef.getLnClass().isEmpty()) { + this.lnClass = tExtRef.getLnClass().get(0); + } + lnInst = tExtRef.getLnInst(); + doName = tExtRef.getDoName(); + daName = tExtRef.getDaName(); + if(tExtRef.getServiceType() != null) { + serviceType = tExtRef.getServiceType(); + } + } + + @Override + public boolean equals(Object o) { + if (o == null) return false; + if (this == o) return true; + if (o.getClass() != getClass()) return false; + ExtRefBindingInfo that = (ExtRefBindingInfo) o; + return Objects.equals(iedName, that.iedName) && + Objects.equals(ldInst, that.ldInst) && + Objects.equals(prefix, that.prefix) && + Objects.equals(lnClass, that.lnClass) && + Objects.equals(lnInst, that.lnInst) && + Objects.equals(doName, that.doName) && + Objects.equals(daName, that.daName) && + serviceType == that.serviceType; + } + + @Override + public int hashCode() { + return Objects.hash(iedName, ldInst, prefix, lnClass, lnInst, doName, daName, serviceType); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java deleted file mode 100644 index 21ea77720..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefDTO.java +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TServiceType; -import org.lfenergy.compas.sct.model.IExtRefDTO; -import org.springframework.lang.NonNull; - - -@Setter -@Getter -@NoArgsConstructor -public class ExtRefDTO implements IExtRefDTO { - private String iedName; - private String ldInst; - private String prefix; - private String lnClass; - private String lnInst; - private String doName; - private String daName; - private TServiceType serviceType; - private String srcLDInst; - private String srcPrefix; - private String srcLNClass; - private String srcLNInst; - private String srcCBName; - private String desc; - private String pLN; - private String pDO; - private String pDA; - private String intAddr; - private TServiceType pServT; - - public ExtRefDTO(@NonNull TExtRef tExtRef) { - iedName = tExtRef.getIedName(); - ldInst = tExtRef.getLdInst(); - prefix = tExtRef.getPrefix(); - if(!tExtRef.getLnClass().isEmpty()) { - this.lnClass = tExtRef.getLnClass().get(0); - } - lnInst = tExtRef.getLnInst(); - doName = tExtRef.getDoName(); - daName = tExtRef.getDaName(); - if(tExtRef.getServiceType() != null) { - serviceType = tExtRef.getServiceType(); - } - srcLDInst = tExtRef.getSrcLDInst(); - srcPrefix = tExtRef.getSrcPrefix(); - srcLNInst = tExtRef.getSrcLNInst(); - srcCBName = tExtRef.getSrcCBName(); - desc = tExtRef.getDesc(); - if(!tExtRef.getPLN().isEmpty()) { - pLN = tExtRef.getPLN().get(0); - } - if(!tExtRef.getSrcLNClass().isEmpty()){ - srcLNClass = tExtRef.getSrcLNClass().get(0); - } - pDO = tExtRef.getPDO(); - pDA = tExtRef.getPDA(); - intAddr = tExtRef.getIntAddr(); - if(tExtRef.getPServT() != null) { - pServT = tExtRef.getPServT(); - } - } -} - diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java new file mode 100644 index 000000000..a1dd9bfce --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TExtRef; + +import java.util.Objects; + +@Getter +@Setter +@NoArgsConstructor +public class ExtRefInfo { + private ExtRefSignalInfo signalInfo; + private ExtRefBindingInfo bindingInfo; + private ExtRefSourceInfo sourceInfo; + + public ExtRefInfo(TExtRef tExtRef) { + bindingInfo = new ExtRefBindingInfo(tExtRef); + sourceInfo = new ExtRefSourceInfo(tExtRef); + signalInfo = new ExtRefSignalInfo(tExtRef); + } + + @Override + public boolean equals(Object o) { + if (o == null) return false; + if (o.getClass() != getClass()) return false; + if (this == o) return true; + ExtRefInfo that = (ExtRefInfo) o; + return Objects.equals(signalInfo, that.signalInfo) && + Objects.equals(bindingInfo, that.bindingInfo) && + Objects.equals(sourceInfo, that.sourceInfo); + } + + @Override + public int hashCode() { + return Objects.hash(signalInfo, bindingInfo, sourceInfo); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java new file mode 100644 index 000000000..1dbeea37b --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.scl.TServiceType; + +import java.util.Objects; + +@Getter +@Setter +@NoArgsConstructor +public class ExtRefSignalInfo { + private String desc; + private String pLN; + private String pDO; + private String pDA; + private String intAddr; + private TServiceType pServT; + + public ExtRefSignalInfo(TExtRef tExtRef){ + desc = tExtRef.getDesc(); + if(!tExtRef.getPLN().isEmpty()) { + pLN = tExtRef.getPLN().get(0); + } + pDO = tExtRef.getPDO(); + pDA = tExtRef.getPDA(); + intAddr = tExtRef.getIntAddr(); + if(tExtRef.getPServT() != null) { + pServT = tExtRef.getPServT(); + } + } + + @Override + public boolean equals(Object o) { + if (o == null) return false; + if (this == o) return true; + if (o.getClass() != this.getClass()) return false; + ExtRefSignalInfo that = (ExtRefSignalInfo) o; + return Objects.equals(desc, that.desc) && + Objects.equals(pLN, that.pLN) && + Objects.equals(pDO, that.pDO) && + Objects.equals(pDA, that.pDA) && + Objects.equals(intAddr, that.intAddr) && + pServT == that.pServT; + } + + @Override + public int hashCode() { + return Objects.hash(desc, pLN, pDO, pDA, intAddr, pServT); + } + + public boolean isWrappedIn(TExtRef tExtRef) { + if((desc != null && tExtRef.getDesc() == null) || + (desc == null && tExtRef.getDesc() != null) || + (desc != null && tExtRef.getDesc() != null && !desc.equals(tExtRef.getDesc()))){ + return false; + } + if(!tExtRef.getPLN().isEmpty() && !tExtRef.getPLN().contains(pLN)){ + return false; + } + + if((pDO == null && tExtRef.getPDO() != null) || + (pDO != null && tExtRef.getPDO() == null) || + (pDO != null && !pDO.equals(tExtRef.getPDO()))){ + return false; + } + if( (pDA == null && tExtRef.getPDA() != null) || + (pDA != null && tExtRef.getPDO() == null) || + (pDA != null && !pDA.equals(tExtRef.getPDA()))){ + return false; + } + + if((intAddr != null && tExtRef.getIntAddr() == null) || + (intAddr == null && tExtRef.getIntAddr() != null) || + (intAddr != null && !intAddr.equals(tExtRef.getIntAddr()))){ + return false; + } + + if((pServT != null && tExtRef.getPServT() == null) || + (pServT == null && tExtRef.getPServT() != null) || + (pServT != null && !pServT.equals(tExtRef.getPServT()))){ + return false; + } + return true; + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java new file mode 100644 index 000000000..97fa054ca --- /dev/null +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.lfenergy.compas.scl.TExtRef; + +import java.util.Objects; + +@Setter +@Getter +@NoArgsConstructor +public class ExtRefSourceInfo { + private String srcLDInst; + private String srcPrefix; + private String srcLNClass; + private String srcLNInst; + private String srcCBName; + + public ExtRefSourceInfo(TExtRef tExtRef){ + srcLDInst = tExtRef.getSrcLDInst(); + srcPrefix = tExtRef.getSrcPrefix(); + srcLNInst = tExtRef.getSrcLNInst(); + srcCBName = tExtRef.getSrcCBName(); + } + + @Override + public boolean equals(Object o) { + if (o == null) return false; + if (o.getClass() != getClass()) return false; + if (this == o) return true; + ExtRefSourceInfo that = (ExtRefSourceInfo) o; + return Objects.equals(srcLDInst, that.srcLDInst) && + Objects.equals(srcPrefix, that.srcPrefix) && + Objects.equals(srcLNClass, that.srcLNClass) && + Objects.equals(srcLNInst, that.srcLNInst) && + Objects.equals(srcCBName, that.srcCBName); + } + + @Override + public int hashCode() { + return Objects.hash(srcLDInst, srcPrefix, srcLNClass, srcLNInst, srcCBName); + } +} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java index ce1fa9aeb..cdfdf0806 100644 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java +++ b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java @@ -8,8 +8,6 @@ import lombok.NoArgsConstructor; import lombok.Setter; import org.lfenergy.compas.scl.TLN; -import org.lfenergy.compas.sct.model.IControlBlockDTO; -import org.lfenergy.compas.sct.model.IExtRefDTO; import org.lfenergy.compas.sct.model.ILNodeDTO; import java.util.HashSet; @@ -22,7 +20,7 @@ public class LNodeDTO implements ILNodeDTO { private String inst; private String lNodeClass; private String lNodeType; - private Set extRefs = new HashSet<>(); + private Set extRefs = new HashSet<>(); private Set resumedDataTemplates = new HashSet<>(); public LNodeDTO(String inst, String lNClass, String lNType) { @@ -37,7 +35,7 @@ public static LNodeDTO extractData(TLN ln) { LNodeDTO lNodeDTO = new LNodeDTO(ln.getInst(),lnClass,ln.getLnType()); if(ln.getInputs() != null){ ln.getInputs().getExtRef().forEach(tExtRef -> { - ExtRefDTO extRefDTO = new ExtRefDTO(tExtRef); + ExtRefInfo extRefDTO = new ExtRefInfo(tExtRef); lNodeDTO.addExtRef(extRefDTO); }); } @@ -45,13 +43,13 @@ public static LNodeDTO extractData(TLN ln) { } @Override - public Set getExtRefs() { - return Set.of(extRefs.toArray(new ExtRefDTO[0])); + public Set getExtRefs() { + return Set.of(extRefs.toArray(new ExtRefInfo[0])); } @Override - public void addExtRef(T extRef) { - extRefs.add((ExtRefDTO) extRef); + public void addExtRef(ExtRefInfo extRef) { + extRefs.add(extRef); } @Override diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java new file mode 100644 index 000000000..151a76925 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class ExtRefBindingInfoTest { + + @Test + void testConstruction(){ + ExtRefBindingInfo bindingInfo = DTO.createExtRefBindingInfo(); + ExtRefBindingInfo bindingInfo_bis = DTO.createExtRefBindingInfo(); + ExtRefBindingInfo bindingInfo_ter = bindingInfo; + ExtRefBindingInfo bindingInfo_qt = new ExtRefBindingInfo(); + + assertEquals(bindingInfo,bindingInfo_ter); + assertEquals(bindingInfo,bindingInfo_bis); + assertNotEquals(bindingInfo, null); + assertNotEquals(bindingInfo, bindingInfo_qt); + bindingInfo_qt.setDaName(bindingInfo.getDaName()); + assertNotEquals(bindingInfo, bindingInfo_qt); + + bindingInfo_qt.setDoName(bindingInfo.getDoName()); + assertNotEquals(bindingInfo, bindingInfo_qt); + + bindingInfo_qt.setIedName(bindingInfo.getIedName()); + assertNotEquals(bindingInfo, bindingInfo_qt); + + bindingInfo_qt.setLdInst(bindingInfo.getLdInst()); + assertNotEquals(bindingInfo, bindingInfo_qt); + + bindingInfo_qt.setLnInst(bindingInfo.getLnInst()); + assertNotEquals(bindingInfo, bindingInfo_qt); + + bindingInfo_qt.setLnClass(bindingInfo.getLnClass()); + assertNotEquals(bindingInfo, bindingInfo_qt); + + bindingInfo_qt.setPrefix(bindingInfo.getPrefix()); + assertNotEquals(bindingInfo, bindingInfo_qt); + + bindingInfo_qt.setServiceType(bindingInfo.getServiceType()); + assertEquals(bindingInfo, bindingInfo_qt); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java deleted file mode 100644 index da31c1e6d..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefDTOTest.java +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.sct.testhelper.DTO; - -class ExtRefDTOTest { - - @Test - void testIsIdentical(){ - ExtRefDTO extRefDTO = DTO.createExtRefDTO(); - ExtRefDTO extRefDTO_bis = new ExtRefDTO(DTO.createExtRef()); - assertTrue(extRefDTO.isIdentical(DTO.createExtRef())); - assertTrue(extRefDTO.isIdentical(extRefDTO_bis)); - assertFalse(extRefDTO.isIdentical(new TExtRef())); - assertFalse(extRefDTO.isIdentical(new ExtRefDTO())); - - extRefDTO_bis.setIntAddr(DTO.INT_ADDR + "_1"); - assertFalse(extRefDTO.isIdentical(extRefDTO_bis)); - extRefDTO_bis.setPLN(DTO.P_LN + "_1"); - assertFalse(extRefDTO.isIdentical(extRefDTO_bis)); - } - -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java new file mode 100644 index 000000000..36cf9fc8e --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class ExtRefInfoTest { + + /* @Test + void testConstruction(){ + ExtRefInfo extRefInfo = createExtRef(); + ExtRefInfo extRefInfo_bis = createExtRef(); + assertEquals(extRefInfo,extRefInfo_bis); + String doName = extRefInfo_bis.getBindingInfo().getDoName(); + extRefInfo_bis.getBindingInfo().setDoName("ggggg"); + assertNotEquals(extRefInfo,extRefInfo_bis); + assertNotEquals(extRefInfo,new ExtRefInfo()); + + + } + + private ExtRefInfo createExtRef(){ + ExtRefInfo extRefInfo = new ExtRefInfo(); + extRefInfo.setSignalInfo(DTO.createExtRefSignalInfo()); + extRefInfo.setBindingInfo(DTO.createExtRefBindingInfo()); + extRefInfo.setSourceInfo(DTO.createExtRefSourceInfo()); + + return extRefInfo; + }*/ + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java new file mode 100644 index 000000000..fff5210c8 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl.TExtRef; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class ExtRefSignalInfoTest { + + @Test + void testConstruction(){ + ExtRefSignalInfo signalInfo = DTO.createExtRefSignalInfo(); + ExtRefSignalInfo signalInfoBis = DTO.createExtRefSignalInfo(); + ExtRefSignalInfo signalInfoTer = signalInfo; + ExtRefSignalInfo signalInfoQt = new ExtRefSignalInfo(); + + assertEquals(signalInfo,signalInfoTer); + assertEquals(signalInfo,signalInfoBis); + assertNotEquals(signalInfo, null); + assertNotEquals(signalInfo, signalInfoQt); + + } + + @Test + void testIsWrappedIn(){ + + TExtRef tExtRef = DTO.createExtRef(); + ExtRefSignalInfo signalInfo = new ExtRefSignalInfo(tExtRef); + ExtRefSignalInfo signalInfo1 = new ExtRefSignalInfo(); + assertTrue(signalInfo.isWrappedIn(tExtRef)); + + assertFalse(signalInfo1.isWrappedIn(tExtRef)); + + signalInfo1.setDesc(signalInfo.getDesc()); + assertFalse(signalInfo1.isWrappedIn(tExtRef)); + + signalInfo1.setPDA(signalInfo.getPDA()); + assertFalse(signalInfo1.isWrappedIn(tExtRef)); + + signalInfo1.setPDO(signalInfo.getPDO()); + assertFalse(signalInfo1.isWrappedIn(tExtRef)); + + signalInfo1.setIntAddr(signalInfo.getIntAddr()); + assertFalse(signalInfo1.isWrappedIn(tExtRef)); + + signalInfo1.setPLN(signalInfo.getPLN()); + assertFalse(signalInfo1.isWrappedIn(tExtRef)); + + signalInfo1.setPServT(signalInfo.getPServT()); + assertTrue(signalInfo1.isWrappedIn(tExtRef)); + } +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java new file mode 100644 index 000000000..7b353c374 --- /dev/null +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2020 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.model.dto; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.sct.testhelper.DTO; + +import static org.junit.jupiter.api.Assertions.*; + +class ExtRefSourceInfoTest { + @Test + void testConstruction(){ + ExtRefSourceInfo sourceInfo = DTO.createExtRefSourceInfo(); + ExtRefSourceInfo bindingInfo_bis = DTO.createExtRefSourceInfo(); + ExtRefSourceInfo bindingInfo_ter = sourceInfo; + ExtRefSourceInfo bindingInfo_qt = new ExtRefSourceInfo(); + + assertEquals(sourceInfo,bindingInfo_ter); + assertEquals(sourceInfo,bindingInfo_bis); + assertNotEquals(sourceInfo, null); + assertNotEquals(sourceInfo, bindingInfo_qt); + assertFalse(sourceInfo.equals(new ExtRefSignalInfo())); + } + +} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java index b70779179..1d93084db 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java @@ -18,7 +18,7 @@ class LNodeDTOTest { @Test public void testConstruction(){ LNodeDTO lNodeDTO = DTO.createLNodeDTO(); - lNodeDTO.addExtRef(DTO.createExtRefDTO()); + lNodeDTO.addExtRef(DTO.createExtRefInfo()); lNodeDTO.addResumedDataTemplate(new ResumedDataTemplate()); assertAll("LNodeDTO", diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java index bd812a35d..cccca7e01 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java @@ -16,7 +16,8 @@ class SimpleScdTest { void testScd(){ UUID id = UUID.randomUUID(); SimpleScd scd = DTO.createScd(id); - assertEquals(scd,scd); + SimpleScd scd2 = scd; + assertEquals(scd,scd2); assertAll("SCD", () -> assertEquals(id, scd.getId()), diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java index b85c80b34..8146ca299 100644 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java +++ b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java @@ -12,7 +12,10 @@ import org.lfenergy.compas.scl.TServiceType; import org.lfenergy.compas.scl.TSubNetwork; import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; -import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefBindingInfo; +import org.lfenergy.compas.sct.model.dto.ExtRefInfo; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; +import org.lfenergy.compas.sct.model.dto.ExtRefSourceInfo; import org.lfenergy.compas.sct.model.dto.IedDTO; import org.lfenergy.compas.sct.model.dto.LDeviceDTO; import org.lfenergy.compas.sct.model.dto.LNodeDTO; @@ -59,7 +62,7 @@ public static ScdDTO createScdDTO(UUID id){ } /*-----------------------------------------------*/ - /* ExtRefDTO */ + /* ExtRefInfo */ /*-----------------------------------------------*/ public static final String DESC = "DESC"; public static final String P_DA = "d"; @@ -109,31 +112,51 @@ public static TExtRef createExtRef(){ return tExtRef; } - public static ExtRefDTO createExtRefDTO(){ - ExtRefDTO tExtRef = new ExtRefDTO(); - tExtRef.setDesc(DESC); - tExtRef.setPDA(P_DA); - tExtRef.setPDO(P_DO); - tExtRef.setPLN(P_LN); - tExtRef.setPServT(TServiceType.fromValue(P_SERV_T)); - tExtRef.setIntAddr(INT_ADDR); - tExtRef.setIedName(IED_NAME); - tExtRef.setLdInst(LD_INST); - tExtRef.setLnInst(LN_INST); - tExtRef.setLnClass(LN_CLASS); - tExtRef.setDaName(DA_NAME); - tExtRef.setDoName(DO_NAME); - tExtRef.setPrefix(PREFIX); - tExtRef.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); + public static ExtRefSignalInfo createExtRefSignalInfo(){ + ExtRefSignalInfo signalInfo = new ExtRefSignalInfo(); + signalInfo.setDesc(DESC); + signalInfo.setPDA(P_DA); + signalInfo.setPDO(P_DO); + signalInfo.setPLN(P_LN); + signalInfo.setPServT(TServiceType.fromValue(P_SERV_T)); + signalInfo.setIntAddr(INT_ADDR); - tExtRef.setSrcLDInst(SRC_LD_INST); - tExtRef.setSrcLNInst(SRC_LN_INST); - tExtRef.setSrcLNClass(SRC_LN_CLASS); - tExtRef.setSrcPrefix(SRC_PREFIX); - tExtRef.setSrcCBName(SRC_CB_NAME); + return signalInfo; + } - return tExtRef; + public static ExtRefBindingInfo createExtRefBindingInfo(){ + ExtRefBindingInfo bindingInfo = new ExtRefBindingInfo(); + bindingInfo.setIedName(IED_NAME); + bindingInfo.setLdInst(LD_INST); + bindingInfo.setLnInst(LN_INST); + bindingInfo.setLnClass(LN_CLASS); + bindingInfo.setDaName(DA_NAME); + bindingInfo.setDoName(DO_NAME); + bindingInfo.setPrefix(PREFIX); + bindingInfo.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); + + return bindingInfo; + } + + public static ExtRefSourceInfo createExtRefSourceInfo(){ + ExtRefSourceInfo sourceInfo = new ExtRefSourceInfo(); + sourceInfo.setSrcLDInst(SRC_LD_INST); + sourceInfo.setSrcLNInst(SRC_LN_INST); + sourceInfo.setSrcLNClass(SRC_LN_CLASS); + sourceInfo.setSrcPrefix(SRC_PREFIX); + sourceInfo.setSrcCBName(SRC_CB_NAME); + + return sourceInfo; + } + + public static ExtRefInfo createExtRefInfo(){ + ExtRefInfo extRefInfo = new ExtRefInfo(); + extRefInfo.setSourceInfo(DTO.createExtRefSourceInfo()); + extRefInfo.setBindingInfo(DTO.createExtRefBindingInfo()); + extRefInfo.setSignalInfo(DTO.createExtRefSignalInfo()); + + return extRefInfo; } /*-----------------------------------------------*/ /* ResumedDataTemplate */ diff --git a/sct-service/pom.xml b/sct-service/pom.xml index 5d383bac0..67d65a30b 100644 --- a/sct-service/pom.xml +++ b/sct-service/pom.xml @@ -15,6 +15,9 @@ sct-service SCT SERVICE + + ${basedir}/${aggregate.report.dir} + diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java index bd6725246..5f09d4000 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java @@ -7,10 +7,10 @@ import org.lfenergy.compas.exception.ScdException; import org.lfenergy.compas.scl.SCL; import org.lfenergy.compas.sct.exception.CompasDataAccessException; -import org.lfenergy.compas.sct.model.IExtRefDTO; import org.lfenergy.compas.sct.model.IIedDTO; import org.lfenergy.compas.sct.model.IScd; import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; import org.springframework.lang.NonNull; import java.util.Set; @@ -90,9 +90,8 @@ public interface ISCDService> { * @return * @throws ScdException */ - - Set extractExtRefSources(T scdObj, String iedName, - String ldInst, U filter) throws ScdException; + Set extractExtRefBindingInfo(T scdObj, String iedName, + String ldInst, ExtRefSignalInfo filter) throws ScdException; /** * diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java index 97a98a52d..cc22a7b56 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java @@ -17,10 +17,10 @@ import org.lfenergy.compas.scl.TLN; import org.lfenergy.compas.scl.TSubNetwork; import org.lfenergy.compas.sct.model.IConnectedApDTO; -import org.lfenergy.compas.sct.model.IExtRefDTO; import org.lfenergy.compas.sct.model.ISubNetworkDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefInfo; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; -import org.lfenergy.compas.sct.model.dto.ExtRefDTO; import org.lfenergy.compas.sct.model.dto.IedDTO; import org.lfenergy.compas.sct.model.dto.LDeviceDTO; import org.lfenergy.compas.sct.model.dto.LNodeDTO; @@ -116,16 +116,15 @@ public IedDTO extractExtRefs(SimpleScd scdObj, String iedName, String ldInst) th LNodeDTO lN0DTO = new LNodeDTO(); lN0DTO.setLNodeClass(TLLN0Enum.LLN_0.value()); ln0ExtRefs.forEach((TExtRef tExtRef) -> { - ExtRefDTO extRefDTO = new ExtRefDTO(tExtRef); + ExtRefInfo extRefDTO = new ExtRefInfo(tExtRef); lN0DTO.addExtRef(extRefDTO); }); lDeviceDTO.addLNode(lN0DTO); iedDTO.addLDevice(lDeviceDTO); return iedDTO; } - @Override - public Set extractExtRefSources(SimpleScd scdObj, String iedName, String ldInst, IExtRefDTO extRef) throws ScdException { + public Set extractExtRefBindingInfo(SimpleScd scdObj, String iedName, String ldInst, ExtRefSignalInfo extRef) throws ScdException { SCL receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); SclIEDManager sclIEDManager = new SclIEDManager(receiver); sclIEDManager.getExtRef(iedName,ldInst,extRef); @@ -140,7 +139,7 @@ public Set extractExtRefSources(SimpleScd scdObj, String iedName, String if(accessPoint.getServer() == null) continue; List deviceList = accessPoint.getServer().getLDevice(); for(TLDevice tlDevice : deviceList) { - Set lNodeDTOs = getExtRefSources(tlDevice,extRef, receiver.getDataTypeTemplates()); + Set lNodeDTOs = getExtRefBindingInfo(tlDevice,extRef, receiver.getDataTypeTemplates()); LDeviceDTO lDeviceDTO = new LDeviceDTO(); lDeviceDTO.setLdName(tlDevice.getLdName()); lDeviceDTO.setLdInst(tlDevice.getInst()); @@ -157,6 +156,7 @@ public Set extractExtRefSources(SimpleScd scdObj, String iedName, String return iedDTOs; } + @Override public Set getSubnetwork(SimpleScd scdObj) throws ScdException { @@ -194,10 +194,11 @@ public SimpleScd addSubnetworks(SimpleScd scdObject, Set getExtRefSources(TLDevice tlDevice, IExtRefDTO extRef, TDataTypeTemplates dtt) throws ScdException { + + public Set getExtRefBindingInfo(TLDevice tlDevice, ExtRefSignalInfo extRef, TDataTypeTemplates dtt) throws ScdException { List lns = tlDevice.getLN(); Set lNodeDTOs = new HashSet<>(); - for(TLN ln : lns){ + for(TLN ln : lns){ if(extRef.getPLN() != null && !ln.getLnClass().contains(extRef.getPLN())) continue; LNodeDTO lNodeDTO = new LNodeDTO(); lNodeDTO.setLNodeType(ln.getLnType()); diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java index 123d592fb..1b4360d7b 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java @@ -22,7 +22,7 @@ import org.lfenergy.compas.scl.TPredefinedBasicTypeEnum; import org.lfenergy.compas.scl.TSDO; import org.lfenergy.compas.scl.TUnNaming; -import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; import java.util.ArrayList; @@ -572,7 +572,7 @@ public Map getLNodeTypeTracker() { } - public static ResumedDataTemplate getResumedDTT(String lnType, IExtRefDTO extRef, + public static ResumedDataTemplate getResumedDTT(String lnType, ExtRefSignalInfo extRef, TDataTypeTemplates dtt) throws ScdException { ResumedDataTemplate resumedDataTemplate = new ResumedDataTemplate(); TLNodeType nodeType = dtt.getLNodeType() @@ -615,16 +615,16 @@ public static ResumedDataTemplate getResumedDTT(String lnType, IExtRefDTO extRef if(extSdoName1 != null){ List sdos = SclDataTemplateManager.retrieveSdoOrDO(tdoType.getSDOOrDA(), TSDO.class); String sdoTypeId = sdos.stream() - .filter(tsdo -> extSdoName1.equals(tsdo.getName())) - .map(TSDO::getType) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown doName.sdoName :" + extDoName + "." + extSdoName1)); + .filter(tsdo -> extSdoName1.equals(tsdo.getName())) + .map(TSDO::getType) + .findFirst() + .orElseThrow(() -> new ScdException("Unknown doName.sdoName :" + extDoName + "." + extSdoName1)); tdoType = dtt.getDOType() - .stream() - .filter(doType -> doType.getId().equals(sdoTypeId)) - .findFirst() - .orElseThrow(() -> new ScdException("No referenced doName.sdoName :" + extDoName + "." + extSdoName1)); + .stream() + .filter(doType -> doType.getId().equals(sdoTypeId)) + .findFirst() + .orElseThrow(() -> new ScdException("No referenced doName.sdoName :" + extDoName + "." + extSdoName1)); resumedDataTemplate.setDoName(extDoName + "." + extSdoName1); } diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java index 87cd02537..1f1539e59 100644 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java +++ b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java @@ -6,22 +6,17 @@ import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.LN0; import org.lfenergy.compas.scl.SCL; import org.lfenergy.compas.scl.TAccessPoint; import org.lfenergy.compas.scl.TAnyLN; -import org.lfenergy.compas.scl.TDataSet; import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TGSEControl; import org.lfenergy.compas.scl.TIED; import org.lfenergy.compas.scl.TLDevice; import org.lfenergy.compas.scl.TLLN0Enum; import org.lfenergy.compas.scl.TLN; import org.lfenergy.compas.scl.TLN0; -import org.lfenergy.compas.scl.TReportControl; -import org.lfenergy.compas.scl.TSampledValueControl; import org.lfenergy.compas.scl.TServer; -import org.lfenergy.compas.sct.model.IExtRefDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; @@ -121,8 +116,7 @@ public TAnyLN updateLN(@NonNull TAnyLN ln, @NonNull Set receiverLNodeTyp return ln; } - - public TExtRef getExtRef(String iedName, String ldInst, IExtRefDTO filter) throws ScdException { + public TExtRef getExtRef(String iedName, String ldInst, ExtRefSignalInfo filter) throws ScdException { TIED ied = receiver.getIED() .stream() .filter(tied -> iedName.equals(tied.getName())) @@ -148,6 +142,7 @@ public TExtRef getExtRef(String iedName, String ldInst, IExtRefDTO filter) throw return extRefs.get(0); } + public static List getIEDLDevice(TIED tied){ return tied.getAccessPoint() .stream() @@ -174,10 +169,10 @@ public static Optional getIEDLDevice(TIED tied, String ldInst){ .findFirst(); } - public static List extractLN0ExtRefs(TLDevice tlDevice, IExtRefDTO filter) { - if(tlDevice.getLN0().getInputs() == null) return new ArrayList<>(); + public static List extractLN0ExtRefs(TLDevice tlDevice, ExtRefSignalInfo filter) { + if (tlDevice.getLN0().getInputs() == null) return new ArrayList<>(); - if(filter == null) { + if (filter == null) { return tlDevice.getLN0().getInputs().getExtRef(); } else { return tlDevice.getLN0().getInputs().getExtRef() @@ -200,7 +195,7 @@ public static List extractLN0ExtRefs(TLDevice tlDevice, IExtRefDTO filt } - public static List extractLNExtRefs(TLDevice tlDevice, String lnClass, String lnInst, IExtRefDTO filter) throws ScdException { + public static List extractLNExtRefs(TLDevice tlDevice, String lnClass, String lnInst, ExtRefSignalInfo filter) throws ScdException { TLN ln = tlDevice.getLN() .stream() .filter(tln -> tln.getLnClass().contains(lnClass)) @@ -217,9 +212,9 @@ public static List extractLNExtRefs(TLDevice tlDevice, String lnClass, return ln.getInputs().getExtRef(); } else { return ln.getInputs().getExtRef() - .stream() - .filter(tExtRef -> filter.isIdentical(tExtRef)) - .collect(Collectors.toList()); + .stream() + .filter(tExtRef -> filter.isWrappedIn(tExtRef)) + .collect(Collectors.toList()); } } } diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java index 2f0e3a349..23c1b37c4 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java @@ -15,35 +15,24 @@ import org.lfenergy.compas.scl.THitem; import org.lfenergy.compas.sct.exception.CompasDataAccessException; import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; -import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; import org.lfenergy.compas.sct.model.dto.IedDTO; -import org.lfenergy.compas.sct.model.dto.ScdDTO; import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; import org.lfenergy.compas.sct.model.entity.SimpleScd; import org.lfenergy.compas.sct.repository.SimpleScdRepository; import org.mockito.InjectMocks; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.mockito.Spy; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.oxm.jaxb.Jaxb2Marshaller; import org.springframework.test.context.junit.jupiter.SpringExtension; -import javax.xml.transform.Result; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; -import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.time.LocalDateTime; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; @@ -234,12 +223,12 @@ void testExtractExtRefSources() throws IOException, ScdException { SimpleScd scdObj = new SimpleScd(); scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); - ExtRefDTO extRef = new ExtRefDTO(); + ExtRefSignalInfo extRef = new ExtRefSignalInfo(); extRef.setIntAddr("INTADDR3"); extRef.setPDO("Op.res"); extRef.setDesc("DESC3"); - Set iedDTOs = simpleSqlScdService.extractExtRefSources(scdObj,IED_NAME, "LDPO", extRef); + Set iedDTOs = simpleSqlScdService.extractExtRefBindingInfo(scdObj,IED_NAME, "LDPO", extRef); assertFalse(iedDTOs.isEmpty()); } diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java index ffa659649..cc6d501a7 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java @@ -22,8 +22,8 @@ import org.lfenergy.compas.scl.TPredefinedCDCEnum; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; -import org.lfenergy.compas.sct.model.dto.ExtRefDTO; import java.io.InputStream; import java.util.List; @@ -41,9 +41,6 @@ class SclDataTemplateManagerTest { private static final String ICD_WITH_DTT_DIFF_IDS = "scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml"; private static final String ICD_WITH_DTT_DIFF_CONTENT = "scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml"; - - //private MarshallerWrapper marshallerWrapper = createWrapper(); - @Test void ShouldReturnTrueWhenIsIdenticalForDTTEnumType() throws Exception { SCL scd = getSCLFromFile(SCD_FILE); @@ -485,7 +482,7 @@ void testShouldReturnOKWhenGetResumedDTT() throws Exception { SCL scd = getSCLFromFile(SCD_FILE); TDataTypeTemplates dtt = scd.getDataTypeTemplates(); String lnType = "LN2"; - ExtRefDTO extRef = new ExtRefDTO(); + ExtRefSignalInfo extRef = new ExtRefSignalInfo(); extRef.setIntAddr("IntAddr"); extRef.setPLN(TLLN0Enum.LLN_0.value()); extRef.setPDO("FACntRs.res"); @@ -506,7 +503,7 @@ void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDoName() throws Except SCL scd = getSCLFromFile(SCD_FILE); TDataTypeTemplates dtt = scd.getDataTypeTemplates(); String lnType = "LN2"; - ExtRefDTO extRef = new ExtRefDTO(); + ExtRefSignalInfo extRef = new ExtRefSignalInfo(); extRef.setIntAddr("IntAddr"); extRef.setPLN(TLLN0Enum.LLN_0.value()); extRef.setPDO("FACntRs1.res"); @@ -520,7 +517,7 @@ void testShouldReturnNOKWhenGetResumedDTTCauseUnknownLnType() throws Exception { SCL scd = getSCLFromFile(SCD_FILE); TDataTypeTemplates dtt = scd.getDataTypeTemplates(); String lnType = "LN210"; - ExtRefDTO extRef = new ExtRefDTO(); + ExtRefSignalInfo extRef = new ExtRefSignalInfo(); extRef.setIntAddr("IntAddr"); extRef.setPLN(TLLN0Enum.LLN_0.value()); extRef.setPDO("FACntRs.res"); @@ -534,7 +531,7 @@ void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedSDoName() throws Excep SCL scd = getSCLFromFile(SCD_FILE); TDataTypeTemplates dtt = scd.getDataTypeTemplates(); String lnType = "LN210"; - ExtRefDTO extRef = new ExtRefDTO(); + ExtRefSignalInfo extRef = new ExtRefSignalInfo(); extRef.setIntAddr("IntAddr"); extRef.setPLN(TLLN0Enum.LLN_0.value()); extRef.setPDO("FACntRs.res1"); @@ -548,7 +545,7 @@ void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDaName() throws Except SCL scd = getSCLFromFile(SCD_FILE); TDataTypeTemplates dtt = scd.getDataTypeTemplates(); String lnType = "LN210"; - ExtRefDTO extRef = new ExtRefDTO(); + ExtRefSignalInfo extRef = new ExtRefSignalInfo(); extRef.setIntAddr("IntAddr"); extRef.setPLN(TLLN0Enum.LLN_0.value()); extRef.setPDO("FACntRs.res1"); diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java index 99b024e0c..4fae5f7d7 100644 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java +++ b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java @@ -16,7 +16,7 @@ import org.lfenergy.compas.scl.TLDevice; import org.lfenergy.compas.scl.TLLN0Enum; import org.lfenergy.compas.scl.TLN; -import org.lfenergy.compas.sct.model.dto.ExtRefDTO; +import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; import java.io.InputStream; import java.util.HashMap; @@ -200,7 +200,7 @@ void ShouldReturnNOKWhenUpdateLNCauseLNodeTypeBadlyRenamed() { void testShouldReturnOKWhenGetExtRef() throws ScdException { SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); SclIEDManager sclIEDManager = new SclIEDManager(scd); - ExtRefDTO simpleExtRef = new ExtRefDTO(); + ExtRefSignalInfo simpleExtRef = new ExtRefSignalInfo(); simpleExtRef.setIntAddr("INTADDR2"); simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); simpleExtRef.setPDO("Op"); @@ -213,7 +213,7 @@ void testShouldReturnOKWhenGetExtRef() throws ScdException { void testShouldReturnNOKWhenGetExtRefNoThingFound() throws ScdException { SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); SclIEDManager sclIEDManager = new SclIEDManager(scd); - ExtRefDTO simpleExtRef = new ExtRefDTO(); + ExtRefSignalInfo simpleExtRef = new ExtRefSignalInfo(); simpleExtRef.setIntAddr("INTADDR1"); simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); simpleExtRef.setPDO("Op"); @@ -224,7 +224,7 @@ void testShouldReturnNOKWhenGetExtRefNoThingFound() throws ScdException { void testShouldReturnNOKWhenGetExtRefUnknownLD() throws ScdException { SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); SclIEDManager sclIEDManager = new SclIEDManager(scd); - ExtRefDTO simpleExtRef = new ExtRefDTO(); + ExtRefSignalInfo simpleExtRef = new ExtRefSignalInfo(); simpleExtRef.setIntAddr("INTADDR1"); simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); simpleExtRef.setPDO("Op"); From 7972bff972965b14b98430534053abcd5fe453ad Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Thu, 22 Apr 2021 10:28:16 +0200 Subject: [PATCH 08/24] Add license info for REUSE compliance Signed-off-by: SYLLA MOHAMED --- .gitignore | 4 ++++ pom.xml | 3 +++ sct-coverage/pom.xml | 3 +++ sct-data/src/test/resources/application.yml | 4 ++++ sct-service/src/test/resources/application.yml | 4 ++++ 5 files changed, 18 insertions(+) diff --git a/.gitignore b/.gitignore index a2e922f9b..ce271ea99 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2020 RTE FRANCE +# +# SPDX-License-Identifier: Apache-2.0 + HELP.md target/ .scannerwork diff --git a/pom.xml b/pom.xml index 707c9d546..e2e931249 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,7 @@ + + + diff --git a/sct-coverage/pom.xml b/sct-coverage/pom.xml index 0ebf4e475..64ca1ccf6 100644 --- a/sct-coverage/pom.xml +++ b/sct-coverage/pom.xml @@ -1,4 +1,7 @@ + + + diff --git a/sct-data/src/test/resources/application.yml b/sct-data/src/test/resources/application.yml index b2e57c5be..7e35218a3 100644 --- a/sct-data/src/test/resources/application.yml +++ b/sct-data/src/test/resources/application.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2020 RTE FRANCE +# +# SPDX-License-Identifier: Apache-2.0 + ## YAML Template. --- spring: diff --git a/sct-service/src/test/resources/application.yml b/sct-service/src/test/resources/application.yml index 1a68e38ed..ab94d62e3 100644 --- a/sct-service/src/test/resources/application.yml +++ b/sct-service/src/test/resources/application.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2020 RTE FRANCE +# +# SPDX-License-Identifier: Apache-2.0 + ## YAML Template. --- spring: From 3688fc8c39c5d51cd53d36433c5125489dbcd4c2 Mon Sep 17 00:00:00 2001 From: Dennis Labordus Date: Thu, 6 May 2021 16:13:45 +0200 Subject: [PATCH 09/24] Github action aangepast voor Sonar. Signed-off-by: Dennis Labordus --- .github/workflows/sonarcloud-analysis.yml | 30 +++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/.github/workflows/sonarcloud-analysis.yml b/.github/workflows/sonarcloud-analysis.yml index 34ce7be7b..84c042d80 100644 --- a/.github/workflows/sonarcloud-analysis.yml +++ b/.github/workflows/sonarcloud-analysis.yml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 Alliander N.V. +# SPDX-FileCopyrightText: 2020 Alliander N.V. # # SPDX-License-Identifier: Apache-2.0 @@ -7,15 +7,31 @@ name: SonarCloud Analysis on: push jobs: - sonarcloud: - name: SonarCloud + build: + name: Build runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: SonarCloud Scan - uses: SonarSource/sonarcloud-github-action@master + fetch-depth: 0 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Cache SonarCloud packages + uses: actions/cache@v1 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + - name: Cache Maven packages + uses: actions/cache@v1 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build and analyze env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=com-pas_compas-sct -Dsonar.organization=com-pas -Dsonar.host.url=https://sonarcloud.io From 040ba524d7cfe3e2d17663b2db12d7f3e6008360 Mon Sep 17 00:00:00 2001 From: SYLLA MOHAMED Date: Wed, 12 May 2021 11:12:35 +0200 Subject: [PATCH 10/24] remove test files from src/resources Signed-off-by: SYLLA MOHAMED --- .../src/main/resources/icd/icd_test.xml | 105 ---------------- .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 68 ----------- .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 66 ---------- .../Icd_With_Identical_DTT.xml | 73 ----------- .../IEDImportHelper/icd_import_ied_test.xml | 86 ------------- .../scl/SCD/scd_ied_receiver_test.xml | 73 ----------- .../resources/scl/SCD/scd_with_dtt_test.xml | 73 ----------- .../resources/scl/SCD/scd_with_ieds_test.xml | 113 ------------------ 8 files changed, 657 deletions(-) delete mode 100644 sct-service/src/main/resources/icd/icd_test.xml delete mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml delete mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml delete mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml delete mode 100644 sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml delete mode 100644 sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml delete mode 100644 sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml delete mode 100644 sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml diff --git a/sct-service/src/main/resources/icd/icd_test.xml b/sct-service/src/main/resources/icd/icd_test.xml deleted file mode 100644 index f9dd3d222..000000000 --- a/sct-service/src/main/resources/icd/icd_test.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml deleted file mode 100644 index 31bf5f5da..000000000 --- a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - -
- - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml deleted file mode 100644 index 18d328bf2..000000000 --- a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - -
- - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - AnotherValue - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - AnotherValue - - - \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml deleted file mode 100644 index b81165384..000000000 --- a/sct-service/src/main/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml deleted file mode 100644 index 6bdb012c9..000000000 --- a/sct-service/src/main/resources/scl/IEDImportHelper/icd_import_ied_test.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - AnotherValue - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - AnotherValue - - - \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml deleted file mode 100644 index b81165384..000000000 --- a/sct-service/src/main/resources/scl/SCD/scd_ied_receiver_test.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml deleted file mode 100644 index 5883470f7..000000000 --- a/sct-service/src/main/resources/scl/SCD/scd_with_dtt_test.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml deleted file mode 100644 index 485ee0299..000000000 --- a/sct-service/src/main/resources/scl/SCD/scd_with_ieds_test.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file From ca751d9dc5e94b1c1fabc0071ddf62a2026d1217 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Fri, 20 Aug 2021 14:34:30 +0200 Subject: [PATCH 11/24] branche reinitilized to take into accoout compas new packaging Signed-off-by: Mohamed Sylla --- pom.xml | 49 +- sct-coverage/pom.xml | 2 +- sct-data-postgres/pom.xml | 21 + sct-data/pom.xml | 2 +- .../exception/CompasDataAccessException.java | 17 - .../compas/sct/model/IAccessPointDTO.java | 17 - .../compas/sct/model/IConnectedApDTO.java | 13 - .../compas/sct/model/IControlBlockDTO.java | 9 - .../lfenergy/compas/sct/model/IIedDTO.java | 16 - .../compas/sct/model/ILDeviceDTO.java | 20 - .../lfenergy/compas/sct/model/ILNodeDTO.java | 25 - .../org/lfenergy/compas/sct/model/IScd.java | 11 - .../compas/sct/model/IScdCrudRepository.java | 19 - .../lfenergy/compas/sct/model/IScdModel.java | 10 - .../lfenergy/compas/sct/model/IServerDTO.java | 11 - .../compas/sct/model/ISubNetworkDTO.java | 17 - .../compas/sct/model/dto/ConnectedApDTO.java | 46 -- .../sct/model/dto/ExtRefBindingInfo.java | 64 -- .../compas/sct/model/dto/ExtRefInfo.java | 44 -- .../sct/model/dto/ExtRefSignalInfo.java | 92 --- .../sct/model/dto/ExtRefSourceInfo.java | 48 -- .../lfenergy/compas/sct/model/dto/IedDTO.java | 32 - .../compas/sct/model/dto/ItemsDTO.java | 15 - .../compas/sct/model/dto/LDeviceDTO.java | 37 - .../compas/sct/model/dto/LNodeDTO.java | 64 -- .../sct/model/dto/ResumedDataTemplate.java | 34 - .../lfenergy/compas/sct/model/dto/ScdDTO.java | 55 -- .../compas/sct/model/dto/SubNetworkDTO.java | 95 --- .../compas/sct/model/entity/SimpleScd.java | 74 -- .../compas/sct/model/entity/package-info.java | 15 - .../AbstractScdSQLCrudRepository.java | 43 -- .../sct/repository/H2XMLTypeMapper.java | 34 - .../sct/repository/PostgreSqlXmlDialect.java | 18 - .../sct/repository/PostgresXMLTypeMapper.java | 57 -- .../sct/repository/ScdBaseXRepository.java | 48 -- .../sct/repository/ScdJpaRepository.java | 18 - .../sct/repository/SimpleScdRepository.java | 70 -- .../sct/repository/SqlXmlTypeMapper.java | 55 -- .../compas/sct/ApplicationContextTest.java | 32 - .../CompasDataAccessExceptionTest.java | 23 - .../sct/model/dto/ConnectedApDTOTest.java | 31 - .../sct/model/dto/ExtRefBindingInfoTest.java | 50 -- .../compas/sct/model/dto/ExtRefInfoTest.java | 36 - .../sct/model/dto/ExtRefSignalInfoTest.java | 57 -- .../sct/model/dto/ExtRefSourceInfoTest.java | 27 - .../compas/sct/model/dto/IedDTOTest.java | 23 - .../compas/sct/model/dto/LDeviceDTOTest.java | 30 - .../compas/sct/model/dto/LNodeDTOTest.java | 66 -- .../model/dto/ResumedDataTemplateTest.java | 39 - .../compas/sct/model/dto/ScdDTOTest.java | 45 -- .../sct/model/dto/SubNetworkDTOTest.java | 32 - .../sct/model/entity/SimpleScdTest.java | 39 - .../compas/sct/model/entity/package-info.java | 13 - .../sct/repository/H2XMLTypeMapperTest.java | 45 -- .../repository/PostgresXMLTypeMapperTest.java | 57 -- .../repository/SimpleScdRepositoryTest.java | 124 ---- .../lfenergy/compas/sct/testhelper/DTO.java | 255 ------- sct-data/src/test/resources/application.yml | 28 - .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 68 -- .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 66 -- .../Icd_With_Identical_DTT.xml | 73 -- .../IEDImportHelper/icd_import_ied_test.xml | 98 --- .../scl/SCD/scd_ied_receiver_test.xml | 73 -- .../resources/scl/SCD/scd_with_dtt_test.xml | 73 -- .../resources/scl/SCD/scd_with_ieds_test.xml | 105 --- sct-service/pom.xml | 2 +- .../sct/config/XMLMarshallerConfig.java | 22 - .../compas/sct/config/XSDFileProperties.java | 32 - .../sct/service/AbstractSqlScdService.java | 54 -- .../compas/sct/service/ISCDService.java | 113 --- .../sct/service/SimpleSqlScdService.java | 223 ------ .../service/scl/SclCommunicationManager.java | 79 --- .../service/scl/SclDataTemplateManager.java | 669 ------------------ .../sct/service/scl/SclHeaderManager.java | 64 -- .../compas/sct/service/scl/SclIEDManager.java | 220 ------ .../compas/sct/service/scl/SclManager.java | 64 -- .../compas/sct/ApplicationContextTest.java | 27 - .../compas/sct/model/entity/package-info.java | 13 - .../sct/service/SqlScdServiceAndDBTest.java | 262 ------- .../scl/SclCommunicationManagerTest.java | 91 --- .../scl/SclDataTemplateManagerTest.java | 567 --------------- .../sct/service/scl/SclHeaderManagerTest.java | 75 -- .../sct/service/scl/SclIEDManagerTest.java | 286 -------- .../sct/service/scl/SclManagerTest.java | 9 - .../src/test/resources/application.yml | 13 - .../IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml | 68 -- .../Icd_With_DTT_Same_IDs_Diff_Contents.xml | 66 -- .../Icd_With_Identical_DTT.xml | 73 -- .../IEDImportHelper/icd_import_ied_test.xml | 98 --- .../scl/SCD/scd_ied_receiver_test.xml | 73 -- .../resources/scl/SCD/scd_with_dtt_test.xml | 73 -- .../resources/scl/SCD/scd_with_ieds_test.xml | 106 --- 92 files changed, 29 insertions(+), 6338 deletions(-) create mode 100644 sct-data-postgres/pom.xml delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java delete mode 100644 sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java delete mode 100644 sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java delete mode 100644 sct-data/src/test/resources/application.yml delete mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml delete mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml delete mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml delete mode 100644 sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml delete mode 100644 sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml delete mode 100644 sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml delete mode 100644 sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java delete mode 100644 sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java delete mode 100644 sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java delete mode 100644 sct-service/src/test/resources/application.yml delete mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml delete mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml delete mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml delete mode 100644 sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml delete mode 100644 sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml delete mode 100644 sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml delete mode 100644 sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml diff --git a/pom.xml b/pom.xml index e2e931249..189457505 100644 --- a/pom.xml +++ b/pom.xml @@ -6,20 +6,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.4.2 - - org.lfenergy.compas compas-sct - 1.0-SNAPSHOT + local-SNAPSHOT pom COMPAS-SCT - 1.0-SNAPSHOT + local-SNAPSHOT 11 11 sct-coverage/** @@ -28,47 +22,14 @@ - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - test - - - org.postgresql - postgresql - runtime - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - - - org.lfenergy.compas - core-commons + org.lfenergy.compas.core + scl2007b4 ${compas.core.version} sct-data + sct-data-postgres sct-service sct-coverage diff --git a/sct-coverage/pom.xml b/sct-coverage/pom.xml index 64ca1ccf6..9a9b58895 100644 --- a/sct-coverage/pom.xml +++ b/sct-coverage/pom.xml @@ -10,7 +10,7 @@ org.lfenergy.compas compas-sct - 1.0-SNAPSHOT + local-SNAPSHOT ../pom.xml diff --git a/sct-data-postgres/pom.xml b/sct-data-postgres/pom.xml new file mode 100644 index 000000000..31b4b77a6 --- /dev/null +++ b/sct-data-postgres/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + + org.lfenergy.compas + compas-sct + local-SNAPSHOT + + + SCT DATA POSTGRES + sct-data-postgres + 1.0-SNAPSHOT + + + ${basedir}/${aggregate.report.dir} + + + \ No newline at end of file diff --git a/sct-data/pom.xml b/sct-data/pom.xml index b67a60b2f..106e95804 100644 --- a/sct-data/pom.xml +++ b/sct-data/pom.xml @@ -11,7 +11,7 @@ org.lfenergy.compas compas-sct - 1.0-SNAPSHOT + local-SNAPSHOT sct-data diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java b/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java deleted file mode 100644 index bd441c207..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/exception/CompasDataAccessException.java +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.exception; - - -public class CompasDataAccessException extends Exception { - - public CompasDataAccessException(String message) { - super(message); - } - - public CompasDataAccessException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java deleted file mode 100644 index 4d8e72d91..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IAccessPointDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -import lombok.NonNull; - -import java.util.Set; - -public interface IAccessPointDTO { - String getName(); - void setName(String name); - void addLDevice(@NonNull T ld); - - @NonNull Set getLDevices(); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java deleted file mode 100644 index 2b583de0b..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IConnectedApDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -public interface IConnectedApDTO { - String getIedName(); - String getApName(); - - void setIedName(String name); - void setApName(String name); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java deleted file mode 100644 index 44917ae6c..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IControlBlockDTO.java +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -public interface IControlBlockDTO { - -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java deleted file mode 100644 index 717ea13e5..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IIedDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -import lombok.NonNull; - -import java.util.Set; - -public interface IIedDTO { - String getName(); - void setName(String name); - void addLDevice(T ld); - @NonNull Set getLDevices(); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java deleted file mode 100644 index a9e9f3868..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILDeviceDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -import org.springframework.lang.NonNull; - -import java.util.Set; - -public interface ILDeviceDTO { - String getLdInst(); - String getLdName(); - - void setLdName(String ldName); - void setLdInst(String inst); - - void addLNode(@NonNull T ln); - Set getLNodes(); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java deleted file mode 100644 index 721f1ae7f..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ILNodeDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -import org.lfenergy.compas.sct.model.dto.ExtRefInfo; -import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; - -import java.util.Set; - -public interface ILNodeDTO { - String getInst(); - String getLNodeClass(); - String getLNodeType(); - Set getExtRefs(); - Set getResumedDataTemplates(); - - void addExtRef(ExtRefInfo extRef); - void addResumedDataTemplate(ResumedDataTemplate dtt); - - void setInst(String inst); - void setLNodeClass(String lnClass); - void setLNodeType(String lnType); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java deleted file mode 100644 index 3e92310c5..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScd.java +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -public interface IScd { - ID getId(); - byte[] getRawXml(); - ID getHeaderId(); -} \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java deleted file mode 100644 index ac96b2757..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdCrudRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -import org.lfenergy.compas.sct.exception.CompasDataAccessException; - -import java.util.Optional; - -public interface IScdCrudRepository { - S save(S s) throws CompasDataAccessException; - S update(S s) throws CompasDataAccessException; - Optional findById(ID id); - boolean existsById(ID id) ; - boolean existsByHeaderId(ID id) ; - long count() ; - void deleteById(ID id) throws CompasDataAccessException; -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java deleted file mode 100644 index ed1bd9eb5..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IScdModel.java +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -public interface IScdModel { - ID getId(); - byte[] getRawXml(); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java deleted file mode 100644 index 827948034..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/IServerDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -import java.util.Set; - -public interface IServerDTO { - Set getLDevices(); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java deleted file mode 100644 index f19c30d02..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/ISubNetworkDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model; - -import java.util.Set; - -public interface ISubNetworkDTO { - String getName(); - String getType(); - Set getConnectedAPs(); - void addConnectedAPs(T cap); - - void setName(String name); - void setType(String type); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java deleted file mode 100644 index d0568f0ef..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTO.java +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TConnectedAP; -import org.lfenergy.compas.sct.model.IConnectedApDTO; - -import java.util.Objects; - -@Setter -@Getter -@NoArgsConstructor -public class ConnectedApDTO implements IConnectedApDTO { - private String iedName; - private String apName; - - public ConnectedApDTO(String iedName, String apName) { - this.iedName = iedName; - this.apName = apName; - } - - public ConnectedApDTO(TConnectedAP tConnectedAP) { - this.iedName = tConnectedAP.getIedName(); - this.apName = tConnectedAP.getApName(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || o.getClass() != this.getClass()) return false; - ConnectedApDTO that = (ConnectedApDTO) o; - return Objects.equals(iedName, that.iedName) && - Objects.equals(apName, that.apName); - } - - @Override - public int hashCode() { - return Objects.hash(iedName, apName); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java deleted file mode 100644 index 0b8113348..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TServiceType; - -import java.util.Objects; - -@Getter -@Setter -@NoArgsConstructor -public class ExtRefBindingInfo { - - private String iedName; - private String ldInst; - private String prefix; - private String lnClass; - private String lnInst; - private String doName; - private String daName; - private TServiceType serviceType; - - public ExtRefBindingInfo(TExtRef tExtRef){ - iedName = tExtRef.getIedName(); - ldInst = tExtRef.getLdInst(); - prefix = tExtRef.getPrefix(); - if(!tExtRef.getLnClass().isEmpty()) { - this.lnClass = tExtRef.getLnClass().get(0); - } - lnInst = tExtRef.getLnInst(); - doName = tExtRef.getDoName(); - daName = tExtRef.getDaName(); - if(tExtRef.getServiceType() != null) { - serviceType = tExtRef.getServiceType(); - } - } - - @Override - public boolean equals(Object o) { - if (o == null) return false; - if (this == o) return true; - if (o.getClass() != getClass()) return false; - ExtRefBindingInfo that = (ExtRefBindingInfo) o; - return Objects.equals(iedName, that.iedName) && - Objects.equals(ldInst, that.ldInst) && - Objects.equals(prefix, that.prefix) && - Objects.equals(lnClass, that.lnClass) && - Objects.equals(lnInst, that.lnInst) && - Objects.equals(doName, that.doName) && - Objects.equals(daName, that.daName) && - serviceType == that.serviceType; - } - - @Override - public int hashCode() { - return Objects.hash(iedName, ldInst, prefix, lnClass, lnInst, doName, daName, serviceType); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java deleted file mode 100644 index a1dd9bfce..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefInfo.java +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TExtRef; - -import java.util.Objects; - -@Getter -@Setter -@NoArgsConstructor -public class ExtRefInfo { - private ExtRefSignalInfo signalInfo; - private ExtRefBindingInfo bindingInfo; - private ExtRefSourceInfo sourceInfo; - - public ExtRefInfo(TExtRef tExtRef) { - bindingInfo = new ExtRefBindingInfo(tExtRef); - sourceInfo = new ExtRefSourceInfo(tExtRef); - signalInfo = new ExtRefSignalInfo(tExtRef); - } - - @Override - public boolean equals(Object o) { - if (o == null) return false; - if (o.getClass() != getClass()) return false; - if (this == o) return true; - ExtRefInfo that = (ExtRefInfo) o; - return Objects.equals(signalInfo, that.signalInfo) && - Objects.equals(bindingInfo, that.bindingInfo) && - Objects.equals(sourceInfo, that.sourceInfo); - } - - @Override - public int hashCode() { - return Objects.hash(signalInfo, bindingInfo, sourceInfo); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java deleted file mode 100644 index 1dbeea37b..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfo.java +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TServiceType; - -import java.util.Objects; - -@Getter -@Setter -@NoArgsConstructor -public class ExtRefSignalInfo { - private String desc; - private String pLN; - private String pDO; - private String pDA; - private String intAddr; - private TServiceType pServT; - - public ExtRefSignalInfo(TExtRef tExtRef){ - desc = tExtRef.getDesc(); - if(!tExtRef.getPLN().isEmpty()) { - pLN = tExtRef.getPLN().get(0); - } - pDO = tExtRef.getPDO(); - pDA = tExtRef.getPDA(); - intAddr = tExtRef.getIntAddr(); - if(tExtRef.getPServT() != null) { - pServT = tExtRef.getPServT(); - } - } - - @Override - public boolean equals(Object o) { - if (o == null) return false; - if (this == o) return true; - if (o.getClass() != this.getClass()) return false; - ExtRefSignalInfo that = (ExtRefSignalInfo) o; - return Objects.equals(desc, that.desc) && - Objects.equals(pLN, that.pLN) && - Objects.equals(pDO, that.pDO) && - Objects.equals(pDA, that.pDA) && - Objects.equals(intAddr, that.intAddr) && - pServT == that.pServT; - } - - @Override - public int hashCode() { - return Objects.hash(desc, pLN, pDO, pDA, intAddr, pServT); - } - - public boolean isWrappedIn(TExtRef tExtRef) { - if((desc != null && tExtRef.getDesc() == null) || - (desc == null && tExtRef.getDesc() != null) || - (desc != null && tExtRef.getDesc() != null && !desc.equals(tExtRef.getDesc()))){ - return false; - } - if(!tExtRef.getPLN().isEmpty() && !tExtRef.getPLN().contains(pLN)){ - return false; - } - - if((pDO == null && tExtRef.getPDO() != null) || - (pDO != null && tExtRef.getPDO() == null) || - (pDO != null && !pDO.equals(tExtRef.getPDO()))){ - return false; - } - if( (pDA == null && tExtRef.getPDA() != null) || - (pDA != null && tExtRef.getPDO() == null) || - (pDA != null && !pDA.equals(tExtRef.getPDA()))){ - return false; - } - - if((intAddr != null && tExtRef.getIntAddr() == null) || - (intAddr == null && tExtRef.getIntAddr() != null) || - (intAddr != null && !intAddr.equals(tExtRef.getIntAddr()))){ - return false; - } - - if((pServT != null && tExtRef.getPServT() == null) || - (pServT == null && tExtRef.getPServT() != null) || - (pServT != null && !pServT.equals(tExtRef.getPServT()))){ - return false; - } - return true; - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java deleted file mode 100644 index 97fa054ca..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfo.java +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TExtRef; - -import java.util.Objects; - -@Setter -@Getter -@NoArgsConstructor -public class ExtRefSourceInfo { - private String srcLDInst; - private String srcPrefix; - private String srcLNClass; - private String srcLNInst; - private String srcCBName; - - public ExtRefSourceInfo(TExtRef tExtRef){ - srcLDInst = tExtRef.getSrcLDInst(); - srcPrefix = tExtRef.getSrcPrefix(); - srcLNInst = tExtRef.getSrcLNInst(); - srcCBName = tExtRef.getSrcCBName(); - } - - @Override - public boolean equals(Object o) { - if (o == null) return false; - if (o.getClass() != getClass()) return false; - if (this == o) return true; - ExtRefSourceInfo that = (ExtRefSourceInfo) o; - return Objects.equals(srcLDInst, that.srcLDInst) && - Objects.equals(srcPrefix, that.srcPrefix) && - Objects.equals(srcLNClass, that.srcLNClass) && - Objects.equals(srcLNInst, that.srcLNInst) && - Objects.equals(srcCBName, that.srcCBName); - } - - @Override - public int hashCode() { - return Objects.hash(srcLDInst, srcPrefix, srcLNClass, srcLNInst, srcCBName); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java deleted file mode 100644 index f03c48284..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/IedDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.sct.model.IIedDTO; -import org.lfenergy.compas.sct.model.ILDeviceDTO; - -import java.util.HashSet; -import java.util.Set; - -@Setter -@Getter -@NoArgsConstructor -public class IedDTO implements IIedDTO { - private String name; - private Set lDevices = new HashSet<>(); - - @Override - public Set getLDevices() { - return Set.of(lDevices.toArray(new LDeviceDTO[0])); - } - - @Override - public void addLDevice(T ld) { - lDevices.add((LDeviceDTO)ld); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java deleted file mode 100644 index bed5d8b60..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ItemsDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; - -import java.util.HashSet; -import java.util.Set; - -@Getter -public class ItemsDTO { - private Set items = new HashSet<>(); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java deleted file mode 100644 index 9afcf3c79..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LDeviceDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.sct.model.ILDeviceDTO; -import org.lfenergy.compas.sct.model.ILNodeDTO; - -import java.util.HashSet; -import java.util.Set; - -@Setter -@Getter -@NoArgsConstructor -public class LDeviceDTO implements ILDeviceDTO { - private String ldInst; - private String ldName; - private Set lNodes = new HashSet<>(); - - @Override - public Set getLNodes() { - return Set.of(lNodes.toArray(new LNodeDTO[0])); - } - - @Override - public void addLNode(T ln) { - lNodes.add((LNodeDTO) ln); - } - - public void addAll(Set lns) { - lNodes.addAll(lns); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java deleted file mode 100644 index cdfdf0806..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/LNodeDTO.java +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TLN; -import org.lfenergy.compas.sct.model.ILNodeDTO; - -import java.util.HashSet; -import java.util.Set; - -@Setter -@Getter -@NoArgsConstructor -public class LNodeDTO implements ILNodeDTO { - private String inst; - private String lNodeClass; - private String lNodeType; - private Set extRefs = new HashSet<>(); - private Set resumedDataTemplates = new HashSet<>(); - - public LNodeDTO(String inst, String lNClass, String lNType) { - this.inst = inst; - this.lNodeClass = lNClass; - this.lNodeType = lNType; - - } - - public static LNodeDTO extractData(TLN ln) { - String lnClass = ln.getLnClass().isEmpty() ? "" : ln.getLnClass().get(0); - LNodeDTO lNodeDTO = new LNodeDTO(ln.getInst(),lnClass,ln.getLnType()); - if(ln.getInputs() != null){ - ln.getInputs().getExtRef().forEach(tExtRef -> { - ExtRefInfo extRefDTO = new ExtRefInfo(tExtRef); - lNodeDTO.addExtRef(extRefDTO); - }); - } - return lNodeDTO; - } - - @Override - public Set getExtRefs() { - return Set.of(extRefs.toArray(new ExtRefInfo[0])); - } - - @Override - public void addExtRef(ExtRefInfo extRef) { - extRefs.add(extRef); - } - - @Override - public void addResumedDataTemplate(ResumedDataTemplate dtt) { - resumedDataTemplates.add(dtt); - } - - @Override - public Set getResumedDataTemplates(){ - return Set.of(resumedDataTemplates.toArray(new ResumedDataTemplate[0])); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java deleted file mode 100644 index b3567a61c..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplate.java +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.Setter; -import org.lfenergy.compas.scl.TFCEnum; -import org.lfenergy.compas.scl.TPredefinedCDCEnum; - -@Getter -@Setter -public class ResumedDataTemplate { - - private String lnType; - private String lnClass; - private String doName; // doName[.sdoName[.sdoName]] - private TPredefinedCDCEnum cdc; - private String daName; // doName[.bdaName[.bdaName]] - private TFCEnum fc; - - @Override - public String toString() { - return "ResumedDataTemplate{" + - "lnType='" + lnType + '\'' + - ", lnClass='" + lnClass + '\'' + - ", doName='" + doName + '\'' + - ", cdc='" + cdc + '\'' + - ", daName='" + daName + '\'' + - ", fc=" + fc + - '}'; - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java deleted file mode 100644 index 1b65524a9..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/ScdDTO.java +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.Objects; -import java.util.UUID; - -@Getter -@Setter -@NoArgsConstructor -public class ScdDTO { - private UUID id; - private String fileName; - private UUID headerId; - private String headerRevision; - private String headerVersion; - private String who; - private String what; - private String why; - - public ScdDTO(UUID id, String fileName, UUID headerId, String headerRevision, String headerVersion) { - this.id = id; - this.fileName = fileName; - this.headerId = headerId; - this.headerRevision = headerRevision; - this.headerVersion = headerVersion; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if(o == null) return false; - if (this.getClass() != o.getClass()) return false; - ScdDTO scdDTO = (ScdDTO) o; - return Objects.equals(id, scdDTO.id) && - Objects.equals(fileName, scdDTO.fileName) && - Objects.equals(headerId, scdDTO.headerId) && - Objects.equals(headerRevision, scdDTO.headerRevision) && - Objects.equals(headerVersion, scdDTO.headerVersion) && - Objects.equals(who, scdDTO.who) && - Objects.equals(what, scdDTO.what) && - Objects.equals(why, scdDTO.why); - } - - @Override - public int hashCode() { - return Objects.hash(id, fileName, headerId, headerRevision, headerVersion, who, what, why); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java deleted file mode 100644 index f7872dc2b..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTO.java +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.scl.TSubNetwork; -import org.lfenergy.compas.sct.model.IConnectedApDTO; -import org.lfenergy.compas.sct.model.ISubNetworkDTO; -import org.springframework.lang.NonNull; - -import java.util.HashSet; -import java.util.Set; - -@Setter -@Getter -@NoArgsConstructor -public class SubNetworkDTO implements ISubNetworkDTO { - - private String name; - private SubnetworkType type; - private Set connectedAPs = new HashSet<>(); - - public SubNetworkDTO(String name, String type) { - this.name = name; - this.type = SubnetworkType.fromValue(type); - } - - public SubNetworkDTO(@NonNull TSubNetwork subNetwork) { - this.name = subNetwork.getName(); - this.type = SubnetworkType.fromValue(subNetwork.getType()); - subNetwork.getConnectedAP().forEach(tConnectedAP -> { - connectedAPs.add(new ConnectedApDTO(tConnectedAP)); - }); - } - - @Override - public Set getConnectedAPs() { - return Set.of(connectedAPs.toArray(new ConnectedApDTO[0])); - } - - public String getType(){ - return this.type.value; - } - - @Override - public void addConnectedAPs(T cap) { - connectedAPs.add((ConnectedApDTO) cap); - } - - @Override - public void setType(String type) { - this.type = SubnetworkType.fromValue(type); - } - - - public enum SubnetworkType { - IP("IP"), // 0 - MMS("8-MMS"), // 1 - PHYSICAL("PHYSICAL"); // 2 - - - private final String value; - - SubnetworkType(String value) { - this.value = value; - } - - @Override - @JsonValue - public String toString() { - return String.valueOf(value); - } - - @JsonCreator - public static SubnetworkType fromValue(String text) { - if(text.equalsIgnoreCase("8-MMS") ) { - return MMS; - } - - for (SubnetworkType b : SubnetworkType.values()) { - if (String.valueOf(b.value).equalsIgnoreCase(text)) { - return b; - } - } - return null; - } - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java deleted file mode 100644 index 34e01cf66..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/SimpleScd.java +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.entity; - -import lombok.Getter; -import lombok.Setter; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; -import org.lfenergy.compas.sct.model.IScd; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; -import java.io.Serializable; -import java.util.Objects; -import java.util.UUID; - - -@Getter -@Setter -@Entity -@Table(name = "SCD") -public class SimpleScd implements IScd, Serializable { - - @Id - @GeneratedValue(generator = "UUID") - @GenericGenerator( - name = "UUID", - strategy = "org.hibernate.id.UUIDGenerator" - ) - @Column(name = "ID") - private UUID id; - - @Column(name="RAW_XML") - @Lob - @Type(type = "xmltype") - private byte[] rawXml; - - @Column(name = "FILE_NAME",unique = true) - private String fileName; - - @Column(name = "HEADER_ID") - private UUID headerId; - - @Column(name = "HEADER_VERSION") - private String headerVersion; - - @Column(name = "HEADER_REVISION") - private String headerRevision; - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if(o == null) return false; - if (o.getClass() != getClass()) return false; - SimpleScd simpleScd = (SimpleScd) o; - return Objects.equals(id, simpleScd.id) && - Objects.equals(fileName, simpleScd.fileName) && - Objects.equals(headerId, simpleScd.headerId) && - Objects.equals(headerVersion, simpleScd.headerVersion) && - Objects.equals(headerRevision, simpleScd.headerRevision); - } - - @Override - public int hashCode() { - return Objects.hash(id, fileName, headerId, headerVersion, headerRevision); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java deleted file mode 100644 index 680fd2861..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/model/entity/package-info.java +++ /dev/null @@ -1,15 +0,0 @@ - - -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -@TypeDef( - name = "xmltype", - defaultForType = byte[].class, - typeClass = PostgresXMLTypeMapper.class -) -package org.lfenergy.compas.sct.model.entity; - -import org.hibernate.annotations.TypeDef; -import org.lfenergy.compas.sct.repository.PostgresXMLTypeMapper; \ No newline at end of file diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java deleted file mode 100644 index fdfa8d5d1..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/AbstractScdSQLCrudRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import lombok.extern.slf4j.Slf4j; -import org.lfenergy.compas.sct.model.IScd; -import org.lfenergy.compas.sct.model.IScdCrudRepository; - -/** - * Abstract DAO for SQL-like DB - * @param Entity model type - * @param Entity identifier type - */ -@Slf4j -public abstract class AbstractScdSQLCrudRepository, ID> implements IScdCrudRepository { - - protected Class genericType; - - public AbstractScdSQLCrudRepository(Class genericType) { - this.genericType = genericType; - } - - /** - * Get new unique identifier - * @param value object for whom to determine an identifier - * @return unique identifier - */ - public ID getNextID(T value){ - ID id = value.getHeaderId(); - if(id == null || existsByHeaderId(id)){ - id = getNextID(); - } - return id; - } - - /** - * Get new unique identifier - * @return unique identifier - */ - public abstract ID getNextID(); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java deleted file mode 100644 index 2f67e6fdf..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SharedSessionContractImplementor; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; - -public class H2XMLTypeMapper extends SqlXmlTypeMapper { - private final int[] SQL_TYPES = new int[] { Types.BINARY }; - - public static final H2XMLTypeMapper INSTANCE = new H2XMLTypeMapper(); - - @Override - public int[] sqlTypes() { - return SQL_TYPES.clone() ; - } - - @Override - public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException { - return resultSet.getBytes(names[0]); - } - - @Override - public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException { - preparedStatement.setBytes(index,(byte[]) value); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java deleted file mode 100644 index a71cd0e86..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgreSqlXmlDialect.java +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.hibernate.dialect.PostgreSQL95Dialect; - -import java.sql.Types; - -public class PostgreSqlXmlDialect extends PostgreSQL95Dialect{ - - public PostgreSqlXmlDialect() { - super(); - registerColumnType(Types.SQLXML, "XML"); - registerHibernateType(Types.OTHER, "pg-uuid"); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java deleted file mode 100644 index f61f14877..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapper.java +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import lombok.extern.slf4j.Slf4j; -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SharedSessionContractImplementor; - -import java.sql.*; - -@Slf4j -public class PostgresXMLTypeMapper extends SqlXmlTypeMapper { - private final int[] SQL_TYPES = new int[] { Types.SQLXML }; - - public static final PostgresXMLTypeMapper INSTANCE = new PostgresXMLTypeMapper(); - - public PostgresXMLTypeMapper() { - super(); - } - - @Override - public int[] sqlTypes() { - return SQL_TYPES.clone(); - } - - @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException { - byte[] rawXml = null; - SQLXML sqlxml = null; - try { - sqlxml = rs.getSQLXML(names[0]); - if(sqlxml != null) { - rawXml = sqlxml.getString().trim().getBytes(); - } - } finally { - if (null != sqlxml) { - sqlxml.free(); - } - } - return rawXml; - } - - @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor ssci) throws HibernateException, SQLException { - - SQLXML xmlType = st.getConnection().createSQLXML(); - if (value != null && value.getClass() == byte[].class) { - xmlType.setString(new String((byte[]) value)); - st.setObject(index, xmlType); - } else { - log.debug("Binding null to parameter {} ",index); - st.setNull(index,Types.SQLXML); - } - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java deleted file mode 100644 index 38698398e..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdBaseXRepository.java +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.lfenergy.compas.sct.exception.CompasDataAccessException; -import org.lfenergy.compas.sct.model.IScdCrudRepository; - -import java.util.Optional; - -public class ScdBaseXRepository implements IScdCrudRepository { - private static final String NOT_IMPLEMENTED_YET = "Not implemented yet!"; - @Override - public S save(S s) throws CompasDataAccessException { - throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); - } - - @Override - public S update(S s) throws CompasDataAccessException { - throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); - } - - @Override - public Optional findById(ID id) { - return Optional.empty(); - } - - @Override - public boolean existsById(ID id) { - return false; - } - - @Override - public boolean existsByHeaderId(ID id) { - return false; - } - - @Override - public long count() { - return 0; - } - - @Override - public void deleteById(ID id) throws CompasDataAccessException { - throw new UnsupportedOperationException("NOT_IMPLEMENTED_YET"); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java deleted file mode 100644 index de5f70bab..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/ScdJpaRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.lfenergy.compas.sct.model.entity.SimpleScd; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.UUID; - - -@Repository -public interface ScdJpaRepository extends JpaRepository { - - boolean existsByHeaderId(UUID id); -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java deleted file mode 100644 index 01aad6a89..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SimpleScdRepository.java +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - - -import lombok.extern.slf4j.Slf4j; -import org.lfenergy.compas.sct.exception.CompasDataAccessException; -import org.lfenergy.compas.sct.model.entity.SimpleScd; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - - -@Slf4j -@Repository -public class SimpleScdRepository extends AbstractScdSQLCrudRepository { - - public final ScdJpaRepository scdJpaRepository; - - @Autowired - public SimpleScdRepository(ScdJpaRepository scdJpaRepository) { - super(SimpleScd.class); - this.scdJpaRepository = scdJpaRepository; - } - - @Override - public UUID getNextID() { - return UUID.randomUUID(); - } - - @Override - public SimpleScd save(SimpleScd simpleScd) throws CompasDataAccessException { - return scdJpaRepository.save(simpleScd); - } - - - @Override - public SimpleScd update(SimpleScd simpleScd) throws CompasDataAccessException { - return scdJpaRepository.save(simpleScd); - } - - @Override - public Optional findById(UUID uuid) { - return scdJpaRepository.findById(uuid); - } - - @Override - public boolean existsById(UUID uuid) { - return scdJpaRepository.existsById(uuid); - } - - @Override - public boolean existsByHeaderId(UUID uuid) { - return scdJpaRepository.existsByHeaderId(uuid); - } - - @Override - public long count() { - return scdJpaRepository.count(); - } - - @Override - public void deleteById(UUID uuid) { - scdJpaRepository.deleteById(uuid); - } -} diff --git a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java b/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java deleted file mode 100644 index 57df3d2d4..000000000 --- a/sct-data/src/main/java/org/lfenergy/compas/sct/repository/SqlXmlTypeMapper.java +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.hibernate.HibernateException; -import org.hibernate.usertype.UserType; - -import java.io.Serializable; -import java.util.Objects; - - -public abstract class SqlXmlTypeMapper implements UserType, Serializable { - - @Override - public Class returnedClass() { - return byte[].class; - } - - @Override - public boolean equals(Object x, Object y) throws HibernateException { - return Objects.equals(x,y); - } - - @Override - public int hashCode(Object x) throws HibernateException { - return Objects.hashCode(x); - } - - @Override - public Object deepCopy(Object value) throws HibernateException { - return value; - } - - @Override - public boolean isMutable() { - return true; - } - - @Override - public Serializable disassemble(Object value) throws HibernateException { - return (Serializable) value; - } - - @Override - public Object assemble(Serializable serializable, Object owner) throws HibernateException { - return serializable; - } - - @Override - public Object replace(Object original, Object target, Object owner) throws HibernateException { - return deepCopy(original); - } -} diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java deleted file mode 100644 index 5b723c901..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.test.context.SpringBootTest; - -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@SpringBootTest -@ActiveProfiles("test") -public class ApplicationContextTest { - - @Test - public void contextLoads() { - // do nothing - } - - @SpringBootApplication - @EnableJpaRepositories - @EnableTransactionManagement - public static class Context { - - } -} diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java deleted file mode 100644 index 1911d6eb2..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/exception/CompasDataAccessExceptionTest.java +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.exception; - -import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.Test; - -class CompasDataAccessExceptionTest { - - @Test - void testConstructor(){ - CompasDataAccessException compasDAOException = new CompasDataAccessException("Exception message"); - - assertEquals("Exception message", compasDAOException.getMessage()); - compasDAOException = new CompasDataAccessException("Exception message", - new RuntimeException("Please check me")); - - assertEquals(compasDAOException.getCause().getClass(),RuntimeException.class); - } - -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java deleted file mode 100644 index ddfab46bb..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ConnectedApDTOTest.java +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class ConnectedApDTOTest { - - @Test - public void testConstruction(){ - ConnectedApDTO connectedApDTO = DTO.createCapDTO(false); - ConnectedApDTO connectedApDTO1 = DTO.createCapDTO(true); - ConnectedApDTO connectedApDTO2 = new ConnectedApDTO(DTO.createCap()); - assertAll("CAP", - () -> assertEquals(DTO.IED_NAME, connectedApDTO.getIedName()), - () -> assertEquals(DTO.AP_NAME, connectedApDTO.getApName()), - () -> assertEquals(DTO.AP_NAME, connectedApDTO2.getApName()), - () -> assertEquals(connectedApDTO1, connectedApDTO), - () -> assertFalse(connectedApDTO.equals(null)), - () -> assertFalse(connectedApDTO.equals("TOTO")), - () -> assertEquals(connectedApDTO.hashCode(), connectedApDTO1.hashCode()) - ); - - - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java deleted file mode 100644 index 151a76925..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefBindingInfoTest.java +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class ExtRefBindingInfoTest { - - @Test - void testConstruction(){ - ExtRefBindingInfo bindingInfo = DTO.createExtRefBindingInfo(); - ExtRefBindingInfo bindingInfo_bis = DTO.createExtRefBindingInfo(); - ExtRefBindingInfo bindingInfo_ter = bindingInfo; - ExtRefBindingInfo bindingInfo_qt = new ExtRefBindingInfo(); - - assertEquals(bindingInfo,bindingInfo_ter); - assertEquals(bindingInfo,bindingInfo_bis); - assertNotEquals(bindingInfo, null); - assertNotEquals(bindingInfo, bindingInfo_qt); - bindingInfo_qt.setDaName(bindingInfo.getDaName()); - assertNotEquals(bindingInfo, bindingInfo_qt); - - bindingInfo_qt.setDoName(bindingInfo.getDoName()); - assertNotEquals(bindingInfo, bindingInfo_qt); - - bindingInfo_qt.setIedName(bindingInfo.getIedName()); - assertNotEquals(bindingInfo, bindingInfo_qt); - - bindingInfo_qt.setLdInst(bindingInfo.getLdInst()); - assertNotEquals(bindingInfo, bindingInfo_qt); - - bindingInfo_qt.setLnInst(bindingInfo.getLnInst()); - assertNotEquals(bindingInfo, bindingInfo_qt); - - bindingInfo_qt.setLnClass(bindingInfo.getLnClass()); - assertNotEquals(bindingInfo, bindingInfo_qt); - - bindingInfo_qt.setPrefix(bindingInfo.getPrefix()); - assertNotEquals(bindingInfo, bindingInfo_qt); - - bindingInfo_qt.setServiceType(bindingInfo.getServiceType()); - assertEquals(bindingInfo, bindingInfo_qt); - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java deleted file mode 100644 index 36cf9fc8e..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefInfoTest.java +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class ExtRefInfoTest { - - /* @Test - void testConstruction(){ - ExtRefInfo extRefInfo = createExtRef(); - ExtRefInfo extRefInfo_bis = createExtRef(); - assertEquals(extRefInfo,extRefInfo_bis); - String doName = extRefInfo_bis.getBindingInfo().getDoName(); - extRefInfo_bis.getBindingInfo().setDoName("ggggg"); - assertNotEquals(extRefInfo,extRefInfo_bis); - assertNotEquals(extRefInfo,new ExtRefInfo()); - - - } - - private ExtRefInfo createExtRef(){ - ExtRefInfo extRefInfo = new ExtRefInfo(); - extRefInfo.setSignalInfo(DTO.createExtRefSignalInfo()); - extRefInfo.setBindingInfo(DTO.createExtRefBindingInfo()); - extRefInfo.setSourceInfo(DTO.createExtRefSourceInfo()); - - return extRefInfo; - }*/ - -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java deleted file mode 100644 index fff5210c8..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSignalInfoTest.java +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class ExtRefSignalInfoTest { - - @Test - void testConstruction(){ - ExtRefSignalInfo signalInfo = DTO.createExtRefSignalInfo(); - ExtRefSignalInfo signalInfoBis = DTO.createExtRefSignalInfo(); - ExtRefSignalInfo signalInfoTer = signalInfo; - ExtRefSignalInfo signalInfoQt = new ExtRefSignalInfo(); - - assertEquals(signalInfo,signalInfoTer); - assertEquals(signalInfo,signalInfoBis); - assertNotEquals(signalInfo, null); - assertNotEquals(signalInfo, signalInfoQt); - - } - - @Test - void testIsWrappedIn(){ - - TExtRef tExtRef = DTO.createExtRef(); - ExtRefSignalInfo signalInfo = new ExtRefSignalInfo(tExtRef); - ExtRefSignalInfo signalInfo1 = new ExtRefSignalInfo(); - assertTrue(signalInfo.isWrappedIn(tExtRef)); - - assertFalse(signalInfo1.isWrappedIn(tExtRef)); - - signalInfo1.setDesc(signalInfo.getDesc()); - assertFalse(signalInfo1.isWrappedIn(tExtRef)); - - signalInfo1.setPDA(signalInfo.getPDA()); - assertFalse(signalInfo1.isWrappedIn(tExtRef)); - - signalInfo1.setPDO(signalInfo.getPDO()); - assertFalse(signalInfo1.isWrappedIn(tExtRef)); - - signalInfo1.setIntAddr(signalInfo.getIntAddr()); - assertFalse(signalInfo1.isWrappedIn(tExtRef)); - - signalInfo1.setPLN(signalInfo.getPLN()); - assertFalse(signalInfo1.isWrappedIn(tExtRef)); - - signalInfo1.setPServT(signalInfo.getPServT()); - assertTrue(signalInfo1.isWrappedIn(tExtRef)); - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java deleted file mode 100644 index 7b353c374..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ExtRefSourceInfoTest.java +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class ExtRefSourceInfoTest { - @Test - void testConstruction(){ - ExtRefSourceInfo sourceInfo = DTO.createExtRefSourceInfo(); - ExtRefSourceInfo bindingInfo_bis = DTO.createExtRefSourceInfo(); - ExtRefSourceInfo bindingInfo_ter = sourceInfo; - ExtRefSourceInfo bindingInfo_qt = new ExtRefSourceInfo(); - - assertEquals(sourceInfo,bindingInfo_ter); - assertEquals(sourceInfo,bindingInfo_bis); - assertNotEquals(sourceInfo, null); - assertNotEquals(sourceInfo, bindingInfo_qt); - assertFalse(sourceInfo.equals(new ExtRefSignalInfo())); - } - -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java deleted file mode 100644 index d1eb9f472..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/IedDTOTest.java +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class IedDTOTest { - - @Test - public void testConstruction(){ - IedDTO iedDTO = DTO.createIedDTO(); - - assertAll("IedDTO", - () -> assertEquals(DTO.IED_NAME, iedDTO.getName()), - () -> assertFalse(iedDTO.getLDevices().isEmpty()) - ); - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java deleted file mode 100644 index a98e9e545..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LDeviceDTOTest.java +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import java.util.Set; - -import static org.junit.jupiter.api.Assertions.*; - -class LDeviceDTOTest { - - @Test - public void testConstruction(){ - LDeviceDTO lDeviceDTO = DTO.createLdDTO(); - - assertAll("LD_DTO", - () -> assertEquals(DTO.LD_INST, lDeviceDTO.getLdInst()), - () -> assertEquals(DTO.LD_NAME, lDeviceDTO.getLdName()), - () -> assertFalse(lDeviceDTO.getLNodes().isEmpty()) - ); - - Set nodeDTOs = Set.of(DTO.createLNodeDTO(),DTO.createLNodeDTO()); - lDeviceDTO.addAll(nodeDTOs); - assertEquals(3,lDeviceDTO.getLNodes().size()); - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java deleted file mode 100644 index 1d93084db..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/LNodeDTOTest.java +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TInputs; -import org.lfenergy.compas.scl.TLN; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class LNodeDTOTest { - - - @Test - public void testConstruction(){ - LNodeDTO lNodeDTO = DTO.createLNodeDTO(); - lNodeDTO.addExtRef(DTO.createExtRefInfo()); - lNodeDTO.addResumedDataTemplate(new ResumedDataTemplate()); - - assertAll("LNodeDTO", - () -> assertEquals(DTO.LN_INST, lNodeDTO.getInst()), - () -> assertEquals(DTO.LN_CLASS, lNodeDTO.getLNodeClass()), - () -> assertEquals(DTO.LN_TYPE, lNodeDTO.getLNodeType()), - () -> assertFalse(lNodeDTO.getExtRefs().isEmpty()), - () -> assertFalse(lNodeDTO.getResumedDataTemplates().isEmpty()) - ); - LNodeDTO lNodeDTO1 = new LNodeDTO(); - lNodeDTO1.setInst(DTO.LN_INST); - lNodeDTO1.setLNodeClass(DTO.LN_CLASS); - lNodeDTO1.setLNodeType(DTO.LN_TYPE); - lNodeDTO1.setExtRefs(lNodeDTO.getExtRefs()); - lNodeDTO1.setResumedDataTemplates(lNodeDTO.getResumedDataTemplates()); - - assertAll("LNodeDTO1", - () -> assertEquals(DTO.LN_INST, lNodeDTO1.getInst()), - () -> assertEquals(DTO.LN_CLASS, lNodeDTO1.getLNodeClass()), - () -> assertEquals(DTO.LN_TYPE, lNodeDTO1.getLNodeType()), - () -> assertFalse(lNodeDTO1.getExtRefs().isEmpty()), - () -> assertFalse(lNodeDTO1.getResumedDataTemplates().isEmpty()) - ); - } - - @Test - public void testExtractData(){ - TLN tln = new TLN(); - tln.setInst(DTO.LN_INST); - tln.setLnType(DTO.LN_TYPE); - tln.getLnClass().add(DTO.LN_CLASS); - TExtRef tExtRef = DTO.createExtRef(); - TInputs tInputs = new TInputs(); - tInputs.getExtRef().add(tExtRef); - tln.setInputs(tInputs); - - LNodeDTO lNodeDTO = LNodeDTO.extractData(tln); - assertAll("LNodeDTO", - () -> assertEquals(DTO.LN_INST, lNodeDTO.getInst()), - () -> assertEquals(DTO.LN_CLASS, lNodeDTO.getLNodeClass()), - () -> assertEquals(DTO.LN_TYPE, lNodeDTO.getLNodeType()) - ); - assertTrue(!lNodeDTO.getExtRefs().isEmpty()); - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java deleted file mode 100644 index c82cf704d..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ResumedDataTemplateTest.java +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.scl.TFCEnum; -import org.lfenergy.compas.scl.TLLN0Enum; -import org.lfenergy.compas.scl.TPredefinedCDCEnum; -import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; - -import static org.junit.jupiter.api.Assertions.*; - -class ResumedDataTemplateTest { - - - @Test - void testResumedDataTemplate(){ - ResumedDataTemplate rDTT = new ResumedDataTemplate(); - rDTT.setCdc(TPredefinedCDCEnum.WYE); - rDTT.setFc(TFCEnum.CF); - rDTT.setLnType("LN1"); - rDTT.setLnClass(TLLN0Enum.LLN_0.value()); - rDTT.setDoName("FACntRs1.res"); - rDTT.setDaName("d"); - - System.out.println(rDTT); - - assertAll("RDTT", - () -> assertEquals(TPredefinedCDCEnum.WYE, rDTT.getCdc()), - () -> assertEquals(TFCEnum.CF, rDTT.getFc()), - () -> assertEquals("LN1", rDTT.getLnType()), - () -> assertEquals(TLLN0Enum.LLN_0.value(), rDTT.getLnClass()), - () -> assertEquals("FACntRs1.res", rDTT.getDoName()), - () -> assertEquals("d", rDTT.getDaName()) - ); - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java deleted file mode 100644 index cf4a203fb..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/ScdDTOTest.java +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; - -class ScdDTOTest { - - - @Test - void testScdDTO(){ - UUID id = UUID.randomUUID(); - ScdDTO scdDTO = DTO.createScdDTO(id); - ScdDTO scdDTO2 = new ScdDTO(id,DTO.FILE_NAME,id,DTO.HEADER_REVISION,DTO.HEADER_VERSION); - - assertAll("scdDTO", - () -> assertEquals(id,scdDTO.getId()), - () -> assertEquals(DTO.HEADER_REVISION,scdDTO.getHeaderRevision()), - () -> assertEquals(DTO.HEADER_VERSION,scdDTO.getHeaderVersion()), - () -> assertEquals(DTO.FILE_NAME,scdDTO.getFileName()), - () -> assertEquals("WHO",scdDTO.getWho()), - () -> assertEquals("WHY",scdDTO.getWhy()), - () -> assertEquals("WHAT",scdDTO.getWhat()), - () -> assertEquals(DTO.FILE_NAME,scdDTO2.getFileName()), - () -> assertEquals(id,scdDTO.getHeaderId()) - ); - - ScdDTO scdDTO1 = DTO.createScdDTO(id); - - assertEquals(scdDTO1,scdDTO); - - scdDTO1.setFileName(scdDTO1.getFileName() + "_1"); - assertNotEquals(scdDTO1,scdDTO); - assertNotEquals(scdDTO1.hashCode(),scdDTO.hashCode()); - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java deleted file mode 100644 index 7891d0c35..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/dto/SubNetworkDTOTest.java +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.dto; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import static org.junit.jupiter.api.Assertions.*; - -class SubNetworkDTOTest { - - @Test - public void testConstruction(){ - SubNetworkDTO subNetworkDTO = DTO.createSnDTO(false); - SubNetworkDTO subNetworkDTO1 = DTO.createSnDTO(true); - SubNetworkDTO subNetworkDTO2 = new SubNetworkDTO(DTO.createSn()); - - assertAll("SN", - () -> assertEquals(DTO.SN_NAME,subNetworkDTO.getName()), - () -> assertEquals(SubNetworkDTO.SubnetworkType.MMS.toString(),subNetworkDTO.getType()), - () -> assertFalse(subNetworkDTO.getConnectedAPs().isEmpty()), - () -> assertFalse(subNetworkDTO2.getConnectedAPs().isEmpty()), - () -> assertTrue(subNetworkDTO1.getConnectedAPs().isEmpty()) - ); - - assertNotNull(SubNetworkDTO.SubnetworkType.fromValue("IP")); - assertNull(SubNetworkDTO.SubnetworkType.fromValue("IPSEC")); - } - -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java deleted file mode 100644 index cccca7e01..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/SimpleScdTest.java +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.model.entity; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.testhelper.DTO; - -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; - -class SimpleScdTest { - @Test - void testScd(){ - UUID id = UUID.randomUUID(); - SimpleScd scd = DTO.createScd(id); - SimpleScd scd2 = scd; - assertEquals(scd,scd2); - - assertAll("SCD", - () -> assertEquals(id, scd.getId()), - () -> assertArrayEquals(DTO.DUMMY_PAYLOAD.getBytes(), scd.getRawXml()), - () -> assertEquals(DTO.HEADER_REVISION, scd.getHeaderRevision()), - () -> assertEquals(DTO.HEADER_VERSION, scd.getHeaderVersion()), - () -> assertEquals(id, scd.getHeaderId()) - ); - - SimpleScd scd1 = DTO.createScd(id); - assertEquals(scd1.hashCode(),scd.hashCode()); - assertEquals(scd1,scd); - //change - scd1.setFileName(scd1.getFileName() + "1"); - assertNotEquals(scd1.hashCode(),scd.hashCode()); - assertNotEquals(scd1,scd); - } - -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java deleted file mode 100644 index f2e6249c5..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -@TypeDef( - name = "xmltype", - defaultForType = byte[].class, - typeClass = H2XMLTypeMapper.class -) -package org.lfenergy.compas.sct.model.entity; - -import org.hibernate.annotations.TypeDef; -import org.lfenergy.compas.sct.repository.H2XMLTypeMapper; \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java deleted file mode 100644 index 016180d84..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/H2XMLTypeMapperTest.java +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.junit.jupiter.api.Test; - -import java.io.Serializable; - -import static org.junit.jupiter.api.Assertions.*; - -class H2XMLTypeMapperTest { - private H2XMLTypeMapper h2XMLTypeMapper = new H2XMLTypeMapper(); - - @Test - void testReturnedClass(){ - assertEquals(byte[].class,h2XMLTypeMapper.returnedClass()); - } - - @Test - void testEquals(){ - byte[] b1 = "hello".getBytes(); - byte[] b2 = "world".getBytes(); - assertTrue(h2XMLTypeMapper.equals(b1,b1)); - assertNotEquals(h2XMLTypeMapper.hashCode(b1),h2XMLTypeMapper.hashCode(b2)); - assertFalse(h2XMLTypeMapper.equals(b1,b2)); - } - - @Test - void testDisassemble(){ - byte[] b = "hello".getBytes(); - - assertNotNull(h2XMLTypeMapper.disassemble(b)); - assertTrue(Serializable.class.isInstance(h2XMLTypeMapper.disassemble(b))); - - // just for coverage ... assemble does nothing exceptional - Serializable bSer = h2XMLTypeMapper.disassemble(b); - h2XMLTypeMapper.assemble(bSer, new byte[]{}); - - } - - - -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java deleted file mode 100644 index a51d9c4ba..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/PostgresXMLTypeMapperTest.java +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatchers; -import org.mockito.Mockito; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.SQLXML; -import java.sql.Types; - -import static org.junit.jupiter.api.Assertions.*; - -class PostgresXMLTypeMapperTest { - - private PostgresXMLTypeMapper xmlTypeMapper = new PostgresXMLTypeMapper(); - - @Test - void testSqlTypes() { - assertArrayEquals(new int[]{Types.SQLXML}, xmlTypeMapper.sqlTypes()); - } - - @Test - void testNullSafeSet() throws SQLException { - PreparedStatement mockPreparedStatement = Mockito.mock(PreparedStatement.class); - Connection mockConnection = Mockito.mock(Connection.class); - SQLXML mockXmlType = Mockito.mock(SQLXML.class); - - Mockito.when(mockPreparedStatement.getConnection()).thenReturn(mockConnection); - Mockito.when(mockConnection.createSQLXML()).thenReturn(mockXmlType); - byte[] b = "".getBytes(); - - xmlTypeMapper.nullSafeSet(mockPreparedStatement,b,1,null); - - xmlTypeMapper.nullSafeSet(mockPreparedStatement,null,1,null); - } - - @Test - void testNullSafeGet() throws SQLException { - ResultSet mockResultSet = Mockito.mock(ResultSet.class); - SQLXML mockXmlType = Mockito.mock(SQLXML.class); - - Mockito.when(mockResultSet.getSQLXML(ArgumentMatchers.anyString())).thenReturn(mockXmlType); - Mockito.when(mockXmlType.getString()).thenReturn(""); - byte[] expected = "".getBytes(); - byte[] res = (byte[]) xmlTypeMapper.nullSafeGet(mockResultSet,new String[]{"RAW_XML"},null,null); - - assertArrayEquals(res,expected); - - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java b/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java deleted file mode 100644 index ca3060810..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/repository/SimpleScdRepositoryTest.java +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.repository; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.sct.ApplicationContextTest; -import org.lfenergy.compas.sct.exception.CompasDataAccessException; -import org.lfenergy.compas.sct.model.entity.SimpleScd; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; - -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest(classes = ApplicationContextTest.Context.class) -@ActiveProfiles("test") -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -class SimpleScdRepositoryTest { - - @Autowired - SimpleScdRepository simpleScdRepository; - - @Test - void testShouldReturnOKWhenGetNextID() { - assertNotNull(simpleScdRepository.getNextID()); - } - - @Test - void testShouldReturnOKWhenSave() throws CompasDataAccessException { - - SimpleScd simpleScd = createScd(null); - SimpleScd expectedScd = simpleScdRepository.save(simpleScd); - assertNotNull(expectedScd.getId()); - } - - @Test - void testShouldReturnOKWhenUpdate() throws CompasDataAccessException { - SimpleScd simpleScd = createScd(null); - SimpleScd savedScd = simpleScdRepository.save(simpleScd); - assertNotNull(savedScd.getId()); - - savedScd.setHeaderRevision("2.0"); - SimpleScd expectedScd = simpleScdRepository.update(simpleScd); - assertEquals("2.0", savedScd.getHeaderRevision()); - } - - @Test - void testShouldReturnOKWhenFindById() throws CompasDataAccessException { - - SimpleScd simpleScd = createScd(null); - SimpleScd savedScd = simpleScdRepository.save(simpleScd); - assertNotNull(savedScd.getId()); - - SimpleScd expectedScd = simpleScdRepository.findById(savedScd.getId()) - .orElseThrow(() -> new CompasDataAccessException("Not found")); - assertEquals(expectedScd.getId(),savedScd.getId()); - - } - - @Test - void testShouldReturnNOKWhenFindByIdCauseUnknownId() throws CompasDataAccessException { - - SimpleScd simpleScd = createScd(null); - SimpleScd savedScd = simpleScdRepository.save(simpleScd); - assertNotNull(savedScd.getId()); - - assertThrows( CompasDataAccessException.class, () -> simpleScdRepository.findById(UUID.randomUUID()) - .orElseThrow(() -> new CompasDataAccessException("Not found"))); - } - - @Test - void existsById() throws CompasDataAccessException { - SimpleScd simpleScd = createScd(null); - SimpleScd savedScd = simpleScdRepository.save(simpleScd); - assertTrue(simpleScdRepository.existsById(savedScd.getId())); - } - - @Test - void existsByHeaderId() throws CompasDataAccessException { - SimpleScd simpleScd = createScd(null); - SimpleScd savedScd = simpleScdRepository.save(simpleScd); - assertTrue(simpleScdRepository.existsByHeaderId(savedScd.getHeaderId())); - } - - @Test - void count() { - } - - @Test - void deleteById() { - } - - @Test - void testGetNextID() throws CompasDataAccessException { - SimpleScd simpleScd = createScd(UUID.randomUUID()); - assertEquals(simpleScd.getHeaderId(),simpleScdRepository.getNextID(simpleScd)); - - simpleScd = simpleScdRepository.save(simpleScd); - - UUID id = simpleScdRepository.getNextID(simpleScd); - assertNotEquals(id,simpleScd.getHeaderId()); - - SimpleScd anotherScd = createScd(null); - id = simpleScdRepository.getNextID(anotherScd); - assertNotNull(id); - assertNotEquals(id,simpleScd.getHeaderId()); - } - private SimpleScd createScd(UUID id){ - SimpleScd scd = new SimpleScd(); - scd.setId(id); - scd.setRawXml("blablabla".getBytes()); - scd.setFileName("FN"); - scd.setHeaderId(id); - scd.setHeaderRevision("RV"); - scd.setHeaderVersion("VR"); - - return scd; - } -} \ No newline at end of file diff --git a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java b/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java deleted file mode 100644 index 8146ca299..000000000 --- a/sct-data/src/test/java/org/lfenergy/compas/sct/testhelper/DTO.java +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.testhelper; - -import org.lfenergy.compas.scl.TConnectedAP; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TFCEnum; -import org.lfenergy.compas.scl.TLLN0Enum; -import org.lfenergy.compas.scl.TPredefinedCDCEnum; -import org.lfenergy.compas.scl.TServiceType; -import org.lfenergy.compas.scl.TSubNetwork; -import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; -import org.lfenergy.compas.sct.model.dto.ExtRefBindingInfo; -import org.lfenergy.compas.sct.model.dto.ExtRefInfo; -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; -import org.lfenergy.compas.sct.model.dto.ExtRefSourceInfo; -import org.lfenergy.compas.sct.model.dto.IedDTO; -import org.lfenergy.compas.sct.model.dto.LDeviceDTO; -import org.lfenergy.compas.sct.model.dto.LNodeDTO; -import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; -import org.lfenergy.compas.sct.model.dto.ScdDTO; -import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; -import org.lfenergy.compas.sct.model.entity.SimpleScd; - -import java.util.UUID; - -public class DTO { - - /*-----------------------------------------------*/ - /* Scd/ScdDTO */ - /*-----------------------------------------------*/ - public static final String HEADER_REVISION = "1.0"; - public static final String HEADER_VERSION = "1.0"; - public static final String FILE_NAME = "filename"; - public static final String DUMMY_PAYLOAD = "blablabla"; - - public static SimpleScd createScd(UUID id){ - SimpleScd scd = new SimpleScd(); - scd.setId(id); - scd.setRawXml(DUMMY_PAYLOAD.getBytes()); - scd.setFileName(FILE_NAME); - scd.setHeaderId(id); - scd.setHeaderRevision(HEADER_REVISION); - scd.setHeaderVersion(HEADER_VERSION); - - return scd; - } - public static ScdDTO createScdDTO(UUID id){ - ScdDTO scdDTO = new ScdDTO(); - scdDTO.setId(id); - scdDTO.setHeaderId(id); - scdDTO.setHeaderRevision(HEADER_REVISION); - scdDTO.setHeaderVersion(HEADER_VERSION); - scdDTO.setFileName(FILE_NAME); - scdDTO.setWhat("WHAT"); - scdDTO.setWhy("WHY"); - scdDTO.setWho("WHO"); - - return scdDTO; - } - - /*-----------------------------------------------*/ - /* ExtRefInfo */ - /*-----------------------------------------------*/ - public static final String DESC = "DESC"; - public static final String P_DA = "d"; - public static final String P_DO = "FACntRs1.res"; - public static final String P_LN = TLLN0Enum.LLN_0.value(); - public static final String P_SERV_T = "Report"; - public static final String INT_ADDR = "INT_ADDR"; - - public static final String IED_NAME = "IED_NAME"; - public static final String LD_INST= "PIOC"; - public static final String LN_INST= "LN"; - public static final String LN_CLASS= "LN_CLASS"; - public static final String DA_NAME = P_DA; - public static final String DO_NAME = P_DO; - public static final String PREFIX = "PR"; - public static final String SERVICE_TYPE = P_SERV_T; - - public static final String SRC_LD_INST= LD_INST; - public static final String SRC_LN_INST= LN_INST; - public static final String SRC_LN_CLASS= LN_CLASS; - public static final String SRC_PREFIX = PREFIX; - public static final String SRC_CB_NAME = "SRC_CB_NAME"; - - public static TExtRef createExtRef(){ - TExtRef tExtRef = new TExtRef(); - tExtRef.setDesc(DESC); - tExtRef.setPDA(P_DA); - tExtRef.setPDO(P_DO); - tExtRef.getPLN().add(P_LN); - tExtRef.setPServT(TServiceType.fromValue(P_SERV_T)); - tExtRef.setIntAddr(INT_ADDR); - - tExtRef.setIedName(IED_NAME); - tExtRef.setLdInst(LD_INST); - tExtRef.setLnInst(LN_INST); - tExtRef.getLnClass().add(LN_CLASS); - tExtRef.setDaName(DA_NAME); - tExtRef.setDoName(DO_NAME); - tExtRef.setPrefix(PREFIX); - tExtRef.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); - - tExtRef.setSrcLDInst(SRC_LD_INST); - tExtRef.setSrcLNInst(SRC_LN_INST); - tExtRef.getSrcLNClass().add(SRC_LN_CLASS); - tExtRef.setSrcPrefix(SRC_PREFIX); - tExtRef.setSrcCBName(SRC_CB_NAME); - - return tExtRef; - } - - public static ExtRefSignalInfo createExtRefSignalInfo(){ - ExtRefSignalInfo signalInfo = new ExtRefSignalInfo(); - signalInfo.setDesc(DESC); - signalInfo.setPDA(P_DA); - signalInfo.setPDO(P_DO); - signalInfo.setPLN(P_LN); - signalInfo.setPServT(TServiceType.fromValue(P_SERV_T)); - signalInfo.setIntAddr(INT_ADDR); - - return signalInfo; - } - - public static ExtRefBindingInfo createExtRefBindingInfo(){ - ExtRefBindingInfo bindingInfo = new ExtRefBindingInfo(); - bindingInfo.setIedName(IED_NAME); - bindingInfo.setLdInst(LD_INST); - bindingInfo.setLnInst(LN_INST); - bindingInfo.setLnClass(LN_CLASS); - bindingInfo.setDaName(DA_NAME); - bindingInfo.setDoName(DO_NAME); - bindingInfo.setPrefix(PREFIX); - bindingInfo.setServiceType(TServiceType.fromValue(SERVICE_TYPE)); - - return bindingInfo; - } - - public static ExtRefSourceInfo createExtRefSourceInfo(){ - ExtRefSourceInfo sourceInfo = new ExtRefSourceInfo(); - sourceInfo.setSrcLDInst(SRC_LD_INST); - sourceInfo.setSrcLNInst(SRC_LN_INST); - sourceInfo.setSrcLNClass(SRC_LN_CLASS); - sourceInfo.setSrcPrefix(SRC_PREFIX); - sourceInfo.setSrcCBName(SRC_CB_NAME); - - return sourceInfo; - } - - public static ExtRefInfo createExtRefInfo(){ - ExtRefInfo extRefInfo = new ExtRefInfo(); - extRefInfo.setSourceInfo(DTO.createExtRefSourceInfo()); - extRefInfo.setBindingInfo(DTO.createExtRefBindingInfo()); - extRefInfo.setSignalInfo(DTO.createExtRefSignalInfo()); - - return extRefInfo; - } - /*-----------------------------------------------*/ - /* ResumedDataTemplate */ - /*-----------------------------------------------*/ - public static final String CDC = TPredefinedCDCEnum.WYE.value(); - public static final String FC = TFCEnum.CF.value(); - public static ResumedDataTemplate createRTT(){ - ResumedDataTemplate rDTT = new ResumedDataTemplate(); - rDTT.setCdc(TPredefinedCDCEnum.fromValue(CDC)); - rDTT.setFc(TFCEnum.fromValue(FC)); - rDTT.setLnType(LN_TYPE); - rDTT.setLnClass(TLLN0Enum.LLN_0.value()); - rDTT.setDoName(DO_NAME); - rDTT.setDaName(DA_NAME); - - return rDTT; - } - - /*-----------------------------------------------*/ - /* LNodeDTO */ - /*-----------------------------------------------*/ - public static final String LN_TYPE = "LN_TYPE"; - public static LNodeDTO createLNodeDTO(){ - return new LNodeDTO(LN_INST,LN_CLASS,LN_TYPE); - } - /*-----------------------------------------------*/ - /* ConnectedAPDTO */ - /*-----------------------------------------------*/ - public static final String AP_NAME = "AP_NAME"; - public static ConnectedApDTO createCapDTO(boolean byStep){ - if(byStep){ - ConnectedApDTO cap = new ConnectedApDTO(); - cap.setApName(AP_NAME); - cap.setIedName(IED_NAME); - } - return new ConnectedApDTO(IED_NAME,AP_NAME); - } - public static TConnectedAP createCap(){ - - TConnectedAP cap = new TConnectedAP(); - cap.setApName(AP_NAME); - cap.setIedName(IED_NAME); - return cap; - } - /*-----------------------------------------------*/ - /* SubNetworkDTO */ - /*-----------------------------------------------*/ - public static final String SN_NAME = "SN_NAME"; - public static SubNetworkDTO createSnDTO(boolean byStep){ - SubNetworkDTO subNetworkDTO = null; - if(byStep){ - subNetworkDTO = new SubNetworkDTO(); - subNetworkDTO.setName(SN_NAME); - subNetworkDTO.setType("8-MMS"); - } else { - subNetworkDTO = new SubNetworkDTO(SN_NAME, SubNetworkDTO.SubnetworkType.MMS.toString()); - subNetworkDTO.addConnectedAPs(createCapDTO(true)); - } - return subNetworkDTO; - } - - public static TSubNetwork createSn(){ - TSubNetwork subNetwork = new TSubNetwork(); - - subNetwork.setName(SN_NAME); - subNetwork.setType("8-MMS"); - subNetwork.getConnectedAP().add(createCap()); - - return subNetwork; - } - /*-----------------------------------------------*/ - /* LDeviceDTO */ - /*-----------------------------------------------*/ - public static final String LD_NAME = "LDPO"; - public static LDeviceDTO createLdDTO(){ - - LDeviceDTO lDeviceDTO = new LDeviceDTO(); - lDeviceDTO.setLdInst(LD_INST); - lDeviceDTO.setLdName(LD_NAME); - - lDeviceDTO.addLNode(createLNodeDTO()); - - return lDeviceDTO; - } - /*-----------------------------------------------*/ - /* IedDTO */ - /*-----------------------------------------------*/ - - public static IedDTO createIedDTO(){ - - IedDTO iedDTO = new IedDTO(); - iedDTO.setName(IED_NAME); - iedDTO.addLDevice(createLdDTO()); - return iedDTO; - } -} diff --git a/sct-data/src/test/resources/application.yml b/sct-data/src/test/resources/application.yml deleted file mode 100644 index 7e35218a3..000000000 --- a/sct-data/src/test/resources/application.yml +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: 2020 RTE FRANCE -# -# SPDX-License-Identifier: Apache-2.0 - -## YAML Template. ---- -spring: - #profile - profiles: - active: test - jpa: - show-sql: true - database-platform: org.hibernate.dialect.H2Dialect - datasource: - platform: h2 - data-source-properties: - cachePrepStmts: true - prepStmtCacheSize: 250 - prepStmtCacheSqlLimit: 2048 - url: "jdbc:h2:mem:compas;MODE=ORACLE;DB_CLOSE_ON_EXIT=FALSE" - driver-class-name: org.h2.Driver - hikari: - username: sa - password: - -logging: - level: - root: INFO \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml deleted file mode 100644 index 31bf5f5da..000000000 --- a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - -
- - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml deleted file mode 100644 index 18d328bf2..000000000 --- a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - -
- - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - AnotherValue - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - AnotherValue - - - \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml deleted file mode 100644 index b81165384..000000000 --- a/sct-data/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml deleted file mode 100644 index 4b68e1b4a..000000000 --- a/sct-data/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - AnotherValue - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - AnotherValue - - - \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml deleted file mode 100644 index 5883470f7..000000000 --- a/sct-data/src/test/resources/scl/SCD/scd_ied_receiver_test.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml deleted file mode 100644 index 5883470f7..000000000 --- a/sct-data/src/test/resources/scl/SCD/scd_with_dtt_test.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml deleted file mode 100644 index 0e70ad0ea..000000000 --- a/sct-data/src/test/resources/scl/SCD/scd_with_ieds_test.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/pom.xml b/sct-service/pom.xml index 67d65a30b..51bf69b5f 100644 --- a/sct-service/pom.xml +++ b/sct-service/pom.xml @@ -10,7 +10,7 @@ org.lfenergy.compas compas-sct - 1.0-SNAPSHOT + local-SNAPSHOT sct-service diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java deleted file mode 100644 index 6f97e189a..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XMLMarshallerConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.config; - -import org.lfenergy.compas.commons.MarshallerWrapper; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableConfigurationProperties(XSDFileProperties.class) -public class XMLMarshallerConfig { - - @Bean - public MarshallerWrapper marshallerWrapper(XSDFileProperties xsdFileProperties) throws Exception { - MarshallerWrapper.Builder builder = new MarshallerWrapper.Builder(); - builder.withSchemaMap(xsdFileProperties.getPaths()); - return builder.build(); - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java b/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java deleted file mode 100644 index 2e6cb5971..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/config/XSDFileProperties.java +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.config; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.commons.CommonConstants; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import javax.annotation.PostConstruct; -import java.util.HashMap; -import java.util.Map; - -@Getter -@Setter -@NoArgsConstructor -@ConfigurationProperties("compas.scl.schema") -public class XSDFileProperties { - - private Map paths; - - @PostConstruct - public void init() { - if (this.paths == null || this.paths.isEmpty()) { - paths = new HashMap<>(); - paths.put(CommonConstants.XML_DEFAULT_NS_PREFIX, CommonConstants.XML_DEFAULT_XSD_PATH); - } - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java deleted file mode 100644 index 214d6631c..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/AbstractSqlScdService.java +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.sct.exception.CompasDataAccessException; -import org.lfenergy.compas.sct.model.IScd; -import org.lfenergy.compas.sct.repository.AbstractScdSQLCrudRepository; -import org.lfenergy.compas.sct.service.scl.SclManager; - -import java.util.UUID; - -@Setter -@Getter -@Slf4j -public abstract class AbstractSqlScdService , R extends AbstractScdSQLCrudRepository> - implements ISCDService { - - protected R repository; - - public AbstractSqlScdService(R repository){ - this.repository = repository; - } - - @Override - public T findScd(UUID id) throws CompasDataAccessException { - return repository.findById(id) - .orElseThrow(() -> new CompasDataAccessException("Unknown SCD with id '" + id + "'")); - } - - public SCL initiateScl(String hVersion, String hRevision){ - UUID hId = UUID.randomUUID(); - return SclManager.initialize(hId.toString(),hVersion,hRevision); - } - - public T addElement(T scd) throws CompasDataAccessException { - return repository.save(scd); - } - - public T updateElement(T scd) throws CompasDataAccessException{ - return addElement(scd); - } - - public T addHistoryItem(UUID id, String who, String what, String why) throws ScdException, CompasDataAccessException { - T scdObj = findScd(id); - return addHistoryItem(scdObj,who,what, why); - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java deleted file mode 100644 index 5f09d4000..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/ISCDService.java +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service; - -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.sct.exception.CompasDataAccessException; -import org.lfenergy.compas.sct.model.IIedDTO; -import org.lfenergy.compas.sct.model.IScd; -import org.lfenergy.compas.sct.model.ISubNetworkDTO; -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; -import org.springframework.lang.NonNull; - -import java.util.Set; -import java.util.UUID; - -public interface ISCDService> { - /** - * Find SCD object for given ID - * @param id object identifier - * @return SCD object identified - * @throws CompasDataAccessException Data access exception on error - */ - T findScd(UUID id) throws CompasDataAccessException; - - /** - * Initiate SCD object with a generated header ID (UUID) - * @param filename scd file name - * @param hVersion scd header version - * @param hRevision scd header revision - * @return the initiated scd - * @throws ScdException exception thrown on error - */ - T initiateSCD(@NonNull String filename, @NonNull String hVersion, @NonNull String hRevision) throws ScdException; - - /** - * Add history item to the scd - * @param scdObj scd representation in database - * @param who scd modifier - * @param when scd modification's date - * @param why scd modification's reason - * @return the modified scd - * @throws ScdException exception thrown on error - */ - T addHistoryItem(T scdObj, String who, String when, String why) throws ScdException; - - /** - * Add/rename IED from ICD file to SCD - * This method import the ICD's DataTemplate as well - * @param scdObj SCD object receiving the ICD - * @param iedName iedName ofr the ICD to import - * @param icd Objectified ICD - * @return Scd object with the IED imported - * @throws ScdException exception thrown on error - */ - T addIED(T scdObj, String iedName, SCL icd) throws ScdException; - - /** - * Add/rename IED from ICD file to SCD - * This method import the ICD's DataTemplate as well - * @param scdObj SCD object receiving the ICD - * @param iedName iedName ofr the ICD to import - * @param rawIcd raw ICD content - * @return Scd object with the IED imported - * @throws ScdException exception thrown on error - */ - T addIED(T scdObj, String iedName, byte[] rawIcd) throws ScdException; - - /** - * Extract External Reference signals for given IED, AccessPoint and LDevice. - * @param scdObj SCD object encapsulating the receiver SCD of the ICD - * @param iedName IED name - * @param ldInst the logical device - * @param DTO type parameter - * @return IED generic DTO - * @throws ScdException exception thrown on error - */ - D extractExtRefs(T scdObj, String iedName, String ldInst) throws ScdException; - - /** - * - * @param scdObj - * @param iedName - * @param ldInst - * @param filter - * @param - * @param - * @return - * @throws ScdException - */ - Set extractExtRefBindingInfo(T scdObj, String iedName, - String ldInst, ExtRefSignalInfo filter) throws ScdException; - - /** - * - * @param scdObj - * @param - * @return - * @throws ScdException - */ - Set getSubnetwork(T scdObj) throws ScdException; - - /** - * - * @param scdObject - * @param subNetworkDTO - * @return - * @throws ScdException - */ - T addSubnetworks(T scdObject,Set subNetworkDTO) throws ScdException; -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java deleted file mode 100644 index cc22a7b56..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/SimpleSqlScdService.java +++ /dev/null @@ -1,223 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service; - -import lombok.extern.slf4j.Slf4j; -import org.lfenergy.compas.commons.MarshallerWrapper; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.TAccessPoint; -import org.lfenergy.compas.scl.TDataTypeTemplates; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TIED; -import org.lfenergy.compas.scl.TLDevice; -import org.lfenergy.compas.scl.TLLN0Enum; -import org.lfenergy.compas.scl.TLN; -import org.lfenergy.compas.scl.TSubNetwork; -import org.lfenergy.compas.sct.model.IConnectedApDTO; -import org.lfenergy.compas.sct.model.ISubNetworkDTO; -import org.lfenergy.compas.sct.model.dto.ExtRefInfo; -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; -import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; -import org.lfenergy.compas.sct.model.dto.IedDTO; -import org.lfenergy.compas.sct.model.dto.LDeviceDTO; -import org.lfenergy.compas.sct.model.dto.LNodeDTO; -import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; -import org.lfenergy.compas.sct.model.entity.SimpleScd; -import org.lfenergy.compas.sct.repository.SimpleScdRepository; -import org.lfenergy.compas.sct.service.scl.SclCommunicationManager; -import org.lfenergy.compas.sct.service.scl.SclDataTemplateManager; -import org.lfenergy.compas.sct.service.scl.SclHeaderManager; -import org.lfenergy.compas.sct.service.scl.SclIEDManager; -import org.lfenergy.compas.sct.service.scl.SclManager; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Service; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; - - -@Slf4j -@Service -public class SimpleSqlScdService extends AbstractSqlScdService{ - - private final MarshallerWrapper marshallerWrapper; - @Autowired - public SimpleSqlScdService(SimpleScdRepository repository, MarshallerWrapper marshallerWrapper) { - super(repository); - this.marshallerWrapper = marshallerWrapper; - } - - @Override - public SimpleScd initiateSCD(@NonNull String filename, @NonNull String hVersion, @NonNull String hRevision) throws ScdException { - SimpleScd scdObj = new SimpleScd(); - scdObj.setFileName(filename); - SCL scd = initiateScl(hVersion,hRevision); - scdObj.setHeaderId(UUID.fromString(scd.getHeader().getId())); - scdObj.setHeaderVersion(hVersion); - scdObj.setHeaderRevision(hRevision); - String rawXml = marshallerWrapper.marshall(scd); - - scdObj.setRawXml(rawXml.getBytes()); - return scdObj; - } - - @Override - public SimpleScd addHistoryItem(SimpleScd scdObj, String who, String what, String why) throws ScdException { - byte[] raw = scdObj.getRawXml(); - SCL scd = marshallerWrapper.unmarshall(raw); - SclHeaderManager sclHeaderManager = new SclHeaderManager(scd); - scd = sclHeaderManager.addHistoryItem(who,what,why); - byte[] rawXml = marshallerWrapper.marshall(scd).getBytes(); - scdObj.setRawXml(rawXml); - return scdObj; - } - - @Override - public SimpleScd addIED(SimpleScd scdObj, String iedName, SCL icd) throws ScdException { - SCL scd = marshallerWrapper.unmarshall(scdObj.getRawXml()); - SclManager sclManager = new SclManager(scd); - sclManager.addIED(icd,iedName); - scdObj.setRawXml(marshallerWrapper.marshall(sclManager.getReceiver()).getBytes()); - return scdObj; - } - - @Override - public SimpleScd addIED(SimpleScd scdObj, String iedName, byte[] rawIcd) throws ScdException { - SCL icd = marshallerWrapper.unmarshall(rawIcd); - return addIED(scdObj,iedName,icd); - } - - @Override - public IedDTO extractExtRefs(SimpleScd scdObj, String iedName, String ldInst) throws ScdException { - SCL receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); - - TIED ied = receiver.getIED() - .stream() - .filter(tied -> iedName.equals(tied.getName())) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown IED: " + iedName)); - - TLDevice lDevice = SclIEDManager.getIEDLDevice(ied,ldInst) - .orElseThrow(() -> new ScdException("Unknown LDevice " + iedName + "/" + ldInst)); - - IedDTO iedDTO = new IedDTO(); - iedDTO.setName(iedName); - - LDeviceDTO lDeviceDTO = new LDeviceDTO(); - lDeviceDTO.setLdInst(ldInst); - - List ln0ExtRefs = SclIEDManager.extractLN0ExtRefs(lDevice, null); - LNodeDTO lN0DTO = new LNodeDTO(); - lN0DTO.setLNodeClass(TLLN0Enum.LLN_0.value()); - ln0ExtRefs.forEach((TExtRef tExtRef) -> { - ExtRefInfo extRefDTO = new ExtRefInfo(tExtRef); - lN0DTO.addExtRef(extRefDTO); - }); - lDeviceDTO.addLNode(lN0DTO); - iedDTO.addLDevice(lDeviceDTO); - return iedDTO; - } - @Override - public Set extractExtRefBindingInfo(SimpleScd scdObj, String iedName, String ldInst, ExtRefSignalInfo extRef) throws ScdException { - SCL receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); - SclIEDManager sclIEDManager = new SclIEDManager(receiver); - sclIEDManager.getExtRef(iedName,ldInst,extRef); - - List ieds = receiver.getIED(); - Set iedDTOs = new HashSet<>(); - for(TIED tied : ieds){ - IedDTO iedDTO = new IedDTO(); - iedDTO.setName(tied.getName()); - List accessPoints = tied.getAccessPoint(); - for(TAccessPoint accessPoint : accessPoints){ - if(accessPoint.getServer() == null) continue; - List deviceList = accessPoint.getServer().getLDevice(); - for(TLDevice tlDevice : deviceList) { - Set lNodeDTOs = getExtRefBindingInfo(tlDevice,extRef, receiver.getDataTypeTemplates()); - LDeviceDTO lDeviceDTO = new LDeviceDTO(); - lDeviceDTO.setLdName(tlDevice.getLdName()); - lDeviceDTO.setLdInst(tlDevice.getInst()); - if(!lNodeDTOs.isEmpty()) { - lDeviceDTO.addAll(lNodeDTOs); - iedDTO.addLDevice(lDeviceDTO); - } - } - } - if(!iedDTO.getLDevices().isEmpty()) { - iedDTOs.add(iedDTO); - } - } - return iedDTOs; - } - - - @Override - public Set getSubnetwork(SimpleScd scdObj) throws ScdException { - - Set subNetworks = new HashSet<>(); - SCL scl = marshallerWrapper.unmarshall(scdObj.getRawXml()); - if(scl.getCommunication() == null || scl.getCommunication().getSubNetwork().isEmpty()){ - return subNetworks; - } - List tSubNetworks = scl.getCommunication().getSubNetwork(); - tSubNetworks.forEach((TSubNetwork subNetwork) -> { - SubNetworkDTO subNetworkDTO = new SubNetworkDTO(subNetwork); - - subNetworks.add(subNetworkDTO); - }); - - return subNetworks; - } - - @Override - public SimpleScd addSubnetworks(SimpleScd scdObject, Set subNetworks) throws ScdException { - SCL receiver = marshallerWrapper.unmarshall(scdObject.getRawXml()); - SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); - for(ISubNetworkDTO subNetworkDTO : subNetworks) { - String snName = subNetworkDTO.getName(); - String snType = subNetworkDTO.getType(); - for (IConnectedApDTO accessPoint : subNetworkDTO.getConnectedAPs()) { - receiver = sclCommunicationManager.addSubnetwork(snName, snType, - accessPoint.getIedName(), accessPoint.getApName()); - } - } - scdObject.setRawXml(marshallerWrapper.marshall(receiver).getBytes()); - return scdObject; - } - - /*------------------------------------------------------*/ - /* Handy methods */ - /*------------------------------------------------------*/ - - public Set getExtRefBindingInfo(TLDevice tlDevice, ExtRefSignalInfo extRef, TDataTypeTemplates dtt) throws ScdException { - List lns = tlDevice.getLN(); - Set lNodeDTOs = new HashSet<>(); - for(TLN ln : lns){ - if(extRef.getPLN() != null && !ln.getLnClass().contains(extRef.getPLN())) continue; - LNodeDTO lNodeDTO = new LNodeDTO(); - lNodeDTO.setLNodeType(ln.getLnType()); - if(ln.getLnClass().isEmpty()){ - throw new ScdException("lnClass is mandatory"); - } - lNodeDTO.setLNodeClass(ln.getLnClass().get(0)); - lNodeDTO.setInst(ln.getInst()); - ResumedDataTemplate resumedDataTemplate = null; - try { - resumedDataTemplate = SclDataTemplateManager.getResumedDTT(ln.getLnType(), extRef, dtt); - } catch (ScdException e){ - // ln is not a source - } - if(resumedDataTemplate != null) { - lNodeDTO.addResumedDataTemplate(resumedDataTemplate); - lNodeDTOs.add(lNodeDTO); - } - } - return lNodeDTOs; - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java deleted file mode 100644 index 0c71cae16..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManager.java +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.TCommunication; -import org.lfenergy.compas.scl.TConnectedAP; -import org.lfenergy.compas.scl.TIED; -import org.lfenergy.compas.scl.TSubNetwork; - -@Setter -@Getter -@NoArgsConstructor -public class SclCommunicationManager { - protected SCL receiver; - - public SclCommunicationManager(SCL receiver) { - this.receiver = receiver; - } - - public SCL addSubnetwork(String snName, String snType, String iedName, String apName) throws ScdException { - - TIED ied = receiver.getIED().stream() - .filter(tied -> tied.getName().equals(iedName)) - .findAny().orElseThrow(() -> new ScdException("Unknown IED:" + iedName)); - - boolean isFound = ied.getAccessPoint() - .stream() - .anyMatch(tAccessPoint -> tAccessPoint.getName().equals(apName)); - if(!isFound){ - throw new ScdException("Unknown AccessPoint :" + apName + " in IED :" + iedName); - } - - TCommunication communication = receiver.getCommunication(); - if(communication == null){ - communication = new TCommunication(); - receiver.setCommunication(communication); - } - addSubnetwork(communication,snName,snType,iedName,apName); - - return receiver; - } - - public TCommunication addSubnetwork(TCommunication communication, String snName, String snType,String iedName, String apName){ - - TSubNetwork subNetwork = communication.getSubNetwork() - .stream() - .filter(tSubNetwork -> tSubNetwork.getName().equals(snName)) - .findFirst().orElse(null); - if(subNetwork == null){ // create new subnetwork - subNetwork = new TSubNetwork(); - subNetwork.setName(snName); - subNetwork.setType(snType); - communication.getSubNetwork().add(subNetwork); - } - addConnectedAP(subNetwork,iedName,apName); - return communication; - } - - public TSubNetwork addConnectedAP(TSubNetwork subNetwork, String iedName, String apName){ - boolean isFound = subNetwork.getConnectedAP().stream() - .anyMatch(tConnectedAP -> - tConnectedAP.getApName().equals(apName) && tConnectedAP.getIedName().equals(iedName)); - - if(!isFound){ - TConnectedAP tConnectedAP = new TConnectedAP(); - tConnectedAP.setApName(apName); - tConnectedAP.setIedName(iedName); - subNetwork.getConnectedAP().add(tConnectedAP); - } - return subNetwork; - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java deleted file mode 100644 index 1b4360d7b..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManager.java +++ /dev/null @@ -1,669 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - - -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.TBDA; -import org.lfenergy.compas.scl.TDA; -import org.lfenergy.compas.scl.TDAType; -import org.lfenergy.compas.scl.TDO; -import org.lfenergy.compas.scl.TDOType; -import org.lfenergy.compas.scl.TDataTypeTemplates; -import org.lfenergy.compas.scl.TEnumType; -import org.lfenergy.compas.scl.TEnumVal; -import org.lfenergy.compas.scl.TIDNaming; -import org.lfenergy.compas.scl.TLNodeType; -import org.lfenergy.compas.scl.TPredefinedBasicTypeEnum; -import org.lfenergy.compas.scl.TSDO; -import org.lfenergy.compas.scl.TUnNaming; -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; -import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -@Getter -@Slf4j -public class SclDataTemplateManager { - - private final Map enumTypeToAdd = new HashMap<>(); - private final Map daTypeToAdd = new HashMap<>(); - private final Map doTypeToAdd = new HashMap<>(); - private final Map lNodeTypeToAdd = new HashMap<>(); - private final Map lNodeTypeTracker = new HashMap<>(); - - - public SCL importDTT(SCL provider, SCL receiver, String iedName){ - - computeImportableDTTFromEnumType(provider,receiver,iedName); - computeImportableDTTFromDAType(provider,receiver,iedName); - computeImportableDTTFromDOType(provider,receiver,iedName); - computeImportableDTTFromLNodeType(provider,receiver,iedName); - - if(receiver.getDataTypeTemplates() == null ){ - receiver.setDataTypeTemplates(new TDataTypeTemplates()); - } - //add importable enum - enumTypeToAdd.values().forEach(tEnumType -> receiver.getDataTypeTemplates().getEnumType().add(tEnumType)); - - //remove duplicate of enumTypeToAdd in daTypeToAdd - - //add importable DAType - daTypeToAdd.values().forEach(tdaType -> receiver.getDataTypeTemplates().getDAType().add(tdaType)); - //add importable DOType - doTypeToAdd.values().forEach(tdoType -> receiver.getDataTypeTemplates().getDOType().add(tdoType)); - //add importable LNodeType - lNodeTypeToAdd.values().forEach(tlNodeType -> receiver.getDataTypeTemplates().getLNodeType().add(tlNodeType)); - - return receiver; - } - - public Boolean isSameID(T rcv, T prd){ - return rcv.getId().equals(prd.getId()); - } - - public boolean isIdentical(TEnumType rcvEnumType,TEnumType prdEnumType, boolean idCheck){ - if(idCheck && !isSameID(rcvEnumType,prdEnumType)){ - return false; - } - List rcvEnumValList = rcvEnumType.getEnumVal(); - List prdEnumValList = prdEnumType.getEnumVal(); - if(rcvEnumValList.size() != prdEnumValList.size()) { - return false; - } - - for(TEnumVal prdEnumVal : prdEnumValList){ - boolean isIn = rcvEnumValList - .stream() - .anyMatch( - rcvEnumVal -> rcvEnumVal.getValue().equals(prdEnumVal.getValue()) && - rcvEnumVal.getOrd() == prdEnumVal.getOrd() - ); - if(!isIn) { - return false; - } - } - return true; - } - - public List findDATypesWhichBdaContainsEnumTypeId(SCL provider,String enumTypeId){ - if(provider.getDataTypeTemplates() == null) { - return new ArrayList<>(); - } - - List daTypeList = provider.getDataTypeTemplates().getDAType(); - List result = new ArrayList<>(); - for(TDAType tdaType: daTypeList){ - boolean containsEnum = tdaType.getBDA() - .stream() - .anyMatch( - bda -> TPredefinedBasicTypeEnum.ENUM.equals(bda.getBType()) && - enumTypeId.equals(bda.getType()) - ); - if(containsEnum) { - result.add(tdaType); - } - } - return result; - } - - public List findDOTypesWhichDAContainsEnumTypeId(SCL provider,String enumTypeId){ - - if(provider.getDataTypeTemplates() == null) { - return new ArrayList<>(); - } - - List doTypeList = provider.getDataTypeTemplates().getDOType(); - List result = new ArrayList<>(); - for(TDOType tdoType: doTypeList){ - List tdaList = new ArrayList<>(); - for( TUnNaming unNaming : tdoType.getSDOOrDA()){ - if(unNaming instanceof TDA) { - tdaList.add((TDA)unNaming); - } - } - boolean containsEnum = tdaList.stream() - .anyMatch( - tda -> tda.getBType().equals(TPredefinedBasicTypeEnum.ENUM) && - tda.getType().equals(enumTypeId) - ); - if(containsEnum) { - result.add(tdoType); - } - } - return result; - } - - public boolean isIdentical(TDAType rcvDAType,TDAType prdDAType, boolean idCheck){ - if(idCheck && !isSameID(rcvDAType,prdDAType)){ - return false; - } - List rcvBdaList = rcvDAType.getBDA(); - List prdBdaList = prdDAType.getBDA(); - - if(rcvBdaList.size() != prdBdaList.size()) { - return false; - } - - int listSz = rcvBdaList.size(); - for(int i = 0; i < listSz; i++){ - if(!rcvBdaList.get(i).getBType().equals(prdBdaList.get(i).getBType()) || - !rcvBdaList.get(i).getName().equals(prdBdaList.get(i).getName())) { - return false; - } - - if(rcvBdaList.get(i).getBType().equals(TPredefinedBasicTypeEnum.ENUM) && - !rcvBdaList.get(i).getType().equals(prdBdaList.get(i).getType())) { - return false; - } - } - return true; - } - - public List findDATypesFromStructBdaWithDATypeId(SCL provider,String daTypeId){ - - if(provider.getDataTypeTemplates() == null) { - return new ArrayList<>(); - } - - List daTypeList = provider.getDataTypeTemplates().getDAType(); - List result = new ArrayList<>(); - for(TDAType tdaType: daTypeList){ - boolean containsEnum = tdaType.getBDA().stream() - .anyMatch( - bda -> bda.getBType().equals(TPredefinedBasicTypeEnum.STRUCT) && - bda.getType().equals(daTypeId) - ); - if(containsEnum) { - result.add(tdaType); - } - } - return result; - } - - public List findDOTypesWhichDAContainsStructWithDATypeId(SCL provider,String daTypeId){ - - if(provider.getDataTypeTemplates() == null) { - return new ArrayList<>(); - } - - List doTypeList = provider.getDataTypeTemplates().getDOType(); - List result = new ArrayList<>(); - for(TDOType tdoType: doTypeList){ - List daList = new ArrayList<>(); - for( TUnNaming unNaming : tdoType.getSDOOrDA()){ - if(unNaming instanceof TDA) { - daList.add((TDA)unNaming); - } - } - boolean containsId = daList.stream() - .anyMatch( - tda -> TPredefinedBasicTypeEnum.STRUCT.equals(tda.getBType()) && - tda.getType().equals(daTypeId) - ); - if(containsId) { - result.add(tdoType); - } - } - return result; - } - - public static List retrieveSdoOrDO(List sdoOrDoList, Class clz){ - List sdoList = new ArrayList<>(); - for( TUnNaming unNaming : sdoOrDoList){ - if(unNaming.getClass().getName().equalsIgnoreCase(clz.getName())) { - sdoList.add((T)unNaming); - } - } - return sdoList; - } - - public boolean isIdentical(TDOType rcvDOType,TDOType prdDOType, boolean idCheck){ - if(idCheck && !isSameID(rcvDOType,prdDOType)) { - return false; - } - - List rcvTdaList = retrieveSdoOrDO(rcvDOType.getSDOOrDA(),TDA.class); - List prdTdaList = retrieveSdoOrDO(prdDOType.getSDOOrDA(),TDA.class); - List rcvSdoList = retrieveSdoOrDO(rcvDOType.getSDOOrDA(),TSDO.class); - List prdSdoList = retrieveSdoOrDO(prdDOType.getSDOOrDA(),TSDO.class); - - if(rcvTdaList.size() != prdTdaList.size() || rcvSdoList.size() != prdSdoList.size()) { - return false; - } - - // SDO - for(int i = 0; i < rcvSdoList.size(); i++){ - if(!rcvSdoList.get(i).getName().equals(prdSdoList.get(i).getName()) || - !rcvSdoList.get(i).getType().equals(prdSdoList.get(i).getType())) { - return false; - } - } - - // TDO - for(int i = 0; i < rcvTdaList.size(); i++){ - if(!rcvTdaList.get(i).getName().equals(prdTdaList.get(i).getName()) || - !rcvTdaList.get(i).getBType().equals(prdTdaList.get(i).getBType())) { - return false; - } - - if(rcvTdaList.get(i).getBType().equals(TPredefinedBasicTypeEnum.ENUM) && - !rcvTdaList.get(i).getType().equals(prdTdaList.get(i).getType())) { - return false; - } - } - - return true; - } - - public List findDOTypesFromSDOWithDOTypeId(SCL provider,String doTypeId){ - - if(provider.getDataTypeTemplates() == null) { - return new ArrayList<>(); - } - - List doTypeList = provider.getDataTypeTemplates().getDOType(); - List result = new ArrayList<>(); - for(TDOType tdoType: doTypeList){ - List sdoList = new ArrayList<>(); - for( TUnNaming unNaming : tdoType.getSDOOrDA()){ - if(unNaming.getClass() == TSDO.class) { - sdoList.add((TSDO)unNaming); - } - } - boolean containsId = sdoList.stream() - .anyMatch(sdo -> sdo.getType().equals(doTypeId)); - if(containsId) { - result.add(tdoType); - } - } - return result; - } - - public boolean isIdentical(TLNodeType rcvLNodeType, TLNodeType providerLNodeType, boolean idCheck) { - - if(idCheck && !isSameID(rcvLNodeType,providerLNodeType)) { - return false; - } - - List rcvTdoList = rcvLNodeType.getDO(); - List prdTdoList = providerLNodeType.getDO(); - if(rcvTdoList.size() != prdTdoList.size()) { - return false; - } - - for(TDO prdTdo : prdTdoList){ - boolean isIn = rcvLNodeType.getDO().stream() - .anyMatch(rcvTdo -> rcvTdo.getType().equals(prdTdo.getType()) - && rcvTdo.getName().equals(prdTdo.getName())); - if(!isIn) { - return false; - } - } - return true; - } - - public List findLNodeTypesFromDoWithDoTypeId(SCL provider,String doTypeId){ - - if(provider.getDataTypeTemplates() == null) { - return new ArrayList<>(); - } - - List lNodeTypes = provider.getDataTypeTemplates().getLNodeType(); - - List result = new ArrayList<>(); - for(TLNodeType lNodeType: lNodeTypes){ - - boolean containsId = lNodeType.getDO().stream() - .anyMatch(tdo -> tdo.getType().equals(doTypeId)); - if(containsId) { - result.add(lNodeType); - } - } - return result; - } - - public String generateDttId(String iedName,String dttId){ - final int MAX_LENGTH = 255; - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(iedName).append("_").append(dttId); - String str = stringBuilder.toString(); - return str.length() <= MAX_LENGTH ? str : str.substring(0,MAX_LENGTH); - } - - public void computeImportableDTTFromEnumType(SCL provider, SCL receiver, String iedName){ - - if(provider.getDataTypeTemplates() == null) { - return; - } - - List prdEnumTypes = provider.getDataTypeTemplates().getEnumType(); - - List rcvEnumTypes = new ArrayList<>(); - if(receiver.getDataTypeTemplates() != null) { - rcvEnumTypes = receiver.getDataTypeTemplates().getEnumType(); - } - - //import EnumType - for(TEnumType prdEnumType : prdEnumTypes){ - //search prdEnumType in rcvEnumTypes - Optional opRcvEnumType = rcvEnumTypes - .stream() - .filter(enumType -> isSameID(enumType,prdEnumType)).findFirst(); - // same ID and same content - if(opRcvEnumType.isPresent() && isIdentical(opRcvEnumType.get(),prdEnumType,false)) { - continue; - } - - // not same ID or not same content - if (opRcvEnumType.isPresent() && isSameID(opRcvEnumType.get(),prdEnumType) ) { // same id and not same content - - List daTypeList = findDATypesWhichBdaContainsEnumTypeId(provider,prdEnumType.getId()); - List doTypeList = findDOTypesWhichDAContainsEnumTypeId(provider,prdEnumType.getId()); - // rename enumType Id - String newId = generateDttId(iedName,prdEnumType.getId()); - // escalate - daTypeList.forEach( - tdaType -> renameRef(tdaType,TPredefinedBasicTypeEnum.ENUM,prdEnumType.getId(),newId)); - doTypeList.forEach( - tdoType -> renameRef(tdoType,TPredefinedBasicTypeEnum.ENUM,prdEnumType.getId(),newId)); - enumTypeToAdd.remove(prdEnumType.getId()); // remove track on old ID if necessary - prdEnumType.setId(newId); - enumTypeToAdd.put(prdEnumType.getId(),prdEnumType); - } - enumTypeToAdd.put(prdEnumType.getId(),prdEnumType); - } - } - - - public void computeImportableDTTFromDAType(SCL provider,SCL receiver, String iedName){ - - if(provider.getDataTypeTemplates() == null) { - return; - } - - List prdDATypes = provider.getDataTypeTemplates().getDAType(); - - List rcvDATypes = new ArrayList<>(); - if(receiver.getDataTypeTemplates() != null) { - rcvDATypes = receiver.getDataTypeTemplates().getDAType(); - } - - for(TDAType prdDAType : prdDATypes) { - - //search prdEnumType in rcvEnumTypes - Optional opRcvDAType = rcvDATypes - .stream() - .filter(daType -> isSameID(daType,prdDAType)) - .findFirst(); - // same ID and same content - if(opRcvDAType.isPresent() && isIdentical(opRcvDAType.get(),prdDAType,false)) { - continue; - } - - // not same ID or not same content - if (opRcvDAType.isPresent() && isSameID(opRcvDAType.get(),prdDAType) ) { - - List daTypeList = findDATypesFromStructBdaWithDATypeId(provider,prdDAType.getId()); - List doTypeList = findDOTypesWhichDAContainsStructWithDATypeId(provider,prdDAType.getId()); - - // rename TDAType Id - String newId = generateDttId(iedName,prdDAType.getId()); - // escalate - daTypeList.forEach( - tdaType -> renameRef(tdaType,TPredefinedBasicTypeEnum.STRUCT,prdDAType.getId(),newId)); - doTypeList.forEach( - tdoType -> renameRef(tdoType,TPredefinedBasicTypeEnum.STRUCT,prdDAType.getId(),newId)); - - daTypeToAdd.remove(prdDAType.getId()); // remove track on old ID if necessary - prdDAType.setId(newId); - } - daTypeToAdd.put(prdDAType.getId(),prdDAType); - } - } - - public void computeImportableDTTFromDOType(SCL provider,SCL receiver, String iedName){ - - if(provider.getDataTypeTemplates() == null) { - return; - } - - List prdDOTypes = provider.getDataTypeTemplates().getDOType(); - - List rcvDOTypes = new ArrayList<>(); - if(receiver.getDataTypeTemplates() != null) { - rcvDOTypes = receiver.getDataTypeTemplates().getDOType(); - } - //Merge DOType - for(TDOType prdDOType : prdDOTypes) { - - //search prdEnumType in rcvEnumTypes - Optional opRcvDOType = rcvDOTypes - .stream() - .filter(daType -> isSameID(daType,prdDOType)) - .findFirst(); - // same ID and same content - if(opRcvDOType.isPresent() && isIdentical(opRcvDOType.get(),prdDOType,false)) { - continue; - } - // not same ID or not same content - if (opRcvDOType.isPresent() && isSameID(opRcvDOType.get(),prdDOType) ) { - - List doTypeList = findDOTypesFromSDOWithDOTypeId(provider,prdDOType.getId()); - List lNodeTypeList = findLNodeTypesFromDoWithDoTypeId(provider,prdDOType.getId()); - // rename TDAType Id - String newId = generateDttId(iedName,prdDOType.getId()); - // escalate - doTypeList.forEach(tdoType -> renameRef(tdoType,prdDOType.getId(),newId)); - lNodeTypeList.forEach(tlNodeType -> renameRef(tlNodeType,prdDOType.getId(),newId)); - - daTypeToAdd.remove(prdDOType.getId()); // remove track on old ID if necessary - - prdDOType.setId(newId); - } - doTypeToAdd.put(prdDOType.getId(),prdDOType); - } - } - - public void computeImportableDTTFromLNodeType(SCL provider, SCL receiver,String iedName){ - if(provider.getDataTypeTemplates() == null) { - return; - } - - List prdLNodeTypes = provider.getDataTypeTemplates().getLNodeType(); - - List rcvLNodeTypes = new ArrayList<>(); - if(receiver.getDataTypeTemplates() != null) { - rcvLNodeTypes = receiver.getDataTypeTemplates().getLNodeType(); - } - //Merge DAType - - for(TLNodeType prdLNodeType : prdLNodeTypes) { - //search prdEnumType in rcvEnumTypes - Optional opRcvLNodeType = rcvLNodeTypes - .stream() - .filter(daType -> isSameID(daType,prdLNodeType)) - .findFirst(); - // same ID and same content - if(opRcvLNodeType.isPresent() && isIdentical(opRcvLNodeType.get(),prdLNodeType,false)) { - continue; - } - - if (opRcvLNodeType.isPresent() && isSameID(opRcvLNodeType.get(),prdLNodeType) ) { - // rename TDAType Id - String newId = generateDttId(iedName,prdLNodeType.getId()); - lNodeTypeToAdd.remove(prdLNodeType.getId()); // remove track on old ID if necessary - lNodeTypeTracker.put(prdLNodeType.getId(),newId); - prdLNodeType.setId(newId); - } - lNodeTypeToAdd.put(prdLNodeType.getId(),prdLNodeType); - } - } - - public void renameRef(TDOType tdoType, String id, String newId) { - List sdoList = retrieveSdoOrDO(tdoType.getSDOOrDA(),TSDO.class); - Optional opSdo = sdoList.stream() - .filter(sdo -> sdo.getType().equals(id)) - .findFirst(); - if(opSdo.isPresent()){ - opSdo.get().setType(newId); - } - } - - public void renameRef(TLNodeType tlNode, String id, String newId) { - List doList = tlNode.getDO(); - Optional opDo = doList.stream() - .filter(tdo -> tdo.getType().equals(id)) - .findFirst(); - if(opDo.isPresent()){ - opDo.get().setType(newId); - } - } - - - public void renameRef(TDAType tdaType, TPredefinedBasicTypeEnum anEnum, String id, String newId) { - List bdaList = tdaType.getBDA(); - Optional opBda = bdaList.stream() - .filter(bda -> bda.getBType().equals(anEnum) && bda.getType().equals(id)) - .findFirst(); - if(opBda.isPresent()){ - opBda.get().setType(newId); - } - } - - public void renameRef(TDOType tdoType, TPredefinedBasicTypeEnum anEnum, String id, String newId) { - List tdaList = retrieveSdoOrDO(tdoType.getSDOOrDA(),TDA.class); - Optional opDa = tdaList.stream() - .filter(tda -> tda.getBType().equals(anEnum) && tda.getType().equals(id)) - .findFirst(); - if(opDa.isPresent()){ - opDa.get().setType(newId); - } - } - - public Map getEnumTypeToAdd() { - return Collections.unmodifiableMap(enumTypeToAdd); - } - - public Map getDaTypeToAdd() { - return Collections.unmodifiableMap(daTypeToAdd); - } - - public Map getDoTypeToAdd() { - return Collections.unmodifiableMap(doTypeToAdd); - } - - public Map getLNodeTypeToAdd() { - return Collections.unmodifiableMap(lNodeTypeToAdd); - } - - public Map getLNodeTypeTracker() { - return Collections.unmodifiableMap(lNodeTypeTracker); - } - - - public static ResumedDataTemplate getResumedDTT(String lnType, ExtRefSignalInfo extRef, - TDataTypeTemplates dtt) throws ScdException { - ResumedDataTemplate resumedDataTemplate = new ResumedDataTemplate(); - TLNodeType nodeType = dtt.getLNodeType() - .stream() - .filter(tlNodeType -> lnType.equals(tlNodeType.getId())) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown LNodeType:" + lnType)); - - resumedDataTemplate.setLnType(nodeType.getId()); - if(nodeType.getLnClass().isEmpty()){ - log.error("Mandatory lnClass is missing in DTT. This should not happen SCD DTT must be correct"); - throw new IllegalArgumentException("lnClass is mandatory for LNodeType in DataTemplate:" + lnType); - } - resumedDataTemplate.setLnType(nodeType.getId()); - resumedDataTemplate.setLnClass(nodeType.getLnClass().get(0)); - if(extRef.getPDO() == null) { - return resumedDataTemplate; - } - - String[] sp = extRef.getPDO().split("\\."); - String extDoName = sp[0]; - String extSdoName1 = sp.length > 1 ? sp[1] : null; - String extSdoName2 = sp.length > 2 ? sp[2] : null; - - String doTypeId = nodeType.getDO() - .stream() - .filter(tdo -> extDoName.equals(tdo.getName())) - .map(TDO::getType) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown doName :" + extRef.getPDO())); - - String finalDoTypeId = doTypeId; - TDOType tdoType = dtt.getDOType() - .stream() - .filter(doType -> doType.getId().equals(finalDoTypeId)) - .findFirst() - .orElseThrow(() -> new ScdException("No referenced for doName :" + extRef.getPDO())); - - resumedDataTemplate.setDoName(extDoName); - if(extSdoName1 != null){ - List sdos = SclDataTemplateManager.retrieveSdoOrDO(tdoType.getSDOOrDA(), TSDO.class); - String sdoTypeId = sdos.stream() - .filter(tsdo -> extSdoName1.equals(tsdo.getName())) - .map(TSDO::getType) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown doName.sdoName :" + extDoName + "." + extSdoName1)); - - tdoType = dtt.getDOType() - .stream() - .filter(doType -> doType.getId().equals(sdoTypeId)) - .findFirst() - .orElseThrow(() -> new ScdException("No referenced doName.sdoName :" + extDoName + "." + extSdoName1)); - - resumedDataTemplate.setDoName(extDoName + "." + extSdoName1); - } - resumedDataTemplate.setCdc(tdoType.getCdc()); - - - if(extRef.getPDA() == null){ - return resumedDataTemplate; - } - - sp = extRef.getPDA().split("\\."); - String extDaName = sp[0]; - String extBdaName1 = sp.length > 1 ? sp[1] : null; - String extBdaName2 = sp.length > 2 ? sp[2] : null; - - List das = SclDataTemplateManager.retrieveSdoOrDO(tdoType.getSDOOrDA(), TDA.class); - TDA da = das.stream() - .filter(tda ->extDaName.equals(tda.getName())) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown referenced daName :" + extDaName)); - - resumedDataTemplate.setDaName(extDaName); - resumedDataTemplate.setFc(da.getFc()); - if(TPredefinedBasicTypeEnum.STRUCT.equals(da.getBType()) && extBdaName1 != null){ - String daTypeId = da.getType(); - TDAType tdaType = dtt.getDAType() - .stream() - .filter(dat -> daTypeId.equals(dat.getId()) ) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown referenced daName.bdaName :" + extDaName + "." + extBdaName1)); - - TBDA bda = tdaType.getBDA() - .stream() - .filter(tbda -> extBdaName1.equals(tbda.getName())) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown daName.bdaName :" + extDaName + "." + extBdaName1)); - resumedDataTemplate.setDaName(extDaName + "." + extBdaName1); - } - - return resumedDataTemplate; - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java deleted file mode 100644 index 06dee06d6..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclHeaderManager.java +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.THeader; -import org.lfenergy.compas.scl.THitem; -import org.springframework.lang.NonNull; -import org.springframework.util.Assert; - -import java.util.Date; - -public class SclHeaderManager { - - public static final String TOOL_ID = "COMPAS"; - - private SCL receiver; - - public SclHeaderManager(SCL receiver) { - this.receiver = receiver; - } - - public SCL addHeader(@NonNull String hId, @NonNull String hVersion, @NonNull String hRevision) throws ScdException { - if(receiver.getHeader() != null){ - throw new ScdException("SCL already contains header"); - } - - THeader tHeader = new THeader(); - tHeader.setRevision(hRevision); - tHeader.setVersion(hVersion); - tHeader.setId(hId); - tHeader.setToolID(TOOL_ID); - receiver.setHeader(tHeader); - - return receiver; - } - - public SCL addHistoryItem(String who, String what, String why){ - - THitem tHitem = new THitem(); - tHitem.setRevision(receiver.getHeader().getRevision()); - tHitem.setVersion(receiver.getHeader().getVersion()); - tHitem.setWho(who); - tHitem.setWhat(what); - tHitem.setWhen((new Date()).toString()); - tHitem.setWhy(why); - - THeader tHeader = receiver.getHeader(); - Assert.notNull(tHeader, "Stored SCD must have Header tag"); - Assert.notNull(tHeader.getId(), "Stored SCD Header must have a unique ID"); - - THeader.History history = tHeader.getHistory(); - if(history == null) { - history = new THeader.History(); - tHeader.setHistory(history); - } - history.getHitem().add(tHitem); - - return receiver; - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java deleted file mode 100644 index 1f1539e59..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclIEDManager.java +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - - -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.TAccessPoint; -import org.lfenergy.compas.scl.TAnyLN; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TIED; -import org.lfenergy.compas.scl.TLDevice; -import org.lfenergy.compas.scl.TLLN0Enum; -import org.lfenergy.compas.scl.TLN; -import org.lfenergy.compas.scl.TLN0; -import org.lfenergy.compas.scl.TServer; -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -public class SclIEDManager { - - private SCL receiver; - - public SclIEDManager(SCL receiver) { - this.receiver = receiver; - } - - public SCL addIed(SCL iedProvider, String iedName) throws ScdException { - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - receiver = sclDataTemplateManager.importDTT(iedProvider,receiver,iedName); - Map lNodeTypeTracker = sclDataTemplateManager.getLNodeTypeTracker(); - receiver = addIed(iedProvider,iedName,lNodeTypeTracker); - - return receiver; - } - - public SCL addIed(SCL iedProvider, String iedName, Map lNodeTypeTracker) throws ScdException { - if(iedProvider.getIED().isEmpty()) return receiver; - TIED tied = iedProvider.getIED().get(0); - return addIed(tied,iedName,lNodeTypeTracker); - } - - public SCL addIed(TIED providerIED,String iedName,Map lNodeTypeTracker) throws ScdException{ - - if(receiver.getIED().stream().anyMatch(tied -> tied.getName().equals(iedName))){ - throw new ScdException("SCL file already contains IED: " + iedName); - } - if(receiver.getDataTypeTemplates() == null){ - throw new ScdException("There is no DataTypeTemplates in the SCD file"); - } - - Set receiverLNodeTypeIds = receiver.getDataTypeTemplates().getLNodeType() - .stream() - .map(tlNodeType -> tlNodeType.getId()) - .collect(Collectors.toSet()); - - if(receiverLNodeTypeIds.isEmpty()){ - throw new ScdException("There is no LNodeType in the SCD file's DataTypeTemplates"); - } - - providerIED.setName(iedName); - // LDevices - String newLdName; - List accessPoints = providerIED.getAccessPoint(); - for(TAccessPoint accessPoint : accessPoints){ - TServer server = accessPoint.getServer(); - if(server == null) continue; - List lDevices = server.getLDevice(); - for(TLDevice lDevice : lDevices){ - newLdName = iedName + lDevice.getInst(); - if(newLdName.length() > 33){ - throw new ScdException(newLdName + "(IED.name + LDevice.inst) has more than 33 characters"); - } - // renaming ldName - lDevice.setLdName(newLdName); - // - TLN0 tln0 = lDevice.getLN0(); - updateLN(tln0,receiverLNodeTypeIds,lNodeTypeTracker); - - List lns = lDevice.getLN(); - for(TLN tln : lns){ - updateLN(tln,receiverLNodeTypeIds,lNodeTypeTracker); - } - } - } - - receiver.getIED().add(providerIED); - return receiver; - } - - public TAnyLN updateLN(@NonNull TAnyLN ln, @NonNull Set receiverLNodeTypeIds, - @NonNull Map lNodeTypeTracker) throws ScdException { - if( (!receiverLNodeTypeIds.contains(ln.getLnType()) && !lNodeTypeTracker.containsKey(ln.getLnType())) || - (lNodeTypeTracker.containsKey(ln.getLnType())) && - !receiverLNodeTypeIds.contains(lNodeTypeTracker.get(ln.getLnType()))){ - String lnInst = ln.getClass() == TLN.class ? ((TLN)ln).getInst() : TLLN0Enum.LLN_0.value(); - String errMsg = String.format("%s id (%s) missing in DataTypeTemplates",lnInst,ln.getLnType()); - throw new ScdException(errMsg); - } - - if(lNodeTypeTracker.containsKey(ln.getLnType())){ - ln.setLnType(lNodeTypeTracker.get(ln.getLnType())); - } - - return ln; - } - - public TExtRef getExtRef(String iedName, String ldInst, ExtRefSignalInfo filter) throws ScdException { - TIED ied = receiver.getIED() - .stream() - .filter(tied -> iedName.equals(tied.getName())) - .findFirst() - .orElseThrow(() -> new ScdException("Unknown IED :" + iedName)); - - TLDevice ld = SclIEDManager.getIEDLDevice(ied,ldInst) - .orElseThrow(() -> new ScdException("Unknown LDevice " + iedName + "/" + ldInst)); - - List extRefs = extractLN0ExtRefs(ld,filter); - - if(extRefs.size() > 1){ - String msg = String.format("Multiple ExtRef[pDo(%s), intAddr(%s), desc(%s)] for [%s,%s]", - filter.getPDO(),filter.getIntAddr(), filter.getDesc(), iedName,ldInst); - throw new ScdException(msg); - } - - if(extRefs.isEmpty()){ - String msg = String.format("No ExtRef[pDo(%s), intAddr(%s), desc(%s)] for [%s,%s]", - filter.getPDO(),filter.getIntAddr(), filter.getDesc(), iedName,ldInst); - throw new ScdException(msg); - } - return extRefs.get(0); - } - - - public static List getIEDLDevice(TIED tied){ - return tied.getAccessPoint() - .stream() - .filter(tAccessPoint -> tAccessPoint.getServer() != null) - .map(tAccessPoint -> tAccessPoint.getServer().getLDevice()) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - } - - public static Optional getLDeviceLN(TLDevice lDevice, String lnClass, @Nullable String lnInst){ - return lDevice.getLN() - .stream() - .filter(tln -> tln.getLnClass().contains(lnClass) && (lnInst == null || lnInst.equals(tln.getInst()))) - .findFirst(); - } - - public static Optional getIEDLDevice(TIED tied, String ldInst){ - return tied.getAccessPoint() - .stream() - .filter(tAccessPoint -> tAccessPoint.getServer() != null) - .map(tAccessPoint -> tAccessPoint.getServer().getLDevice()) - .flatMap(Collection::stream) - .filter(tlDevice -> ldInst.equals(tlDevice.getInst())) - .findFirst(); - } - - public static List extractLN0ExtRefs(TLDevice tlDevice, ExtRefSignalInfo filter) { - if (tlDevice.getLN0().getInputs() == null) return new ArrayList<>(); - - if (filter == null) { - return tlDevice.getLN0().getInputs().getExtRef(); - } else { - return tlDevice.getLN0().getInputs().getExtRef() - .stream() - .filter(tExtRef -> { - - if (filter.getDesc() != null && !filter.getDesc().equals(tExtRef.getDesc())) { - return false; - } - if (filter.getPDO() != null && !tExtRef.getPDO().equals(filter.getPDO())) { - return false; - } - if (filter.getIntAddr() != null && !filter.getIntAddr().equals(tExtRef.getIntAddr())) { - return false; - } - return true; - }) - .collect(Collectors.toList()); - } - - } - - public static List extractLNExtRefs(TLDevice tlDevice, String lnClass, String lnInst, ExtRefSignalInfo filter) throws ScdException { - TLN ln = tlDevice.getLN() - .stream() - .filter(tln -> tln.getLnClass().contains(lnClass)) - .collect(Collectors.toList()) - .stream() - .filter(tln -> lnInst.equals(tln.getInst())) - .findFirst() - .orElseThrow(() -> new ScdException(String.format("Unknown LN [lnClass(%s),inst(%s)] ",lnClass,lnInst))); - - - if(ln.getInputs() == null) return new ArrayList<>(); - - if(filter == null){ - return ln.getInputs().getExtRef(); - } else { - return ln.getInputs().getExtRef() - .stream() - .filter(tExtRef -> filter.isWrappedIn(tExtRef)) - .collect(Collectors.toList()); - } - } -} diff --git a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java b/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java deleted file mode 100644 index 1d584afce..000000000 --- a/sct-service/src/main/java/org/lfenergy/compas/sct/service/scl/SclManager.java +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.THeader; -import org.lfenergy.compas.scl.TIED; - -import java.util.Optional; - -@Getter -@NoArgsConstructor -public class SclManager { - private SCL receiver; - - public SclManager(SCL receiver) { - this.receiver = receiver; - } - - public SclManager(String hId, String hVersion, String hRevision){ - this.receiver = SclManager.initialize(hId,hVersion,hRevision); - } - - - - public Optional getIED(String iedName){ - return receiver.getIED().stream().filter(tied -> iedName.equals(tied.getName())).findFirst(); - } - - /** - * Add IED named iedName from a given SCL to recipient SCL - * @param provider SCL containing IED to add - * @param iedName IED name to be added - * @throws ScdException - */ - public void addIED(SCL provider, String iedName) throws ScdException { - SclIEDManager sclIEDManager = new SclIEDManager(receiver); - sclIEDManager.addIed(provider,iedName); - } - - /*--------------------------------------------------------*/ - /* Static methods */ - /*--------------------------------------------------------*/ - - public static SCL initialize(String hId, String hVersion, String hRevision) { - - SCL scd = new SCL(); - scd.setRelease((short) 4); - scd.setVersion("2007"); - scd.setRevision("B"); - THeader tHeader = new THeader(); - tHeader.setRevision(hRevision); - tHeader.setVersion(hVersion); - tHeader.setId(hId); - scd.setHeader(tHeader); - - return scd; - } -} diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java deleted file mode 100644 index f002e1ae4..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/ApplicationContextTest.java +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@SpringBootTest -@ActiveProfiles("test") -public class ApplicationContextTest { - - @Test - public void contextLoads() { - // do nothing - } - - @SpringBootApplication - public static class Context { - - } -} diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java b/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java deleted file mode 100644 index 6f3e270f5..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/model/entity/package-info.java +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -@TypeDef( - name = "xmltype", - defaultForType = byte[].class, - typeClass = H2XMLTypeMapper.class -) -package org.lfenergy.compas.sct.model.entity; -import org.hibernate.annotations.TypeDef; -import org.lfenergy.compas.sct.repository.H2XMLTypeMapper; - diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java deleted file mode 100644 index 23c1b37c4..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/SqlScdServiceAndDBTest.java +++ /dev/null @@ -1,262 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service; - -import org.checkerframework.checker.units.qual.C; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.lfenergy.compas.commons.MarshallerWrapper; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.THeader; -import org.lfenergy.compas.scl.THitem; -import org.lfenergy.compas.sct.exception.CompasDataAccessException; -import org.lfenergy.compas.sct.model.dto.ConnectedApDTO; -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; -import org.lfenergy.compas.sct.model.dto.IedDTO; -import org.lfenergy.compas.sct.model.dto.SubNetworkDTO; -import org.lfenergy.compas.sct.model.entity.SimpleScd; -import org.lfenergy.compas.sct.repository.SimpleScdRepository; -import org.mockito.InjectMocks; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.Resource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; - -@ExtendWith(SpringExtension.class) -class SqlScdServiceAndDBTest { - private final String FILE_NAME = "file.scd"; - private final String H_VERSION = "1.0"; - private final String H_REVISION = "1.0"; - private static final String WHO = "who"; - private static final String WHAT = "what"; - private static final String WHY = "why"; - private final UUID ID = UUID.randomUUID(); - - private static final String IED_NAME = "IED_NAME"; - - private static final String SCD_IED_RCV_FILE = "scl/SCD/scd_ied_receiver_test.xml"; - private static final String SCD_WITH_IEDS_FILE = "scl/SCD/scd_with_ieds_test.xml"; - private static final String ICD_IMPORT_FILE = "scl/IEDImportHelper/icd_import_ied_test.xml"; - - @InjectMocks - private SimpleSqlScdService simpleSqlScdService; - - @MockBean - private SimpleScdRepository simpleScdRepository; - - - private MarshallerWrapper marshallerWrapper; - - private DefaultResourceLoader defaultResourceLoader; - - - @BeforeEach - public void setUp(){ - MockitoAnnotations.openMocks( this ); - - try { - marshallerWrapper = (new MarshallerWrapper.Builder()).build(); - } catch (Exception e) { - e.printStackTrace(); - } - simpleSqlScdService = new SimpleSqlScdService(simpleScdRepository,marshallerWrapper); - defaultResourceLoader = new DefaultResourceLoader(); - } - - @Test - public void shouldReturnOKWhenInitiateSCD() throws CompasDataAccessException, ScdException { - - SimpleScd expected = new SimpleScd(); - expected.setFileName(FILE_NAME); - expected.setRawXml(createSCD(ID, H_REVISION, H_VERSION)); - - SimpleScd result = simpleSqlScdService.initiateSCD(FILE_NAME, H_VERSION, H_REVISION); - - SCL scd = marshallerWrapper.unmarshall(result.getRawXml()); - - assertEquals(FILE_NAME,result.getFileName()); - assertEquals(H_REVISION,scd.getHeader().getRevision()); - assertEquals(H_VERSION,scd.getHeader().getVersion()); - } - - @Test - public void shouldReturnOKWhenAddHistoryItem() throws ScdException, CompasDataAccessException { - SimpleScd storedSimpleSCD = new SimpleScd(); - storedSimpleSCD.setFileName(FILE_NAME); - storedSimpleSCD.setId(ID); - storedSimpleSCD.setRawXml(createSCD(ID, H_REVISION, H_VERSION)); - - SCL storedScd = marshallerWrapper.unmarshall(createSCD(ID, H_REVISION, H_VERSION)); - - SimpleScd expected = new SimpleScd(); - expected.setFileName(FILE_NAME); - expected.setId(ID); - - SCL expectedScd = marshallerWrapper.unmarshall(createSCD(ID, H_REVISION, H_VERSION)); - - THeader.History history = new THeader.History(); - THitem tHitem = new THitem(); - tHitem.setVersion("1.0"); - tHitem.setRevision("1.0"); - tHitem.setWhat("what"); - tHitem.setWho("who"); - tHitem.setWhy("why"); - tHitem.setWhen(LocalDateTime.now().toString()); - history.getHitem().add(tHitem); - expectedScd.getHeader().setHistory(history); - expected.setRawXml(marshallerWrapper.marshall(expectedScd).getBytes()); - - Mockito.when(simpleScdRepository.findById(ID)).thenReturn(Optional.of(storedSimpleSCD)); - Mockito.when(simpleScdRepository.save(any(SimpleScd.class))).thenReturn(expected); - - - SimpleScd result = simpleSqlScdService.addHistoryItem(ID,"who","what", "why"); - assertNotNull(result); - SCL resultScd = marshallerWrapper.unmarshall(result.getRawXml()); - - assertAll( - () -> assertNotNull(resultScd), - () -> assertNotNull(resultScd.getHeader()), - () -> assertNotNull(resultScd.getHeader().getHistory()) - ); - List hItems = resultScd.getHeader().getHistory().getHitem(); - - assertFalse(hItems.isEmpty()); - THitem hItem = hItems.get(0); - assertAll( - () -> assertNotNull(hItem), - () -> assertEquals("who",hItem.getWho()), - () -> assertEquals("what",hItem.getWhat()), - () -> assertEquals("why",hItem.getWhy()) - ); - } - - - @Test - public void shouldReturnOKWhenInitiateScdAndAddHistory() throws ScdException { - SimpleScd result = simpleSqlScdService.initiateSCD(FILE_NAME, H_VERSION, H_REVISION); - SCL resultScd = marshallerWrapper.unmarshall(result.getRawXml()); - - assertNotNull(result); - assertNotNull(resultScd.getHeader()); - assertNotNull(UUID.fromString(resultScd.getHeader().getId())); - - result = simpleSqlScdService.addHistoryItem(result,"who","what","why"); - resultScd = marshallerWrapper.unmarshall(result.getRawXml()); - THeader.History history = resultScd.getHeader().getHistory(); - assertNotNull(history); - assertFalse(history.getHitem().isEmpty()); - THitem tHitem = history.getHitem().get(0); - assertEquals(H_REVISION,tHitem.getRevision()); - assertEquals(H_VERSION,tHitem.getVersion()); - assertEquals(WHO,tHitem.getWho()); - } - @Test - void testAddIED() throws IOException, ScdException { - - SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); - SimpleScd scdObj = new SimpleScd(); - scdObj.setRawXml(getFileContent(SCD_IED_RCV_FILE)); - - scdObj = simpleSqlScdService.addIED(scdObj,IED_NAME,iedProvider); - SCL res_receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); - - assertNotNull(res_receiver); - assertFalse(res_receiver.getIED().isEmpty()); - - } - - @Test - void testGetSubnetworks() throws IOException, ScdException { - SimpleScd scdObj = new SimpleScd(); - scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); - - Set subnetworks = simpleSqlScdService.getSubnetwork(scdObj); - assertEquals(1,subnetworks.size()); - } - - @Test - void testExtractExtRefs() throws IOException, ScdException { - SimpleScd scdObj = new SimpleScd(); - scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); - - IedDTO iedDTO = simpleSqlScdService.extractExtRefs(scdObj,IED_NAME,"LDPO"); - assertEquals(IED_NAME,iedDTO.getName()); - assertEquals(1,iedDTO.getLDevices().size()); - } - - @Test - public void testAddSubnetwork() throws IOException, ScdException { - SimpleScd scdObj = new SimpleScd(); - scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); - - SubNetworkDTO subNetworkDTO = new SubNetworkDTO("SN","IP"); - subNetworkDTO.addConnectedAPs(new ConnectedApDTO(IED_NAME,"AP_NAME")); - - scdObj = simpleSqlScdService.addSubnetworks(scdObj,Set.of(subNetworkDTO)); - SCL res_receiver = marshallerWrapper.unmarshall(scdObj.getRawXml()); - assertNotNull(res_receiver.getCommunication()); - assertFalse(res_receiver.getCommunication().getSubNetwork().isEmpty()); - } - - @Test - void testExtractExtRefSources() throws IOException, ScdException { - - SimpleScd scdObj = new SimpleScd(); - scdObj.setRawXml(getFileContent(SCD_WITH_IEDS_FILE)); - ExtRefSignalInfo extRef = new ExtRefSignalInfo(); - extRef.setIntAddr("INTADDR3"); - extRef.setPDO("Op.res"); - extRef.setDesc("DESC3"); - - Set iedDTOs = simpleSqlScdService.extractExtRefBindingInfo(scdObj,IED_NAME, "LDPO", extRef); - assertFalse(iedDTOs.isEmpty()); - - } - - - - private byte[] createSCD(UUID uuid, String hRevision, String hVersion){ - SCL scd = new SCL(); - scd.setVersion("2007"); - scd.setRevision("B"); - scd.setRelease((short) 4); - THeader tHeader = new THeader(); - tHeader.setRevision(hRevision); - tHeader.setVersion(hVersion); - tHeader.setId(uuid.toString()); - scd.setHeader(tHeader); - - return marshallerWrapper.marshall(scd).getBytes(StandardCharsets.UTF_8); - - } - - private byte[] getFileContent(String filename) throws IOException { - Resource resource = defaultResourceLoader.getResource("classpath:" + filename); - File file = resource.getFile(); - return Files.readAllBytes(file.toPath()); - } - - private SCL getSCLFromFile(String filename) throws IOException { - return marshallerWrapper.unmarshall(getFileContent(filename)); - } -} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java deleted file mode 100644 index e861ffdf0..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclCommunicationManagerTest.java +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.TAccessPoint; -import org.lfenergy.compas.scl.TConnectedAP; -import org.lfenergy.compas.scl.TIED; -import org.lfenergy.compas.scl.TSubNetwork; -import org.lfenergy.compas.exception.ScdException; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.junit.jupiter.api.Assertions.*; - -@ExtendWith(SpringExtension.class) -class SclCommunicationManagerTest { - - private static final String IED_NAME = "IED_NAME"; - private static final String AP_NAME = "AP_NAME"; - private static final String SUBNETWORK = "SUBNETWORK"; - - - @Test - void shouldReturnOKWhenAddSubnetworkCaseReceiverHasNoCommunication() throws ScdException { - SCL receiver = createSCLWithIEDAndAccessPoint(); - SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); - - receiver = sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME); - assertNotNull(receiver.getCommunication()); - assertNotNull(receiver.getCommunication().getSubNetwork()); - assertFalse(receiver.getCommunication().getSubNetwork().isEmpty()); - TSubNetwork subNetwork = receiver.getCommunication().getSubNetwork() - .stream() - .filter(sn -> sn.getName().equals(SUBNETWORK)) - .findFirst() - .orElse(null); - assertNotNull(subNetwork); - - TConnectedAP cAP = subNetwork.getConnectedAP() - .stream() - .filter(connectedAP -> connectedAP.getIedName().equals(IED_NAME) && connectedAP.getApName().equals(AP_NAME) ) - .findFirst() - .orElse(null); - assertNotNull(cAP); - - } - - - @Test - void ShouldReturnNOKWhenAddSubnetworkCauseUnknownIED() throws ScdException { - - SCL receiver = createMinimalSCL(); - - SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); - - assertThrows(ScdException.class, () -> sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME)); - - } - - @Test - void ShouldReturnNOKWhenAddSubnetworkCauseUnknownIEDAccessPoint() { - SCL receiver = createMinimalSCL(); - TIED ied = new TIED(); - ied.setName(IED_NAME); - receiver.getIED().add(ied); - - SclCommunicationManager sclCommunicationManager = new SclCommunicationManager(receiver); - - assertThrows(ScdException.class, () -> sclCommunicationManager.addSubnetwork(SUBNETWORK,"IP",IED_NAME,AP_NAME)); - } - - private SCL createMinimalSCL(){ - return SclManager.initialize("hID","hVersion","hRevision"); - } - - private SCL createSCLWithIEDAndAccessPoint(){ - SCL receiver = createMinimalSCL(); - TIED ied = new TIED(); - ied.setName(IED_NAME); - TAccessPoint accessPoint = new TAccessPoint(); - accessPoint.setName(AP_NAME); - ied.getAccessPoint().add(accessPoint); - - receiver.getIED().add(ied); - return receiver; - } -} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java deleted file mode 100644 index cc6d501a7..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclDataTemplateManagerTest.java +++ /dev/null @@ -1,567 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.commons.MarshallerWrapper; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.TBDA; -import org.lfenergy.compas.scl.TDA; -import org.lfenergy.compas.scl.TDAType; -import org.lfenergy.compas.scl.TDOType; -import org.lfenergy.compas.scl.TDataTypeTemplates; -import org.lfenergy.compas.scl.TEnumType; -import org.lfenergy.compas.scl.TFCEnum; -import org.lfenergy.compas.scl.TLLN0Enum; -import org.lfenergy.compas.scl.TLNodeType; -import org.lfenergy.compas.scl.TPredefinedBasicTypeEnum; -import org.lfenergy.compas.scl.TPredefinedCDCEnum; - - -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; -import org.lfenergy.compas.sct.model.dto.ResumedDataTemplate; - -import java.io.InputStream; -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class SclDataTemplateManagerTest { - - private static final String SCD_FILE = "scl/SCD/scd_with_dtt_test.xml"; - private static final String ICD_WITH_IDENTICAL_DTT = "scl/IEDImportHelper/Icd_With_Identical_DTT.xml"; - private static final String ICD_WITH_DTT_DIFF_IDS = "scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml"; - private static final String ICD_WITH_DTT_DIFF_CONTENT = "scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml"; - - @Test - void ShouldReturnTrueWhenIsIdenticalForDTTEnumType() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); - List prdEnumType = icd.getDataTypeTemplates().getEnumType(); - - assertFalse(rcvEnumType.isEmpty()); - assertFalse(prdEnumType.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); - assertTrue(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTEnumTypeCauseIdsAreDifferent() throws Exception { - - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); - List prdEnumType = icd.getDataTypeTemplates().getEnumType(); - assertFalse(rcvEnumType.isEmpty()); - assertFalse(prdEnumType.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTEnumTypeCauseContentsAreDifferent() throws Exception { - - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvEnumType = scd.getDataTypeTemplates().getEnumType(); - List prdEnumType = icd.getDataTypeTemplates().getEnumType(); - assertFalse(rcvEnumType.isEmpty()); - assertFalse(prdEnumType.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvEnumType.get(0),prdEnumType.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnTrueWhenIsIdenticalForDTTDaType() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); - List prdDaTypes = icd.getDataTypeTemplates().getDAType(); - - assertFalse(rcvDaTypes.isEmpty()); - assertFalse(prdDaTypes.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); - assertTrue(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTDaTypeCauseIdsAreDifferent() throws Exception { - - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); - List prdDaTypes = icd.getDataTypeTemplates().getDAType(); - - assertFalse(rcvDaTypes.isEmpty()); - assertFalse(prdDaTypes.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTDaTypeCauseContentsAreDifferent() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvDaTypes = scd.getDataTypeTemplates().getDAType(); - List prdDaTypes = icd.getDataTypeTemplates().getDAType(); - - assertFalse(rcvDaTypes.isEmpty()); - assertFalse(prdDaTypes.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDaTypes.get(0),prdDaTypes.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnTrueWhenIsIdenticalForDTTDoType() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); - List prdDoTypes = icd.getDataTypeTemplates().getDOType(); - - assertFalse(rcvDoTypes.isEmpty()); - assertFalse(prdDoTypes.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); - assertTrue(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTDoTypeCauseIdsAreDifferent() throws Exception { - - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); - List prdDoTypes = icd.getDataTypeTemplates().getDOType(); - - assertFalse(rcvDoTypes.isEmpty()); - assertFalse(prdDoTypes.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTDoTypeCauseContentsAreDifferent() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvDoTypes = scd.getDataTypeTemplates().getDOType(); - List prdDoTypes = icd.getDataTypeTemplates().getDOType(); - - assertFalse(rcvDoTypes.isEmpty()); - assertFalse(prdDoTypes.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvDoTypes.get(0),prdDoTypes.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnTrueWhenIsIdenticalForDTTLNodeType() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); - List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); - - assertFalse(rcvLNodeType.isEmpty()); - assertFalse(prdLNodeType.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); - assertTrue(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTLNodeTypeCauseIdsAreDifferent() throws Exception { - - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); - List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); - - assertFalse(rcvLNodeType.isEmpty()); - assertFalse(prdLNodeType.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnFalseWhenIsIdenticalForDTTLNodeTypeCauseContentsAreDifferent() throws Exception { - - SCL scd = getSCLFromFile(SCD_FILE); - SCL icd = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - List rcvLNodeType = scd.getDataTypeTemplates().getLNodeType(); - List prdLNodeType = icd.getDataTypeTemplates().getLNodeType(); - - assertFalse(rcvLNodeType.isEmpty()); - assertFalse(prdLNodeType.isEmpty()); - boolean isIdentical = sclDataTemplateManager.isIdentical(rcvLNodeType.get(0),prdLNodeType.get(0),true); - assertFalse(isIdentical); - } - - @Test - void ShouldReturnOKWhenFindDATypesWhichBdaContainsEnumTypeId() throws Exception { - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - String enumTypeId = "RecCycModKind"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - List daTypeList = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(icd,enumTypeId); - - assertEquals(1,daTypeList.size()); - } - - @Test - void ShouldReturnOKWhenFindDOTypesWhichDAContainsEnumTypeId() throws Exception { - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - String enumTypeId = "PhaseAngleReferenceKind"; - List doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(icd,enumTypeId); - assertEquals(1,doTypeList.size()); - - enumTypeId = "RecCycModKind"; - doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(icd,enumTypeId); - assertTrue(doTypeList.isEmpty()); - } - - @Test - void ShouldReturnOKWhenFindDATypesFromStructBdaWithDATypeId() throws Exception { - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - String daTypeId = "DA3"; - List daTypeList = sclDataTemplateManager.findDATypesFromStructBdaWithDATypeId(icd,daTypeId); - - assertEquals(1,daTypeList.size()); - daTypeId = "DA1"; - - daTypeList = sclDataTemplateManager.findDATypesFromStructBdaWithDATypeId(icd,daTypeId); - assertTrue(daTypeList.isEmpty()); - } - - @Test - void ShouldReturnOKWhenFindDOTypesWhichDAContainsStructWithDATypeId() throws Exception { - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - String daTypeId = "DA3"; - List doTypeList = sclDataTemplateManager.findDOTypesWhichDAContainsStructWithDATypeId(icd,daTypeId); - assertEquals(1,doTypeList.size()); - - } - - @Test - void ShouldReturnOKWhenFindDOTypesFromSDOWithDOTypeId() throws Exception { - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - String doTypeId = "DO4"; - List doTypeList = sclDataTemplateManager.findDOTypesFromSDOWithDOTypeId(icd,doTypeId); - assertEquals(2,doTypeList.size()); - - doTypeId = "UnknownDOID"; - doTypeList = sclDataTemplateManager.findDOTypesFromSDOWithDOTypeId(icd,doTypeId); - assertTrue(doTypeList.isEmpty()); - } - - @Test - void ShouldReturnOKWhenFindLNodeTypesFromDoWithDoTypeId() throws Exception { - SCL icd = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - String doTypeId = "DO1"; - List lNodeTypes = sclDataTemplateManager.findLNodeTypesFromDoWithDoTypeId(icd,doTypeId); - assertEquals(2,lNodeTypes.size()); - - doTypeId = "UnknownDOID"; - lNodeTypes = sclDataTemplateManager.findLNodeTypesFromDoWithDoTypeId(icd,doTypeId); - assertTrue(lNodeTypes.isEmpty()); - } - - @Test - void testComputeImportableDTTFromEnumTypeWithIdenticalIdsAndSameContent() throws Exception { - // identical id, same content - SCL receiver = getSCLFromFile(SCD_FILE); - SCL provider = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - String iedName = "IED_NAME"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); - - assertTrue(sclDataTemplateManager.getEnumTypeToAdd().isEmpty()); - assertTrue(sclDataTemplateManager.getDoTypeToAdd().isEmpty()); - assertTrue(sclDataTemplateManager.getDaTypeToAdd().isEmpty()); - - } - - @Test - void testComputeImportableDTTFromEnumTypeWithIdenticalIdsAndDiffContent() throws Exception { - - // identical id, different content - SCL receiver = getSCLFromFile(SCD_FILE); - SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); - String iedName = "IED_NAME"; - String newExpectedEnumTypeID1 = iedName + "_PhaseAngleReferenceKind"; - String newExpectedEnumTypeID2 = iedName + "_RecCycModKind"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); - - assertEquals(2, sclDataTemplateManager.getEnumTypeToAdd().size()); - assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID1)); - assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID2)); - - List daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID1); - List doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID1); - assertTrue(daTypeListRefEnumID.isEmpty()); - assertEquals(1, doTypeListRefEnumID.size()); - List tdaList = sclDataTemplateManager.retrieveSdoOrDO(doTypeListRefEnumID.get(0).getSDOOrDA(), TDA.class); - assertFalse(tdaList.isEmpty()); - assertEquals(TPredefinedBasicTypeEnum.ENUM,tdaList.get(0).getBType()); - assertEquals(newExpectedEnumTypeID1,tdaList.get(0).getType()); - - daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID2); - doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID2); - - assertEquals(1, daTypeListRefEnumID.size()); - assertTrue(doTypeListRefEnumID.isEmpty()); - List bdaList = daTypeListRefEnumID.get(0).getBDA(); - assertTrue(!bdaList.isEmpty()); - Optional opBda = bdaList.stream() - .filter(tbda -> TPredefinedBasicTypeEnum.ENUM.equals(tbda.getBType()) - && newExpectedEnumTypeID2.equals(tbda.getType())) - .findFirst(); - assertTrue(opBda.isPresent()); - } - - @Test - void testComputeImportableDTTFromEnumTypeWithDiffIds() throws Exception { - // different id - SCL receiver = getSCLFromFile(SCD_FILE); - SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); - String iedName = "IED_NAME"; - String newExpectedEnumTypeID1 = "MultiplierKind"; - String newExpectedEnumTypeID2 = "CtlModelKind"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - sclDataTemplateManager.computeImportableDTTFromEnumType(provider,receiver,iedName); - - assertEquals(2, sclDataTemplateManager.getEnumTypeToAdd().size()); - assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID1)); - assertTrue(sclDataTemplateManager.getEnumTypeToAdd().containsKey(newExpectedEnumTypeID2)); - - List daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID1); - List doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID1); - assertTrue( daTypeListRefEnumID.isEmpty()); - assertEquals(1, doTypeListRefEnumID.size()); - List tdaList = sclDataTemplateManager.retrieveSdoOrDO(doTypeListRefEnumID.get(0).getSDOOrDA(), TDA.class); - assertFalse(tdaList.isEmpty()); - assertEquals(TPredefinedBasicTypeEnum.ENUM,tdaList.get(0).getBType()); - assertEquals(newExpectedEnumTypeID1,tdaList.get(0).getType()); - - daTypeListRefEnumID = sclDataTemplateManager.findDATypesWhichBdaContainsEnumTypeId(provider,newExpectedEnumTypeID2); - doTypeListRefEnumID = sclDataTemplateManager.findDOTypesWhichDAContainsEnumTypeId(provider,newExpectedEnumTypeID2); - - assertEquals(1, daTypeListRefEnumID.size()); - assertFalse(!doTypeListRefEnumID.isEmpty()); - List bdaList = daTypeListRefEnumID.get(0).getBDA(); - assertTrue(!bdaList.isEmpty()); - Optional opBda = bdaList.stream() - .filter(tbda -> TPredefinedBasicTypeEnum.ENUM.equals(tbda.getBType()) - && newExpectedEnumTypeID2.equals(tbda.getType())) - .findFirst(); - assertTrue(opBda.isPresent()); - } - - @Test - void testComputeImportableDTTFromDATypeWithIdenticalIdsAndSameContent() throws Exception { - - // identical id, same content - SCL receiver = getSCLFromFile(SCD_FILE); - SCL provider = getSCLFromFile(ICD_WITH_IDENTICAL_DTT); - String iedName = "IED_NAME"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); - - assertTrue(sclDataTemplateManager.getEnumTypeToAdd().isEmpty()); - assertTrue(sclDataTemplateManager.getDaTypeToAdd().isEmpty()); - assertTrue(sclDataTemplateManager.getDoTypeToAdd().isEmpty()); - assertTrue(sclDataTemplateManager.getLNodeTypeToAdd().isEmpty()); - - } - - @Test - void testComputeImportableDTTFromDATypeWithIdenticalIdsAndDiffContent() throws Exception { - // identical id, different content - SCL receiver = getSCLFromFile(SCD_FILE); - SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); - String iedName = "IED_NAME"; - String expectedDATypeID1 = iedName + "_DA1"; - String expectedDATypeID3 = iedName + "_DA3"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); - - assertEquals(2, sclDataTemplateManager.getDaTypeToAdd().size()); - assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID1)); - assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID3)); - } - - @Test - void testComputeImportableDTTFromDATypeWithDiffIds() throws Exception { - // identical id, different content - SCL receiver = getSCLFromFile(SCD_FILE); - SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_IDS); - String iedName = "IED_NAME"; - String expectedDATypeID1 = "DA11"; - String expectedDATypeID2 = "DA21"; - String expectedDATypeID3 = "DA31"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - - sclDataTemplateManager.computeImportableDTTFromDAType(provider,receiver,iedName); - - assertEquals(3, sclDataTemplateManager.getDaTypeToAdd().size()); - assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID1)); - assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID2)); - assertTrue(sclDataTemplateManager.getDaTypeToAdd().containsKey(expectedDATypeID3)); - } - - @Test - void testComputeImportableDTTFromDOType(){ - - } - @Test - void testComputeImportableDTTFromLNodeType(){ - - } - - @Test - void testImportDTT() throws Exception { - SCL receiver = getSCLFromFile(SCD_FILE); - SCL provider = getSCLFromFile(ICD_WITH_DTT_DIFF_CONTENT); - String iedName = "IED_NAME"; - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - receiver = sclDataTemplateManager.importDTT(provider,receiver,iedName); - - System.out.print(createWrapper().marshall(receiver)); - } - - @Test - void testShouldReturnOKWhenGetResumedDTT() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - TDataTypeTemplates dtt = scd.getDataTypeTemplates(); - String lnType = "LN2"; - ExtRefSignalInfo extRef = new ExtRefSignalInfo(); - extRef.setIntAddr("IntAddr"); - extRef.setPLN(TLLN0Enum.LLN_0.value()); - extRef.setPDO("FACntRs.res"); - extRef.setPDA("d"); - - ResumedDataTemplate res = SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt); - System.out.println(res); - assertEquals(lnType,res.getLnType()); - assertEquals(TLLN0Enum.LLN_0.value(),res.getLnClass()); - assertEquals(extRef.getPDO(),res.getDoName()); - assertEquals(extRef.getPDA(),res.getDaName()); - assertEquals(TPredefinedCDCEnum.WYE,res.getCdc()); - assertEquals(TFCEnum.CF,res.getFc()); - } - - @Test - void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDoName() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - TDataTypeTemplates dtt = scd.getDataTypeTemplates(); - String lnType = "LN2"; - ExtRefSignalInfo extRef = new ExtRefSignalInfo(); - extRef.setIntAddr("IntAddr"); - extRef.setPLN(TLLN0Enum.LLN_0.value()); - extRef.setPDO("FACntRs1.res"); - extRef.setPDA("d"); - - assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); - } - - @Test - void testShouldReturnNOKWhenGetResumedDTTCauseUnknownLnType() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - TDataTypeTemplates dtt = scd.getDataTypeTemplates(); - String lnType = "LN210"; - ExtRefSignalInfo extRef = new ExtRefSignalInfo(); - extRef.setIntAddr("IntAddr"); - extRef.setPLN(TLLN0Enum.LLN_0.value()); - extRef.setPDO("FACntRs.res"); - extRef.setPDA("d"); - - assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); - } - - @Test - void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedSDoName() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - TDataTypeTemplates dtt = scd.getDataTypeTemplates(); - String lnType = "LN210"; - ExtRefSignalInfo extRef = new ExtRefSignalInfo(); - extRef.setIntAddr("IntAddr"); - extRef.setPLN(TLLN0Enum.LLN_0.value()); - extRef.setPDO("FACntRs.res1"); - extRef.setPDA("d"); - - assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); - } - - @Test - void testShouldReturnNOKWhenGetResumedDTTCauseUnreferencedDaName() throws Exception { - SCL scd = getSCLFromFile(SCD_FILE); - TDataTypeTemplates dtt = scd.getDataTypeTemplates(); - String lnType = "LN210"; - ExtRefSignalInfo extRef = new ExtRefSignalInfo(); - extRef.setIntAddr("IntAddr"); - extRef.setPLN(TLLN0Enum.LLN_0.value()); - extRef.setPDO("FACntRs.res1"); - extRef.setPDA("d"); - - assertThrows(ScdException.class, () -> SclDataTemplateManager.getResumedDTT(lnType,extRef,dtt)); - } - - private SCL getSCLFromFile(String filename) throws Exception { - MarshallerWrapper marshallerWrapper = createWrapper(); - InputStream is = getClass().getClassLoader().getResourceAsStream(filename); - return marshallerWrapper.unmarshall(is); - } - - private MarshallerWrapper createWrapper() throws Exception { - return (new MarshallerWrapper.Builder()).build(); - } - -} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java deleted file mode 100644 index 33b292ae0..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclHeaderManagerTest.java +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.THitem; -import org.lfenergy.compas.exception.ScdException; - - -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - - -class SclHeaderManagerTest { - - private final String H_VERSION = "1.0"; - private final String TOOL_ID = "COMPAS"; - private final String H_REVISION = "1.0"; - private final UUID ID = UUID.randomUUID(); - - @Test - void testShouldReturnOKWhenAddHeader() throws ScdException { - SCL receiver = new SCL(); - SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); - assertNull(receiver.getHeader()); - sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); - assertAll("header", - () -> assertNotNull(receiver.getHeader()), - () -> assertEquals(ID.toString(),receiver.getHeader().getId()), - () -> assertNotNull(H_VERSION,receiver.getHeader().getVersion()), - () -> assertNotNull(H_REVISION,receiver.getHeader().getRevision()), - () -> assertNotNull(TOOL_ID,receiver.getHeader().getToolID()) - ); - } - - @Test - void testShouldReturnNOKWhenAddHeaderCauseHeaderExistAlready() throws ScdException { - - SCL receiver = new SCL(); - SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); - assertNull(receiver.getHeader()); - sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); - - assertThrows(ScdException.class, () -> sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION)); - } - - @Test - void testShouldReturnOKWhenAddHistoryItem() throws ScdException { - SCL receiver = new SCL(); - SclHeaderManager sclHeaderManager = new SclHeaderManager(receiver); - assertNull(receiver.getHeader()); - sclHeaderManager.addHeader(ID.toString(),H_VERSION,H_REVISION); - assertNotNull(receiver.getHeader()); - sclHeaderManager.addHistoryItem("who","what","why"); - - assertNotNull(receiver.getHeader().getHistory()); - assertEquals(1,receiver.getHeader().getHistory().getHitem().size()); - THitem tHitem = receiver.getHeader().getHistory().getHitem().get(0); - assertEquals("who",tHitem.getWho()); - assertEquals("what",tHitem.getWhat()); - assertEquals("why",tHitem.getWhy()); - assertNotNull(tHitem.getWhen()); - assertNotNull(receiver.getHeader().getRevision(),tHitem.getRevision()); - assertNotNull(receiver.getHeader().getVersion(),tHitem.getVersion()); - assertNotNull(tHitem.getWhen()); - } -} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java deleted file mode 100644 index 4fae5f7d7..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclIEDManagerTest.java +++ /dev/null @@ -1,286 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - - -import org.junit.jupiter.api.Test; -import org.lfenergy.compas.commons.MarshallerWrapper; -import org.lfenergy.compas.exception.ScdException; -import org.lfenergy.compas.scl.SCL; -import org.lfenergy.compas.scl.TAccessPoint; -import org.lfenergy.compas.scl.TDataTypeTemplates; -import org.lfenergy.compas.scl.TExtRef; -import org.lfenergy.compas.scl.TIED; -import org.lfenergy.compas.scl.TLDevice; -import org.lfenergy.compas.scl.TLLN0Enum; -import org.lfenergy.compas.scl.TLN; -import org.lfenergy.compas.sct.model.dto.ExtRefSignalInfo; - -import java.io.InputStream; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -class SclIEDManagerTest { - - private static final String SCD_IED_RCV_FILE = "scl/SCD/scd_ied_receiver_test.xml"; - private static final String SCD_WITH_IEDS_FILE = "scl/SCD/scd_with_ieds_test.xml"; - private static final String ICD_IMPORT_FILE = "scl/IEDImportHelper/icd_import_ied_test.xml"; - - private static final String IED_NAME = "IED_NAME"; - - - @Test - void addIed() { - } - - @Test - void shouldReturnOKWhenAddIed() throws ScdException { - SCL iedReceiver = getSCLFromFile(SCD_IED_RCV_FILE); - SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); - //check prerequisite - assertFalse(iedReceiver.getIED().stream().anyMatch(tied -> tied.getName().equals(IED_NAME))); - Optional opIED = iedProvider.getIED().stream().filter(tied -> tied.getName().equals(IED_NAME)).findFirst(); - assertTrue(opIED.isPresent()); - TIED ied = opIED.get(); - assertFalse(ied.getAccessPoint().isEmpty()); - TAccessPoint accessPoint = ied.getAccessPoint().get(0); - assertEquals(1, accessPoint.getServer().getLDevice().size() ); - TLDevice lDevice = accessPoint.getServer().getLDevice().get(0); - assertEquals("LN2",lDevice.getLN0().getLnType()); - assertEquals(2,lDevice.getLN().size() ); - TLN ln = lDevice.getLN().get(0); - assertEquals("LN1",ln.getLnType() ); - - // import IED - SclIEDManager sclIEDManager = new SclIEDManager(iedReceiver); - - SclDataTemplateManager sclDataTemplateManager = new SclDataTemplateManager(); - sclDataTemplateManager.importDTT(iedProvider,iedReceiver,IED_NAME); - Map lNodeTypeTracker = sclDataTemplateManager.getLNodeTypeTracker(); - assertFalse(lNodeTypeTracker.isEmpty()); - iedReceiver = sclIEDManager.addIed(iedProvider,IED_NAME,lNodeTypeTracker); - - opIED = iedReceiver.getIED().stream().filter(tied -> tied.getName().equals(IED_NAME)).findFirst(); - assertTrue(opIED.isPresent()); - ied = opIED.get(); - assertFalse(ied.getAccessPoint().isEmpty()); - accessPoint = ied.getAccessPoint().get(0); - assertNotNull(accessPoint.getServer()); - assertEquals(1, accessPoint.getServer().getLDevice().size()); - lDevice = accessPoint.getServer().getLDevice().get(0); - assertNotNull(lDevice.getLN0()); - assertEquals(IED_NAME + "_LN2",lDevice.getLN0().getLnType()); - assertEquals(2,lDevice.getLN().size()); - ln = lDevice.getLN().get(0); - assertEquals(IED_NAME + "_LN1", ln.getLnType()); - } - - @Test - void ShouldReturnNOKWhenAddIedCauseIEDAlreadyExistsInReceiver() { - SCL receiver = createMinimalSCL(); - TIED tied = new TIED(); - tied.setName(IED_NAME); - receiver.getIED().add(tied); - SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); - - SclIEDManager sclIEDManager = new SclIEDManager(receiver); - - - assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); - - } - - @Test - void ShouldReturnNOKWhenAddIedCauseReceiverContainsDTTisNULL() { - SCL receiver = createMinimalSCL(); - SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); - - SclIEDManager sclIEDManager = new SclIEDManager(receiver); - - assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); - } - - @Test - void ShouldReturnNOKWhenAddIedCauseReceiverContainsDTTHasNoLNodeType() { - - SCL receiver = createMinimalSCL(); - TDataTypeTemplates tDataTypeTemplates = new TDataTypeTemplates(); - receiver.setDataTypeTemplates(tDataTypeTemplates); - SCL iedProvider = getSCLFromFile(ICD_IMPORT_FILE); - - SclIEDManager sclIEDManager = new SclIEDManager(receiver); - - assertThrows(ScdException.class, () -> sclIEDManager.addIed(iedProvider,IED_NAME,new HashMap<>())); - } - - @Test - void testGetLDevice(){ - SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); - assertFalse(scd.getIED().isEmpty()); - TIED ied = scd.getIED().get(0); - - List lds = SclIEDManager.getIEDLDevice(ied); - assertFalse(lds.isEmpty()); - } - @Test - void testGetSpecificLDevice(){ - SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); - assertFalse(scd.getIED().isEmpty()); - - TIED ied = scd.getIED() - .stream() - .filter(tied -> tied.getName().equals(IED_NAME)) - .findFirst() - .orElse(null); - assertNotNull(ied); - - TLDevice ld = SclIEDManager.getIEDLDevice(ied,"LDPO").orElse(null); - assertNotNull(ld); - } - - @Test - void ShouldReturnOKWhenUpdateLN() throws ScdException { - TLN ln = new TLN(); - ln.setInst("lnInst"); - ln.setLnType("lnType"); - String newLnType = "newLNType"; - Set receiverLNodeTypeIds = new HashSet<>(); - receiverLNodeTypeIds.add(newLnType); - Map tracker = new HashMap<>(); - tracker.put(ln.getLnType(),newLnType); - SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); - - ln = (TLN) sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker); - assertEquals(newLnType,ln.getLnType()); - - } - - @Test - void ShouldReturnNOKWhenUpdateLNCauseUnknownLNodeType() { - TLN ln = new TLN(); - ln.setInst("lnInst"); - ln.setLnType("lnType"); - Set receiverLNodeTypeIds = new HashSet<>(); - Map tracker = new HashMap<>(); - SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); - - assertThrows(ScdException.class, () -> sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker)); - - } - - @Test - void ShouldReturnNOKWhenUpdateLNCauseLNodeTypeBadlyRenamed() { - TLN ln = new TLN(); - ln.setInst("lnInst"); - ln.setLnType("lnType"); - String badNewLNType = "badNewLNType"; - Set receiverLNodeTypeIds = new HashSet<>(); - Map tracker = new HashMap<>(); - tracker.put(ln.getLnType(),badNewLNType); - SclIEDManager sclIEDManager = new SclIEDManager(new SCL()); - - assertThrows(ScdException.class, () -> sclIEDManager.updateLN(ln,receiverLNodeTypeIds,tracker)); - - } - - @Test - void testShouldReturnOKWhenGetExtRef() throws ScdException { - SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); - SclIEDManager sclIEDManager = new SclIEDManager(scd); - ExtRefSignalInfo simpleExtRef = new ExtRefSignalInfo(); - simpleExtRef.setIntAddr("INTADDR2"); - simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); - simpleExtRef.setPDO("Op"); - TExtRef extRef = sclIEDManager.getExtRef(IED_NAME,"LDPO",simpleExtRef); - assertEquals("DESC2",extRef.getDesc()); - - } - - @Test - void testShouldReturnNOKWhenGetExtRefNoThingFound() throws ScdException { - SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); - SclIEDManager sclIEDManager = new SclIEDManager(scd); - ExtRefSignalInfo simpleExtRef = new ExtRefSignalInfo(); - simpleExtRef.setIntAddr("INTADDR1"); - simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); - simpleExtRef.setPDO("Op"); - assertThrows(ScdException.class, () -> sclIEDManager.getExtRef(IED_NAME,"LDPO",simpleExtRef)); - } - - @Test - void testShouldReturnNOKWhenGetExtRefUnknownLD() throws ScdException { - SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); - SclIEDManager sclIEDManager = new SclIEDManager(scd); - ExtRefSignalInfo simpleExtRef = new ExtRefSignalInfo(); - simpleExtRef.setIntAddr("INTADDR1"); - simpleExtRef.setPLN(TLLN0Enum.LLN_0.value()); - simpleExtRef.setPDO("Op"); - assertThrows(ScdException.class, () -> sclIEDManager.getExtRef(IED_NAME,"LDPO1",simpleExtRef)); - } - @Test - void testExtractLN0ExtRefs(){ - - SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); - SclIEDManager sclIEDManager = new SclIEDManager(scd); - //prerequisite - assertFalse(scd.getIED().isEmpty()); - assertFalse(scd.getIED().get(0).getAccessPoint().isEmpty()); - assertNotNull(scd.getIED().get(0).getAccessPoint().get(0).getServer()); - assertFalse(scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().isEmpty()); - TLDevice lDevice = scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0); - List extRefs = sclIEDManager.extractLN0ExtRefs(lDevice, null); - - assertFalse(extRefs.isEmpty()); - } - - @Test - void testExtractLNExtRefs() throws ScdException { - - SCL scd = getSCLFromFile(SCD_WITH_IEDS_FILE); - SclIEDManager sclIEDManager = new SclIEDManager(scd); - //prerequisite - assertFalse(scd.getIED().isEmpty()); - assertFalse(scd.getIED().get(0).getAccessPoint().isEmpty()); - assertNotNull(scd.getIED().get(0).getAccessPoint().get(0).getServer()); - assertFalse(scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().isEmpty()); - TLDevice lDevice = scd.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0); - assertEquals(2,lDevice.getLN().size()); - TLN tln = lDevice.getLN().get(0); - assertFalse(tln.getLnClass().isEmpty()); - String lnClass = tln.getLnClass().get(0); - List extRefs = sclIEDManager.extractLNExtRefs(lDevice,lnClass,tln.getInst(),null); - - assertFalse(extRefs.isEmpty()); - } - - private SCL createMinimalSCL(){ - return SclManager.initialize("hID","hVersion","hRevision"); - } - private MarshallerWrapper createWrapper() throws Exception { - return (new MarshallerWrapper.Builder()).build(); - } - - private SCL getSCLFromFile(String filename){ - MarshallerWrapper marshallerWrapper = null; - try { - marshallerWrapper = createWrapper(); - } catch (Exception e) { - fail("XML marshaller can't be created!"); - } - InputStream is = getClass().getClassLoader().getResourceAsStream(filename); - return marshallerWrapper.unmarshall(is); - } -} \ No newline at end of file diff --git a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java b/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java deleted file mode 100644 index b07efdd18..000000000 --- a/sct-service/src/test/java/org/lfenergy/compas/sct/service/scl/SclManagerTest.java +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-FileCopyrightText: 2020 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.service.scl; - -class SclManagerTest { - -} \ No newline at end of file diff --git a/sct-service/src/test/resources/application.yml b/sct-service/src/test/resources/application.yml deleted file mode 100644 index ab94d62e3..000000000 --- a/sct-service/src/test/resources/application.yml +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-FileCopyrightText: 2020 RTE FRANCE -# -# SPDX-License-Identifier: Apache-2.0 - -## YAML Template. ---- -spring: - #profile - profiles: - active: test -logging: - level: - root: INFO \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml deleted file mode 100644 index 31bf5f5da..000000000 --- a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_DIFF_IDS.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - -
- - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml deleted file mode 100644 index 18d328bf2..000000000 --- a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_DTT_Same_IDs_Diff_Contents.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - -
- - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - AnotherValue - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - AnotherValue - - - \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml b/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml deleted file mode 100644 index b81165384..000000000 --- a/sct-service/src/test/resources/scl/IEDImportHelper/Icd_With_Identical_DTT.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml b/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml deleted file mode 100644 index 4b68e1b4a..000000000 --- a/sct-service/src/test/resources/scl/IEDImportHelper/icd_import_ied_test.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - AnotherValue - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - AnotherValue - - - \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml b/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml deleted file mode 100644 index 5883470f7..000000000 --- a/sct-service/src/test/resources/scl/SCD/scd_ied_receiver_test.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml deleted file mode 100644 index 5883470f7..000000000 --- a/sct-service/src/test/resources/scl/SCD/scd_with_dtt_test.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file diff --git a/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml b/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml deleted file mode 100644 index d8e228508..000000000 --- a/sct-service/src/test/resources/scl/SCD/scd_with_ieds_test.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IEC 61850-7-3:2007B - - - - - - - - - - - - - - - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - - - IEC 61850-8-1:2003 - - - Completed - Cancelled - New adjustments - Under way - - - Va - Vb - Vc - Aa - Ab - Ac - Vab - Vbc - Vca - Vother - Aother - Synchrophasor - - - \ No newline at end of file From 2e3fbc6a5d212a9fb68b848d1f44211179358ad9 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Fri, 20 Aug 2021 14:46:56 +0200 Subject: [PATCH 12/24] add copyright to POM file Signed-off-by: Mohamed Sylla --- sct-data-postgres/pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sct-data-postgres/pom.xml b/sct-data-postgres/pom.xml index 31b4b77a6..bcac26036 100644 --- a/sct-data-postgres/pom.xml +++ b/sct-data-postgres/pom.xml @@ -1,4 +1,7 @@ + + + From 12f7639d9dc4a48a03ca647b5c913f4c3165da7c Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Fri, 20 Aug 2021 14:58:27 +0200 Subject: [PATCH 13/24] use concrete COMPAS package version Signed-off-by: Mohamed Sylla --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 189457505..7cb9ed279 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ COMPAS-SCT - local-SNAPSHOT + 0.2.1 11 11 sct-coverage/** From 0e8cec057b3e814e69990ac1fd9ff3c0fd54115c Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Fri, 20 Aug 2021 15:02:33 +0200 Subject: [PATCH 14/24] add COMPAS GITHUB packaging repo Signed-off-by: Mohamed Sylla --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index 7cb9ed279..3964dab54 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,14 @@ pom COMPAS-SCT + + + github-packages-compas + Github Packages CoMPAS + https://maven.pkg.github.com/com-pas/* + + + 0.2.1 11 @@ -20,6 +28,7 @@ ../sct-coverage/target/site/jacoco-aggregate/jacoco.xml ${basedir}/${aggregate.report.dir} + org.lfenergy.compas.core From 4d74c1d6edf93077f5456c515a05f7ba61881a93 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Fri, 20 Aug 2021 15:12:50 +0200 Subject: [PATCH 15/24] create custom mvn setting for CI script Signed-off-by: Mohamed Sylla --- .github/workflows/sonarcloud-analysis.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sonarcloud-analysis.yml b/.github/workflows/sonarcloud-analysis.yml index 84c042d80..1fe77aa5e 100644 --- a/.github/workflows/sonarcloud-analysis.yml +++ b/.github/workflows/sonarcloud-analysis.yml @@ -30,8 +30,18 @@ jobs: path: ~/.m2 key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-m2 + - name: Create custom Maven Settings.xml + uses: whelk-io/maven-settings-xml-action@v18 + with: + output_file: custom_maven_settings.xml + servers: '[{ "id": "github-packages-compas", "username": "OWNER", "password": "${{ secrets.GITHUB_TOKEN }}" }]' - name: Build and analyze env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=com-pas_compas-sct -Dsonar.organization=com-pas -Dsonar.host.url=https://sonarcloud.io + run: | + ./mvnw -B -s custom_maven_settings.xml \ + -Dsonar.projectKey=com-pas_compas-sct \ + -Dsonar.organization=com-pas \ + -Dsonar.host.url=https://sonarcloud.io \ + verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar From f894f3d5e14671454bc73b8c854d253f84cf6704 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Fri, 20 Aug 2021 15:16:47 +0200 Subject: [PATCH 16/24] correct typo in maven command Signed-off-by: Mohamed Sylla --- .github/workflows/sonarcloud-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sonarcloud-analysis.yml b/.github/workflows/sonarcloud-analysis.yml index 1fe77aa5e..7f6d81e9d 100644 --- a/.github/workflows/sonarcloud-analysis.yml +++ b/.github/workflows/sonarcloud-analysis.yml @@ -40,7 +40,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | - ./mvnw -B -s custom_maven_settings.xml \ + mvn -B -s custom_maven_settings.xml \ -Dsonar.projectKey=com-pas_compas-sct \ -Dsonar.organization=com-pas \ -Dsonar.host.url=https://sonarcloud.io \ From 8b1cd3eea1ac7aa7c17422539cf8fee9a1bca5e9 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 23 Aug 2021 15:34:46 +0200 Subject: [PATCH 17/24] create compas sct documentation Signed-off-by: Mohamed Sylla --- doc/compas-sct.md | 30 ++++++++++++++++++++++ pom.xml | 6 +++-- sct-commons/pom.xml | 23 +++++++++++++++++ {sct-data-postgres => sct-data-pg}/pom.xml | 0 sonar-project.properties | 7 ----- 5 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 doc/compas-sct.md create mode 100644 sct-commons/pom.xml rename {sct-data-postgres => sct-data-pg}/pom.xml (100%) delete mode 100644 sonar-project.properties diff --git a/doc/compas-sct.md b/doc/compas-sct.md new file mode 100644 index 000000000..679b6f5b5 --- /dev/null +++ b/doc/compas-sct.md @@ -0,0 +1,30 @@ + + + +# COMPAS SCT (Substation Configuration Tool) +## Introduction + + +System Configuration Tool (SCT) is part of CoMPAS open source project. It goal is to bring a flexible and adaptative tool for configuring PACS (Power Automation and power Control System). It's an n-tiers architecture which combine reliabilitily, flexibility, modularity and adaptability to allows users to choose their own database to implement the SCT. + +The following architecture is divided in three major parts: +* sct-commons : .... +* sct-service : this part could be considered as the engine of the SCT. It computes all needed operations and uses sct-data for database access. +* sct-data : implements a generic abstract data service which should be extended by specific real data service for exchange with chosen database. +* sct-app : *TODO* + +*Insert diagram here* + + +## SCT COMMONS +*TODO* +## SCT DATA +*TODO* +### SQL-Like Database +*TODO* +### NoSQL-Like Database +*TODO* +## SCT SERVICE +*TODO* +## SCT APPLICATION +*TODO* \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3964dab54..6c37cd143 100644 --- a/pom.xml +++ b/pom.xml @@ -21,9 +21,10 @@ - 0.2.1 + local-SNAPSHOT 11 11 + UTF-8 sct-coverage/** ../sct-coverage/target/site/jacoco-aggregate/jacoco.xml ${basedir}/${aggregate.report.dir} @@ -38,7 +39,8 @@ sct-data - sct-data-postgres + sct-data-pg + sct-commons sct-service sct-coverage diff --git a/sct-commons/pom.xml b/sct-commons/pom.xml new file mode 100644 index 000000000..832b91ace --- /dev/null +++ b/sct-commons/pom.xml @@ -0,0 +1,23 @@ + + + + + + 4.0.0 + + + org.lfenergy.compas + compas-sct + local-SNAPSHOT + + + org.lfenergy.compas + sct-commons + local-SNAPSHOT + + + ${basedir}/${aggregate.report.dir} + + \ No newline at end of file diff --git a/sct-data-postgres/pom.xml b/sct-data-pg/pom.xml similarity index 100% rename from sct-data-postgres/pom.xml rename to sct-data-pg/pom.xml diff --git a/sonar-project.properties b/sonar-project.properties deleted file mode 100644 index 1b1deb96d..000000000 --- a/sonar-project.properties +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-FileCopyrightText: 2021 Alliander N.V. -# -# SPDX-License-Identifier: Apache-2.0 - -# Properties for SonarCloud to recognize the project -sonar.projectKey=com-pas_compas-sct -sonar.organization=com-pas \ No newline at end of file From ca2d82fa0731304cc8ce4965ab1c35c77a24fb74 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 23 Aug 2021 15:53:54 +0200 Subject: [PATCH 18/24] use known package version Signed-off-by: Mohamed Sylla --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6c37cd143..2b7030fe9 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ org.lfenergy.compas.core scl2007b4 - ${compas.core.version} + 0.2.1 From 2d7918f61f6d309268ae3d2b1f13f64f29b519c3 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 23 Aug 2021 16:07:19 +0200 Subject: [PATCH 19/24] add package diagram for compas sct architecture Signed-off-by: Mohamed Sylla --- doc/compas-sct.md | 2 +- doc/drawio/compas-sct.drawio | 1 + doc/images/PackageDiagram-CompasSCT.png | Bin 0 -> 37490 bytes 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 doc/drawio/compas-sct.drawio create mode 100644 doc/images/PackageDiagram-CompasSCT.png diff --git a/doc/compas-sct.md b/doc/compas-sct.md index 679b6f5b5..8b3abe0b3 100644 --- a/doc/compas-sct.md +++ b/doc/compas-sct.md @@ -13,7 +13,7 @@ The following architecture is divided in three major parts: * sct-data : implements a generic abstract data service which should be extended by specific real data service for exchange with chosen database. * sct-app : *TODO* -*Insert diagram here* +![Package Diagram](images/PackageDiagram-CompasSCT.png) ## SCT COMMONS diff --git a/doc/drawio/compas-sct.drawio b/doc/drawio/compas-sct.drawio new file mode 100644 index 000000000..9682326e1 --- /dev/null +++ b/doc/drawio/compas-sct.drawio @@ -0,0 +1 @@ +7Vtbd5s4EP41Pmf3wT1I4vqYOHa3Z3vJ1t2z7VMPBtnmFBALcu30168Ekg0IfEkwdjbJS9BIyNJ83wwzIxigUbR5m7rJ8gPxcTiAmr8ZoLsBhADYkP3jkodCYiEhWKSBLwbtBNPgFxZCTUhXgY+zykBKSEiDpCr0SBxjj1ZkbpqSdXXYnITVX03cBVYEU88NVek/gU+XhdSG1k7+Bw4WS/nLwHSKnsiVg8VOsqXrk3VJhMYDNEoJocVVtBnhkCtP6qW4b9LSu11YimN6zA1ROLbej79P3iXfI+Pj57dr8vbdEInF/XTDldjx6NOH+5upWDN9kIpgy0/45SoKJ6kbscvb9TKgeJq4HpevGf5MtqRRyFqAXc6DMByRkKT5BMjXPIzZrm8zmpIfuNRjmAaw+ITZOohCN8aT6p13+hhMDNYv1opTijetWgBb3TJSYhJhmj6wIfIGXexY8FE21ztwTUvIliVgDd0QpBKEWmyn3umcXQi1nwIBaIFgOB196QAGuTPA+ME65J6QpkI0n8+h5zVB5Jsz0zDbIZrnfx1BZFUhclSIdK0BIt3QzgURbINo9OnzuEuMUAWjHLEWjY/BnTG2VAwdZzSaTLpBwoRVJKChQgHMBiigdTYokAJF5tGhR6KIxFkrFNzv45Rri8R0Kvq55jOGSRAvvpCEC7i+qTuTnl4X7a2HB3ohuCdZQAMSM1GI53S/3zOw7etNRmXDGTLNbqDSTaMCFQLwjaGA5TR5trNBpTdC5bvUfbk4QbtqUshUTarx+XM2lIxWlIbJ4uUCBRy9Gig0+L5+gTLbgZptrgKoLvwYMK9M7Vaj2jOc/gzY0/wa1H4ZR2aab6qPHHBxqOxGqNwkGUAz5Eqbpexqwa9+c1eUsByN65QtJUl+f7lQ6vAwkAD2iqSjIPl3phobjv0bnuOzFkkw0+gtk4gaAuCppu9mS+wL3ZbUjDcB/cqutTeGaH0r9dxxvWiy8VBq3OM0YDvkbChkMdvt13LjW7mRTwR3zYdyZ32uYnfYV+oRNRiZBsgq9fARPou66QLTgyGaSoym+D7FITOXn9XVNSEvprsnAVt3a+K9zS3kFMWuxF3lOkZtIqQdmKjYtTJRTsTtHh/PTbmPV24+jpv2sdxEr9w8mZtqLek83CwxU2tlJoJPoKZVpWYx19Vw03rl5sncVIto+4g5C4n3o05F1s/LYFuyVEhb5umWYIUTlRQDFYod6fw4tWTYR1K6JAsSu+F4Jz2Bgtf0RN6esdRTrb6YxaB2H0rDEj4gO33BbetSxuv7xyNg7BvPLooVd2sWakFzn1nEJMZPcdDwqNihS59qHiS0sSe16Np71gvTR3O8hUtdc1xHZuPvtK7LOpHjxt7xZ+K4WgmWGTnPqQf8+FZmtua/K34iyiiIWGLqQFwWaZk8IJYyUO4uUns5NUvP44odyYH8N4drQbYbNiQ/Tip4r+UnNcOsOKrhnTFJIzfc9uc3F8vgvQAmG3UJmRdCTbNmulwLU1uxnOoSmbhQgBRfQQli8PSCglkvcl+6MqSrRe5+42Knu8D4EnExOjJ60S9YTwBdRS/1ic4dF++p6w+s281mM7DursIzXKbO7NSCsgZfYht9+hL1QOApAdtFqjSHDfmiUVtbIH6ybQPnwratnki4Mdejt8ooidjFXftDPyaUM+fAqyMiIsoNmBta4LnhTRgsuAlTbvy3rmgJg644hmFHVopq3thoeK8KgAbG1FPF7sxUPULoxEw7KCh0+GTWj61YXdaglYe1+UwNWurjYoGkdVwg2SHFeqxIGfLlWfm+mWM9jiZKAuLAfmnyv63D58+Zq8k3+uSmVeUm0h7JTauWb+haz9yEF+bmcSXIaz2+PPZo/SWlwicX8m278jsA7S9amrUi56HxdROrjT9PkdPot5APYP+RgH2Q0s8hhlTYIb9R6ssBq9XwJgfMkrFa/aVaZxEEKhdlhEgmfB5DOK8N1fPCKPD9sC23TMkq9nNK7ujztGpw7egEmOqL6XqfqaGhVoMV7e+0AA7n4ISn1DQ3w4avajr9fMmuHQ8hNc+GmqMq0zmbMtXy5XNRpl6PxBqU2fh5y/mU2VRbPHxQprG/+Vw9hpr+9X74/t2f40FRZzruzOk6/M6OBUZHbmjr5iXaQEXbsvt0Q2px8ClgfySvcO95qbkJbgAaDg4egTdr7r7jLcKE3dfQaPwf \ No newline at end of file diff --git a/doc/images/PackageDiagram-CompasSCT.png b/doc/images/PackageDiagram-CompasSCT.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad9078e42780e72f75a2b9873ab3980a5874aeb GIT binary patch literal 37490 zcmeFYcT`hb*Eb4?iWL++3My4VER+-=D4~Z=NTEeR10*2?5=fy}djX^u1)@?SO;k{n zsvbqEC{;i}1wp!kfDzHVf*#LvzwdqD?~Xg}pLYx;$=-9XGW-0kxi8q+nr&Jyy&5OdA)yTzwy6`_Cy-3_CJ8A)jemVp zf@pX$SZpPzi4p`tVfZo`huj(7-b6PBlgOr$)tGG3Au^LlcPFX2GkgFIc)*9@K_yd3 z9={%fXh1X%Y3Lk+K=GO|C8(hW1pI-*)DRjF!Y_Ivg+%{7gAF5?3Px9gpx|m6V5ohL zRJsQvfCawV;=vzH4R9H11ipbAT3|TA*FY_pD)=z;_4Ot>lH9DQY{BzTZ8fMCxV+EG z9B*T-1ThBRy{R-3_%I{6(-?wBj6InQA8-YQfT(Gx!Qh&3HBAj|a05pq6PeWi9LCgx z@(&$Yxf&e)YwaX9k@9Pw7C1A4jy?NOpc@WOv~mV3&;VG-6?PnJ2%4T3PI8bXO!C=Bh#0aS2bk6;Z83I=8aelQT0bf&kdErv)S z7{RrzeLdJlSUZ2aAdHzihmLdCMB&U#DFFxu%?agfk2ay%(P$RdHeNnx9V?2Ko3k4N zrl~_E=>&899Cgf1Sxy=>6SBX#yAF*?1Kc5cvI$P$lj0T($FKtkK6b%yLvNN1+|!0` zjPOVK!2>PKzj57yBHb&YU3%WTy zI1q|(^6@15)3vS0ObEiAW$x(??gtU<*g(TjEE5xaAo%3C1rcrd3}7tE-x6&OGYiC!{k<&%-K?>}C?hR+ zkOfdbBSUro#gwXpxA6#|vm7ieyimqOZ-&1$l*sU56P>KxEG!)T8FU*4gn+>60KuTV z9ks|fV_-Qb4GR-HhNhV@6%VtwF+p2U%njifGTYQfhvw&IWoD!4BM>A7=76Qb;cSdX zu(_WNf#Xfa1bS&w1C5N#a3~L^y^)120_SLI#I(1-<8=^bPWG0jSfU}(!k%U1hw{=f z_ONlYq!}BMOkhriI&Ktai(nkX*pSQ!GG!UFFou>yH=L;v!Gh#~HpK?I8<|jStb9-u zrZ)m*V#|gRjBH52H=*!kQ;R?ycWbyIOv{;q_Hl!t>^!y1ok&nGPZ-0DWK4nw!UAn< zJW*tC2A1xoZHKYbbaI1Q`TF|?`1yMK*k~FVu{=zzd=TcIW*RoeL`@TKO-(-&V{d{n z+=FRKX3}6poRgESuOZuyZXHa-XwaBgXPPC!4@~c58DP(0)4eGk7Jg1Bz!oURh^~n- zg*rI|pzIAH40AZs(HBY#v?sx=sg^JV2hJu@5Db53qhJ#<%7o-j4Y2igz*u@?HBIe& zyx@2U9_Ql#wS^!E9E7E%mk&WB$jign8;h`GSsSsfiPRvpAsu7k>#Jc4=C^dS@@9A# zBb-Szgd54!!rs}5WKW^_n+F&>5}3Xa7R`|30MSGTLA=;Bdk-z98!V87W;2-_657w+ z-ocCH;SLMbMw!z!jj;@Z4T^0=C%Xqg{W;EVTK3og2s9Y&0e7SOvFrl_-2I&~7&6Qf zVr}lOfk9Jkh!`udWrl~XTM&cF(e#3&Y?&mSpCi`F4+BToc{sy#zk_HX{akP=fJV&Spe{mOa&yO}Dc^ySY=XVL>bi!kR9yW?LOorY#r(<>N~? z!7-g|f&(>zG`)RkL_kY)@HHbs9D zo?0}lv74P0%gfo@jHXQ@yR$4Pwm1to*$n{+^0hN})b=;?VL7s3{_Yej<;l4 z8XJ+#NsgK@jxW&>MnZ7{ElkYtPzMyz-Oa>91844s_O?Tj@a_nPw=qWB*UZer!Wm`) zL4YAOe1pMXv^NW-W#}C2sN-pY3xtvUh%`-27MAG8_6dLo;v8`9L}x<_H!ToOjc91L zHWop`dze@wNSfB(Fh`1$zz;HQsSJ{>k-MWuprM0#pr3Yt5!#*X#Ky8b;20g06-mHX z2!mtoOYP7X`2(ra9tv%7khED8Y2RE=3nx`cr07lY; z5nyB#hRD>m@%0KeNBAIg+;m_zKEPr7YdgTHaCUG2PJ?0ML1!?mJn2w^CEEjyW*Y~A zg<7!99BDrOz_ALZK!>EJJgeHx^DZHy1=wl$I$T1~IatYYI{n_ds@_2g?>~ zZR8F|1i&;s0uU@;Hwe?#mx0%|HuN&o^g|mu1v?sATicjWO(5PDU?<=oGYIN!=}jhi z6CFst2$Thj_&LsOjTGa4=%xEy;nt9vHfnjRO^B zO%<3g(ahV{ThoCa01}2kO}v&Z+~3j{63yL{kmj;lv?#`g)6^nwiqD8jBSkn z<5Inf`#+liB#*SgIv6*pV*jo~E;n?#r}QW)MrL2Do_^;wPFK2($Jg6_%#YVe?q9l! zj~>zs35ZWVPzxKF2&IYhyAPE=ulZS@Ena{6TwT3nBDqojr?dXT4+=L-LHkW0Y4V$+ zYmni$FUy4)6}N-u6Fr8j#VwQfKi~DC`Tn;rGT0oodA$%m(O4$#l6s9>?ZLS~n>ENk z8>-(Fl`~7dNIA3Ktj+_wE<3>jXVBUG_w>|J6N%16ZN?AV>2CoMs;*V1{g%f&4}ADK zR5+uO+qIZ{M2+wrQf+IS@&1G10)^7Jys|4Zg%je)2T7W=prhSc zbw&9Je}CpH#z?gskLahGQ;+cRB$+H7hv{j(*PgD))WPY$fR%0E8iOh8Bz0+N4w_|Ze;3kFWKFi=~B~vO5OfPq$X(w zmV7*OCu1J_UfOBVzvrC~?OhBdET$C%Nfqiw(lG%GZV-PUkc z!?iE(RCIO3%{$&dKBRJ0GWoDR=%R1U&&P-FNKBrKpA?&dmdl2HJyX>GDYLBl9*6GP zzWoi3LKR~kS%&QBxP#Qv3hwI?}(Oc-doKdDWo<~s+O*RnF~iKe z`Z-U$ma*H;oxk1Isy~%rCKK*Tp9)Ld9X?Flf933aW)Z1}6nWjLp5IS1J^^-$_W+4^7B1#GWK6jIYl zsmh&ZPtQ>sc`gp^@o4*>=P}E<-7c#xHGB6mcpkN_yr5c4N}tr1e|2i7D7KNJ@q{gN zMz{Y3vyv5_bo$S-T(^o5KkxcDw#1y=d@p z7?75nT{HhL>CC#*wgS@dI6KAvB)$2IboIZaQIirH!=*zu*^54d3pjtmr#oGZ_6HiC z6{`*ROd%mW)jykwTNm}ZnNqtHLc+$<Sk1eXh0( z(>-}+w@uawi+P&9ePry_nB^YqwH^8xM6@%a%>CSmqg{qxTJO)9IjtR<U~=+EH)hXXx8y)lk7d^Q4NtRXN5#Fwi+Na6S9w4iqumqO^yL+>gKL9bv*Bl61EY?jzOb8GO zS%}fZ>M2f8t6I6Z5HR#K%Rp4(A7xNoC&yLY;s?Ux+c*&PBz8ZOlMn(#LJ1OG5^=4! z$tmH6a*JT-H=~haa&MCWP15cUSg=x@!g~=A=j4Tl+vRmG8p;U)BB8zVMe=f7V#~qh zlLpgZ=!dPsTMQnl0vc6BV=mZDp2^eI5|NR{AUYcRZaZZlBqqldHaBuIHbDM;#rfOn zs5d|*S=?0$k&!r&>&dMyl?&#JmCx&+T0l2xwX`0_!Oo|jkf7OEDzo)?h8-4 zuRWi<(0y#TqXEu^YdhGYga6slBz-y6Sc?B8L78JHB;p`auQDVo@@=bFt{|fBKWcxu zaId3l@GZ>)y)`XLret{=Kj@$%)1l(aCI*mo#Yw!=JJY#VupJ?1xj2hr^#9 z$_gz=eL!pzOAvH!MUeUp1Zg%AtQ{<|W<73Z&O-+Xje%oGy!!FCa^pJt%UUUKJEL;aO9w5j zkV8|0FpA^P{^IJJ!HkOOyDK4i`F29OEqo|_{F?~~NB*?In= zxA5)8&l%bS>P#%sb+Sv-ozWB?rW>X`(Nvd(PU%~B~;1m@67g74wu=L0HfNzuDFj`8U>OH)aci&JHTj1J`16@|9XbZr{FfATWO zU&2p3)Z41B`*E)*(@Kcnd?$b2wZ2+&_oWFSE9^;k1;q4Xg5arAw)$?0K@Gd z?2TtW`0pu2HA}qY3eDz6Y#uXY0~htGrCLRg@~~er8ZRO&<^gttXKT|R; zw{xO*A98=XA?lL^@KK3Y!CUo!fBeFnwzv#}xu{|?(3{O*oXw9h8%2Zxx7Wz6(>?o$ zSsClBNESPN4)7}LSX<&pP%&huvby!i5BuRp`+;PR0VnDrlA|NaG?(Me2EFXo^O(u< zK};fT4$J%c_DBxb_httAS4svZMG1)>k&g@wJ{fN*7bhu#NN%k?G$999zY?Dq+rDol zm-qk zY(a>o@jW*FLzU4;DRviMC@X2w`aVt#!>@_j2Oi0eBYhJC(NN9*j_%n z-C1Bg@8sU%k>aoCW7rd2Hgz$(RN!768YhaJ?ij7vxKobL=VNO^`O!j}bLm^u)Xqj4 zf>p`=GvDu3od;`{+PIRTT-y`n-M|xhb>HV``r&|Ek3D{T=eOM^8uwIiXp_qooQcM0 zDQI*$j*PswOILLF@1T_{k#gv$@+dc==KJU8ve-(0pP;!G?U?DA{z}KqM?M)04X)ko z8~Odm(oB{3+PYQTOQ-eMCWZcR9m3>?e7{}?kI;WBA%+eVf?EL(5VJYpUgMj4Zi7k4=u)%`_)Wk)||-H<(c){H;%n2qbA}D@Txn7x2_hIyQUQ7-4aUgxob)&rysIP zIe6jl1oa7oqQ97O1Z5RoA-cSrC&K^ucL1rSU^_FURk-4`O@=B6vm4`!w(L9-c>Bng zm&R@PXpZh(kvjysQzE95+^T3b1qoNqUxjMeygR?A1r;N0F*nje`u_EETgmZS1yXbP z?a66-RC~$jyyMRUefR0{T~l=1S_#KB0u8vyK7Al9*D6)IX_S}2w0xk8Vt`UUL(+FY z*Iry*xxX?X73jmR5S>n|q5puMpVDP$~N28eRKOR7Q!`5k28+v z(<;_?Vx zx(lz}^-8X;7i7-+MCilqRwoZuhFBz4+yHJR+A=R}eDwXZOCL^dP?NYf9NvL3<9Fea42=8ac)juR(e_vL9`0YLP zLqEEkKd5u4LLoA=;)xk?CGoFc4My0}ajJWy;rX&L^7s<#lZfJt9AMdN#8#Yvrx|bt zY9!}%Ut?pt8XEZj~hCB;pWdd0Spp%2spj_^;mV$yJ+AckwfP9?5YC&_+vb-$ud`< zM^WCuc1ukiN`keEjw(KP$S-hwX>tI>(??JdOI@?*o$|)#HqRH??iUOvaTz3059~y} z9MzPL7Y(l4*aGIgq7?1BQo}srOU9nqp$2lqEWQbHzIhkMSRihgFd37q!T4UolZC?L;LoysY zjBBk5+B$#u!106t#}^AZYW5A^M^o!(LKZCBY3TW)7o~;A_uCYde=0)mU%w{m`KWkm z%;A$uM@BA^3hHfQrZ=xSc;h_q)E+1HiR{*CW9^pX29LBP-b@btahp||f&a`#kIz*k zsB5bw{cUA$fUI7#EArc#+78Suua}2};-8AY<6nMm;d<#pRLtc^I#Vxp?gJ_HIAUuY zT5oQ|qNARtvNQjwFbI~yu#4N|A2qA2GTQRCtTJl|=mV6IWfHRzLv{mCzQ-V2OaOWr zm;=VkTjV6t<+!#tF?AaN(|2skc3BJMzIvfw-F+2A%77ooOfRpf-wwd99iR4j38IJC zMIpeI-D`o6g68&m4Yz{;`W}=iV?xrV7X<_o7lqcwe)+En0NWphgTeIHuAa@O3>>*2 z&Hn;IsSXIAx{;_YAcozR6}GLMK?AU2(QWbbK*if^V zb9)rp%jYcygA8^41-I~HJlgT=zR8ndVInf7n*`Qx_}}xye2ahpFzr$Nf6uhnKzZ{= zuYvKKuc~15`Hy!x*K%@IIA@9ze#>9%Xt_u`cWLmWlK#xVmbAdhsPEY(=?2etIQd4b zakyi>{bByAe&8(ZYJM);fm9)eHg(!tz%5VxfH)f%-2S59v?hG?9e|%KKpDwf|?d=<_58JIDAFD=dfNIk{jGZrCw7r2_{{R1Z)V?*m&#b?u({Vs))xqfO# zK_z9uy)Q2j3e@-$E9stCJbD;PJ9WVHSv}=e{ZhNyiqXF-tGwk76a>zac^VU{z?Ipk zXl5_RjlE69iSav>?R(cYMk(sy&WDbtYol+Vknw2rnuJr9ap<)#Vf#;pdLk32Fet6#57K)QQbnD_mCeYHgvg50xy;IYP z5K>dF%Z?pJ20MVds--s?Wz?(8rk^1uJ0u&XqH%j24<03c8O`6pGp}wRm--pISUps* zM@8@OV#4aVzjk)N=_)N`SCqDgAC#$?Axh~(1_Nt}?Pnp(Ct|9YyE)MxwT;60W0av~ z#~(`t9XIWb>yAKBv4?9e-t6h{Kh(F2bA=??$^9!-R?Te$8dhIV`BwA*as)V>Ps5O* zEIDpHrS4Q+wuoU$Yk%e9PRLEy>NWETD$3R=rn2fiO--By-;LjgDUN?+eH)YjY zySKXHi<-hyncQckUU98oFnNmH@hjgoPsLbPF4SLYNhpwNlgaFBy7<8=mzX$5db%o6 zQ5)A-+TSiqGpyLk--y);ja?1=YnTl4&ImiMm68>TBDi!nN<7-CbaB_615vv}7vo+R z@J57Qu3`0q(!z(0`S)Cg zq00wz5?b#SI@V97x94_qBP2cyYMb2hVx3A-J?a|VKk!)MRq%Z4Hv86*87=AV?dllF zvJk8`VU=01vcw-(b%0w^y>JCa>uOGXbGkY~u8F6bZuzx2RrNZf>U*&D`p$$v;--UM|Bw5Emcoka&6!d z^6*xP<2$_4?~+1iFcnbSu{9}UlCeqbfq=m^Dm@jXt9}o!SoBxZcFc}3znGaKJEO8we;hUr9(4W6 z`Y^Co+2T^u(Mt)f3yzt`PrJoj;dnHkR>kIe!Bg4usxPPkVN6oYwqM(xN(OLo^#>!Q zUKBBZuL~dFh9EcZ?0Mj)*p^P*dh#H5f#fsy=rUnJOZ=~NtAVZ$erM!*r~wnB9zTxG z#e`k$A_d%QX88PFGup1Z)R={izg^GU+QiThYlM;21Us}?2)loWwJT9s7Q1vVXv zz1#)~IjisW;K((gz>&&zmv6ss;BoHP9f_f>&*fV=JtJq;xh(YTs8h#Ggj`5b9Ln5% zzl-YA8vbN){JvuY3&*`Y6;k@bzv~-iN}={k%PPh3)Q7>&=rt-{t&NA1LlrWo%_wmn zaPu$1Z}jV)-I{s2JofOCD<&j!d=B^H(=7AL9kZrAVbgI-=lU52hg>R>?i9(+lxm#7 zN2LFF+I|CR=Jl6W{o+LGCc5XOvYu1|kt)a??5#D-xLVqaj z*p}ZO{-ir227;DSx$1|7S`S8)KdiSP!n5&tp*?9iy?s#eq?@q4320W(av!5M`S46t zd+LYz?FSsp%jx|dZyxwzvr(JelWs2lN1d}fdiSEu8W&{$qQ}BYAXU5TN`m~Q_ zscODMQA2O(LW3IDVQlhM_Br;)mygT6<+(N2UpO1r^Ppdd&i(;iA(rW)I=(rhPQPQ? z^P~Rd18Y!lH?G>z?Nl!-GhZNuK4)ZAA3M3V%zc2JLnC&*&4epoq$lIiJe6QV^EOs6LxxBR4+Pic-Y~H?&w1{Ah)L((q z_NuF+|2pU-hs(2$C;olbf{P5x30qn?d;ZGI4u-Q83*#{D)cHTGs%W-Qc9HoJJ;qIlvu_jA%eN0vQ(-ZOfjp(oro*-JO~SWQH2UMf!6`pic!E$KxT zdJh>{?%ktMe6&18$tvY(<~-~i{UupHoxgERJXyc;Su^FqoYjonTaf;arCh7~fXnoE zbSZ5-Ue!L`MM3wKXusNf7?CkvR_TIlnJDIkP0fzYQx}izhCzDrKg`{7sg#Bm{WrDX zNiFNldLI8=b8-LSXIZ7wImf-Ksut@inJ&*KGPVWaQ89fd8SA4Z$18TrG5_AhXTz-b ziAL3foKP`weEINrXBhJDvl`~S{(z}o(i`J4zoEK18QXbjP@DQ0hun)svPP_j^yc;E zwtfHjDm#X@-@ahm(OAdh=uBO>25%^{o^sciF&6vy*pVx36X)b|`W)47l@1`Dgs<0k zUIyvwmwd%NA{qYZbJ$O}43Vc&B?lFZkVDx5fGS+Z z2+q$It?u%aKKe(8VZyv=RbXSv0m;5q#kVkv8}zDQjrnmq>5ReP^~ix`{i$s2?c$yH zgC4b3G4fUGHeJn7+At6__~6`4j@6}hXTorMx$ICp<2;Ce0Ki!(GT^gg*2os@!(*|F z9zw&n6Rau7;>C3P#R~j!^v?NfZ=m00vUiNfU0uFlFp{!q!VrpE)1tC1cMhg#Ut94k zEoe!7qF>rIgwGjzdo@_;A_ez2PeI(!eBtTdiN)rnF*QEhqA11$ZD)DzoN7j14q+zj zD4+Y6{6D<_iyalF)0b#FJ_VMmxsO24$;w@c1@+zh?u~!){mjr_r6fuvPyZk^xzz;f z+tq`_t)DvAnb5$icAfBc=S^qsoq2IY)3mcDRAy#+-RJif%G`@-^Uj~U7Ftwf^Q&)I zhTAk~4P7uhyhq029X-6~j30M%-uQj}Q#I|GnQgWjP%bt5y-}*D&eZhQ6R{T+xd;*2 z)8u$GW4L|)^_DB}4Mtw8WR3G?shPz%C^rwb|6Q3rTTYT+wjl?{hs{{+QqS_3&41b! zTzMyOHa%91{N(Qop;t;9$EKG|kgI-f*=ry+46w{}-1mn*yZK)nkgTgV)r3|&GO>S6 zkx4^>pKQyO7k4Wip|$IdMkUlJvihJ{zwMU!=A1{Mc|+&=FH0^K7m?k zO#8FYy>lRmekdKA-blHt#F!|`UiK>-Sw7YhmT0>WnpZkmGg+$c22E>te`nBZ?19&F zsU`ast@l%WYcpgq^ufYHOZo}c(I>mqYt=x4r$x^u56~8GuRpiFr@Jw$^;j6hQyT}g zyEVy4DdVDL$H(BuWP~f?FSNfOO?-YjQtSdsqS)H|V z_pVyY;rdT?sIpS}Pr*cC@Gcu$ zKCKHi)0vX_y6xGfKgpv4H*4eGwaGg1=(R0&d(A*OHu zrr2yg<}OS;`Tv%{{$2xshObfaqWq41&R5P|1XYy5FAKky(E1BRC{J#_x{$x^fHLz1 zoL5oYm^e#uti@l!Gu~Oa;P2}Hh7r0<*ThH<+LUand%dtK_!-20I1d#-xtIT;WaW+k+#pyi zu|V!E6l|FC7Pf(P+FY}H$g6cf1)pp{@QcDOwxuR~0@7N7*-@p+j!qH8wq z-nVuSJMK+bfPd<^`6^MSp+U^dkL9J&8)Gl;Ul3rJQk>}aX{mSXn?ad*0&6I@0_Vo5 z0r<%U`>rMy@MvU*Alo(BB!H6JfNacp`dvYQD}DgY5UgA8#3LaDfGKlB7N@UI?Amiu zsA+oOGFWLyo^Dq?HDFJv^2uM6VbAvj)cZZ(qf$N?9`f-U>YUu8D8-rQz!LRvUZ*3E z1B{{8yxkTnQr_=>wc{qnxWa#Gy{g#hSU?eG8IPVx$0~|`2k6>2(<}Z7TX(`d<97SM zCbm6ffp%g!wy2Z;A~Lt0w`k2Nif^CRCC88g^h!}3f-Nc70*vsh(AUzX6(~nz4geYF z0hktPkOPhb;%y^}=76vK1-)FqMCgxPdhLEW`6|6abwv~>dis|%0gqep&!rJlx7@p& z{JWtv`RED&leOhoNIrabc9+rX!xh^&z=USQMdi2y&|H+*SJTM!-&^WF9#NeUFc8G- z=X4vc|8FJML0v4cFSG=}sNCwPms7Q?w{)MpV02#es^|p1I z_13)A?@=>=b`-q?m}9&$06cY<@4Qgt2FI=v=%9gcaI@9r~N-r zyNROG9OqK<|Gc9e$9$u{jCWeS(Es`Uf8No<(X0bOK|yV0RNRU}#i3_#7lG81q~+i4 z02;lr??^(*kR0I=6*;ZKxB z1W4F*PK*FqY=H~#S95@Pt-zzeWjrv^oZ0L0yy(v4ElSrf<9`Z_e~YY8gg+NJy4Y3Z|HQ9{ zp>1QAIWqi?U&!wvHm0zBy8I3ElHhpffA$J)&o0gau)PsuwrBg3fmgXVB>_gcs3`P@ z^Uc3qn9lq2iXLNax!CJQtN%xhn{3OyB=B|rpKIJewwXBpx&Dv;S>s$P*wmh?pwiu; zpB~Fk?s2)OE4+DkkiG~okY7F-xSthWib_zjYFwD=%Qd;M^^eBE4$cNmb?#^wm93r7 zlk@7h_-M=a15Jy&x|d|;#(3IE&$&S@i~jNG!T9zQM?}1w@1nU#=G&;XB7%lY14|KN zJo+BR@4d1bFFvc%<|1+6Z`mX%eI4krpPce+fx$2 z=l`y!PUtiqpl&!-rN~9bKL33d`_BCm40QDvJUT1_&Q9V$P22FmZzuv1C0 z^!1N7rmD}lxOdR(0_I8k=feHXHrth8!9f=K# zBfO}*ab;sT(LTcjiwx2zRyQ;4%fjy9(&(z=S`tE!GT-#!s# zoenWQyJ;7B_buALr=aj3VnfM-vnD;;W7|VTBGQJXG7=cDaYc zBS)OSj^oplx^J1EFmo(9@KYLT9DDQF1C?IyLhCb@D5;5wrTGKH@s&rL$`7ROWN^bs zX4FpiqTNnMKFg9y(ADUyU44oUF?x0Qu+nm>gU5nJn9stX?f1IJ=!UT!_iWU+th*KL zKJKLIq;oV+U$@0x&vt_%*R}z(S)gsPVxZwrP*E=>C+^X~mR^mKh9``)Ty6ULc_{aI zZMbRU@V?OEtENaCPd)3SDiIGMt^fE!w!CpDtgmrwNBQLoNfqSY^JmK zHoIK0U6Y7ExiGkPCSI|iBTldO$JVR-vL;?aWsl_AdU*BhCPO?Y^YzY*w9o=0-ODWk=@r`*KHNs45JRC&{7P0*sJfga36#o6?4tf$-M zm2SH~-~90Bk0r#EOxyRf)knMjHZCaf@^9Y;UTaXXJ$P((_)&a7wlLqi1(FO)hh|fb zwbj%!D_qtLhWnq~jhz{)XfEV?RepbrMs2z#=xzqlP_Ztl|e28Lv_sRAWzF=M3GyvLWpC3J&!X2 z9hi;SADa)we7Puhuv`%wh~y1vvAZLHqniEnw>Ya;kDZ=tEKx6T6YxIJ!PGff&*do;-$sWr*4p@o4H@d6f2|?Xjv)c z;pja{x`m{*`4NT_J2%?%9%jt2TY1aZ5>sdSbsbANC*D~h4)@b#;gfvpWyJgSf^-&i zAcF1_Ydwjrnf~Qj9_Ue%2g{#gDy9+;?oS^o8U%9t7Z2&hG`a;M)%e9*?IgVRfQzPy`lybel5@|v3xM4K2dGZ z-hhfr=@XpSWoqskr)hb=mP=H&d0!TCvvl{=i%q+A;(U~3#6kY(e(j0_uc@^E)crTH z00y`cK3u&aWUBWbb0BC`>azUs>L`t^`y7hWCi}|Oqg|SuxpA!-*Lm+Yt`qfpxCa!u z(A{3Ul$Nzy5wh;Vl}3=+@q3tA=l+tM!G(B9>WiMOYwKxf3|GREM51ZHmej{9>%Q8TYV<$*_bznqud^xzMlvbCjVFR{7TRwqdpq{@eTnw(|fPb@6o=V zC`EW>&rOUXb)f2Dw5-1CxA_Uj9P7O&UNyYjDiC1DpR%;FNqTlHRyKE)<%#ZFE^YrW z;?A`o<%42hZ9sl}HBh5(=uv!SmD~y&9*Gv6JBLsEGh@U?+q73$}3{4Oy+y6GSoP<13iqi?1Ifc7* znA)3H6h(lU2#IU~hy`k2Pd%k8Atsc(>CpDInUC7h`iH>rMY10*$W=m2Q8=Z)x^@5m zss#jhk@h^BM9=`-^I%a$UF>wcpcMZ_=M^pR$H55R^N6i!5Yok}AKxZshZE6HL`AL( z@FK3m3L3QYSO25!<)3>$aesa{18*)prv{)*Jb!WN|Fo41|A7DFRunHEQP`zT2R#5U zB~3$P1q1JNd2&+Vj#hA(>APn`D~8OdG3x})Y$hv0T(*Pa#;;x z(Yv&5LEQ(AXwP2g5_Jukf{%eSG|fwl2ql7l362*FS`bm-oG6bo$l7vbHhshRV_IVS z^fdG2%JKw~La6ux$7)&VQ2hQyc<(7(X;$lzx#;F}sLH6{#70 zvMPv01zCQ44~Wr+OS7iUHqMS^5qEll4xmcV9SyV@NM8{Zt+5a~5HeFOy?FAayq&q+ zz$9<^(G~&y20$+lHvs)f8%Vkitrxs9l}eKJbPsN{1@f!dY<;~ ze5GCh-Fc4cw^hqRJkEcgiTF8G7LsFT_&~RWtUpsVXUl(oNj*B&Iko@KGn|q$V5^Yx zf7lbHaLu-+u$sF^mwo=(vm#!Asu8l=!!0=oETV~TV5PYEq$STX(>2Z$2<-# zPV_pqo!8&5B>tO&AA#RXQgb16{0uUbvleacX(ctKSQHcPJt*OwYcNIXowl%#2fbk^ zt$B7;z{~*lzPIyOXWPNlH`7p%2e?93Q5lWXL=CUnKJC?EQNCU1tB7HE5KZDGF^Ut+;ECNgO|P z*Z$sL^9o!-j_QOV^KJbew?EwY6#eLJs;*^=B`?H*+r9mey3@X(L(0J}#SZiGTte;v z+G8N?m;Xq7yljbhZjUn1jP?gRPRl5ZSRzZjB;I`f`u+J(TykVRG+pQ z*@xqxv#USe>^E}(V!9tr>jI3b@O-nuNL&(_$JZW@5$IQh!jrcEbUMXVRA}BB^&<1I zRi-Xyxa%mR1-k*iA*va~&h*cX&%i0R+Rb+IYw(lUv~StsYNYOzD?lg4Uf*%=B|VT3 z=>gt_oOnx{17fjnNA+K}m6c6$EB;@Acm;y?DON&>xwMq z|4Kh5Q~4L4efkjl3^-3y1E4nGU{~5BfVHXt>x*krtF#8T6PzX{>Vk~;I(8KCJuds6 z*{!|0CC^OEmO;xPFg||j#+l8_YFgXuADLe?+7KvOE`<1TC*tum}(QSg5Az**hic|h>Vzx3cc8YLb`0y z0up(0F0|rrGpfLG4ghIYyQdc^4}&A0!)-dg!?AMEe_UiF1w7hnr(7%sQrP}j7%&aP z74x83Uju=axzIyt3L4Gi`KgQPfgW9S#N7)ZIi{OQ1I69~o>=i3FZ33VVaku{0_61< z??B#%)&eSW?ahFn5lyNbbh3k^Yoe`WeDxZBwDK)0d);}e?cV&AY}66+g)CzM|RKhKZS`m-MGA?seYYe9J=X| z0ob2)xb5C6;Q3dDKWjhiBkQ%-T@1~OxwzqPltHF{?f2QHT-!`t;)L|_t0V&mKXiD`Q!O;#o=@n zuI4~(F~xC=O;H&dJbZs9E-N#n;bhQ;=n}IdfhA=R3QQ-LrQwB5>a~-w#)81!V}k^G z<@KZSw3Y{JqQ}+SL6?97=r%07?mA>P^4twRM5qkT{PNXNd`Ndbc>I|vcBU-YttKL< zu*u^`--hV4qC3j_Q$2SIngo^g72dam6VR1cOS3kN9!hDOoVVU^Xg2*XWwn)->oAcE z!|h3hyAB7$fgUDE&Znd`^BXa++EneTl8z(%y~fI&h27U&>k>llrlaA|Z_5E!V`!-n zKXT=7TYil#^gkA_WqqM69DVOP8Q*=2Kue-=Tne48mQ;VQkbiXeK3%(pa`A>2+Jd*$ zxl}eeHs2$u4}ZHs0^Mn*^zh6xv-W>_0W9yU*ra)PWV?=saL~oHV@q{SCC_UD@VVKL z@zR0~f+BJm)<@AVUK^V>-<+h}G@UM)Eh;#YIJm`JiR*=WnGppuwo6z59gah4#VSYr zwJBOhUBmL_L%LG!wK|)#5yl0##yYAKhx^mZx!>y&Q8;9aly#w9Z|f*`r)pJAs&obb!TB@Zdse<0hAv$&acR2Mz$dHyPS`1oy+0 z%CinUVcB*o?FOm8kE(|5TVxYH;OxDo-{DDXqow8e*|YA@G~MP<*z1`r5TYK?G3|1O-7l(wh)^2_2+Jq=|Hp z5&@-ylmH?MO79R_l-`lv!3NSpN02H_LX%KKofZGjIp>-8oOfov%%>SYpuf1;S$nO$ z*4?h_x@`rT%FSDh0{}DU$HrJ$BZfy39KDOcNlXHRgE|>4>LtTWy?#~q2MDjNrUNsV z&cH6p@&_GwrWZoaBtT>4p%eRd)c#@L+S=tyk!KCxB{x=1&pna(?*L zwAs6YCH2LWYv_$%*rgs@Kn1~69JTKGR?TZ^ zH>E9=_RNo6ggGtgZ46gu8rNkG)H&by*i(NBnC*8F!no>yt!TNk7$gKvSImNu+Y7Y^ z5R?PnCw>DzK@7h|YcmUyT;|V9dXE7G`-Q&iR%JASAKI}qoU>;zjul}Gy&Ve+o#V=*2{Nv6 zprv#w>$I{{w2n4Row;JLr#YEJwvhI#Nvdk$2O6YYodXsgmNZ7?WKnMc3C@>@l~ z=@Bagvq~I_$kXhe_5{E?2lZ2hB0D7upQT&0?my)sE~-h_I>(~|Ct1Ghmth1_=o3|; z8Nr5CsMC<$SOx!3R}0vGj)GwCb|0vvc4-Q>+`QV1H_U6Lb=|RQjQE7{*=EyLM6QlG z#YZZ@r3z+2!qZ(tgsAe&F;1io(eG2|MP}WVuH!tE1WzlG-T5_k?i2p|y{p1@KV;p! z->~KC4BNRKn_V0tXTD&l`T$zqvg%;;$7=o})vH4XZ&fAa{-L|VHGWn|xIf}{7ga(}Pjd_m@>+$dO%N4OE$_7Imb^XYKFra>V%vRxA+Ha> zD1yyYQ(J!N#KYL7flt}P_%KztV4!hzHMY){AqP;>5zfiP?y&bjKBQxw%@fwH5KOENu&v)@=35;`d30u1ZjljU znBP(MkwXvVM>5DqH2Wf)Co0n$9d*^KLxd&P*lZ4=4O!!MzaJsLON zBn$iHat9^*mJ*2JN5g}6OPNuUFooC)|9E~!Uy+ZV5pA}e2Plcz^&YN8lZ!U(wVj{B zI-(e^mQzsuXnIjj@A8R2l^o^2Zv>)#cAUXS~jb^Yfgup_JY_g1l#QMqeqxg^vwU}iQCT4nuK~9 zKm|mH=@8WR#w51;dBusElh6RrY$oNkUa-^xl2CyimNAPE^JoIQ)yGKx=H*`dP2YtwTi~j2#ZFlmH6s_|E9~q0YvxAG* zSZZdbTE{A8W`^v)CeP-E>!z*MkLrHZZ7)rFl}Mho{qCi&RAl4lW?xL~Obm6|VxTQBeJ(ZUB%_8n^V_ft~tI~e^?0V>JMWe@=q5N;4^Rn-e%?YH_J z1=}d3t4EglTd{%TGfz!lA@a0ADkn7-We6}&LwWp$L>z**xo4d$Hj1L2Q9~Qow}(Dh z&6_KkuTlZ;1~aAxFt}p-s~u^3A|_Y9t^<$$tlrf@dPk85{e z2M>T>V&@^r+f&&DaY80NnUK|cVk)R`-oCy}W1KKtoP-7_9S8b*8eVhv`<%oaM((GI zI}0p)j}~`|w&ABD4pCrQu(B*Unp>`NfSN<@^TnV?CM=gBqHJ>I07CL}9|#m` z!o69(5~2ELltpldRB_qg03dDI@sx)DU|~-0w!DA;ss5k{ocsR;v>o{@^e+x3@VLH{ zkfP`oM0qn9b7B-}d$6zG#En16%5GidLKS5r*VF8lhX)5-4BjFEziLRJw->zg^#gc1 znmF~y%w#aRfXuZD@9ig&08bN<)>v%9w6{4eJ;t&&&$5@7IxV6ylra2`>Z&bEFG=ay|tz$MLenu6WKnko3Qd#qW=?ujC(J{>_C#Zl(#~+LXS=l|7cDv+!gS~tVpQ=3j>~P&bgxPKO6S?uAG*Hb)cr}qW|x$$E+5`! zev38Q`|~7oGc5qKoxc=DZAh!{zPIjEu1B|P`=b0f&B?zL-k2j(zv%|UE`>)yT}9QE8MW=of}$m3dqIOw zj4u_5V3CqIJQbpzpotOIXTk33FX6JRYlu5G-qiOu_l4(o!_1IMz(*R-^4<6}? z`OcS~$c92L8EkA#wfNOljAX7C%3)R&@=}&pR(kvors3(ThFOJ47<>ga@W$IzL`TnQ z5fH7~H#b`hWfJR=grhjwNFr~D22(HMZ_A2OID1VjA+`u5?H;@ zgH&um^U)D6wzFPcw^nN+!GHyY&sboszg*e|`Ga@g+ZkR=v0zB$4T|({c*Y+Hww(xX zTvUy~6L9^(SdL11dGUoZ=QcwLHs6i&n)qd)`h{>j6<;&sM@Q4jDK57hC$YT06z!Ts$YphQ9-=F9> z74JK*@A9(@y%uDTm%T}@mTlXJ{Y7$1AQAO5s{-U;D_vA~*LQLPT8L>4q4O2n*r`C2 z5Yg`IqEX5uPz(nZ)`e)AOE-hwqY=wInjm+jjWxarJusDp?tr&938Xwa4`HWGz%f>_ z+5JWZ>oq8-zDlqG61_8d52q{bXZ)Ns&_B1L3`+K+>?&o>zm0rfnpdY<9CVG((JpOt zy$Id}kW%`IcCv9$f-dAwf}${Q!0|?1%Ij3cqWvH-fVktxp|L=?+H_Dbym@H?5F3XZ@R!&RdQiFd02Via)2!`;G>RXoh@uz@v&b+ z@4t&`gy;MxSSK`bFLeGH0Dcl4oc?0q`~| zIW^Q2^WhNovBJxHW7;FK4N(zH(#EQh{_>M2vj%R)!AGPGDSP|tu4+ST`j@6`pr!Lm zeJWEnGk2l_#$O@q1W?-=1tvnssw~X;^7EvVe$EXAc{O~J$_V1@6sW$V8A&X6w5#L; zKl?efyY8MF&~hkVhdRaZHB`aGeQc&|td~cQy7LgNl3UNS3yaH}O}#c|p1=KV1W$KD zoKE$gcONqeh}d|n4hh;UrW`K~hJx46!94%9Udv|V&OWQF$y(Fmud9)bdR_V4<$C8k z5?K2?Wnh3Pv~z(mC}RV`0J1Am7YR^c$pGrVO48lOT-JUS<%#L~c*YjFwLaORsgcA* zdll1HXOV2uIL(F2W{L|>t9jdkib5E}>CZiPB86^L_dhJ6z0V%~v(`Dh4*^sr4!Lx9 zY;X0SkWwwx^CXhpsOi7|NP3=V)#ru9>hzAbHOFptwA{OQg*DKLIklMj;BtWkPkQ_MWP^2V<(N^g@3~CFeV>|$*_}-pT1kYhvN?ew9f6`u&Rl1E{G1}fUtT-=!yqBmiadLTKpzN{h%Kj1+aFmGQc5Z zdq$q72+j!dP$~n3Pd9+Sa6=4z<@t22%A*ov7T&fqO!;|Wi=sv{55H(p2A8OI0n2FQ zIf`qvc=YY`0CY4H<}R2o^}H;ne`?35>{$bA)!SvOtTZW8!2`J%=P3vK(Q%9KvV1vG z8@tth%}4`1F@qM&g}6rdcmAk?BgQ&o4Vfu0mi6r08DYSbK%}xWGKmub3aP0#eXKeY zNG6yRp?3LY(>&uOl}kvGvVVC<;8AIJktbtbDJtM_o5)SdjEg$%F2XV}1qV{c=N zF+YDhUlhzB+P@9Jfrfo2WoLRhz??2`>d}2k!XLV?zorV<f8E#pq*^I<_p0DYh?|;=3xFqCd($>lVZT(;qD(WK~(cI-uJ9V{_JStN*&EV|ahd zBFKy80LD<o9R=ys{@`Xdq`Peuk{^&y?h2m7tK$f<;o|+Xr>P_d?Su>RLPvhd4GzoMx% zo02vnw?_X(Bv10+S6TPnX<3L8Y(`e#{v%&(RPpRhbz@l~;LAU>S=LiuK8(ewOs1cY zot$C}Xj1kH0;2)>*xq&20=9Txyan(5)n6yXi>z(Z`Wghs4XB+%bj*+3IYf})>A1!K&f z?qKJ!QB)K1X$DZ_0jT-)e*22uoxNu~KWsW}t271fwZb!Se1Idb1M4XkO!Unkg|r?_ z_LScte3m?|Z?6i~yYcJT{KjLD%=mW^pdy1UvfKCMu{%4t2pra2^wtmG81!5&2Lq|f zUkmJwGUI0jVtEcBL(t*^JLSZ?9VW)GS{bKX#-f_Yr|5i;RlPavy=M&9q3Wy7)3}aB zhEdEO0O=X-R|sFx)aG)||9I$AxB#W79S`bCm;vGFc;0IcDlKuWy}%Cdygo@%NoZ`z zUeV)`gW6{^lqQ=f5i4N`D)x5Qk(Y2HqA0WGU-VQDxBp3N=m{jhaS&fYtVns?k7Tbi zomC%kLzE5|<@(3t<_-p$E`!P>Lr;RJ>l_z*mc03#GPEx$*AXp>i)`SOGFk>5qe zXX~?Vf3{sNl3W*QUG|so7G?Yg$n(F1yPY4czUKT}y!$fVYbN^V zCng66g3hkFd}jL%Cso?AK4}WBFU?OmrhPXX5gd2{9j0-e+d~8XYZ_YLQt94 z3rqB=w?t$hsBIlKlo9Q#ZC-%F#_v;*3UrwCoiy`*9#-%-iK}r^vSm^(-t?s3t7zik zvHgo<#(r#Qa&mUG?4-oY>XRKo>-;r?ma8j*5gB1^zbmgUjT*U!eM=UQ0(3mhu(c`5 zhdnE1Ov2{+wDg<8xEJLfzaSZp}x& zn2|!`%qYO+J77^?X~l0{aLcW#Vio01_=yOp=wF*1AhHJ{M^d?V;tyg)mhkdMs)3R& zH>awLWl^ALf5qvgy>e2NN9ri3D*=1m5gMks52!D!D1-oWj3Z$$Vp-}UEAl@0FByw< zyxpl<8CLtjDE0=ee|fRHsJ8~lxl2pszqmGal@fvXUU zt|q=hqre;vuIBrai}{C!>~Ja_1|Iz=`ibv*X~4KWxJDU>uZSvi5(?$0TmW&%FddgE zQ4k-9lBzBz7qKY;0GC$L-WJ!tIR>z4$o&%qyy6?n)o(G>1o$Y-@x99pqDs7o9II(j z)HN_v;li=D?Ei}g`&V))W2{D}@%Qh_@0y_@ve_fHM^}QeeSZe*gUJ z^pyN1Aou>aTWai+78s$kqoKxm57Ics&HYLdATsFtSf zC?23*rtax~!TrvT?&hzXdh(X53U#&;M9mVz3ue5mbJ!^b%%N2`hkq9jf&19bS8}-o zfR5@0X@R8(NWbMiqK@L+(e?y|E~N%raD()>-cw*pke3ZFJ0U>s zt587?lJkR*sCP}9JV!=#0mOQu1!WuKTjj+gE0tDX+gfKDYd&r^xL=)hoN4~!Zq|yJ zAMXmF{_*qC^FqUB^!`f%RvhllUPqI5%fZRc8@Z}XpS-8NcGCMOA3MYtDjd@i#SnhB zUI}?P{;inzR*z`_6RwxtfAacO@Me6~Dzdnsmv^$K`T69{V5|SU;PoBHJZ~-HdjP88de&xMyj?y#e6#YG0 zY}LT<>&Aj>I1hs8EQ-T;;P=fxe0%Wq$C1*D<=#U`;uruQcW(BsWU0J?&}qXTP@XD& z+?O2`q;uyGQz{8+Gwt)GzIn3~K=vvvN_qo`q5fqT^--jv*51EAuqN`H?uF)pk}AY+ zIU=)xa;Sd$tSWDL-G;SGa}TLGA_PvP-w+08Vo@_(^|_8ibdOE;nfLfoG=LiJeSdd_ znYj}l68tH>y;_hHIeIshwBkxeqnJt0rlA>oRuXY(&q^(emSgj2uQ zwOs`7`*mF>phXc@P^7W3SB-WlI4E^X;>U>`m`ohNQ?d55(YZ5qThe-4?5TK8Lko0z z-zhik$fhdOj-fXoPg4)QRuX5E_-QcveDVc@GxZ3M)4ps*-dm2Jm2m}T$7jyKec4p1 z*%A_MA8dpfw9ss=XjaO(Y+&un1!vIjnWHHeA)ON}VrF0{j5ggz<4#^28 zDkpHRbBZai`v+X8IR&Rx)508oYQ<=Ikb6aR&8Se9-KgH>gXk{)|rC+n$5BH??n`CS#g}!U9tKeMg zWj4W(6dJoVt>$HE_H-p>TLhXdCg>@bRIyLY0AW;>b-Bfs7_|N|x`bZ0uh-_KY<_Zw z^n4~4vz?rKYEg-plLez#?njNpwntKweF(2jKEPjQRSG@xbem4+7FilO^T`m^%rS!8 z5Uq0Pw%|a`Yb8%7=5+i_OYLGx*#4zivohSzQmnpP;I=r-7NbvP4^Fa>)w=VSqJfra zp%m-+)4(&7O~Kf1e(ha+oj+{CKLMMEW5av8><_fy>cZbL<9mjI`UXIDqClpt(e>Ut zc-33m^1_Iq+Fn@Q3S{Opcm4rR%j0qn!7urnND=$EDUfl}ooOC? zLZ|b5y3v5qdyb%CyW`GqeX6Dh3k3|iL1=$QV7F;sy%kiO`Py)Nvdwvxs_5+L=_+R| zxg6igSA*yI>Yhvw;`3Yh_gar6M~e*RtqN@pa3X=r1tA!+a$4$6ga{}B;F~--a61@%Si3FpIKm93 ztgBoEqHINW68KE+ARgq*JG(0;4eZdmOYT?<)qgM<7F%-s0Er_5@aR%rz67e)peQv$ zp#av7C|*06g_*UJ^Xr9w1xLC{M5K5iZ)4$i{cVu>WCiv;LcekKSrXVWMuf+}N_7G@ zmhD>Y2DS$+y;L_F7%%rYuaEM1Q6GCy+bv!W5(e*>gflg6Zi})K{ep)I*X2(Bl)V17 z!o&Mm$F2#jyXSOug73R4Pq*ny48WJxAZ>vI%SQ1 z&s9Pzw)gw3XF!Ig(tSm+(*LIzP>`xxKejGUcR?5wW^I1i{2Y!>B%xr_SNVJI4?)U? zRd^8O|>P zFnBR1s5}cmVX*+3K@9CTB{}R1*{j4B+k$kUUM^sw(!Tk+!oy~2n$AHWZmlaCgvcXJ z?O~3=6DQof3oK$#0>-SIn~CV!hRdVdgQS>haS(+m36LySP7VAFTt-KrAN;F?9Jj({FQ-|K!uR;v^|U|GhWqfin%R*1z0urRb}0#OQ<7i0FOz zJ{t<0O@>d8#2e2}!k648X~`H8^4?x23OHKj)H!GH-yKw~$9rg|K1+#id!vSH6anw8 zPkw*Bwl23y@!Y2t1efkoUm?h+QanX{9e zZ3OB9*l&Ur%RkEY|A^I3o)da9XSt1HjLh5s4QG=6Y}cx~`EgPzlJot3T_?>D_yUhJaS? z$ff!(FTla&zUa5V9veLq2oq?n_lec0JZ;br{{;f~ha-%$04~%?KtdnmBvdw>BA+Gn z4*22visT}A$JzHx+Oam>@3V@L-=pIKo$MSS-htQkB^lKDMo#F!eU|E2ww+x#Q1c

2z$Zyn8A6RCKsN3b}zc;9%a_*@@&Q2e@ZLj`sRTdW7#f?qUn=6-lN4;78A$ikqcb zdbOM^!G$!Bt()=H#Ecfh*HsqqbTV)M%^tU<*0oPKFFIVboJHzAM&zTAjdrl%k{1hE>PYOI<9b`CQRXk0#J z;r&wC)C6)@fT%EuKhpn-L*QY!*E>{em#8XSV{W3t0ga!*g<&xs{h^6|?GYVr1ZZ;? z<3&sq_AB{OZzF?q4ozRvH(V?WM#NdakQ^%&!4{fyyfuX52eQrrv{>GhT&{YuNg4JR z`@My)ACL#J$jZIs2T^P1CmEw|Zt)8Y$uNVDh}G=HlT^dJ zMn3)7z|)=;o1gt#7k}ovB#uEG_Fd7v$-k%2|wKz$MCZ$Dewxh zECD1o?(NW)2tAD^#$EFYcq?FvUtJL1GRXJ1-dKcuC&fp|mSmq#vlO5gGnv0!y@j7j zDIl9O;ATpM>vaWue30!|qWA~U?H+JXY;N^#^Gjf^8SY*NXAA##6`-xdi4U2BMTzj4 z-8nYlsd+Hb*zo@vCO#GMneG(`gK7WVpxyj~AB4*PItT?2Kwmq2d+micSgI3NuvAO+ zm$AqNAbrva{}_VL$rB@#L!@QE2m}6y5duvoDC<`SM({$l{rePvFD+qt3r0Y|6gz(% zkUwH9fI@CHJ&gj?J^cdyOUEei<=U6goi3rF2mrJJBDTg+;Q*M%#K` z!XgX65XyG1u}TG68a?dlj9e1OpO z3htVV8{Y>O)anu`xQxnB;S*jH_+l7-MuA}9Qv!iE2x19IpmExz@K5s?36LI;k_Qv_ zG6W$NOg*RD34a+MjIc|m|EC4bOKbcMJpNz1LD0GLR&Q_)50>b}(d$C2QUjeTwd5s} zON$hy?->;6pC|3fE7`=3k~WJ*s9gGLb<1;?{Kn^p&5EQtHm}KUf2Sb06}xmr!G7@> zpuM`px_{!hY#B1sDV`=;&S+q^wd6ONXs}iMmNfr(33poAC>MY*5`om>@C7=o zJ#pVJY8^VQMNz?13z@YMAI-t_q`krS-3VnL!13En0OB1bWs^Ck~VuS9II2{Q2-T%G7Ji zvv8-EpR#6c#Pw)>x~{IutT?k2xBN4~NJMtbi{Yo_#^#Zgp|RC=lp5Q0HeO;Y4PMk6 z%6NV3s`(uakr#+Iwi~ch@(hJw63O$I1CEL{+1BM}t`#mbUvl^n?A5%<mKSBg+6~>^AaPvz#aKUp4fNHfr<)!A#)H(48f9_@#=$dle#?GJDedN5ih9iGZP zT!cnA5R6rpoE0m3eSUT6-L*19Ah+^AEHX7w%cZi`F-qfUqc%*YZ5*s+ujreS*<&{g zRkyn0j;u@uSvQf2>8+VBp4r>`NDXLB%A^2(l{_4kzjtKpjZ}<0!6fOPYMooNkG8XK z?Y9v`(W5Yoh3B-KV2oz%}(UG_^eoyS#8Cu48V?(4R={eO>h@K0Xcc2F<7Y zKbNLo%szPbya@vO4Nd<%IFiY0CEao|bRJ);LTVWAc}FqIrb>ht^?M~HCgQQ}3H2MB zeF#jz$nDV{zZpG$^8fx!K#&@3*qh(P;NQhHTHDkV z=+9^XR~R;Paq!S)TUkd@kLxGvH~Tw$v$APt)>1c^qKUe~&f)NCCL*W*Vew9SUs#%C za@Z8o%QMd~Ln!ln5D^+3mg~D3uAaQ#sGp~m5+@;7lDV|-hK)bnxMK>NPlP_*R@sDu z#vTx$G4G^iA*@levAJo1QX4fI@PI=Bk~}{fa3wa;D?0H z6+#^#5JJWUc#Hg(k81rqX*mxhWnOUbjEWUVhcC5kY|4I}_>&$oRN_;W6Rzk>ZzATO zTz_k}3Px_!QYo{vqJj|<+?rJrD=nu;ly!HWUfy|rfQVG*!FgEFIZoxc{#tGf8)cfs zF~{HY zK=E+`S5{q1OzH$&d0VTi^^*k5QiUCnnA#?4<5MjQ;UVjTOji}Kfn&ff{x7q2jR!?+ z_Smr9Z+Tc&{s0F%AoI%@9JPJkg)k-&|Mv1Q9Ub^dsZv+)ZvCNOFw4Ks1S_g5a8;GX z1MV<7zF8I0ng5w}$LLL)%WH(4F%N(aCbA&wT5xi2dNy%CZ3x7BbWpFC7=38Qo# zR_90F+wR?0CIo2@5 zQ8*QLHJU1ynF4eI8Ggx%wZA}y6A89+F9LhPBKQ!tzJ-#*A!*{*Y6}R70iWMC9j5V$ad!=8xUHJf07gH?Q zI8iXG-}W2QQZDQ%0>J)8Ab*ngq{43|SCa<+-aZlEdQYVa4W`VNA?gL;9r5~?vpA98 zaXdn-_g-w8(hA$$S3pbL!5R&GN--S+7Z|B&kx<;n??md0U|}M8REcVV5;UM*3l}-M zvo8)W|NiCD#Gn9uukJ6U; z9)jqAZ1zftgV^EXCU9*Kh%wh)QDShwk_bL0AfItE_0bHPbQ#(l_@f zyKMngLSS|H1rO-Du|`NJ3S=@wEKgUWp-Dl8$?7_>(@bxy?}-*Y*2b$f=o%SuFptsPz#x(D2+=y_a@xjzYtBD0d7kgBLcU3SA%~$*U`l%HVMa6Rfc-h9r#}*L z*K&qL7zWCtbVN=w&9K}Tv$};Qb!7_Ai{zQpE}cp2qvG_$LNi4&*8^Pp2wFjhHDqfzI>r%Qb+zZ4r5B0|9;c;>S`_(w#bPC_^c zjwGdf1~hk5Z=pC#(auy^w~7>*jR`g8Qbp`pfp%J0?R-q>#*u42{f~oTTAIk_K5Xk1 z(o{?<>7iNtCUFMggmBKi=vMeq!EnWY&rUP%J_=SAe;T3b;mV4-D*ci zYgIU6a6hF%w5FzEIW19muA6r;-MzoCmT;@MSBCpWrhJSjkhEQSaFxOZKdQ1&RKSt? zqvZ0$vS~lo_bf)bvQmUQE9hi=Zy})e*I#eIXeM}OtlPFYUTOsTIeYA!HsmyypH$=~ z&=SOp7W%R7*mtBGgUu^`rmfL!r&3EfBG_$UQJ$ntW8O=Ru+g{Y;tK+7Q4ImWaQ@i$ zx~RNXwC>pqSBv1weXmh#ZhkQ3WLaVVH2av?K$4|I0YMxe#zo7I>&Dxlz!C-mL z^QL_p1-4%rkUExxoP8_N=*a537kAN7vB%mZ`@$o?Mh+hf+{*_yEQqqe zwuSp+7u6-bN_4L?N!=wOUym;u4or+r*%Mv?fR?~nu|@gcEgUSOPU!Z=FU8&CLE=bIISDT?vK>v z0syw~lW%YDyN>ek#7Whx-471g%e9a1&^0whbdYqajk0VN7u=`zlAbV)f5VE(cEXjG zm^L(jq#>-TN|HxGPi-)PfsYmz{FdcV$yp{&h)PUXGGp;}zoQCbxvGOxKJ>4^Bj~RO zep@m~EuW$j-$VC1!TV!xs)xz3VPRo-bk#QT=XDke&?}Xe;&wZWB_6JsWqB{*@J5Q* z^VBIY57^HnOr2!nQxtL+dT$egCWJ607yaOum%u-+zWPM*>%kll>Pejc8j4q<;%M>R z3lqO)M^1nO|BrglMNDuN9P!k|Z&=!+KY>b84&b(Ir%6CUUg8_AQqYewTjKjWy#m;b z%k`vFp5ta%ptnH)+MO4KfMOW-rTiJFBJ7BJMKsHkM$k)wWq|TQ;Qa~2WOO%w^C78; zzJTEQ>vpynksDx(04%~$h&&x3{#*qNgf5T`up%P3oCCu7ND8IG?VrE@d_n zVsJSJWKb%F|7!@*v_ak78cuEB`IfcBLE$QXlpyE?4@YudzwHx2TEO?4x4fAZP%EN^ zF6A+TY%e@L8$GoHDul?b8#X5uckcz9cq74X*b$${_1v#8C9FV+U}=xpFT9iiU$yM| z=eBP%X)~yaR{9+{`2Ycl1+rHY-$DCP+MbV)RYGvqQr~Ar660y@65!z$Za!Z&ehTJC zF`R4X9eWU{%ss}dw1L09`Bu<53wX&Vi(aJbJlO14Ig@(tb`XK^p8abmc`~D{Zzm8G zptq*fk`(~As8>$)p=J#NJr}3Vs1`>C!xR_0)33b!WCnANS>hGHH4uSy+mPdm~zFu3(RyLvfI zUPmWZZ@=cna_6m!<$Gq)ul~O2mU#G0fBik4aIk0%WFc{AATHJon!`~HOohCf`71Vz zZ-Ym~7I{+`ELGj00k%-xKn`}{0x?QmSwUYI4d_;+gsDFt4oLqMAO`n|wakfCf(F|DyOv$Us8z@P{_j`6L6AbUr4^gJF0MUK=RHSKaN z3}OrEl;qjSImv(?Aw_{JSjR}V{I3Wgn8Bf@)wQBTF1t8YG+x<&z`6MVJy%M?qD8%y zOz&T$D{Y0CLo*U5oU;6>ZZ|R1Vx4!2{Ptzs;KXadR+U7n&T>a^gFx%_Nb<28C@GCNHvE_p*1u$(YN7^e0h|n{1a51+8&dh zaOmhsV!EHLm|neJ7bjurJ32J}CHMgv)>Vs(Mf6eSpZ}tGlJ|_yC;`_94j^VES)T}r_E?K_o ze>c_-GqdrG-`%0feD<#MSP7D?3^Nqfoz+;^H4Rq}PRB(kLLt*$XuD-S$f9)$Um%;1 z3|{l*9Q0PS;g)BH%dK5RT_KqnvV7BhW5l7 zTZ77+J{UfFB$e!w;DSlp@IAIj9G^XK|2eG;eE?nALBccDP35mt{ywn*Q^KsweHBaz za~(KyKsw++hM8h?1!1=nJiButdz%6z05Pwx6$m--{M~zaHOolLym$l$#UrR^t-jCz zY7dE)aqwNgNPH~@WH3oKYxi)^ZO(=s1g+^108veF27z~_SHQwp@B*RLQq={D#ig72 z9Ufo%t$ifDi1A8C?_k=|1qjm39!Fu~6lEjV-dZd|qj25WhRQUSUHaf$$% zeO&mKck|yx1Zug%a_cl1I<*lXUsO@co_@E=gT1qK&FtY8=RpI3dN1_R}fwWR;gPne0p5N{J9x$!fH*NMJB zU;;)~tNh9pe~Z7L1lHE0-x+ HzWP4^_{E5; literal 0 HcmV?d00001 From 4f9572b521470e657662ba152cd68512ab9227a3 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 23 Aug 2021 16:16:17 +0200 Subject: [PATCH 20/24] add REUSE configuration files Signed-off-by: Mohamed Sylla --- .reuse/include | 12 ++++++++++++ doc/compas-sct.md | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .reuse/include diff --git a/.reuse/include b/.reuse/include new file mode 100644 index 000000000..eda09144f --- /dev/null +++ b/.reuse/include @@ -0,0 +1,12 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: compas-scl-data-service +Upstream-Contact: Rob Tjalma +Source: https://github.com/com-pas/compas-sct + +Files: doc/images/* +Copyright: 2021 RTE FRANCE +License: Apache-2.0 + +Files: doc/drawio/* +Copyright: 2021 RTE FRANCE +License: Apache-2.0 \ No newline at end of file diff --git a/doc/compas-sct.md b/doc/compas-sct.md index 8b3abe0b3..d5a113db1 100644 --- a/doc/compas-sct.md +++ b/doc/compas-sct.md @@ -1,4 +1,4 @@ - + # COMPAS SCT (Substation Configuration Tool) From e487cde717bb1adbf901846d978301560c2ad700 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 23 Aug 2021 16:27:46 +0200 Subject: [PATCH 21/24] rename .reuse file Signed-off-by: Mohamed Sylla --- .reuse/{include => dep5} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename .reuse/{include => dep5} (74%) diff --git a/.reuse/include b/.reuse/dep5 similarity index 74% rename from .reuse/include rename to .reuse/dep5 index eda09144f..6f9971099 100644 --- a/.reuse/include +++ b/.reuse/dep5 @@ -1,6 +1,6 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: compas-scl-data-service -Upstream-Contact: Rob Tjalma +Upstream-Name: compas-sct +Upstream-Contact: Mohamed SYLLA Source: https://github.com/com-pas/compas-sct Files: doc/images/* From 5ce20306d9b1a16b2abf287d0de6dc8539d87ba2 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 6 Sep 2021 15:25:00 +0200 Subject: [PATCH 22/24] remove empty modules, complete documentation ... Signed-off-by: Mohamed Sylla --- doc/compas-sct.md | 106 +++++++++++++++--- pom.xml | 3 - sct-commons/pom.xml | 87 ++++++++++++++ .../compas/sct/commons/CommonConstants.java | 15 +++ .../sct/commons/CommonConstantsTest.java | 14 +++ .../src/test/resources/scl_schema.properties | 0 sct-commons/src/test/resources/scl_schema.yml | 0 sct-data-pg/pom.xml | 24 ---- sct-data/pom.xml | 24 ---- sct-service/pom.xml | 30 ----- 10 files changed, 206 insertions(+), 97 deletions(-) create mode 100644 sct-commons/src/main/java/org/lfenergy/compas/sct/commons/CommonConstants.java create mode 100644 sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java create mode 100644 sct-commons/src/test/resources/scl_schema.properties create mode 100644 sct-commons/src/test/resources/scl_schema.yml delete mode 100644 sct-data-pg/pom.xml delete mode 100644 sct-data/pom.xml delete mode 100644 sct-service/pom.xml diff --git a/doc/compas-sct.md b/doc/compas-sct.md index d5a113db1..1e5dd41d7 100644 --- a/doc/compas-sct.md +++ b/doc/compas-sct.md @@ -4,27 +4,101 @@ # COMPAS SCT (Substation Configuration Tool) ## Introduction +The CoMPAS SCT (System Configuration Tool) is part of the CoMPAS (Configuration Module for Power System Automation) +ecosystem which is an open source project aimed at providing a tool for configuring control system and +profile management related to the 61850 standard. Its architecture allows an easy integration with the other +components of CoMPAS, in addition to being modular and flexible with a high level of abstraction, it gives +the freedom to implement the tool with the database of its choice. -System Configuration Tool (SCT) is part of CoMPAS open source project. It goal is to bring a flexible and adaptative tool for configuring PACS (Power Automation and power Control System). It's an n-tiers architecture which combine reliabilitily, flexibility, modularity and adaptability to allows users to choose their own database to implement the SCT. - -The following architecture is divided in three major parts: -* sct-commons : .... -* sct-service : this part could be considered as the engine of the SCT. It computes all needed operations and uses sct-data for database access. -* sct-data : implements a generic abstract data service which should be extended by specific real data service for exchange with chosen database. -* sct-app : *TODO* +The below package diagram shows different part of the tool architecture. ![Package Diagram](images/PackageDiagram-CompasSCT.png) +Hence, we can distinguish four major parts: + +* **[sct-commons](#SCT-COMMONS)** : a library that contents shared functionalities for the bound SCL object. +* **[sct-service](#SCT-SERVICE)** : It computes all needed operations and uses sct-data for database access. +* **[sct-data](#SCT-DATA)** : It holds data models and database connectivity services. +* **[sct-app](#SCT-APPLICATION)** : *TODO*. ## SCT COMMONS -*TODO* +This package holds a light weight and configurable XML binding tool based on the JAXB utilities, and set of bound SCL +objects adapter. Actually the JAXB generated SCL objects can only be read through from the parent tag to child tag. That can be very limiting. +The adapter concept allows: +* navigating in all direction (upward, downward) +* more flexible manipulation of the JAXB SCL object +* considering specific algorithm based on SCL version + +The SCT services specification of the norm IEC 61850 will be implemented in this package. + +The Approach behind the SCL adapter is to complete the navigation provided by the JAXB tool, by adding +functionalities that allow the browsing upward (from child to any ancestor). The conception is based on the +abstraction defined below : + + public abstract class SclElementAdapter

{ + protected P parentAdapter; + protected T currentElem; + + public SclElementAdapter(P parentAdapter) { + this.parentAdapter = parentAdapter; + } + + public SclElementAdapter(P parentAdapter, T currentElem) { + this.parentAdapter = parentAdapter; + setCurrentElem(currentElem); + } + + public final void setCurrentElem(T currentElem){ + Assert.isTrue(amChildElementRef(currentElem),"No relation between SCL parent and child elements"); + this.currentElem = currentElem; + } + + protected abstract boolean amChildElementRef(T sclElement); + } + +The root element adapter (entry point) is special as it does not have any parent adapter, hence, its method `amChildElementRef(T)` +should always return `true`: + + public class SclRootAdapter extends SclElementAdapter{ + private version; + private revision; + private release; + + public SclRootAdapter(SCL currentElem) { + super(null, currentElem); + //set version, release & revision + } + + public SclRootAdapter(String hId, String hVersion, String hRevision){ + super(null); + this.currentElem = initialize(hId,hVersion,hRevision); + } + + @Override + protected boolean amChildElementRef(SCL sclElement) { + return true; + } + + [...] + } + + + ## SCT DATA -*TODO* -### SQL-Like Database -*TODO* -### NoSQL-Like Database -*TODO* -## SCT SERVICE -*TODO* +Data models and connectivity to database are defined here. Data access layer is an abstract layer that defined connectivity +interfaces. This layer manages a database with single table (SQL-Like database) or single collection (NoSQL-Like database). +The concrete data access layers are implemented in specific packages + +* ### SQL-Like Database +An implementation of the sct-data connectivity interface with custom data models. This allows the application to work with sql-like database. +The libraries ares use for SQL-Like databases, those that support XML type (PostgreSql, Oracle, etc) + +* ### NoSQL-Like Database +Like SQL-like part, this package contains the sct-data connector interfaces implementation for NoSQL-Like databases (BaseX, existDB, etc ) +that support XML processing + +## SCT SERVICE +This module implements all needed specification as functions (methods in Java). As shown in package diagram, +it interacts with sct-data (database access) and sct-commons (delegate SCL manipulation). ## SCT APPLICATION -*TODO* \ No newline at end of file +**TODO** \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2b7030fe9..85f76eb2e 100644 --- a/pom.xml +++ b/pom.xml @@ -38,10 +38,7 @@ - sct-data - sct-data-pg sct-commons - sct-service sct-coverage diff --git a/sct-commons/pom.xml b/sct-commons/pom.xml index 832b91ace..4c4876c07 100644 --- a/sct-commons/pom.xml +++ b/sct-commons/pom.xml @@ -20,4 +20,91 @@ ${basedir}/${aggregate.report.dir} + + + + org.springframework + spring-context + 5.3.3 + + + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.3 + + + com.sun.xml.bind + jaxb-impl + 2.3.3 + runtime + + + org.springframework + spring-oxm + 5.3.2 + + + org.projectlombok + lombok + 1.18.16 + true + + + org.junit.jupiter + junit-jupiter-api + 5.7.0 + test + + + org.hamcrest + hamcrest + 2.2 + test + + + org.mockito + mockito-core + 3.6.28 + test + + + org.mockito + mockito-junit-jupiter + 3.6.28 + test + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.12.3 + + + jakarta.annotation + jakarta.annotation-api + 1.3.5 + + + + + + org.jacoco + jacoco-maven-plugin + + + default-prepare-agent + + prepare-agent + + + + report + test + + report + + + + + + \ No newline at end of file diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/CommonConstants.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/CommonConstants.java new file mode 100644 index 000000000..01f29cbf4 --- /dev/null +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/CommonConstants.java @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: 2021 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons; + +public class CommonConstants { + CommonConstants() { + throw new UnsupportedOperationException("CommonConstants class"); + } + + public static final String XML_DEFAULT_NS_PREFIX = "scl"; + public static final String XML_DEFAULT_NS_URI = "http://www.iec.ch/61850/2003/SCL"; + public static final String XML_DEFAULT_XSD_PATH = "classpath:schema/SCL.xsd"; +} diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java new file mode 100644 index 000000000..b2a3ecb27 --- /dev/null +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java @@ -0,0 +1,14 @@ +package org.lfenergy.compas.sct.commons; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + + +public class CommonConstantsTest { + @Test + public void testShouldReturnNOKWhenConstructClassCauseForbidden() { + assertThrows(UnsupportedOperationException.class, () -> new CommonConstants()); + } + +} \ No newline at end of file diff --git a/sct-commons/src/test/resources/scl_schema.properties b/sct-commons/src/test/resources/scl_schema.properties new file mode 100644 index 000000000..e69de29bb diff --git a/sct-commons/src/test/resources/scl_schema.yml b/sct-commons/src/test/resources/scl_schema.yml new file mode 100644 index 000000000..e69de29bb diff --git a/sct-data-pg/pom.xml b/sct-data-pg/pom.xml deleted file mode 100644 index bcac26036..000000000 --- a/sct-data-pg/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - 4.0.0 - - - org.lfenergy.compas - compas-sct - local-SNAPSHOT - - - SCT DATA POSTGRES - sct-data-postgres - 1.0-SNAPSHOT - - - ${basedir}/${aggregate.report.dir} - - - \ No newline at end of file diff --git a/sct-data/pom.xml b/sct-data/pom.xml deleted file mode 100644 index 106e95804..000000000 --- a/sct-data/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - 4.0.0 - - - org.lfenergy.compas - compas-sct - local-SNAPSHOT - - - sct-data - SCT DATA - - - ${basedir}/${aggregate.report.dir} - - - \ No newline at end of file diff --git a/sct-service/pom.xml b/sct-service/pom.xml deleted file mode 100644 index 51bf69b5f..000000000 --- a/sct-service/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - 4.0.0 - - org.lfenergy.compas - compas-sct - local-SNAPSHOT - - - sct-service - SCT SERVICE - - ${basedir}/${aggregate.report.dir} - - - - - org.lfenergy.compas - sct-data - ${project.version} - - - - \ No newline at end of file From a9cc9c15fe957fe5ce83c1cd6aa425a6381f495f Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 6 Sep 2021 15:27:33 +0200 Subject: [PATCH 23/24] add reuse compliance copyright to a file ... Signed-off-by: Mohamed Sylla --- .../org/lfenergy/compas/sct/commons/CommonConstantsTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java index b2a3ecb27..53df21759 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/CommonConstantsTest.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2021 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + package org.lfenergy.compas.sct.commons; import org.junit.jupiter.api.Test; From edc3d0d8ab9406a0532e9fe4fae52feea5b43a43 Mon Sep 17 00:00:00 2001 From: Mohamed Sylla Date: Mon, 6 Sep 2021 15:31:32 +0200 Subject: [PATCH 24/24] adjust jacoco aggregate module ... Signed-off-by: Mohamed Sylla --- sct-coverage/pom.xml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/sct-coverage/pom.xml b/sct-coverage/pom.xml index 9a9b58895..69de14b2e 100644 --- a/sct-coverage/pom.xml +++ b/sct-coverage/pom.xml @@ -24,14 +24,10 @@ org.lfenergy.compas - sct-data - ${project.version} - - - org.lfenergy.compas - sct-service + sct-commons ${project.version} +