From c96609c908af16cf67f41591a64008b637e63590 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 12 Feb 2026 08:31:32 +0100 Subject: [PATCH 01/18] 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 02/18] 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); - } } From c3997f3a4eea7048575654f4780272ef9dfd82f1 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 16 Feb 2026 08:52:05 +0100 Subject: [PATCH 03/18] for line catalog allow to have several temporary limits Signed-off-by: Etienne LESOT --- .../server/NetworkModificationController.java | 18 ++++++++++++++++-- .../entities/catalog/AerialLineTypeEntity.java | 6 ++++-- .../catalog/LimitsForLineTypeEntity.java | 12 +++++++++++- .../entities/catalog/LineTypeEntity.java | 15 +++++++++++++-- .../entities/catalog/TemporaryLimitEntity.java | 3 ++- .../catalog/UndergroundLineTypeEntity.java | 7 +++++-- .../LineTypesCatalogRepository.java | 1 + .../service/LineTypesCatalogService.java | 18 ++++++++++++++++-- src/main/resources/config/application.yaml | 2 +- 9 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index bc0503889..b4eebd055 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -16,6 +16,8 @@ import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.service.LineTypesCatalogService; import org.gridsuite.modification.server.service.NetworkModificationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.util.Pair; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -40,6 +42,8 @@ private enum GroupModificationAction { MOVE, COPY, INSERT } + private static final Logger LOGGER = LoggerFactory.getLogger(NetworkModificationController.class); + private final NetworkModificationService networkModificationService; private final LineTypesCatalogService lineTypesCatalogService; @@ -197,15 +201,25 @@ public ResponseEntity> getLineTypes() { @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Get a line types catalog") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) - public ResponseEntity getOneLineTypeWithLimits(@PathVariable("uuid") UUID uuid) { - return ResponseEntity.ok().body(lineTypesCatalogService.getLineTypesWithLimits(uuid)); + public ResponseEntity getOneLineTypeWithAreaAndTemperature(@PathVariable("uuid") UUID uuid) { + return ResponseEntity.ok().body(lineTypesCatalogService.getLineTypesWithAreaAndTemperature(uuid)); + } + + @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}/area/{area}/temperature/{temperature}", params = {}, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get a line types catalog") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) + public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID uuid, @PathVariable String area, @PathVariable String temperature) { + LineTypeInfos test = lineTypesCatalogService.getLineTypesWithLimits(uuid, area, temperature); + return ResponseEntity.ok().body(test); } @PostMapping(value = "/network-modifications/catalog/line_types", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary = "Create or reset completely a line types catalog") @ApiResponse(responseCode = "200", description = "The line types catalog is created or reset") public ResponseEntity resetLineTypes(@RequestParam("file") MultipartFile file) { + LOGGER.info("Resetting line types catalog with file: {}", file.getOriginalFilename()); lineTypesCatalogService.resetLineTypes(file); + LOGGER.info("Resetting line types catalog is over"); return ResponseEntity.ok().build(); } diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java index 290aef162..c7ece7761 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java @@ -60,9 +60,11 @@ public AerialLineTypeInfos toDto() { } @Override - public AerialLineTypeInfos toDtoWithLimits() { + public AerialLineTypeInfos toDtoWithLimits(String area, String temperature) { return toDtoBuilder() - .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) + .limitsForLineType(this.getLimitsForLineType().stream() + .filter((limitsForLineTypeEntity) -> limitsForLineTypeEntity.getArea().equals(area) && limitsForLineTypeEntity.getTemperature().equals(temperature)) + .map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) .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 a89ddd456..ce22a5009 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 @@ -50,12 +50,22 @@ public class LimitsForLineTypeEntity { @Column private String temperature; + + + public LimitsForLineTypeInfos toLineTypeInfosWithoutLimits() { + return LimitsForLineTypeInfos.builder() + .id(id) + .area(area) + .temperature(temperature) + .build(); + } + public LimitsForLineTypeInfos toLineTypeInfos() { return LimitsForLineTypeInfos.builder() .id(id) .limitSetName(limitSetName) .permanentLimit(permanentLimit) - .temporaryLimits(temporaryLimits.stream().map(TemporaryLimitEntity::toTemporaryLimitInfos).toList()) + .temporaryLimits(temporaryLimits.parallelStream().map(TemporaryLimitEntity::toTemporaryLimitInfos).toList()) .area(area) .temperature(temperature) .build(); diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java index 5790017ca..3d8a0bd4c 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java @@ -9,6 +9,7 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; +import org.gridsuite.modification.server.dto.catalog.LimitsForLineTypeInfos; import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import java.util.List; @@ -88,9 +89,19 @@ public LineTypeInfos toDto() { return toBuilder().build(); } - public LineTypeInfos toDtoWithLimits() { + public LineTypeInfos toDtoWithAreaAndTemperature() { return toBuilder() - .limitsForLineType(this.limitsForLineType.stream().map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) + .limitsForLineType(this.limitsForLineType.parallelStream().map(LimitsForLineTypeEntity::toLineTypeInfosWithoutLimits).toList()) + .build(); + } + + public LineTypeInfos toDtoWithLimits(String area, String temperature) { + List test = this.limitsForLineType + .stream() + .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area) && limitsForLineTypeEntity.getTemperature().equals(temperature)) + .map(LimitsForLineTypeEntity::toLineTypeInfos).toList(); + return toBuilder() + .limitsForLineType(test) .build(); } } 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 index 28c135783..742475708 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java @@ -46,6 +46,7 @@ public TemporaryLimitInfos toTemporaryLimitInfos() { .id(id) .limitValue(limitValue) .acceptableDuration(acceptableDuration) - .name(name).build(); + .name(name) + .build(); } } diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java index 7745beafa..7c5644a22 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java @@ -59,10 +59,13 @@ public UndergroundLineTypeInfos toDto() { } @Override - public UndergroundLineTypeInfos toDtoWithLimits() { + public UndergroundLineTypeInfos toDtoWithLimits(String area, String temperature) { return toDtoBuilder() .shapeFactors(SHAPE_FACTORS) - .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) + .limitsForLineType(this.getLimitsForLineType().parallelStream() + .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area)) + .map(LimitsForLineTypeEntity::toLineTypeInfos) + .toList()) .build(); } } diff --git a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java index cef4c43cf..aba6d522d 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java @@ -10,6 +10,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; import java.util.UUID; /** 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 6e02b0c41..bce5c5728 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java @@ -11,6 +11,8 @@ import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.entities.catalog.LineTypeEntity; import org.gridsuite.modification.server.repositories.LineTypesCatalogRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -32,6 +34,8 @@ public class LineTypesCatalogService { private final LineTypesCatalogRepository lineTypesCatalogRepository; private final ObjectMapper mapper; + private static final Logger LOGGER = LoggerFactory.getLogger(LineTypesCatalogService.class); + public LineTypesCatalogService(LineTypesCatalogRepository lineTypesCatalogRepository, ObjectMapper objectMapper) { this.lineTypesCatalogRepository = lineTypesCatalogRepository; this.mapper = objectMapper; @@ -45,9 +49,15 @@ public List getAllLineTypes() { } @Transactional(readOnly = true) - public LineTypeInfos getLineTypesWithLimits(UUID id) { + public LineTypeInfos getLineTypesWithLimits(UUID id, String area, String temperature) { + Optional lineTypeEntity = lineTypesCatalogRepository.findById(id); + return lineTypeEntity.map((LineTypeEntity lineType) -> lineType.toDtoWithLimits(area, temperature)).orElse(null); + } + + @Transactional(readOnly = true) + public LineTypeInfos getLineTypesWithAreaAndTemperature(UUID id) { Optional lineTypeEntity = lineTypesCatalogRepository.findById(id); - return lineTypeEntity.map(LineTypeEntity::toDtoWithLimits).orElse(null); + return lineTypeEntity.map(LineTypeEntity::toDtoWithAreaAndTemperature).orElse(null); } public void deleteLineTypesCatalog() { @@ -58,14 +68,18 @@ public void resetLineTypes(MultipartFile file) { try (GZIPInputStream gzipInputStream = new GZIPInputStream(file.getInputStream())) { List lineTypes = mapper.readValue(gzipInputStream, new TypeReference>() { }); + LOGGER.info("Starting to delete all line types from the catalog"); deleteLineTypesCatalog(); + LOGGER.info("All line types from the catalog deleted"); // remove duplicates in file Set lineTypesSet = lineTypes.stream().collect(Collectors.toSet()); List lineTypesEntities = lineTypesSet.stream() .map(LineTypeInfos::toEntity) .collect(Collectors.toList()); + LOGGER.info("Starting to save {} line types in the catalog", lineTypesEntities.size()); lineTypesCatalogRepository.saveAll(lineTypesEntities); + LOGGER.info("all line types saved in the catalog"); } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/src/main/resources/config/application.yaml b/src/main/resources/config/application.yaml index 2edfd845d..5bd6027e6 100644 --- a/src/main/resources/config/application.yaml +++ b/src/main/resources/config/application.yaml @@ -14,7 +14,7 @@ spring: order_inserts: true order_updates: true jdbc: - batch_size: 128 + batch_size: 512 cloud: function: From 2d5683dff8cb53f493e29037e99eaf86a3ff7e5b Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 16 Feb 2026 09:01:58 +0100 Subject: [PATCH 04/18] checkstyle Signed-off-by: Etienne LESOT --- .../server/entities/catalog/AerialLineTypeEntity.java | 2 +- .../server/entities/catalog/LimitsForLineTypeEntity.java | 2 -- .../server/repositories/LineTypesCatalogRepository.java | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java index c7ece7761..f26d0103e 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java @@ -63,7 +63,7 @@ public AerialLineTypeInfos toDto() { public AerialLineTypeInfos toDtoWithLimits(String area, String temperature) { return toDtoBuilder() .limitsForLineType(this.getLimitsForLineType().stream() - .filter((limitsForLineTypeEntity) -> limitsForLineTypeEntity.getArea().equals(area) && limitsForLineTypeEntity.getTemperature().equals(temperature)) + .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area) && limitsForLineTypeEntity.getTemperature().equals(temperature)) .map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) .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 ce22a5009..064ebac24 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 @@ -50,8 +50,6 @@ public class LimitsForLineTypeEntity { @Column private String temperature; - - public LimitsForLineTypeInfos toLineTypeInfosWithoutLimits() { return LimitsForLineTypeInfos.builder() .id(id) diff --git a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java index aba6d522d..cef4c43cf 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java @@ -10,7 +10,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.Optional; import java.util.UUID; /** From 30d801ef5b1c4cfb57c6b93933e366b6b5af4514 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 16 Feb 2026 10:25:31 +0100 Subject: [PATCH 05/18] fix tests Signed-off-by: Etienne LESOT --- .../server/ModificationControllerTest.java | 17 +++++++++++++++++ .../TabularGeneratorModificationsTest.java | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index aa7d48f52..50751821a 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1558,6 +1558,8 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { // getting the whole catalog does not load the limits assertNull(lineTypes.get(0).getLimitsForLineType()); assertNull(lineTypes.get(1).getLimitsForLineType()); + + // get one line of the catalog does not load limits too mvcResult = mockMvc .perform(get(URI_LINE_CATALOG + "/" + lineTypes.get(0).getId()).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -1565,6 +1567,21 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { resultAsString = mvcResult.getResponse().getContentAsString(); LineTypeInfos selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); assertEquals(2, selectedLineType.getLimitsForLineType().size()); + assertNull(selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); + assertNull(selectedLineType.getLimitsForLineType().getFirst().getPermanentLimit()); + assertNull(selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits()); + assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); + assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); + + // get one line with specified area and temperature + mvcResult = mockMvc + .perform(get(URI_LINE_CATALOG + "/" + lineTypes.getFirst().getId() + "/area/1/temperature/37").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + resultAsString = mvcResult.getResponse().getContentAsString(); + selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); + + assertEquals(1, selectedLineType.getLimitsForLineType().size()); assertEquals("LimitSet1", selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); assertEquals(10.0, selectedLineType.getLimitsForLineType().getFirst().getPermanentLimit()); assertEquals(20.0, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getLimitValue()); 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 3c4a94f49..4726c32a6 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 @@ -184,7 +184,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(20, 9, 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); } @@ -237,7 +237,7 @@ void testSqlRequestsCountOnPutGroupsDuplications2() throws Exception { reset(); ApiUtils.putGroupsDuplications(mockMvc, getGroupId(), targetGroupUuid, getNetworkId()); - TestUtils.assertRequestsCount(20, 10, 2, 0); // (107, 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(20, 9, 2, 0); // (107, 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); } @@ -289,7 +289,7 @@ void testSqlRequestsCountOnPutGroupsWithCopy2() throws Exception { reset(); ApiUtils.putGroupsWithCopy(mockMvc, targetGroupUuid, modifications.stream().map(Pair::getLeft).toList(), getNetworkId()); - TestUtils.assertRequestsCount(19, 10, 2, 0); // (26, 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(19, 9, 2, 0); // (26, 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); } @@ -337,7 +337,7 @@ void testSqlRequestsCountOnPostNetworkModificationsDuplicate2() throws Exception reset(); Map idsMapping = ApiUtils.postNetworkModificationsDuplicate(mockMvc, modifications.stream().map(Pair::getLeft).toList()); - TestUtils.assertRequestsCount(17, 9, 2, 0); // (93, 9, 1, 0) before improvements, why one additional insert ? Maybe insertion batch size limit but not sure + TestUtils.assertRequestsCount(17, 8, 2, 0); // (93, 9, 1, 0) before improvements, why one additional insert ? Maybe insertion batch size limit but not sure assertTabularModificationsEquals(modifications, idsMapping); } From d51903081af348af89a7fd25df41b46e440d2715 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 17 Feb 2026 10:58:44 +0100 Subject: [PATCH 06/18] fix Signed-off-by: Etienne LESOT --- .../server/NetworkModificationController.java | 10 +++-- .../catalog/AerialLineTypeEntity.java | 41 +++++++++++-------- .../catalog/LimitsForLineTypeEntity.java | 2 + .../entities/catalog/LineTypeEntity.java | 13 ++---- .../catalog/TemporaryLimitEntity.java | 2 + .../catalog/UndergroundLineTypeEntity.java | 20 +++++++-- .../service/LineTypesCatalogService.java | 8 ++-- .../server/ModificationControllerTest.java | 24 ++++++++++- 8 files changed, 81 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index b4eebd055..e4fef789f 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -202,14 +202,16 @@ public ResponseEntity> getLineTypes() { @Operation(summary = "Get a line types catalog") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) public ResponseEntity getOneLineTypeWithAreaAndTemperature(@PathVariable("uuid") UUID uuid) { - return ResponseEntity.ok().body(lineTypesCatalogService.getLineTypesWithAreaAndTemperature(uuid)); + return ResponseEntity.ok().body(lineTypesCatalogService.getLineTypesWithAreaTemperatureShapeFactors(uuid)); } - @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}/area/{area}/temperature/{temperature}", params = {}, produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}/withLimits", produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Get a line types catalog") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) - public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID uuid, @PathVariable String area, @PathVariable String temperature) { - LineTypeInfos test = lineTypesCatalogService.getLineTypesWithLimits(uuid, area, temperature); + public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID uuid, @RequestParam String area, + @RequestParam(required = false) String temperature, + @RequestParam(required = false) String shapeFactor) { + LineTypeInfos test = lineTypesCatalogService.getLineTypesWithLimits(uuid, area, temperature, shapeFactor); return ResponseEntity.ok().body(test); } diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java index f26d0103e..4bf5bbe52 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java @@ -9,6 +9,7 @@ import jakarta.persistence.*; import lombok.NoArgsConstructor; import org.gridsuite.modification.server.dto.catalog.AerialLineTypeInfos; +import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; /** * @author Sylvain Bouzols @@ -41,17 +42,17 @@ private void assignAttributes(AerialLineTypeInfos aerialLineType) { AerialLineTypeInfos.AerialLineTypeInfosBuilder toDtoBuilder() { return AerialLineTypeInfos.builder() - .id(this.getId()) - .type(this.getType()) - .voltage(this.getVoltage()) - .conductorType(this.getConductorType()) - .section(this.getSection()) - .conductorsNumber(this.conductorsNumber) - .circuitsNumber(this.circuitsNumber) - .groundWiresNumber(this.groundWiresNumber) - .linearResistance(this.getLinearResistance()) - .linearReactance(this.getLinearReactance()) - .linearCapacity(this.getLinearCapacity()); + .id(this.getId()) + .type(this.getType()) + .voltage(this.getVoltage()) + .conductorType(this.getConductorType()) + .section(this.getSection()) + .conductorsNumber(this.conductorsNumber) + .circuitsNumber(this.circuitsNumber) + .groundWiresNumber(this.groundWiresNumber) + .linearResistance(this.getLinearResistance()) + .linearReactance(this.getLinearReactance()) + .linearCapacity(this.getLinearCapacity()); } @Override @@ -60,12 +61,20 @@ public AerialLineTypeInfos toDto() { } @Override - public AerialLineTypeInfos toDtoWithLimits(String area, String temperature) { + public AerialLineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { return toDtoBuilder() - .limitsForLineType(this.getLimitsForLineType().stream() - .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area) && limitsForLineTypeEntity.getTemperature().equals(temperature)) - .map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) - .build(); + .limitsForLineType(this.getLimitsForLineType().stream() + .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area) && + limitsForLineTypeEntity.getTemperature().equals(temperature)) + .map(LimitsForLineTypeEntity::toLineTypeInfos).toList()) + .build(); + } + + @Override + public LineTypeInfos toDtoWithAreaTemperatureShapeFactors() { + return toDtoBuilder() + .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfosWithoutLimits).toList()) + .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 064ebac24..87901fed1 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 @@ -11,6 +11,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import org.gridsuite.modification.server.dto.catalog.LimitsForLineTypeInfos; import org.gridsuite.modification.server.dto.catalog.TemporaryLimitInfos; @@ -22,6 +23,7 @@ * @author Etienne Lesot */ @Getter +@Setter @NoArgsConstructor @AllArgsConstructor @SuperBuilder diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java index 3d8a0bd4c..edfec59c3 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/LineTypeEntity.java @@ -9,7 +9,6 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; -import org.gridsuite.modification.server.dto.catalog.LimitsForLineTypeInfos; import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import java.util.List; @@ -89,20 +88,14 @@ public LineTypeInfos toDto() { return toBuilder().build(); } - public LineTypeInfos toDtoWithAreaAndTemperature() { + public LineTypeInfos toDtoWithAreaTemperatureShapeFactors() { return toBuilder() .limitsForLineType(this.limitsForLineType.parallelStream().map(LimitsForLineTypeEntity::toLineTypeInfosWithoutLimits).toList()) .build(); } - public LineTypeInfos toDtoWithLimits(String area, String temperature) { - List test = this.limitsForLineType - .stream() - .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area) && limitsForLineTypeEntity.getTemperature().equals(temperature)) - .map(LimitsForLineTypeEntity::toLineTypeInfos).toList(); - return toBuilder() - .limitsForLineType(test) - .build(); + public LineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { + throw new UnsupportedOperationException("Not implemented, only implemented for subClasses AerialLineTypeEntity and UndergroundLineTypeEntity"); } } 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 index 742475708..bc4940b96 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/TemporaryLimitEntity.java @@ -11,6 +11,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import org.gridsuite.modification.server.dto.catalog.TemporaryLimitInfos; @@ -20,6 +21,7 @@ * @author Etienne Lesot */ @Getter +@Setter @NoArgsConstructor @AllArgsConstructor @SuperBuilder diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java index 7c5644a22..dd59267db 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java @@ -8,6 +8,7 @@ import jakarta.persistence.*; import lombok.NoArgsConstructor; +import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.dto.catalog.UndergroundLineTypeInfos; import java.util.List; @@ -59,15 +60,28 @@ public UndergroundLineTypeInfos toDto() { } @Override - public UndergroundLineTypeInfos toDtoWithLimits(String area, String temperature) { + public UndergroundLineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { + double shapeFactorValue = shapeFactor == null ? 0 : Double.parseDouble(shapeFactor); return toDtoBuilder() - .shapeFactors(SHAPE_FACTORS) - .limitsForLineType(this.getLimitsForLineType().parallelStream() + .limitsForLineType(this.getLimitsForLineType().stream() .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area)) + .peek(limitsForLineTypeEntity -> { + limitsForLineTypeEntity.setPermanentLimit(shapeFactorValue * limitsForLineTypeEntity.getPermanentLimit()); + limitsForLineTypeEntity.getTemporaryLimits().forEach(temporaryLimit -> + temporaryLimit.setLimitValue(shapeFactorValue * temporaryLimit.getLimitValue())); + }) .map(LimitsForLineTypeEntity::toLineTypeInfos) .toList()) .build(); } + + @Override + public LineTypeInfos toDtoWithAreaTemperatureShapeFactors() { + return toDtoBuilder() + .shapeFactors(SHAPE_FACTORS) + .limitsForLineType(this.getLimitsForLineType().stream().map(LimitsForLineTypeEntity::toLineTypeInfosWithoutLimits).toList()) + .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 bce5c5728..43eaa5c37 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java @@ -49,15 +49,15 @@ public List getAllLineTypes() { } @Transactional(readOnly = true) - public LineTypeInfos getLineTypesWithLimits(UUID id, String area, String temperature) { + public LineTypeInfos getLineTypesWithLimits(UUID id, String area, String temperature, String shapeFactor) { Optional lineTypeEntity = lineTypesCatalogRepository.findById(id); - return lineTypeEntity.map((LineTypeEntity lineType) -> lineType.toDtoWithLimits(area, temperature)).orElse(null); + return lineTypeEntity.map((LineTypeEntity lineType) -> lineType.toDtoWithLimits(area, temperature, shapeFactor)).orElse(null); } @Transactional(readOnly = true) - public LineTypeInfos getLineTypesWithAreaAndTemperature(UUID id) { + public LineTypeInfos getLineTypesWithAreaTemperatureShapeFactors(UUID id) { Optional lineTypeEntity = lineTypesCatalogRepository.findById(id); - return lineTypeEntity.map(LineTypeEntity::toDtoWithAreaAndTemperature).orElse(null); + return lineTypeEntity.map(LineTypeEntity::toDtoWithAreaTemperatureShapeFactors).orElse(null); } public void deleteLineTypesCatalog() { diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 50751821a..8e695664e 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -28,7 +28,9 @@ import org.gridsuite.modification.server.dto.ModificationsSearchResult; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; +import org.gridsuite.modification.server.dto.catalog.AerialLineTypeInfos; import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; +import org.gridsuite.modification.server.dto.catalog.UndergroundLineTypeInfos; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosRepository; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; import org.gridsuite.modification.server.elasticsearch.TombstonedEquipmentInfosRepository; @@ -1558,6 +1560,8 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { // getting the whole catalog does not load the limits assertNull(lineTypes.get(0).getLimitsForLineType()); assertNull(lineTypes.get(1).getLimitsForLineType()); + UUID aerialLineId = lineTypes.get(0) instanceof AerialLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); + UUID underGroundLineId = lineTypes.get(0) instanceof UndergroundLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); // get one line of the catalog does not load limits too mvcResult = mockMvc @@ -1573,9 +1577,9 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); - // get one line with specified area and temperature + // get one aerial line with limits mvcResult = mockMvc - .perform(get(URI_LINE_CATALOG + "/" + lineTypes.getFirst().getId() + "/area/1/temperature/37").contentType(MediaType.APPLICATION_JSON)) + .perform(get(URI_LINE_CATALOG + "/" + aerialLineId + "/withLimits?area=1&temperature=37").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); resultAsString = mvcResult.getResponse().getContentAsString(); @@ -1589,6 +1593,22 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { assertEquals(100, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getAcceptableDuration()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); + + // get one underground line with limits + mvcResult = mockMvc + .perform(get(URI_LINE_CATALOG + "/" + underGroundLineId + "/withLimits?area=1&shapeFactor=0.9").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + resultAsString = mvcResult.getResponse().getContentAsString(); + selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); + assertEquals(1, selectedLineType.getLimitsForLineType().size()); + assertEquals("LimitSet1", selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); + assertEquals(9.0, selectedLineType.getLimitsForLineType().getFirst().getPermanentLimit()); + assertEquals(18.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()); } private MockMultipartFile createMockMultipartFile(String fileName) throws IOException { From 8b7c0c74d687f15e774ffa9d8e39794708c0b724 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 17 Feb 2026 11:11:26 +0100 Subject: [PATCH 07/18] fix Signed-off-by: Etienne LESOT --- .../modification/server/NetworkModificationController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index e4fef789f..3d11fab28 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -219,9 +219,7 @@ public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID @Operation(summary = "Create or reset completely a line types catalog") @ApiResponse(responseCode = "200", description = "The line types catalog is created or reset") public ResponseEntity resetLineTypes(@RequestParam("file") MultipartFile file) { - LOGGER.info("Resetting line types catalog with file: {}", file.getOriginalFilename()); lineTypesCatalogService.resetLineTypes(file); - LOGGER.info("Resetting line types catalog is over"); return ResponseEntity.ok().build(); } From e68011613a1e88600dfa4d7da99d1c9ee4b0ef52 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 17 Feb 2026 11:16:43 +0100 Subject: [PATCH 08/18] fix sonar Signed-off-by: Etienne LESOT --- .../server/ModificationControllerTest.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 8e695664e..eb8356909 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1532,7 +1532,7 @@ void testGetLineTypesCatalog() throws Exception { } @Test - void testGetLineTypeWithLimitsCatalog() throws Exception { + void testGetLineTypeWithoutLimitsCatalog() throws Exception { MvcResult mvcResult; String resultAsString; @@ -1560,8 +1560,6 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { // getting the whole catalog does not load the limits assertNull(lineTypes.get(0).getLimitsForLineType()); assertNull(lineTypes.get(1).getLimitsForLineType()); - UUID aerialLineId = lineTypes.get(0) instanceof AerialLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); - UUID underGroundLineId = lineTypes.get(0) instanceof UndergroundLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); // get one line of the catalog does not load limits too mvcResult = mockMvc @@ -1577,13 +1575,33 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); + + } + + @Test + void testGetLineTypeWithLimitsCatalog() throws Exception { + // Create the catalog with some line types + mockMvc.perform(multipart(URI_LINE_CATALOG) + .file(createMockMultipartFile(LINE_TYPES_CATALOG_JSON_FILE_3))) + .andExpect(status().isOk()); + + MvcResult mvcResult = mockMvc + .perform(get(URI_LINE_CATALOG).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + String resultAsString = mvcResult.getResponse().getContentAsString(); + List lineTypes = mapper.readValue(resultAsString, new TypeReference<>() { }); + assertEquals(2, lineTypes.size()); + UUID aerialLineId = lineTypes.get(0) instanceof AerialLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); + UUID underGroundLineId = lineTypes.get(0) instanceof UndergroundLineTypeInfos ? lineTypes.get(0).getId() : lineTypes.get(1).getId(); + // get one aerial line with limits mvcResult = mockMvc .perform(get(URI_LINE_CATALOG + "/" + aerialLineId + "/withLimits?area=1&temperature=37").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); resultAsString = mvcResult.getResponse().getContentAsString(); - selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); + LineTypeInfos selectedLineType = mapper.readValue(resultAsString, new TypeReference<>() { }); assertEquals(1, selectedLineType.getLimitsForLineType().size()); assertEquals("LimitSet1", selectedLineType.getLimitsForLineType().getFirst().getLimitSetName()); From e972bf430ea676c987c7b5da5e3a1079f5ecd1e2 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 17 Feb 2026 11:19:17 +0100 Subject: [PATCH 09/18] fix Signed-off-by: Etienne LESOT --- .../modification/server/ModificationControllerTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index eb8356909..5428bb239 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1574,8 +1574,6 @@ void testGetLineTypeWithoutLimitsCatalog() throws Exception { assertNull(selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits()); assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); - - } @Test From b51b241dc3fac5e43da366427d84c9207987eb7f Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 17 Feb 2026 11:30:28 +0100 Subject: [PATCH 10/18] fix Signed-off-by: Etienne LESOT --- .../modification/server/ModificationControllerTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 5428bb239..37d2aea4d 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1574,6 +1574,8 @@ void testGetLineTypeWithoutLimitsCatalog() throws Exception { assertNull(selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits()); assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); + mockMvc.perform(delete(URI_LINE_CATALOG)) + .andExpect(status().isOk()); } @Test @@ -1625,6 +1627,9 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { assertEquals(100, selectedLineType.getLimitsForLineType().getFirst().getTemporaryLimits().getFirst().getAcceptableDuration()); assertEquals("37", selectedLineType.getLimitsForLineType().getFirst().getTemperature()); assertEquals("1", selectedLineType.getLimitsForLineType().getFirst().getArea()); + + mockMvc.perform(delete(URI_LINE_CATALOG)) + .andExpect(status().isOk()); } private MockMultipartFile createMockMultipartFile(String fileName) throws IOException { From e6f867531e7ef2331e4b207d252bdafcef9fdb52 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 17 Feb 2026 11:38:06 +0100 Subject: [PATCH 11/18] fix issue Signed-off-by: Etienne LESOT --- .../modification/server/NetworkModificationController.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index 3d11fab28..3cb2a5bf0 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -16,8 +16,6 @@ import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.service.LineTypesCatalogService; import org.gridsuite.modification.server.service.NetworkModificationService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.data.util.Pair; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -42,8 +40,6 @@ private enum GroupModificationAction { MOVE, COPY, INSERT } - private static final Logger LOGGER = LoggerFactory.getLogger(NetworkModificationController.class); - private final NetworkModificationService networkModificationService; private final LineTypesCatalogService lineTypesCatalogService; From 3c0c6905bc24f50226cfae6b48680a40ecd994bf Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 17 Feb 2026 11:40:23 +0100 Subject: [PATCH 12/18] fix Signed-off-by: Etienne LESOT --- .../server/entities/catalog/UndergroundLineTypeEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java index dd59267db..e8c29c260 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java @@ -61,7 +61,7 @@ public UndergroundLineTypeInfos toDto() { @Override public UndergroundLineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { - double shapeFactorValue = shapeFactor == null ? 0 : Double.parseDouble(shapeFactor); + double shapeFactorValue = shapeFactor == null ? 1 : Double.parseDouble(shapeFactor); return toDtoBuilder() .limitsForLineType(this.getLimitsForLineType().stream() .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area)) From 7864969ca9b060f81205e3cb3fec0ac4ef02a273 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 19 Feb 2026 08:33:08 +0100 Subject: [PATCH 13/18] review Signed-off-by: Etienne LESOT --- .../modification/server/NetworkModificationController.java | 6 +++--- .../server/dto/catalog/TemporaryLimitInfos.java | 2 +- .../server/entities/catalog/LimitsForLineTypeEntity.java | 2 +- .../modification/server/ModificationControllerTest.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index 3cb2a5bf0..ddb01dc2a 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -195,14 +195,14 @@ public ResponseEntity> getLineTypes() { } @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}", produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Get a line types catalog") + @Operation(summary = "Get a line type from the catalog with area and temperature but no limits") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) public ResponseEntity getOneLineTypeWithAreaAndTemperature(@PathVariable("uuid") UUID uuid) { return ResponseEntity.ok().body(lineTypesCatalogService.getLineTypesWithAreaTemperatureShapeFactors(uuid)); } - @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}/withLimits", produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Get a line types catalog") + @GetMapping(value = "/network-modifications/catalog/line_types/{uuid}/with-limits", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get a line type from the catalog with the limits associated with requested area, temperature and shape factor") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The line types catalog is returned")}) public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID uuid, @RequestParam String area, @RequestParam(required = false) String temperature, 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 index 886db6b52..c890ba5a1 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java @@ -25,7 +25,7 @@ @AllArgsConstructor @Getter @Setter -@Schema(description = "Temporary Limits infos") +@Schema(description = "Temporary limits infos") public class TemporaryLimitInfos { @Schema(description = "id") private UUID id; 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 87901fed1..e8cf63dba 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 @@ -65,7 +65,7 @@ public LimitsForLineTypeInfos toLineTypeInfos() { .id(id) .limitSetName(limitSetName) .permanentLimit(permanentLimit) - .temporaryLimits(temporaryLimits.parallelStream().map(TemporaryLimitEntity::toTemporaryLimitInfos).toList()) + .temporaryLimits(temporaryLimits.stream().map(TemporaryLimitEntity::toTemporaryLimitInfos).toList()) .area(area) .temperature(temperature) .build(); diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 37d2aea4d..75641d9ae 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1597,7 +1597,7 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { // get one aerial line with limits mvcResult = mockMvc - .perform(get(URI_LINE_CATALOG + "/" + aerialLineId + "/withLimits?area=1&temperature=37").contentType(MediaType.APPLICATION_JSON)) + .perform(get(URI_LINE_CATALOG + "/" + aerialLineId + "/with-limits?area=1&temperature=37").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); resultAsString = mvcResult.getResponse().getContentAsString(); @@ -1614,7 +1614,7 @@ void testGetLineTypeWithLimitsCatalog() throws Exception { // get one underground line with limits mvcResult = mockMvc - .perform(get(URI_LINE_CATALOG + "/" + underGroundLineId + "/withLimits?area=1&shapeFactor=0.9").contentType(MediaType.APPLICATION_JSON)) + .perform(get(URI_LINE_CATALOG + "/" + underGroundLineId + "/with-limits?area=1&shapeFactor=0.9").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn(); resultAsString = mvcResult.getResponse().getContentAsString(); From 8853c81e7572145481f5dbbdf613564bcc3a294b Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 19 Feb 2026 08:50:13 +0100 Subject: [PATCH 14/18] change peek to for loop Signed-off-by: Etienne LESOT --- .../catalog/UndergroundLineTypeEntity.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java index e8c29c260..fec5b7640 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/UndergroundLineTypeEntity.java @@ -8,9 +8,11 @@ import jakarta.persistence.*; import lombok.NoArgsConstructor; +import org.gridsuite.modification.server.dto.catalog.LimitsForLineTypeInfos; import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.dto.catalog.UndergroundLineTypeInfos; +import java.util.ArrayList; import java.util.List; /** @@ -62,16 +64,17 @@ public UndergroundLineTypeInfos toDto() { @Override public UndergroundLineTypeInfos toDtoWithLimits(String area, String temperature, String shapeFactor) { double shapeFactorValue = shapeFactor == null ? 1 : Double.parseDouble(shapeFactor); + List filterAndAdaptedLimits = new ArrayList<>(); + for (LimitsForLineTypeEntity limitsForLineTypeEntity : this.getLimitsForLineType()) { + if (limitsForLineTypeEntity.getArea().equals(area)) { + limitsForLineTypeEntity.setPermanentLimit(shapeFactorValue * limitsForLineTypeEntity.getPermanentLimit()); + limitsForLineTypeEntity.getTemporaryLimits().forEach(temporaryLimit -> + temporaryLimit.setLimitValue(shapeFactorValue * temporaryLimit.getLimitValue())); + filterAndAdaptedLimits.add(limitsForLineTypeEntity.toLineTypeInfos()); + } + } return toDtoBuilder() - .limitsForLineType(this.getLimitsForLineType().stream() - .filter(limitsForLineTypeEntity -> limitsForLineTypeEntity.getArea().equals(area)) - .peek(limitsForLineTypeEntity -> { - limitsForLineTypeEntity.setPermanentLimit(shapeFactorValue * limitsForLineTypeEntity.getPermanentLimit()); - limitsForLineTypeEntity.getTemporaryLimits().forEach(temporaryLimit -> - temporaryLimit.setLimitValue(shapeFactorValue * temporaryLimit.getLimitValue())); - }) - .map(LimitsForLineTypeEntity::toLineTypeInfos) - .toList()) + .limitsForLineType(filterAndAdaptedLimits) .build(); } From 0c3c2a5d4c24092ab174431baaf33d17c9de4b82 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 19 Feb 2026 10:04:28 +0100 Subject: [PATCH 15/18] revert blanks Signed-off-by: Etienne LESOT --- .../catalog/AerialLineTypeEntity.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java index 4bf5bbe52..b000e35a1 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/catalog/AerialLineTypeEntity.java @@ -42,17 +42,17 @@ private void assignAttributes(AerialLineTypeInfos aerialLineType) { AerialLineTypeInfos.AerialLineTypeInfosBuilder toDtoBuilder() { return AerialLineTypeInfos.builder() - .id(this.getId()) - .type(this.getType()) - .voltage(this.getVoltage()) - .conductorType(this.getConductorType()) - .section(this.getSection()) - .conductorsNumber(this.conductorsNumber) - .circuitsNumber(this.circuitsNumber) - .groundWiresNumber(this.groundWiresNumber) - .linearResistance(this.getLinearResistance()) - .linearReactance(this.getLinearReactance()) - .linearCapacity(this.getLinearCapacity()); + .id(this.getId()) + .type(this.getType()) + .voltage(this.getVoltage()) + .conductorType(this.getConductorType()) + .section(this.getSection()) + .conductorsNumber(this.conductorsNumber) + .circuitsNumber(this.circuitsNumber) + .groundWiresNumber(this.groundWiresNumber) + .linearResistance(this.getLinearResistance()) + .linearReactance(this.getLinearReactance()) + .linearCapacity(this.getLinearCapacity()); } @Override From a099c06803e522367354f78738feac7e94dae849 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 19 Feb 2026 10:06:14 +0100 Subject: [PATCH 16/18] fix Signed-off-by: Etienne LESOT --- .../modification/server/dto/catalog/TemporaryLimitInfos.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index c890ba5a1..9aed4b4f7 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/catalog/TemporaryLimitInfos.java @@ -25,7 +25,7 @@ @AllArgsConstructor @Getter @Setter -@Schema(description = "Temporary limits infos") +@Schema(description = "Temporary limit infos") public class TemporaryLimitInfos { @Schema(description = "id") private UUID id; From 86094f84a7aa053d8c957d7e03474a2eae243ce8 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Tue, 24 Feb 2026 12:51:54 +0100 Subject: [PATCH 17/18] speed up deleting catalog Signed-off-by: Etienne LESOT --- .../LineTypesCatalogRepository.java | 13 ++++++++++ .../service/LineTypesCatalogService.java | 4 ++- .../changesets/changelog_20260211T143540Z.xml | 25 ++++++++++++++++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java index cef4c43cf..b90e51073 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/LineTypesCatalogRepository.java @@ -8,7 +8,10 @@ import org.gridsuite.modification.server.entities.catalog.LineTypeEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.util.UUID; @@ -17,4 +20,14 @@ */ @Repository public interface LineTypesCatalogRepository extends JpaRepository { + + @Transactional + @Modifying + @Query(value = """ + TRUNCATE TABLE line_types_catalog, + aerial_line_types_catalog, + underground_line_types_catalog + RESTART IDENTITY CASCADE + """, nativeQuery = true) + void truncateCatalogFast(); } 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 43eaa5c37..a65a4a3a1 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java @@ -61,7 +61,9 @@ public LineTypeInfos getLineTypesWithAreaTemperatureShapeFactors(UUID id) { } public void deleteLineTypesCatalog() { - lineTypesCatalogRepository.deleteAll(); + LOGGER.info("Starting to delete all line types from the catalog"); + lineTypesCatalogRepository.truncateCatalogFast(); + LOGGER.info("All line types from the catalog deleted"); } public void resetLineTypes(MultipartFile file) { diff --git a/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml index 2f110156b..ce7a2dcb4 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260211T143540Z.xml @@ -14,7 +14,15 @@ - + @@ -25,4 +33,19 @@ + + + + + + From 0aa443402920d41eb88ba17134ed8c67d585c684 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 26 Feb 2026 08:21:12 +0100 Subject: [PATCH 18/18] fix logs Signed-off-by: Etienne LESOT --- .../modification/server/service/LineTypesCatalogService.java | 2 -- 1 file changed, 2 deletions(-) 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 a65a4a3a1..875fc2936 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LineTypesCatalogService.java @@ -70,9 +70,7 @@ public void resetLineTypes(MultipartFile file) { try (GZIPInputStream gzipInputStream = new GZIPInputStream(file.getInputStream())) { List lineTypes = mapper.readValue(gzipInputStream, new TypeReference>() { }); - LOGGER.info("Starting to delete all line types from the catalog"); deleteLineTypesCatalog(); - LOGGER.info("All line types from the catalog deleted"); // remove duplicates in file Set lineTypesSet = lineTypes.stream().collect(Collectors.toSet());