From c96609c908af16cf67f41591a64008b637e63590 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 12 Feb 2026 08:31:32 +0100 Subject: [PATCH 1/2] allow to have a list of temporary limits in line catalog Signed-off-by: Etienne LESOT --- .../dto/catalog/LimitsForLineTypeInfos.java | 11 +- .../dto/catalog/TemporaryLimitInfos.java | 48 +++++++++ .../catalog/LimitsForLineTypeEntity.java | 21 ++-- .../catalog/TemporaryLimitEntity.java | 51 ++++++++++ .../service/LineTypesCatalogService.java | 2 +- .../changesets/changelog_20260211T143540Z.xml | 28 +++++ .../db/changelog/db.changelog-master.yaml | 3 + .../server/ModificationControllerTest.java | 96 +++++++++++++++++- .../resources/line_types_catalog_3.json.gz | Bin 479 -> 450 bytes 9 files changed, 234 insertions(+), 26 deletions(-) create mode 100644 src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java create mode 100644 src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java create mode 100644 src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml diff --git a/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java b/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java index 4b40ec6ee..202a8994f 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/catalog/LimitsForLineTypeInfos.java @@ -14,6 +14,7 @@ import lombok.Setter; import lombok.experimental.SuperBuilder; +import java.util.List; import java.util.UUID; /** @@ -36,14 +37,8 @@ public class LimitsForLineTypeInfos { @Schema(description = "Permanent limit") private Double permanentLimit; - @Schema(description = "Temporary limit value") - private Double temporaryLimitValue; - - @Schema(description = "Temporary limit acceptable duration") - private Integer temporaryLimitAcceptableDuration; - - @Schema(description = "Temporary limit name") - private String temporaryLimitName; + @Schema(description = "temporary limits list") + List temporaryLimits; @Schema(description = "Area") private String area; diff --git a/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java b/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java new file mode 100644 index 000000000..886db6b52 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2026, 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package org.gridsuite.modification.server.dto.catalog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import org.gridsuite.modification.server.entities.catalog.TemporaryLimitEntity; + +import java.util.UUID; + +/** + * @author Etienne Lesot + */ +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Schema(description = "Temporary Limits infos") +public class TemporaryLimitInfos { + @Schema(description = "id") + private UUID id; + + @Schema(description = "Temporary limit value") + private Double limitValue; + + @Schema(description = "Temporary limit acceptable duration") + private Integer acceptableDuration; + + @Schema(description = "Temporary limit name") + private String name; + + public TemporaryLimitEntity toTemporaryLimitEntity() { + return TemporaryLimitEntity.builder() + .limitValue(limitValue) + .acceptableDuration(acceptableDuration) + .name(name).build(); + } +} diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java index 28d2ee887..a89ddd456 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/LimitsForLineTypeEntity.java @@ -13,7 +13,9 @@ import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import org.gridsuite.modification.server.dto.catalog.LimitsForLineTypeInfos; +import org.gridsuite.modification.server.dto.catalog.TemporaryLimitInfos; +import java.util.List; import java.util.UUID; /** @@ -38,14 +40,9 @@ public class LimitsForLineTypeEntity { @Column private Double permanentLimit; - @Column - private Double temporaryLimitValue; - - @Column - private Integer temporaryLimitAcceptableDuration; - - @Column - private String temporaryLimitName; + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "temporary_limit_id", nullable = false) + private List temporaryLimits; @Column private String area; @@ -58,9 +55,7 @@ public LimitsForLineTypeInfos toLineTypeInfos() { .id(id) .limitSetName(limitSetName) .permanentLimit(permanentLimit) - .temporaryLimitValue(temporaryLimitValue) - .temporaryLimitAcceptableDuration(temporaryLimitAcceptableDuration) - .temporaryLimitName(temporaryLimitName) + .temporaryLimits(temporaryLimits.stream().map(TemporaryLimitEntity::toTemporaryLimitInfos).toList()) .area(area) .temperature(temperature) .build(); @@ -70,9 +65,7 @@ public LimitsForLineTypeEntity(LimitsForLineTypeInfos limitsForLineTypeInfos) { this(limitsForLineTypeInfos.getId(), limitsForLineTypeInfos.getLimitSetName(), limitsForLineTypeInfos.getPermanentLimit(), - limitsForLineTypeInfos.getTemporaryLimitValue(), - limitsForLineTypeInfos.getTemporaryLimitAcceptableDuration(), - limitsForLineTypeInfos.getTemporaryLimitName(), + limitsForLineTypeInfos.getTemporaryLimits() != null ? limitsForLineTypeInfos.getTemporaryLimits().stream().map(TemporaryLimitInfos::toTemporaryLimitEntity).toList() : null, limitsForLineTypeInfos.getArea(), limitsForLineTypeInfos.getTemperature()); } diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java new file mode 100644 index 000000000..28c135783 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2026, 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package org.gridsuite.modification.server.entities.catalog; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.gridsuite.modification.server.dto.catalog.TemporaryLimitInfos; + +import java.util.UUID; + +/** + * @author Etienne Lesot + */ +@Getter +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +@Entity +@Table(name = "temporary_limit_for_line_catalog") +public class TemporaryLimitEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private UUID id; + + @Column + private Double limitValue; + + @Column + private Integer acceptableDuration; + + @Column + private String name; + + public TemporaryLimitInfos toTemporaryLimitInfos() { + return TemporaryLimitInfos.builder() + .id(id) + .limitValue(limitValue) + .acceptableDuration(acceptableDuration) + .name(name).build(); + } +} diff --git a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java index d68b8b885..6e02b0c41 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java @@ -56,7 +56,7 @@ public void deleteLineTypesCatalog() { public void resetLineTypes(MultipartFile file) { try (GZIPInputStream gzipInputStream = new GZIPInputStream(file.getInputStream())) { - List lineTypes = mapper.readValue(gzipInputStream, new TypeReference<>() { + List lineTypes = mapper.readValue(gzipInputStream, new TypeReference>() { }); deleteLineTypesCatalog(); // remove duplicates in file diff --git a/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml new file mode 100644 index 000000000..2f110156b --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 22bc992fa..ffcbfe894 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -453,3 +453,6 @@ databaseChangeLog: - include: file: changesets/changelog_20251215T152152Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20260211T143540Z.xml + relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 4ec138b38..dfc90bfcb 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1567,9 +1567,9 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { assertEquals(2, selectedLineType.getLimitsForLineType().size()); assertEquals("LimitSet1", selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); assertEquals(10.0, selectedLineType.getLimitsForLineType().getFirst().getPermanentLimit()); - assertEquals(20.0, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimitValue()); - assertEquals("TemporaryLimit1", selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimitName()); - assertEquals(100, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimitAcceptableDuration()); + assertEquals(20.0, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getLimitValue()); + assertEquals("TemporaryLimit1", selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getName()); + assertEquals(100, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getAcceptableDuration()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); } @@ -2000,4 +2000,94 @@ void testSearchModificationInfos() throws Exception { }); assertEquals(0, networkModificationsResult.size()); } + + @Test + void test() throws JsonProcessingException { + String test = "[\n" + + " {\n" + + " \"category\": \"AERIAL\",\n" + + " \"type\": \"TEST1 123AB\",\n" + + " \"voltage\": 63,\n" + + " \"conductorType\": \"AL - Aluminium\",\n" + + " \"section\": 27.5,\n" + + " \"conductorsNumber\": 1,\n" + + " \"circuitsNumber\": 1,\n" + + " \"groundWiresNumber\": 0,\n" + + " \"linearResistance\": 0.00047,\n" + + " \"linearReactance\": 0.000345,\n" + + " \"linearCapacity\": 0.00000000727,\n" + + " \"limitsForLineType\": [\n" + + " {\n" + + " \"limitSetName\": \"LimitSet1\",\n" + + " \"permanentLimit\": 10,\n" + + " \"temporaryLimits\": [\n" + + " {\n" + + " \"limitValue\": 20,\n" + + " \"acceptableDuration\": 100,\n" + + " \"name\": \"TemporaryLimit1\"\n" + + " }\n" + + " ],\n" + + " \"temperature\": 37,\n" + + " \"area\": 1\n" + + " },\n" + + " {\n" + + " \"limitSetName\": \"LimitSet2\",\n" + + " \"permanentLimit\": 12,\n" + + " \"temporaryLimits\": [\n" + + " {\n" + + " \"limitValue\": 25,\n" + + " \"acceptableDuration\": 100,\n" + + " \"name\": \"TemporaryLimit2\"\n" + + " }\n" + + " ],\n" + + " \"temperature\": 21,\n" + + " \"area\": 2\n" + + " }\n" + + " ]\n" + + " }, {\n" + + " \"category\": \"UNDERGROUND\",\n" + + " \"type\": \"CS1 123AB\",\n" + + " \"voltage\": 400,\n" + + " \"conductorType\": \"Aluminium\",\n" + + " \"section\": 24,\n" + + " \"insulator\": \"AB\",\n" + + " \"screen\": \"Aluminium\",\n" + + " \"linearResistance\": 0.010,\n" + + " \"linearReactance\": 0.120,\n" + + " \"linearCapacity\": 0.000000123,\n" + + " \"limitsForLineType\": [\n" + + " {\n" + + " \"limitSetName\": \"LimitSet1\",\n" + + " \"permanentLimit\": 10,\n" + + " \"temporaryLimits\": [\n" + + " {\n" + + " \"limitValue\": 20,\n" + + " \"acceptableDuration\": 100,\n" + + " \"name\": \"TemporaryLimit1\"\n" + + " }\n" + + " ],\n" + + " \"temperature\": 37,\n" + + " \"area\": 1\n" + + " },\n" + + " {\n" + + " \"limitSetName\": \"LimitSet2\",\n" + + " \"permanentLimit\": 12,\n" + + " \"temporaryLimits\": [\n" + + " {\n" + + " \"limitValue\": 25,\n" + + " \"acceptableDuration\": 100,\n" + + " \"name\": \"TemporaryLimit2\"\n" + + " }\n" + + " ],\n" + + " \"temperature\": 21,\n" + + " \"area\": 2\n" + + " }\n" + + " ]\n" + + " }" + + + "]"; + List lineTypes = mapper.readValue(test, new TypeReference>() { + }); + System.out.println(lineTypes); + } } diff --git a/src/test/resources/line_types_catalog_3.json.gz b/src/test/resources/line_types_catalog_3.json.gz index add23bba9be013c1e149edd64f330e6ab9ea0865..ea2bb3262d1ae5a4e80dfe1aa336299d5732eb11 100644 GIT binary patch delta 434 zcmV;j0Zsnj1HuCcABzYG44sT=kq8`r?UPMw!axv)@A(xWXDit?R_HBNTMEH~+V&tG z#&wW|WD_>K1u6dbZqkh=(OL^06@tk;^Re?L@4|82FLSxB$3WpGm0Rz@^}_M=C5*hz z4^i6;i|Bkjn-iDNUies{&ooxBDd>IAhFB`rnyFOIZCMz(cWxN#gbS{dsxn7^rg$n$ z0v&Yw?b>{zlNCxsNrkv%nyX{5k*OBz4=(Y*e9K}k5abkdo+}WnIF8@-eLonq5`Z;$ zFX%TChL8c{YFqL0H=u_ui8Ou?7JX-J5AWb&Kr}7SIgS% z@0YEkqG_yUQQsTX5J-e#n2qc@mup4OYelc4RsWh=(f?{i$+1?{sn;(ZtJ(?gzD-8s z>GSl}{I?A}oc(IwpjzgHf6rJqupusT9fK(<3-*0DipIZ~y=R delta 463 zcmV;=0Wki;1K$G(ABzYGe|D&7kq8`ry_8XF!Y~lW-}@o0c>g$k=yZQtC|BXggucLrZi2yIlY6@7A8L)<<>Kt4FYaea;WPJHMAq7f;Eo z*FQzYp#U9OO_!_C4^fodo8k976?m@|w~?_;a<-F1% zORn|Ns3E`{us+h-|LkAq9qQs8>gwI_KfQCbZhMEqbKW7_yNzd9cxD#7%qP>u#KgutB`I1+J& Date: Thu, 12 Feb 2026 08:35:12 +0100 Subject: [PATCH 2/2] clean code Signed-off-by: Etienne LESOT --- .../server/ModificationControllerTest.java | 90 ------------------- 1 file changed, 90 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index dfc90bfcb..aa7d48f52 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -2000,94 +2000,4 @@ void testSearchModificationInfos() throws Exception { }); assertEquals(0, networkModificationsResult.size()); } - - @Test - void test() throws JsonProcessingException { - String test = "[\n" + - " {\n" + - " \"category\": \"AERIAL\",\n" + - " \"type\": \"TEST1 123AB\",\n" + - " \"voltage\": 63,\n" + - " \"conductorType\": \"AL - Aluminium\",\n" + - " \"section\": 27.5,\n" + - " \"conductorsNumber\": 1,\n" + - " \"circuitsNumber\": 1,\n" + - " \"groundWiresNumber\": 0,\n" + - " \"linearResistance\": 0.00047,\n" + - " \"linearReactance\": 0.000345,\n" + - " \"linearCapacity\": 0.00000000727,\n" + - " \"limitsForLineType\": [\n" + - " {\n" + - " \"limitSetName\": \"LimitSet1\",\n" + - " \"permanentLimit\": 10,\n" + - " \"temporaryLimits\": [\n" + - " {\n" + - " \"limitValue\": 20,\n" + - " \"acceptableDuration\": 100,\n" + - " \"name\": \"TemporaryLimit1\"\n" + - " }\n" + - " ],\n" + - " \"temperature\": 37,\n" + - " \"area\": 1\n" + - " },\n" + - " {\n" + - " \"limitSetName\": \"LimitSet2\",\n" + - " \"permanentLimit\": 12,\n" + - " \"temporaryLimits\": [\n" + - " {\n" + - " \"limitValue\": 25,\n" + - " \"acceptableDuration\": 100,\n" + - " \"name\": \"TemporaryLimit2\"\n" + - " }\n" + - " ],\n" + - " \"temperature\": 21,\n" + - " \"area\": 2\n" + - " }\n" + - " ]\n" + - " }, {\n" + - " \"category\": \"UNDERGROUND\",\n" + - " \"type\": \"CS1 123AB\",\n" + - " \"voltage\": 400,\n" + - " \"conductorType\": \"Aluminium\",\n" + - " \"section\": 24,\n" + - " \"insulator\": \"AB\",\n" + - " \"screen\": \"Aluminium\",\n" + - " \"linearResistance\": 0.010,\n" + - " \"linearReactance\": 0.120,\n" + - " \"linearCapacity\": 0.000000123,\n" + - " \"limitsForLineType\": [\n" + - " {\n" + - " \"limitSetName\": \"LimitSet1\",\n" + - " \"permanentLimit\": 10,\n" + - " \"temporaryLimits\": [\n" + - " {\n" + - " \"limitValue\": 20,\n" + - " \"acceptableDuration\": 100,\n" + - " \"name\": \"TemporaryLimit1\"\n" + - " }\n" + - " ],\n" + - " \"temperature\": 37,\n" + - " \"area\": 1\n" + - " },\n" + - " {\n" + - " \"limitSetName\": \"LimitSet2\",\n" + - " \"permanentLimit\": 12,\n" + - " \"temporaryLimits\": [\n" + - " {\n" + - " \"limitValue\": 25,\n" + - " \"acceptableDuration\": 100,\n" + - " \"name\": \"TemporaryLimit2\"\n" + - " }\n" + - " ],\n" + - " \"temperature\": 21,\n" + - " \"area\": 2\n" + - " }\n" + - " ]\n" + - " }" + - - "]"; - List lineTypes = mapper.readValue(test, new TypeReference>() { - }); - System.out.println(lineTypes); - } }