diff --git a/pom.xml b/pom.xml
index 93b4ce701..06ec1526f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,7 +52,7 @@
gridsuite
org.gridsuite:network-modification-server
- 0.42.0
+ 0.43.0-SNAPSHOT
1.31.0
2.14.1
diff --git a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java
index a3a61c8ee..ae45b7142 100644
--- a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java
+++ b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java
@@ -10,6 +10,7 @@
import java.util.Map;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.*;
import org.gridsuite.modification.server.entities.equipment.creation.*;
import org.gridsuite.modification.server.entities.equipment.deletion.*;
import org.gridsuite.modification.server.entities.equipment.modification.*;
@@ -20,8 +21,7 @@
import org.gridsuite.modification.server.entities.equipment.modification.attribute.IntegerEquipmentAttributeModificationEntity;
import org.gridsuite.modification.server.entities.equipment.modification.attribute.StringEquipmentAttributeModificationEntity;
import org.gridsuite.modification.server.entities.equipment.modification.byfilter.*;
-import org.gridsuite.modification.server.entities.tabular.TabularCreationEntity;
-import org.gridsuite.modification.server.entities.tabular.TabularModificationEntity;
+import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity;
/**
* @author Ayoub LABIDI
@@ -50,7 +50,6 @@ private EntityRegistry() {
register(ConverterStationCreationInfos.class, ConverterStationCreationEntity.class);
register(LccCreationInfos.class, LccCreationEntity.class);
register(LccConverterStationCreationInfos.class, LccConverterStationCreationEntity.class);
- register(TabularCreationInfos.class, TabularCreationEntity.class);
register(CreateVoltageLevelSectionInfos.class, CreateVoltageLevelSectionEntity.class);
// // modification
@@ -64,8 +63,6 @@ private EntityRegistry() {
register(ShuntCompensatorModificationInfos.class, ShuntCompensatorModificationEntity.class);
register(VscModificationInfos.class, VscModificationEntity.class);
register(ConverterStationModificationInfos.class, ConverterStationModificationEntity.class);
- register(TabularModificationInfos.class, TabularModificationEntity.class);
- register(LimitSetsTabularModificationInfos.class, TabularModificationEntity.class);
register(ByFormulaModificationInfos.class, ByFormulaModificationEntity.class);
register(ModificationByAssignmentInfos.class, ModificationByAssignmentEntity.class);
register(EquipmentAttributeModificationInfos.class, EquipmentAttributeModificationEntity.class);
@@ -76,6 +73,11 @@ private EntityRegistry() {
register(CreateVoltageLevelTopologyInfos.class, CreateVoltageLevelTopologyEntity.class);
register(MoveVoltageLevelFeederBaysInfos.class, MoveVoltageLevelFeederBaysEntity.class);
+ // tabular
+ register(TabularCreationInfos.class, TabularModificationsEntity.class);
+ register(TabularModificationInfos.class, TabularModificationsEntity.class);
+ register(LimitSetsTabularModificationInfos.class, TabularModificationsEntity.class);
+
// // attatching and splitting
register(LineAttachToVoltageLevelInfos.class, LineAttachToVoltageLevelEntity.class);
register(LineSplitWithVoltageLevelInfos.class, LineSplitWithVoltageLevelEntity.class);
diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java
index 050d0be72..c157b5fbe 100644
--- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java
+++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java
@@ -43,16 +43,14 @@ public void update(ModificationInfos modificationInfos) {
private void assignAttributes(EquipmentModificationInfos equipmentModificationInfos) {
equipmentId = equipmentModificationInfos.getEquipmentId();
- List newProperties = equipmentModificationInfos.getProperties() == null ? null :
+ List newProperties = equipmentModificationInfos.getProperties() == null ? List.of() :
equipmentModificationInfos.getProperties().stream()
.map(FreePropertyEntity::new)
.toList();
if (this.properties != null) {
// update using the same reference with clear/add (to avoid JPA exception)
this.properties.clear();
- if (newProperties != null) {
- this.properties.addAll(newProperties);
- }
+ this.properties.addAll(newProperties);
} else {
this.properties = newProperties;
}
diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularBaseEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularBaseEntity.java
deleted file mode 100644
index 9f350afdf..000000000
--- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularBaseEntity.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Copyright (c) 2021, RTE (http://www.rte-france.com)
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-package org.gridsuite.modification.server.entities.tabular;
-
-import jakarta.persistence.CascadeType;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.MappedSuperclass;
-import jakarta.persistence.OneToMany;
-import jakarta.persistence.OrderColumn;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import org.gridsuite.modification.dto.ModificationInfos;
-import org.gridsuite.modification.dto.TabularBaseInfos;
-import org.gridsuite.modification.server.entities.ModificationEntity;
-
-import java.util.List;
-
-/**
- * @author Franck Lecuyer
- */
-@NoArgsConstructor
-@Getter
-@MappedSuperclass
-public class TabularBaseEntity extends ModificationEntity {
-
- @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
- @JoinColumn(name = "tabular_modification_id")
- @OrderColumn(name = "insert_position")
- private List properties;
-
- private String csvFilename;
-
- protected TabularBaseEntity(TabularBaseInfos tabularBaseInfos) {
- super(tabularBaseInfos);
- assignAttributes(tabularBaseInfos);
- }
-
- @Override
- public void update(ModificationInfos modificationInfos) {
- super.update(modificationInfos);
- assignAttributes((TabularBaseInfos) modificationInfos);
- }
-
- private void assignAttributes(TabularBaseInfos tabularBaseInfos) {
- List newProperties = tabularBaseInfos.getProperties() == null ? null :
- tabularBaseInfos.getProperties().stream()
- .map(TabularPropertyEntity::new)
- .toList();
- if (this.properties != null) {
- this.properties.clear();
- if (newProperties != null) {
- this.properties.addAll(newProperties);
- }
- } else {
- this.properties = newProperties;
- }
- this.csvFilename = tabularBaseInfos.getCsvFilename();
- }
-}
diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularCreationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularCreationEntity.java
deleted file mode 100644
index dbd5abc30..000000000
--- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularCreationEntity.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- Copyright (c) 2024, RTE (http://www.rte-france.com)
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-package org.gridsuite.modification.server.entities.tabular;
-
-import jakarta.persistence.CascadeType;
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.EnumType;
-import jakarta.persistence.Enumerated;
-import jakarta.persistence.OneToMany;
-import jakarta.persistence.OrderColumn;
-import jakarta.persistence.Table;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.NonNull;
-import lombok.Setter;
-import org.gridsuite.modification.ModificationType;
-import org.gridsuite.modification.dto.ModificationInfos;
-import org.gridsuite.modification.dto.TabularCreationInfos;
-import org.gridsuite.modification.server.entities.ModificationEntity;
-import org.springframework.util.CollectionUtils;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Franck Lecuyer
- */
-@NoArgsConstructor
-@Getter
-@Setter
-@Entity
-@Table(name = "tabular_creation")
-public class TabularCreationEntity extends TabularBaseEntity {
-
- @Column(name = "creationType")
- @Enumerated(EnumType.STRING)
- private ModificationType creationType;
-
- @OneToMany(cascade = CascadeType.ALL)
- @OrderColumn
- private List creations;
-
- public TabularCreationEntity(@NonNull TabularCreationInfos tabularCreationInfos) {
- super(tabularCreationInfos);
- assignAttributes(tabularCreationInfos);
- }
-
- @Override
- public TabularCreationInfos toModificationInfos() {
- List creationsInfos = creations.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList());
- return TabularCreationInfos.builder()
- .date(getDate())
- .uuid(getId())
- .stashed(getStashed())
- .activated(getActivated())
- .creationType(creationType)
- .creations(creationsInfos)
- .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream()
- .map(TabularPropertyEntity::toInfos)
- .toList())
- .csvFilename(getCsvFilename())
- .build();
- }
-
- @Override
- public void update(@NonNull ModificationInfos modificationInfos) {
- super.update(modificationInfos);
- assignAttributes((TabularCreationInfos) modificationInfos);
- }
-
- private void assignAttributes(TabularCreationInfos tabularCreationInfos) {
- creationType = tabularCreationInfos.getCreationType();
- if (creations == null) {
- creations = tabularCreationInfos.getCreations().stream()
- .map(ModificationEntity::fromDTO)
- .toList();
- } else {
- creations.clear();
- creations.addAll(tabularCreationInfos.getCreations().stream()
- .map(ModificationEntity::fromDTO)
- .toList());
- }
- }
-}
diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationEntity.java
deleted file mode 100644
index c9af5f86b..000000000
--- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationEntity.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- Copyright (c) 2023, RTE (http://www.rte-france.com)
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-package org.gridsuite.modification.server.entities.tabular;
-
-import jakarta.persistence.*;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.NonNull;
-import lombok.Setter;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.gridsuite.modification.ModificationType;
-import org.gridsuite.modification.dto.*;
-import org.gridsuite.modification.server.entities.ModificationEntity;
-import org.springframework.util.CollectionUtils;
-
-/**
- * @author Etienne Homer
- */
-@NoArgsConstructor
-@Getter
-@Setter
-@Entity
-@Table(name = "tabular_modification")
-public class TabularModificationEntity extends TabularBaseEntity {
-
- @Column(name = "modificationType")
- @Enumerated(EnumType.STRING)
- private ModificationType modificationType;
-
- @OneToMany(cascade = CascadeType.ALL)
- @OrderColumn
- private List modifications;
-
- public TabularModificationEntity(@NonNull TabularModificationInfos tabularModificationInfos) {
- super(tabularModificationInfos);
- assignAttributes(tabularModificationInfos);
- }
-
- public TabularModificationEntity(@NonNull LimitSetsTabularModificationInfos tabularModificationInfos) {
- super(tabularModificationInfos);
- assignAttributes(tabularModificationInfos);
- }
-
- @Override
- public TabularModificationInfos toModificationInfos() {
- List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList());
- return TabularModificationInfos.builder()
- .date(getDate())
- .uuid(getId())
- .stashed(getStashed())
- .activated(getActivated())
- .modificationType(modificationType)
- .modifications(modificationsInfos)
- .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream()
- .map(TabularPropertyEntity::toInfos)
- .toList())
- .csvFilename(getCsvFilename())
- .build();
- }
-
- @Override
- public void update(@NonNull ModificationInfos modificationInfos) {
- super.update(modificationInfos);
- assignAttributes((TabularModificationInfos) modificationInfos);
- }
-
- private void assignAttributes(TabularModificationInfos tabularModificationInfos) {
- modificationType = tabularModificationInfos.getModificationType();
- if (modifications == null) {
- modifications = tabularModificationInfos.getModifications().stream()
- .map(ModificationEntity::fromDTO)
- .collect(Collectors.toList());
- } else {
- modifications.clear();
- modifications.addAll(tabularModificationInfos.getModifications().stream()
- .map(ModificationEntity::fromDTO)
- .toList());
- }
- }
-}
diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java
new file mode 100644
index 000000000..cd60c3b36
--- /dev/null
+++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java
@@ -0,0 +1,100 @@
+/*
+ Copyright (c) 2025, RTE (http://www.rte-france.com)
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.gridsuite.modification.server.entities.tabular;
+
+import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.Setter;
+import org.gridsuite.modification.ModificationType;
+import org.gridsuite.modification.dto.ModificationInfos;
+import org.gridsuite.modification.dto.tabular.*;
+import org.gridsuite.modification.server.entities.ModificationEntity;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author David Braquart
+ */
+@NoArgsConstructor
+@Getter
+@Setter
+@Entity
+@Table(name = "tabular_modifications")
+public class TabularModificationsEntity extends ModificationEntity {
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
+ @JoinColumn(name = "tabular_modification_id")
+ @OrderColumn(name = "insert_position")
+ private List properties;
+
+ private String csvFilename;
+
+ @Enumerated(EnumType.STRING)
+ private ModificationType modificationType;
+
+ @OneToMany(cascade = CascadeType.ALL)
+ @OrderColumn
+ private List modifications;
+
+ public TabularModificationsEntity(@NonNull TabularModificationInfos tabularModificationInfos) {
+ super(tabularModificationInfos);
+ assignAttributes(tabularModificationInfos);
+ }
+
+ public TabularModificationsEntity(@NonNull LimitSetsTabularModificationInfos tabularModificationInfos) {
+ super(tabularModificationInfos);
+ assignAttributes(tabularModificationInfos);
+ }
+
+ public TabularModificationsEntity(@NonNull TabularCreationInfos tabularCreationInfos) {
+ super(tabularCreationInfos);
+ assignAttributes(tabularCreationInfos);
+ }
+
+ @Override
+ public void update(ModificationInfos modificationInfos) {
+ super.update(modificationInfos);
+ assignAttributes((TabularBaseInfos) modificationInfos);
+ }
+
+ @Override
+ public TabularBaseInfos toModificationInfos() {
+ throw new UnsupportedOperationException("Tabular DTO must be retrieved with NetworkModificationRepository::getModificationInfos");
+ }
+
+ private void assignAttributes(TabularBaseInfos tabularBaseInfos) {
+ this.csvFilename = tabularBaseInfos.getCsvFilename();
+ modificationType = tabularBaseInfos.getModificationType();
+ // properties list
+ List newProperties = tabularBaseInfos.getProperties() == null ? null :
+ tabularBaseInfos.getProperties().stream()
+ .map(TabularPropertyEntity::new)
+ .toList();
+ if (this.properties != null) {
+ this.properties.clear();
+ if (newProperties != null) {
+ this.properties.addAll(newProperties);
+ }
+ } else {
+ this.properties = newProperties;
+ }
+ // modifications list
+ if (modifications == null) {
+ modifications = tabularBaseInfos.getModifications().stream()
+ .map(ModificationEntity::fromDTO)
+ .collect(Collectors.toList());
+ } else {
+ modifications.clear();
+ modifications.addAll(tabularBaseInfos.getModifications().stream()
+ .map(ModificationEntity::fromDTO)
+ .toList());
+ }
+ }
+}
diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java
index 397d830a2..db7da6912 100644
--- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java
+++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java
@@ -18,7 +18,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.gridsuite.modification.dto.TabularPropertyInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import java.util.UUID;
diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java
index 3d9a06003..f78c27c6e 100644
--- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java
+++ b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java
@@ -17,7 +17,6 @@
import com.powsybl.network.store.client.NetworkStoreService;
import com.powsybl.network.store.client.PreloadingStrategy;
import lombok.Getter;
-import lombok.Setter;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.ModificationInfos;
import org.gridsuite.modification.modifications.AbstractModification;
@@ -29,6 +28,7 @@
import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService;
import org.gridsuite.modification.server.entities.ModificationEntity;
import org.gridsuite.modification.server.impacts.AbstractBaseImpact;
+import org.gridsuite.modification.server.repositories.NetworkModificationRepository;
import org.gridsuite.modification.server.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,8 +63,9 @@ public class NetworkModificationApplicator {
private final NetworkModificationObserver networkModificationObserver;
+ private final NetworkModificationRepository networkModificationRepository;
+
@Value("${impacts.collection-threshold:50}")
- @Setter // TODO REMOVE when VoltageInitReportTest will no longer use NetworkModificationApplicator
private Integer collectionThreshold;
@Value("${naming-strategy:Default}")
@@ -75,6 +76,7 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq
ReportService reportService, FilterService filterService,
LoadFlowService loadFlowService,
NetworkModificationObserver networkModificationObserver,
+ NetworkModificationRepository networkModificationRepository,
LargeNetworkModificationExecutionService largeNetworkModificationExecutionService) {
this.networkStoreService = networkStoreService;
this.equipmentInfosService = equipmentInfosService;
@@ -83,6 +85,7 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq
this.filterService = filterService;
this.loadFlowService = loadFlowService;
this.networkModificationObserver = networkModificationObserver;
+ this.networkModificationRepository = networkModificationRepository;
this.largeNetworkModificationExecutionService = largeNetworkModificationExecutionService;
}
@@ -192,7 +195,7 @@ private ApplicationStatus apply(ModificationApplicationGroup modificationGroupIn
.filter(ModificationEntity::getActivated)
.map(m -> {
listener.initModificationApplication(modificationGroupInfos.groupUuid(), m);
- return apply(m.toModificationInfos(), listener.getNetwork(), reportNode);
+ return apply(networkModificationRepository.getModificationInfos(m), listener.getNetwork(), reportNode);
})
.reduce(ApplicationStatus::max)
.orElse(ApplicationStatus.ALL_OK);
diff --git a/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java
index 230fdc167..315d8f395 100644
--- a/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java
+++ b/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java
@@ -34,20 +34,4 @@ public interface GeneratorCreationRepository extends JpaRepository subModificationIdsPart);
-
- @Modifying
- @Query(value = "BEGIN;" +
- "DELETE FROM tabular_creation_creations WHERE tabular_creation_entity_id = ?1 ;" +
- "DELETE FROM modification WHERE id IN ?2 ;" +
- "COMMIT;", nativeQuery = true)
- // This function is generic and can work on any creation
- void deleteTabularCreationCreations(UUID tabularModificationId, List subModificationIds);
-
- @Modifying
- @Query(value = "BEGIN;" +
- "DELETE FROM tabular_creation WHERE id = ?1 ;" +
- "DELETE FROM modification WHERE id = ?1 ;" +
- "COMMIT;", nativeQuery = true)
- // This function is generic and can work on any creation
- void deleteTabularCreationItself(UUID tabularModificationId);
}
diff --git a/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java
index a0cac072f..0aa459ae1 100644
--- a/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java
+++ b/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java
@@ -42,17 +42,17 @@ public interface LineModificationRepository extends JpaRepository subModificationIds);
@Modifying
@Query(value = "BEGIN;" +
- "DELETE FROM tabular_modification WHERE id = ?1 ;" +
+ "DELETE FROM tabular_modifications WHERE id = ?1 ;" +
"DELETE FROM modification WHERE id = ?1 ;" +
"COMMIT;", nativeQuery = true)
- // This function is generic and can work on any modification
+ // This function is generic and can work on any tabular modification/creation
void deleteTabularModificationItself(UUID tabularModificationId);
}
diff --git a/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java
index 93e97849f..6ec7ec599 100644
--- a/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java
+++ b/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java
@@ -49,18 +49,12 @@ public interface ModificationRepository extends JpaRepository findAllByIdInReverse(List uuids);
- @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modification_modifications WHERE tabular_modification_entity_id = :uuid", nativeQuery = true)
+ @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modifications_modifications WHERE tabular_modifications_entity_id = :uuid", nativeQuery = true)
List findSubModificationIdsByTabularModificationId(UUID uuid);
- @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modification_modifications WHERE tabular_modification_entity_id = :uuid ORDER BY modifications_order", nativeQuery = true)
+ @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modifications_modifications WHERE tabular_modifications_entity_id = :uuid ORDER BY modifications_order", nativeQuery = true)
List findSubModificationIdsByTabularModificationIdOrderByModificationsOrder(UUID uuid);
- @Query(value = "SELECT cast(creations_id AS VARCHAR) FROM tabular_creation_creations WHERE tabular_creation_entity_id = :uuid", nativeQuery = true)
- List findSubModificationIdsByTabularCreationId(UUID uuid);
-
- @Query(value = "SELECT cast(creations_id AS VARCHAR) FROM tabular_creation_creations WHERE tabular_creation_entity_id = :uuid ORDER BY creations_order", nativeQuery = true)
- List findSubModificationIdsByTabularCreationIdOrderByModificationsOrder(UUID uuid);
-
@Query(value = "SELECT cast(modification_id AS VARCHAR) FROM composite_modification_sub_modifications WHERE id = :uuid ORDER BY modifications_order", nativeQuery = true)
List findModificationIdsByCompositeModificationId(UUID uuid);
diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java
index 14c310fb0..696851f78 100644
--- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java
+++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java
@@ -12,13 +12,12 @@
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.NetworkModificationException;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.*;
import org.gridsuite.modification.server.dto.ModificationMetadata;
import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService;
import org.gridsuite.modification.server.entities.*;
import org.gridsuite.modification.server.entities.equipment.modification.EquipmentModificationEntity;
-import org.gridsuite.modification.server.entities.tabular.TabularBaseEntity;
-import org.gridsuite.modification.server.entities.tabular.TabularCreationEntity;
-import org.gridsuite.modification.server.entities.tabular.TabularModificationEntity;
+import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity;
import org.gridsuite.modification.server.entities.tabular.TabularPropertyEntity;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@@ -105,20 +104,16 @@ public void deleteAll() {
modificationGroupRepository.deleteAll();
}
- @Transactional // To have all create in the same transaction (atomic)
- // TODO Remove transaction when errors will no longer be sent to the front
- // This method should be package-private and not used as API of the service as it uses ModificationEntity and
- // we want to encapsulate the use of Entity related objects to this service.
- // Nevertheless We have to keep it public for transactional annotation.
+ @Transactional
+ // TODO Rather than calling saveModificationsNonTransactional(), we should call saveModificationInfos() below.
+ // In this case, we could change this method signature to use DTOs instead of Entities.
+ // Note: This current method is used only by the tests.
public List saveModifications(UUID groupUuid, List modifications) {
return saveModificationsNonTransactional(groupUuid, modifications);
}
- @Transactional // To have all create in the same transaction (atomic)
- // TODO Remove transaction when errors will no longer be sent to the front
public List saveModificationInfos(UUID groupUuid, List modifications) {
List entities = modifications.stream().map(ModificationEntity::fromDTO).toList();
-
return saveModificationsNonTransactional(groupUuid, entities);
}
@@ -314,6 +309,24 @@ private List reorderModifications(List extends Eq
private List extends EquipmentModificationEntity> loadTabularModificationSubEntities(List subModificationsUuids, ModificationType modificationType) {
List extends EquipmentModificationEntity> modifications;
switch (modificationType) {
+ case GENERATOR_CREATION -> {
+ // load generator modifications with curvePoints
+ modifications = generatorCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList();
+ // load properties too, it uses hibernate first-level cache to fill them up directly in modifications
+ generatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
+ }
+ case BATTERY_CREATION -> {
+ // load battery modifications with curvePoints
+ modifications = batteryCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList();
+ // load properties too, it uses hibernate first-level cache to fill them up directly in modifications
+ batteryCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
+ }
+ case LOAD_CREATION ->
+ // load Load modifications with properties
+ modifications = loadCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
+ case SHUNT_COMPENSATOR_CREATION ->
+ // load MCS modifications with properties
+ modifications = shuntCompensatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
case GENERATOR_MODIFICATION -> {
// load generator modifications with curvePoints
modifications = generatorModificationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList();
@@ -356,87 +369,34 @@ private List extends EquipmentModificationEntity> loadTabularModificationSubEn
return modifications;
}
- private TabularModificationInfos loadTabularModification(ModificationEntity modificationEntity) {
- TabularModificationEntity tabularModificationEntity = (TabularModificationEntity) modificationEntity;
+ private TabularBaseInfos loadTabularModification(TabularModificationsEntity tabularEntity) {
// fetch embedded modifications uuids only
- List subModificationsUuids = modificationRepository.findSubModificationIdsByTabularModificationIdOrderByModificationsOrder(modificationEntity.getId());
+ List subModificationsUuids = modificationRepository.findSubModificationIdsByTabularModificationIdOrderByModificationsOrder(tabularEntity.getId());
// optimized entities full loading, per type
- List extends EquipmentModificationEntity> modifications = loadTabularModificationSubEntities(subModificationsUuids, tabularModificationEntity.getModificationType());
+ List extends EquipmentModificationEntity> modifications = loadTabularModificationSubEntities(subModificationsUuids, tabularEntity.getModificationType());
// re-order the list of entities based on the ordered list of IDs
List orderedModifications = reorderModifications(modifications, subModificationsUuids);
- // then build DTOs
- var builder = TabularModificationInfos.builder();
- if (tabularModificationEntity.getType().equals(ModificationType.LIMIT_SETS_TABULAR_MODIFICATION.name())) {
- builder = LimitSetsTabularModificationInfos.builder();
- }
- return builder.uuid(tabularModificationEntity.getId())
- .date(tabularModificationEntity.getDate())
- .stashed(tabularModificationEntity.getStashed())
- .activated(tabularModificationEntity.getActivated())
- .modificationType(tabularModificationEntity.getModificationType())
+ var builder = switch (ModificationType.valueOf(tabularEntity.getType())) {
+ case ModificationType.TABULAR_CREATION -> TabularCreationInfos.builder();
+ case ModificationType.LIMIT_SETS_TABULAR_MODIFICATION -> LimitSetsTabularModificationInfos.builder();
+ default -> TabularModificationInfos.builder();
+ };
+ return builder.uuid(tabularEntity.getId())
+ .date(tabularEntity.getDate())
+ .stashed(tabularEntity.getStashed())
+ .activated(tabularEntity.getActivated())
+ .modificationType(tabularEntity.getModificationType())
.modifications(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList())
- .properties(CollectionUtils.isEmpty(tabularModificationEntity.getProperties()) ? null : tabularModificationEntity.getProperties().stream()
+ .properties(CollectionUtils.isEmpty(tabularEntity.getProperties()) ? null : tabularEntity.getProperties().stream()
.map(TabularPropertyEntity::toInfos)
.toList())
- .csvFilename(tabularModificationEntity.getCsvFilename())
+ .csvFilename(tabularEntity.getCsvFilename())
.build();
}
- private List extends EquipmentModificationEntity> loadTabularCreationSubEntities(List subModificationsUuids, ModificationType modificationType) {
- List extends EquipmentModificationEntity> modifications;
- switch (modificationType) {
- case GENERATOR_CREATION -> {
- // load generator modifications with curvePoints
- modifications = generatorCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList();
- // load properties too, it uses hibernate first-level cache to fill them up directly in modifications
- generatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
- }
- case BATTERY_CREATION -> {
- // load battery modifications with curvePoints
- modifications = batteryCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList();
- // load properties too, it uses hibernate first-level cache to fill them up directly in modifications
- batteryCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
- }
- case LOAD_CREATION ->
- // load Load modifications with properties
- modifications = loadCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
- case SHUNT_COMPENSATOR_CREATION ->
- // load MCS modifications with properties
- modifications = shuntCompensatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids);
- default ->
- throw new UnsupportedOperationException(String.format("No sub-modifications loading for creation type: %s", modificationType));
- }
- return modifications;
- }
-
- private TabularCreationInfos loadTabularCreation(ModificationEntity modificationEntity) {
- TabularCreationEntity tabularCreationEntity = (TabularCreationEntity) modificationEntity;
- // fetch embedded modifications uuids only
- List subModificationsUuids = modificationRepository.findSubModificationIdsByTabularCreationIdOrderByModificationsOrder(modificationEntity.getId());
- // optimized entities full loading, per type
- List extends EquipmentModificationEntity> modifications = loadTabularCreationSubEntities(subModificationsUuids, tabularCreationEntity.getCreationType());
- // re-order the list of entities based on the ordered list of IDs
- List orderedModifications = reorderModifications(modifications, subModificationsUuids);
- // then build DTOs
- return TabularCreationInfos.builder()
- .uuid(tabularCreationEntity.getId())
- .date(tabularCreationEntity.getDate())
- .stashed(tabularCreationEntity.getStashed())
- .activated(tabularCreationEntity.getActivated())
- .creationType(tabularCreationEntity.getCreationType())
- .creations(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList())
- .properties(CollectionUtils.isEmpty(tabularCreationEntity.getProperties()) ? null : tabularCreationEntity.getProperties().stream()
- .map(TabularPropertyEntity::toInfos)
- .toList())
- .csvFilename(tabularCreationEntity.getCsvFilename())
- .build();
- }
-
public ModificationInfos getModificationInfos(ModificationEntity modificationEntity) {
- if (modificationEntity instanceof TabularModificationEntity) {
- return loadTabularModification(modificationEntity);
- } else if (modificationEntity instanceof TabularCreationEntity) {
- return loadTabularCreation(modificationEntity);
+ if (modificationEntity instanceof TabularModificationsEntity tabularEntity) {
+ return loadTabularModification(tabularEntity);
}
return modificationEntity.toModificationInfos();
}
@@ -630,14 +590,12 @@ public void updateModification(@NonNull UUID modificationUuid, @NonNull Modifica
// Tabular modifications optimization:
// Before updating/adding with new sub-modifications, we delete and clear existing sub-modifications manually
// to avoid JPA to make a huge query to find them (no need to read them, they are going to be replaced).
- if (modificationInfos.getType() == ModificationType.TABULAR_MODIFICATION || modificationInfos.getType() == ModificationType.LIMIT_SETS_TABULAR_MODIFICATION) {
- TabularModificationEntity tabularModificationEntity = (TabularModificationEntity) entity;
- deleteTabularModificationSubModifications(tabularModificationEntity);
- tabularModificationEntity.update(modificationInfos);
- } else if (modificationInfos.getType() == ModificationType.TABULAR_CREATION) {
- TabularCreationEntity tabularCreationEntity = (TabularCreationEntity) entity;
- deleteTabularCreationSubModifications(tabularCreationEntity);
- tabularCreationEntity.update(modificationInfos);
+ if (modificationInfos.getType() == ModificationType.TABULAR_CREATION
+ || modificationInfos.getType() == ModificationType.TABULAR_MODIFICATION
+ || modificationInfos.getType() == ModificationType.LIMIT_SETS_TABULAR_MODIFICATION) {
+ TabularModificationsEntity tabularEntity = (TabularModificationsEntity) entity;
+ deleteTabularModificationSubModifications(tabularEntity);
+ tabularEntity.update(modificationInfos);
} else {
entity.update(modificationInfos);
}
@@ -681,27 +639,17 @@ private void deleteModifications(List modificationEntities)
// efficient so no need to dig deeper about that for now.
// delete tabular modifications/creations
- List tabularModificationsToDelete = modificationEntities.stream().filter(TabularModificationEntity.class::isInstance).map(TabularModificationEntity.class::cast).toList();
+ List tabularModificationsToDelete = modificationEntities.stream().filter(TabularModificationsEntity.class::isInstance).map(TabularModificationsEntity.class::cast).toList();
tabularModificationsToDelete.forEach(this::deleteTabularModification);
- List tabularCreationsToDelete = modificationEntities.stream().filter(TabularCreationEntity.class::isInstance).map(TabularCreationEntity.class::cast).toList();
- tabularCreationsToDelete.forEach(this::deleteTabularCreation);
// delete other modification types with "in" requests
- List uuidsToDelete = modificationEntities.stream().filter(Predicate.not(TabularBaseEntity.class::isInstance)).map(ModificationEntity::getId).toList();
+ List uuidsToDelete = modificationEntities.stream().filter(Predicate.not(TabularModificationsEntity.class::isInstance)).map(ModificationEntity::getId).toList();
if (!uuidsToDelete.isEmpty()) {
modificationApplicationInfosService.deleteAllByModificationIds(uuidsToDelete);
modificationRepository.deleteAllByIdIn(uuidsToDelete);
}
}
- private void deleteTabularCreation(TabularCreationEntity tabularCreationEntity) {
- deleteTabular(tabularCreationEntity.getCreationType(), tabularCreationEntity);
- }
-
- private void deleteTabularModification(TabularModificationEntity tabularModificationEntity) {
- deleteTabular(tabularModificationEntity.getModificationType(), tabularModificationEntity);
- }
-
private void deleteSomeLineTabularSubModifications(List subModificationsIds) {
List opLimitsGroupsIds = modificationRepository.findLineModificationOpLimitsGroupsIdsByBranchIds(subModificationsIds);
List currentLimitsIds = modificationRepository.findCurrentLimitsIdsByOpLimitsGroupsIds(opLimitsGroupsIds);
@@ -745,46 +693,27 @@ private void deleteAllTabularSubModificationsUsingPartition(ModificationType tab
}
}
- private void deleteTabular(ModificationType tabularModificationType, ModificationEntity modificationEntity) {
- UUID modificationUuid = modificationEntity.getId();
+ private void deleteTabularModification(TabularModificationsEntity tabularEntity) {
+ UUID modificationUuid = tabularEntity.getId();
List modificationToCleanUuids = new ArrayList<>();
modificationToCleanUuids.add(modificationUuid);
- List subModificationsIds = modificationEntity instanceof TabularModificationEntity ?
- modificationRepository.findSubModificationIdsByTabularModificationId(modificationUuid) :
- modificationRepository.findSubModificationIdsByTabularCreationId(modificationUuid);
+ List subModificationsIds = modificationRepository.findSubModificationIdsByTabularModificationId(modificationUuid);
modificationToCleanUuids.addAll(subModificationsIds);
-
modificationApplicationInfosService.deleteAllByModificationIds(modificationToCleanUuids);
tabularPropertyRepository.deleteTabularProperties(modificationUuid);
- deleteAllTabularSubModificationsUsingPartition(tabularModificationType, subModificationsIds);
- if (modificationEntity instanceof TabularModificationEntity) {
- // line functions works for any modification case
- lineModificationRepository.deleteTabularModificationModifications(modificationUuid, subModificationsIds);
- lineModificationRepository.deleteTabularModificationItself(modificationUuid);
- } else {
- // generator functions works for any creation case
- generatorCreationRepository.deleteTabularCreationCreations(modificationUuid, subModificationsIds);
- generatorCreationRepository.deleteTabularCreationItself(modificationUuid);
- }
- }
-
- private void deleteTabularCreationSubModifications(TabularCreationEntity tabularCreationEntity) {
- UUID modificationId = tabularCreationEntity.getId();
- List subModificationsIds = modificationRepository.findSubModificationIdsByTabularCreationId(modificationId);
- tabularCreationEntity.setCreations(null);
- modificationApplicationInfosService.deleteAllByModificationIds(subModificationsIds);
- deleteAllTabularSubModificationsUsingPartition(tabularCreationEntity.getCreationType(), subModificationsIds);
- // generator function works for any creation case
- generatorCreationRepository.deleteTabularCreationCreations(modificationId, subModificationsIds);
+ deleteAllTabularSubModificationsUsingPartition(tabularEntity.getModificationType(), subModificationsIds);
+ // line functions work for any type
+ lineModificationRepository.deleteTabularModificationModifications(modificationUuid, subModificationsIds);
+ lineModificationRepository.deleteTabularModificationItself(modificationUuid);
}
- private void deleteTabularModificationSubModifications(TabularModificationEntity tabularModificationEntity) {
+ private void deleteTabularModificationSubModifications(TabularModificationsEntity tabularModificationEntity) {
UUID modificationId = tabularModificationEntity.getId();
List subModificationsIds = modificationRepository.findSubModificationIdsByTabularModificationId(modificationId);
tabularModificationEntity.setModifications(null);
modificationApplicationInfosService.deleteAllByModificationIds(subModificationsIds);
deleteAllTabularSubModificationsUsingPartition(tabularModificationEntity.getModificationType(), subModificationsIds);
- // line function works for any modification case
+ // line function works for any type
lineModificationRepository.deleteTabularModificationModifications(modificationId, subModificationsIds);
}
}
diff --git a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java
index 8daf4cca9..32dbe9a22 100644
--- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java
+++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java
@@ -191,9 +191,7 @@ public void restoreNetworkModifications(UUID groupUuid, @NonNull List modi
networkModificationRepository.getModificationsCount(groupUuid, false));
}
- // No transactional because we need to save modification in DB also in case of error
- // Transaction made in 'saveModifications' method
- // TODO Add transaction when errors will no longer be sent to the front
+ @Transactional
public NetworkModificationsResult createNetworkModification(@NonNull UUID groupUuid, @NonNull ModificationInfos modificationInfo, @NonNull List applicationContexts) {
List modificationEntities = networkModificationRepository.saveModificationInfos(groupUuid, List.of(modificationInfo));
diff --git a/src/main/resources/db/changelog/changesets/changelog_20250930T101841Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250930T101841Z.xml
new file mode 100644
index 000000000..73e86e60b
--- /dev/null
+++ b/src/main/resources/db/changelog/changesets/changelog_20250930T101841Z.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml
new file mode 100644
index 000000000..dcbf5b3a4
--- /dev/null
+++ b/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/db/changelog/changesets/migrationTabularModifications_20250930T132326Z.sql b/src/main/resources/db/changelog/changesets/migrationTabularModifications_20250930T132326Z.sql
new file mode 100644
index 000000000..b1d95a7fc
--- /dev/null
+++ b/src/main/resources/db/changelog/changesets/migrationTabularModifications_20250930T132326Z.sql
@@ -0,0 +1,27 @@
+-- tabular_modification + tabular_creation -> tabular_modifications
+insert into tabular_modifications (id, modification_type, csv_filename)
+select
+ id,
+ modification_type,
+ csv_filename
+from tabular_modification;
+insert into tabular_modifications (id, modification_type, csv_filename)
+select
+ id,
+ creation_type,
+ csv_filename
+from tabular_creation;
+
+-- tabular_modification_modifications + tabular_creation_creations -> tabular_modifications_modifications
+insert into tabular_modifications_modifications (tabular_modifications_entity_id, modifications_id, modifications_order)
+select
+ tabular_modification_entity_id,
+ modifications_id,
+ modifications_order
+from tabular_modification_modifications;
+insert into tabular_modifications_modifications (tabular_modifications_entity_id, modifications_id, modifications_order)
+select
+ tabular_creation_entity_id,
+ creations_id,
+ creations_order
+from tabular_creation_creations;
\ No newline at end of file
diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml
index 2ac6938dc..8ad4fa74e 100644
--- a/src/main/resources/db/changelog/db.changelog-master.yaml
+++ b/src/main/resources/db/changelog/db.changelog-master.yaml
@@ -417,3 +417,10 @@ databaseChangeLog:
- include:
file: changesets/changelog_20250923T141508Z.xml
relativeToChangelogFile: true
+
+ - include:
+ file: changesets/changelog_20250930T101841Z.xml
+ relativeToChangelogFile: true
+ - include:
+ file: changesets/changelog_20250930T132326Z.xml
+ relativeToChangelogFile: true
\ No newline at end of file
diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java
index 61804e764..65c64007d 100644
--- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java
+++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java
@@ -450,8 +450,9 @@ void testNetworkModificationsWithErrorOnNetworkFlush() throws Exception {
String groovyScriptInfosJson = getJsonBody(groovyScriptInfos, TEST_NETWORK_WITH_FLUSH_ERROR_ID, NetworkCreation.VARIANT_ID);
mockMvc.perform(post(NETWORK_MODIFICATION_URI).content(groovyScriptInfosJson).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError());
-
- assertEquals(1, modificationRepository.getModifications(TEST_GROUP_ID, true, false).size());
+ // TODO because creating a modification is now a unique Tx, and because network.flush() is not covered by the apply() exception catch,
+ // this test result has changed : the modification save is not committed because of the flush exception.
+ assertEquals(0, modificationRepository.getModifications(TEST_GROUP_ID, true, false).size());
}
@Test
diff --git a/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java b/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java
index df946fac5..c80ea253e 100644
--- a/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java
+++ b/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java
@@ -13,14 +13,6 @@
import com.powsybl.commons.report.ReportNodeJsonModule;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.ThreeSides;
-import com.powsybl.network.store.client.NetworkStoreService;
-import com.powsybl.network.store.client.NetworkStoreServicePublic;
-import com.powsybl.network.store.client.PreloadingStrategy;
-import com.powsybl.network.store.client.RestClient;
-import com.powsybl.network.store.iidm.impl.CachedNetworkStoreClient;
-import com.powsybl.network.store.iidm.impl.OfflineNetworkStoreClient;
-import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
-import io.micrometer.observation.ObservationRegistry;
import lombok.extern.slf4j.Slf4j;
import org.gridsuite.modification.dto.*;
import org.gridsuite.modification.server.dto.ModificationApplicationGroup;
@@ -28,13 +20,11 @@
import org.gridsuite.modification.server.dto.NetworkModificationResult;
import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus;
import org.gridsuite.modification.server.dto.ReportInfos;
-import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService;
-import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService;
import org.gridsuite.modification.server.entities.ModificationEntity;
import org.gridsuite.modification.server.modifications.NetworkModificationApplicator;
-import org.gridsuite.modification.server.service.LargeNetworkModificationExecutionService;
-import org.gridsuite.modification.server.service.NetworkModificationObserver;
+import org.gridsuite.modification.server.repositories.NetworkModificationRepository;
import org.gridsuite.modification.server.service.ReportService;
+import org.gridsuite.modification.server.utils.elasticsearch.DisableElasticsearch;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -45,6 +35,9 @@
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.skyscreamer.jsonassert.JSONAssert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -52,12 +45,33 @@
import java.util.List;
import java.util.UUID;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.verify;
import static org.assertj.core.api.Assertions.assertThat;
@Slf4j
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ExtendWith({MockitoExtension.class})
+@SpringBootTest
+@DisableElasticsearch
class VoltageInitReportTest {
+
+ @Autowired
+ private NetworkModificationRepository modificationRepository;
+
+ @Autowired
+ private NetworkModificationApplicator networkModificationApplicator;
+
+ @MockBean
+ protected ReportService reportService;
+
+ private static final UUID NETWORK_ID = UUID.fromString("11111111-1111-1111-1111-111111111111");
+ private static final UUID NODE_ID = UUID.fromString("99999999-9999-9999-9999-999999999999");
+ private static final UUID REPORT_ID = UUID.fromString("88888888-8888-8888-8888-888888888888");
+ private static final UUID GROUP_ID = UUID.randomUUID();
+
private final ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules()
.registerModule(new ReportNodeJsonModule())
.setInjectableValues(new InjectableValues.Std().addValue(ReportNodeDeserializer.DICTIONARY_VALUE_ID, null));
@@ -67,41 +81,32 @@ class VoltageInitReportTest {
@ParameterizedTest(name = "result status = {0}")
@DisplayName("Verifying logs after applying Voltage-Init server modifications on a network")
void testVoltageInitDuplicationLogs(final ApplicationStatus resultStatus, final String logsJsonFile, final VoltageInitModificationInfos modificationInfos) throws Exception {
- final ReportService reportService = Mockito.mock(ReportService.class);
- final RestClient restClient = Mockito.mock(RestClient.class);
- final NetworkStoreService networkStoreService = new NetworkStoreServicePublic(restClient, PreloadingStrategy.NONE,
- (restClient_, preloadingStrategy, executorService) -> new CachedNetworkStoreClient(new OfflineNetworkStoreClient()));
- final EquipmentInfosService equipmentInfosService = Mockito.mock(EquipmentInfosService.class);
- final ModificationApplicationInfosService modificationApplicationInfosService = Mockito.mock(ModificationApplicationInfosService.class);
- final NetworkModificationObserver networkModificationObserver = new NetworkModificationObserver(ObservationRegistry.NOOP, new SimpleMeterRegistry());
- final LargeNetworkModificationExecutionService modificationExecutionService = new LargeNetworkModificationExecutionService(2, networkModificationObserver);
- final NetworkModificationApplicator networkModificationApplicator = new NetworkModificationApplicator(networkStoreService, equipmentInfosService, modificationApplicationInfosService, reportService, null, null, networkModificationObserver, modificationExecutionService);
- networkModificationApplicator.setCollectionThreshold(5);
-
final Network network = Network.read(Paths.get(this.getClass().getClassLoader().getResource("fourSubstations_testsOpenReac.xiidm").toURI()));
- //for internal call to reportService.sendReport(reportInfos.getReportUuid(), reporter);
- final ArgumentCaptor reporterCaptor = ArgumentCaptor.forClass(ReportNode.class);
-
- final UUID networkUuuid = UUID.fromString("11111111-1111-1111-1111-111111111111");
- final UUID reportUuid = UUID.fromString("88888888-8888-8888-8888-888888888888");
- //simulate PUT /v1/groups/abc?action=COPY with body ModificationApplicationContext(networkUuid=0000, reportUuid=0000, reporterId=0000, variantId=0000, duplicateFrom=0000)
- assertThat(networkModificationApplicator.applyModifications(
- new ModificationApplicationGroup(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(modificationInfos)), new ReportInfos(reportUuid, UUID.fromString("99999999-9999-9999-9999-999999999999"))),
- new NetworkInfos(network, networkUuuid, true)))
- .as("network modifications results")
- .isNotNull()
- .extracting(NetworkModificationResult::getApplicationStatus)
- .isEqualTo(resultStatus);
+ // apply a VoltageInit modification and check status
+ assertThat(applyModification(network, modificationInfos))
+ .as("voltage init result status")
+ .isEqualTo(resultStatus);
- Mockito.verify(reportService, Mockito.times(1)).sendReport(Mockito.eq(reportUuid), reporterCaptor.capture());
+ // check produced report json data
+ ArgumentCaptor reporterCaptor = ArgumentCaptor.forClass(ReportNode.class);
+ verify(reportService, atLeast(1)).sendReport(any(UUID.class), reporterCaptor.capture());
final ReportNode result = reporterCaptor.getValue();
- log.info("Result = {}", objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(result));
+ assertNotNull(result);
JSONAssert.assertEquals("voltage-init plan logs aggregated",
Files.readString(Paths.get(this.getClass().getClassLoader().getResource(logsJsonFile).toURI())),
objectMapper.writeValueAsString(result), false);
Mockito.verifyNoMoreInteractions(reportService);
- Mockito.reset(reportService); //because parametized tests haven't same lifecycle than tests
+ Mockito.reset(reportService); //because parameterized tests haven't same lifecycle than tests
+ }
+
+ private ApplicationStatus applyModification(Network network, VoltageInitModificationInfos infos) {
+ List entities = modificationRepository.saveModifications(GROUP_ID, List.of(ModificationEntity.fromDTO(infos)));
+ List modificationInfosGroups = List.of(
+ new ModificationApplicationGroup(GROUP_ID, entities, new ReportInfos(REPORT_ID, NODE_ID))
+ );
+ NetworkModificationResult result = networkModificationApplicator.applyModifications(modificationInfosGroups, new NetworkInfos(network, NETWORK_ID, true));
+ return result.getApplicationStatus();
}
private static List voltageInitModifications() {
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java
index 0c54ec7f3..5eddfb415 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java
@@ -13,8 +13,8 @@
import org.gridsuite.modification.dto.BatteryCreationInfos;
import org.gridsuite.modification.dto.ModificationInfos;
import org.gridsuite.modification.dto.ReactiveCapabilityCurvePointsInfos;
-import org.gridsuite.modification.dto.TabularCreationInfos;
-import org.gridsuite.modification.dto.TabularPropertyInfos;
+import org.gridsuite.modification.dto.tabular.TabularCreationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.ModificationCreation;
import org.gridsuite.modification.server.utils.NetworkCreation;
@@ -58,8 +58,8 @@ protected ModificationInfos buildModification() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.BATTERY_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.BATTERY_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build()))
.stashed(false)
.build();
@@ -75,8 +75,8 @@ protected ModificationInfos buildModificationUpdate() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.BATTERY_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.BATTERY_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build()))
.stashed(false)
.build();
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java
index 0b0608824..3e1120f6b 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java
@@ -12,21 +12,19 @@
import com.powsybl.iidm.network.IdentifiableType;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.extensions.ConnectablePosition;
+import jakarta.servlet.ServletException;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.FreePropertyInfos;
import org.gridsuite.modification.dto.GeneratorCreationInfos;
import org.gridsuite.modification.dto.ModificationInfos;
import org.gridsuite.modification.dto.SubstationCreationInfos;
-import org.gridsuite.modification.dto.TabularCreationInfos;
-import org.gridsuite.modification.server.dto.NetworkModificationsResult;
-import org.gridsuite.modification.dto.TabularPropertyInfos;
+import org.gridsuite.modification.dto.tabular.*;
import org.gridsuite.modification.server.impacts.AbstractBaseImpact;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.MvcResult;
import java.util.List;
import java.util.Map;
@@ -111,8 +109,8 @@ protected ModificationInfos buildModification() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.GENERATOR_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.GENERATOR_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build()))
.stashed(false)
.build();
@@ -145,8 +143,8 @@ protected ModificationInfos buildModificationUpdate() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.GENERATOR_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.GENERATOR_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build()))
.stashed(false)
.build();
@@ -202,8 +200,8 @@ void testCheckSqlRequestsCount() throws Exception {
.build()
);
TabularCreationInfos creationInfos = TabularCreationInfos.builder()
- .creationType(ModificationType.GENERATOR_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.GENERATOR_CREATION)
+ .modifications(creations)
.build();
modificationUuid = saveModification(creationInfos);
reset();
@@ -249,8 +247,8 @@ void testAllModificationsHaveSucceeded() throws Exception {
);
ModificationInfos creationInfos = TabularCreationInfos.builder()
- .creationType(ModificationType.GENERATOR_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.GENERATOR_CREATION)
+ .modifications(creations)
.build();
String tabularCreationJson = getJsonBody(creationInfos, null);
@@ -298,8 +296,8 @@ void testAllModificationsHaveFailed() throws Exception {
.build()
);
ModificationInfos creationInfos = TabularCreationInfos.builder()
- .creationType(ModificationType.GENERATOR_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.GENERATOR_CREATION)
+ .modifications(creations)
.build();
String tabularCreationJson = getJsonBody(creationInfos, null);
@@ -335,48 +333,16 @@ void testUnsupportedTabularCreationType() throws Exception {
.build()
);
ModificationInfos creationInfos = TabularCreationInfos.builder()
- .creationType(ModificationType.SUBSTATION_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.SUBSTATION_CREATION)
+ .modifications(creations)
.build();
String tabularCreationJson = getJsonBody(creationInfos, null);
- // creation
- MvcResult mvcResult = mockMvc.perform(post(getNetworkModificationUri()).content(tabularCreationJson)
- .contentType(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk()).andReturn();
- NetworkModificationsResult result = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { });
- assertNotNull(result);
- assertEquals(1, result.modificationUuids().size());
- UUID modifId = result.modificationUuids().get(0);
-
- // try to get via the group
- UnsupportedOperationException exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.getModifications(TEST_GROUP_ID, false, true)
- );
- assertEquals("No sub-modifications loading for creation type: SUBSTATION_CREATION", exception.getMessage());
-
- // try to get via id
- exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.getModificationInfo(modifId)
- );
- assertEquals("No sub-modifications loading for creation type: SUBSTATION_CREATION", exception.getMessage());
-
- // try to update
- exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.updateModification(modifId, creationInfos)
- );
- // deletion error because we try to remove the sub-modifications before updating them
- assertEquals("No sub-modifications deletion method for type: SUBSTATION_CREATION", exception.getMessage());
-
- // try to delete
- List ids = List.of(modifId);
- exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.deleteModifications(TEST_GROUP_ID, ids)
+ // try to create+apply a tabular creation with an unsupported type
+ ServletException exception = assertThrows(
+ ServletException.class,
+ () -> mockMvc.perform(post(getNetworkModificationUri()).content(tabularCreationJson).contentType(MediaType.APPLICATION_JSON))
);
- assertEquals("No sub-modifications deletion method for type: SUBSTATION_CREATION", exception.getMessage());
+ assertEquals("No sub-modifications loading for modification type: SUBSTATION_CREATION", exception.getRootCause().getMessage());
}
}
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java
index 0de39c63d..adb793725 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java
@@ -14,8 +14,7 @@
import org.gridsuite.modification.dto.FreePropertyInfos;
import org.gridsuite.modification.dto.LoadCreationInfos;
import org.gridsuite.modification.dto.ModificationInfos;
-import org.gridsuite.modification.dto.TabularCreationInfos;
-import org.gridsuite.modification.dto.TabularPropertyInfos;
+import org.gridsuite.modification.dto.tabular.*;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
@@ -57,8 +56,8 @@ protected ModificationInfos buildModification() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.LOAD_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.LOAD_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build()))
.stashed(false)
.build();
@@ -76,8 +75,8 @@ protected ModificationInfos buildModificationUpdate() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.LOAD_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.LOAD_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build()))
.stashed(false)
.build();
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java
index c6d1c3222..73d84034b 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java
@@ -13,8 +13,7 @@
import org.gridsuite.modification.dto.FreePropertyInfos;
import org.gridsuite.modification.dto.ModificationInfos;
import org.gridsuite.modification.dto.ShuntCompensatorCreationInfos;
-import org.gridsuite.modification.dto.TabularCreationInfos;
-import org.gridsuite.modification.dto.TabularPropertyInfos;
+import org.gridsuite.modification.dto.tabular.*;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
@@ -60,8 +59,8 @@ protected ModificationInfos buildModification() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.SHUNT_COMPENSATOR_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.SHUNT_COMPENSATOR_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build()))
.stashed(false)
.build();
@@ -81,8 +80,8 @@ protected ModificationInfos buildModificationUpdate() {
.build()
);
return TabularCreationInfos.builder()
- .creationType(ModificationType.SHUNT_COMPENSATOR_CREATION)
- .creations(creations)
+ .modificationType(ModificationType.SHUNT_COMPENSATOR_CREATION)
+ .modifications(creations)
.properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build()))
.stashed(false)
.build();
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java
index d4fd67fd4..2a8c50582 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java
@@ -10,6 +10,8 @@
import com.powsybl.iidm.network.Network;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java
index ceb79c2a8..08f1764eb 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java
@@ -10,9 +10,11 @@
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.StaticVarCompensator;
import com.powsybl.iidm.network.extensions.ConnectablePosition;
+import jakarta.servlet.ServletException;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
-import org.gridsuite.modification.server.dto.NetworkModificationsResult;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.repositories.ModificationRepository;
import org.gridsuite.modification.server.repositories.TabularPropertyRepository;
@@ -24,7 +26,6 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.MvcResult;
import org.testcontainers.shaded.org.apache.commons.lang3.tuple.Pair;
import java.util.List;
@@ -40,7 +41,6 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -170,7 +170,7 @@ void testSqlRequestsCountOnPostGroups() throws Exception {
reset();
ApiUtils.postGroups(mockMvc, getGroupId(), targetGroupUuid);
- TestUtils.assertRequestsCount(12, 9, 2, 0); // (13, 9, 2, 0) before improvements
+ TestUtils.assertRequestsCount(13, 9, 2, 0); // (13, 9, 2, 0) before improvements
assertTabularModificationsEquals(modifications, targetGroupUuid);
}
@@ -181,7 +181,7 @@ void testSqlRequestsCountOnPostGroups2() throws Exception {
reset();
ApiUtils.postGroups(mockMvc, getGroupId(), targetGroupUuid);
- TestUtils.assertRequestsCount(20, 10, 2, 0); // (95, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points
+ TestUtils.assertRequestsCount(21, 10, 2, 0); // (95, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points
assertTabularModificationsEquals(modifications, targetGroupUuid);
}
@@ -595,44 +595,12 @@ void testUnsupportedTabularModificationType() throws Exception {
.build();
String tabularModificationJson = getJsonBody(tabularInfos, null);
- // creation
- MvcResult mvcResult = mockMvc.perform(post(getNetworkModificationUri()).content(tabularModificationJson)
- .contentType(MediaType.APPLICATION_JSON))
- .andExpect(status().isOk()).andReturn();
- NetworkModificationsResult result = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { });
- assertNotNull(result);
- assertEquals(1, result.modificationUuids().size());
- UUID modifId = result.modificationUuids().get(0);
-
- // try to get via the group
- UnsupportedOperationException exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.getModifications(TEST_GROUP_ID, false, true)
- );
- assertEquals("No sub-modifications loading for modification type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage());
-
- // try to get via id
- exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.getModificationInfo(modifId)
- );
- assertEquals("No sub-modifications loading for modification type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage());
-
- // try to update
- exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.updateModification(modifId, tabularInfos)
- );
- // deletion error because we try to remove the sub-modifications before updating them
- assertEquals("No sub-modifications deletion method for type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage());
-
- // try to delete
- List ids = List.of(modifId);
- exception = assertThrows(
- UnsupportedOperationException.class,
- () -> networkModificationRepository.deleteModifications(TEST_GROUP_ID, ids)
+ // try to create+apply a tabular modification with an unsupported type
+ ServletException exception = assertThrows(
+ ServletException.class,
+ () -> mockMvc.perform(post(getNetworkModificationUri()).content(tabularModificationJson).contentType(MediaType.APPLICATION_JSON))
);
- assertEquals("No sub-modifications deletion method for type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage());
+ assertEquals("No sub-modifications loading for modification type: STATIC_VAR_COMPENSATOR_CREATION", exception.getRootCause().getMessage());
}
@Override
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java
index e69e4db03..9b8ac8298 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java
@@ -10,6 +10,8 @@
import com.powsybl.iidm.network.Network;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.repositories.ModificationRepository;
import org.gridsuite.modification.server.utils.ApiUtils;
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java
index 2e665eaee..bdc13a86e 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java
@@ -10,6 +10,8 @@
import com.powsybl.iidm.network.Network;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java
index fff9e845e..bf1ddb29b 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java
@@ -15,8 +15,10 @@
import com.powsybl.iidm.network.ShuntCompensatorModelType;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
-import org.gridsuite.modification.modifications.TabularModification;
+import org.gridsuite.modification.modifications.tabular.TabularModification;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@@ -130,13 +132,13 @@ void testCheckModificationConflict() {
.withMessageTemplate("test")
.build();
- tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode);
+ tabularModification.specificCheck(shuntModification, network, reportNode);
shuntModification.setShuntCompensatorType(AttributeModification.toAttributeModification(ShuntCompensatorType.CAPACITOR, OperationType.SET));
- tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode);
+ tabularModification.specificCheck(shuntModification, network, reportNode);
shuntModification.setMaxQAtNominalV(null);
- tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode);
+ tabularModification.specificCheck(shuntModification, network, reportNode);
assertEquals(TypedValue.WARN_SEVERITY, reportNode.getChildren().get(0).getValues().get(ReportConstants.SEVERITY_KEY));
}
@@ -165,7 +167,7 @@ void testCheckModificationNonLinear() {
.withResourceBundles("i18n.reports")
.withMessageTemplate("test")
.build();
- tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode);
+ tabularModification.specificCheck(shuntModification, network, reportNode);
assertEquals(TypedValue.ERROR_SEVERITY, reportNode.getChildren().get(0).getValues().get(ReportConstants.SEVERITY_KEY));
@@ -195,7 +197,7 @@ void testCheckModificationOK() {
.withMessageTemplate("test")
.build();
- tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode);
+ tabularModification.specificCheck(shuntModification, network, reportNode);
assertEquals(0, reportNode.getChildren().size());
}
}
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java
index cea05a375..19782c815 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java
@@ -11,6 +11,8 @@
import com.powsybl.iidm.network.Network;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java
index 465250d54..979ee312a 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java
@@ -10,6 +10,8 @@
import com.powsybl.iidm.network.Network;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.repositories.ModificationRepository;
import org.gridsuite.modification.server.utils.ApiUtils;
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java
index 13ecddf44..b290dbd72 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java
@@ -10,6 +10,8 @@
import com.powsybl.iidm.network.Network;
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
+import org.gridsuite.modification.dto.tabular.TabularPropertyInfos;
import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest;
import org.gridsuite.modification.server.utils.NetworkCreation;
import org.junit.jupiter.api.Tag;
diff --git a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java
index 4a3ddb6be..9ec25805c 100644
--- a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java
+++ b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java
@@ -12,6 +12,7 @@
import org.gridsuite.modification.ModificationType;
import org.gridsuite.modification.NetworkModificationException;
import org.gridsuite.modification.dto.*;
+import org.gridsuite.modification.dto.tabular.TabularModificationInfos;
import org.gridsuite.modification.server.entities.ModificationEntity;
import org.gridsuite.modification.server.entities.ModificationGroupEntity;
import org.gridsuite.modification.server.entities.equipment.creation.VoltageLevelCreationEntity;