From 635696b84a1228166083eeac2662674011a948a7 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Mon, 30 Jun 2025 16:05:21 +0200 Subject: [PATCH 01/16] feat: add controller to save study layout, for now only diagram layout can be saved Signed-off-by: LE SAULNIER Kevin --- .../StudyLayoutConfigController.java | 39 +++++++++++++++++++ .../server/dto/studylayout/StudyLayout.java | 18 +++++++++ .../diagramlayout/AbstractDiagramLayout.java | 26 +++++++++++++ .../diagramlayout/DiagramLayoutType.java | 17 ++++++++ .../NetworkAreaDiagramLayout.java | 30 ++++++++++++++ .../SubstationDiagramLayout.java | 26 +++++++++++++ .../VoltageLevelDiagramLayout.java | 26 +++++++++++++ .../AbstractDiagramLayoutEntity.java | 28 +++++++++++++ .../NetworkAreaDiagramLayoutEntity.java | 30 ++++++++++++++ .../studylayout/StudyLayoutEntity.java | 30 ++++++++++++++ .../studylayout/StudyLayoutRepository.java | 10 +++++ .../SubstationDiagramLayoutEntity.java | 26 +++++++++++++ .../studylayout/VoltageLevelLayoutEntity.java | 26 +++++++++++++ .../server/service/StudyLayoutService.java | 31 +++++++++++++++ 14 files changed, 363 insertions(+) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutConfigController.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutConfigController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutConfigController.java new file mode 100644 index 0000000..1737615 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutConfigController.java @@ -0,0 +1,39 @@ +package org.gridsuite.studyconfig.server.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.gridsuite.studyconfig.server.StudyConfigApi; +import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; +import org.gridsuite.studyconfig.server.service.StudyLayoutService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +@RestController +@RequestMapping(value = "/" + StudyConfigApi.API_VERSION + "/study-layout") +@RequiredArgsConstructor +@Tag(name = "Study Layout Config", description = "Study Layout Configuration API") +public class StudyLayoutConfigController { + private final StudyLayoutService studyLayoutService; + + @PostMapping(consumes = APPLICATION_JSON_VALUE) + @Operation(summary = "Save study layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The newly created study layout UUID returned")}) + public ResponseEntity saveStudyLayout(@RequestBody StudyLayout studyLayout) { + return ResponseEntity.ok().body(studyLayoutService.saveStudyLayout(studyLayout)); + } + + @GetMapping(value = "/{id}") + @Operation(summary = "Get study layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout is returned")}) + public ResponseEntity getStudyLayout( + @PathVariable("id") UUID studyLayoutUuid) { + return ResponseEntity.ok().body(studyLayoutService.getByStudyUuidAndUserId(studyLayoutUuid)); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java new file mode 100644 index 0000000..749f3ba --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java @@ -0,0 +1,18 @@ +package org.gridsuite.studyconfig.server.dto.studylayout; + +import lombok.Builder; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; + +import java.util.List; + +@Builder +public class StudyLayout { + List diagramLayoutParams; + + public StudyLayoutEntity toEntity() { + return StudyLayoutEntity.builder() + .diagramGridLayoutEntityList(diagramLayoutParams.stream().map(AbstractDiagramLayout::toEntity).toList()) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java new file mode 100644 index 0000000..b8ae533 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -0,0 +1,26 @@ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.entities.studylayout.AbstractDiagramLayoutEntity; + +import java.util.UUID; + +@SuperBuilder +public abstract class AbstractDiagramLayout { + UUID diagramUuid; + + Integer w; + Integer h; + Integer x; + Integer y; + + @JsonIgnore + public abstract DiagramLayoutType getDiagramType(); + + public String getType() { + return getDiagramType().getLabel(); + } + + public abstract AbstractDiagramLayoutEntity toEntity(); +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java new file mode 100644 index 0000000..5ca9fbc --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java @@ -0,0 +1,17 @@ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import lombok.Getter; + +@Getter +public enum DiagramLayoutType { + NETWORK_AREA("network-area"), + SUBSTATION("substation"), + VOLTAGE_LEVEL("voltage-level"); + + private final String label; + + DiagramLayoutType(String label) { + this.label = label; + } + +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java new file mode 100644 index 0000000..de44b91 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -0,0 +1,30 @@ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.entities.studylayout.NetworkAreaDiagramLayoutEntity; + +import java.util.List; + +@SuperBuilder +public class NetworkAreaDiagramLayout extends AbstractDiagramLayout { + List voltageLevelIds; + Integer depth; + + @Override + public DiagramLayoutType getDiagramType() { + return DiagramLayoutType.NETWORK_AREA; + } + + @Override + public NetworkAreaDiagramLayoutEntity toEntity() { + return NetworkAreaDiagramLayoutEntity.builder() + .diagramUuid(diagramUuid) + .width(w) + .height(h) + .xPosition(x) + .yPosition(y) + .voltageLevelIds(voltageLevelIds) + .depth(depth) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java new file mode 100644 index 0000000..dc67a22 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java @@ -0,0 +1,26 @@ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.entities.studylayout.SubstationDiagramLayoutEntity; + +@SuperBuilder +public class SubstationDiagramLayout extends AbstractDiagramLayout { + String substationId; + + @Override + public DiagramLayoutType getDiagramType() { + return DiagramLayoutType.SUBSTATION; + } + + @Override + public SubstationDiagramLayoutEntity toEntity() { + return SubstationDiagramLayoutEntity.builder() + .diagramUuid(diagramUuid) + .width(w) + .height(h) + .xPosition(x) + .yPosition(y) + .substationId(substationId) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java new file mode 100644 index 0000000..aeacd53 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -0,0 +1,26 @@ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.entities.studylayout.VoltageLevelLayoutEntity; + +@SuperBuilder +public class VoltageLevelDiagramLayout extends AbstractDiagramLayout { + String voltageLevelId; + + @Override + public DiagramLayoutType getDiagramType() { + return DiagramLayoutType.VOLTAGE_LEVEL; + } + + @Override + public VoltageLevelLayoutEntity toEntity() { + return VoltageLevelLayoutEntity.builder() + .diagramUuid(diagramUuid) + .width(w) + .height(h) + .xPosition(x) + .yPosition(y) + .voltageLevelId(voltageLevelId) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java new file mode 100644 index 0000000..d25135c --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java @@ -0,0 +1,28 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; + +import java.util.UUID; + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public abstract class AbstractDiagramLayoutEntity { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private UUID id; + + UUID diagramUuid; + Integer width; + Integer height; + Integer xPosition; + Integer yPosition; + + public abstract AbstractDiagramLayout toDto(); +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java new file mode 100644 index 0000000..0bf0b6a --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java @@ -0,0 +1,30 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import jakarta.persistence.Entity; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; + +import java.util.List; + +@Entity +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity { + List voltageLevelIds; + Integer depth; + + public NetworkAreaDiagramLayout toDto() { + return NetworkAreaDiagramLayout.builder() + .diagramUuid(diagramUuid) + .w(width) + .h(height) + .x(xPosition) + .y(yPosition) + .depth(depth) + .voltageLevelIds(voltageLevelIds) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java new file mode 100644 index 0000000..412fbb7 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java @@ -0,0 +1,30 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; + +import java.util.List; +import java.util.UUID; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Getter +public class StudyLayoutEntity { + @Id + UUID uuid; + + @OneToMany + List diagramGridLayoutEntityList; + + public StudyLayout toDto() { + return StudyLayout.builder() + .diagramLayoutParams(diagramGridLayoutEntityList.stream().map(AbstractDiagramLayoutEntity::toDto).toList()) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java new file mode 100644 index 0000000..a1c28fc --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java @@ -0,0 +1,10 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface StudyLayoutRepository extends JpaRepository { +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java new file mode 100644 index 0000000..2bf9270 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java @@ -0,0 +1,26 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import jakarta.persistence.Entity; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; + +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@Entity +public class SubstationDiagramLayoutEntity extends AbstractDiagramLayoutEntity { + String substationId; + + public SubstationDiagramLayout toDto() { + return SubstationDiagramLayout.builder() + .diagramUuid(diagramUuid) + .w(width) + .h(height) + .x(xPosition) + .y(yPosition) + .substationId(substationId) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java new file mode 100644 index 0000000..eb93af5 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java @@ -0,0 +1,26 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import jakarta.persistence.Entity; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; + +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@Entity +public class VoltageLevelLayoutEntity extends AbstractDiagramLayoutEntity { + String voltageLevelId; + + public VoltageLevelDiagramLayout toDto() { + return VoltageLevelDiagramLayout.builder() + .diagramUuid(diagramUuid) + .w(width) + .h(height) + .x(xPosition) + .y(yPosition) + .voltageLevelId(voltageLevelId) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java new file mode 100644 index 0000000..1f5e129 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java @@ -0,0 +1,31 @@ +package org.gridsuite.studyconfig.server.service; + +import jakarta.persistence.EntityNotFoundException; +import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; +import org.springframework.stereotype.Service; + +import java.util.UUID; + +@Service +public class StudyLayoutService { + private final StudyLayoutRepository studyLayoutRepository; + + public StudyLayoutService(StudyLayoutRepository studyLayoutRepository) { + this.studyLayoutRepository = studyLayoutRepository; + } + + public StudyLayout getByStudyUuidAndUserId(UUID studyLayoutUuid) { + return studyLayoutRepository + .findById(studyLayoutUuid) + .orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)) + .toDto(); + } + + public UUID saveStudyLayout(StudyLayout studyLayout) { + StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(studyLayout.toEntity()); + + return studyLayoutEntity.getUuid(); + } +} From 7f2376391d4336d279b6dd248a6f3d6a2329c300 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Tue, 1 Jul 2025 13:58:57 +0200 Subject: [PATCH 02/16] fix: save and get implementation Signed-off-by: LE SAULNIER Kevin --- ...roller.java => StudyLayoutController.java} | 9 ++- .../server/dto/studylayout/StudyLayout.java | 6 +- .../diagramlayout/AbstractDiagramLayout.java | 27 ++++++- .../diagramlayout/DiagramLayoutType.java | 2 +- .../NetworkAreaDiagramLayout.java | 8 +- .../SubstationDiagramLayout.java | 6 ++ .../VoltageLevelDiagramLayout.java | 6 ++ .../studylayout/StudyLayoutEntity.java | 3 +- .../server/service/StudyLayoutService.java | 3 + .../changesets/changelog_20250701T092933Z.xml | 75 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 3 + .../studyconfig/server/StudyLayoutTest.java | 51 +++++++++++++ 12 files changed, 188 insertions(+), 11 deletions(-) rename src/main/java/org/gridsuite/studyconfig/server/controller/{StudyLayoutConfigController.java => StudyLayoutController.java} (80%) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml create mode 100644 src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutConfigController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java similarity index 80% rename from src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutConfigController.java rename to src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java index 1737615..49a3cb1 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutConfigController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java @@ -1,5 +1,6 @@ package org.gridsuite.studyconfig.server.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -8,6 +9,7 @@ import org.gridsuite.studyconfig.server.StudyConfigApi; import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; import org.gridsuite.studyconfig.server.service.StudyLayoutService; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,7 +21,7 @@ @RequestMapping(value = "/" + StudyConfigApi.API_VERSION + "/study-layout") @RequiredArgsConstructor @Tag(name = "Study Layout Config", description = "Study Layout Configuration API") -public class StudyLayoutConfigController { +public class StudyLayoutController { private final StudyLayoutService studyLayoutService; @PostMapping(consumes = APPLICATION_JSON_VALUE) @@ -29,11 +31,12 @@ public ResponseEntity saveStudyLayout(@RequestBody StudyLayout studyLayout return ResponseEntity.ok().body(studyLayoutService.saveStudyLayout(studyLayout)); } - @GetMapping(value = "/{id}") + @GetMapping(value = "/{id}", produces = APPLICATION_JSON_VALUE) @Operation(summary = "Get study layout") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout is returned")}) public ResponseEntity getStudyLayout( @PathVariable("id") UUID studyLayoutUuid) { - return ResponseEntity.ok().body(studyLayoutService.getByStudyUuidAndUserId(studyLayoutUuid)); + ObjectMapper objectMapper = new ObjectMapper(); + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyLayoutService.getByStudyUuidAndUserId(studyLayoutUuid)); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java index 749f3ba..d531c1a 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java @@ -1,12 +1,16 @@ package org.gridsuite.studyconfig.server.dto.studylayout; -import lombok.Builder; +import lombok.*; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import java.util.List; @Builder +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter public class StudyLayout { List diagramLayoutParams; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java index b8ae533..5550605 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -1,12 +1,33 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.entities.studylayout.AbstractDiagramLayoutEntity; import java.util.UUID; @SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "type", + visible = true +) +@JsonSubTypes({ + @JsonSubTypes.Type(value = SubstationDiagramLayout.class, name = "substation"), + @JsonSubTypes.Type(value = VoltageLevelDiagramLayout.class, name = "voltage-level"), + @JsonSubTypes.Type(value = NetworkAreaDiagramLayout.class, name = "network-area-diagram"), +}) public abstract class AbstractDiagramLayout { UUID diagramUuid; @@ -15,12 +36,10 @@ public abstract class AbstractDiagramLayout { Integer x; Integer y; +// String type = getDiagramType().getLabel(); + @JsonIgnore public abstract DiagramLayoutType getDiagramType(); - public String getType() { - return getDiagramType().getLabel(); - } - public abstract AbstractDiagramLayoutEntity toEntity(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java index 5ca9fbc..032f8a1 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java @@ -4,7 +4,7 @@ @Getter public enum DiagramLayoutType { - NETWORK_AREA("network-area"), + NETWORK_AREA_DIAGRAM("network-area-diagram"), SUBSTATION("substation"), VOLTAGE_LEVEL("voltage-level"); diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java index de44b91..ad0f77c 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -1,18 +1,24 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.entities.studylayout.NetworkAreaDiagramLayoutEntity; import java.util.List; @SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +@Setter public class NetworkAreaDiagramLayout extends AbstractDiagramLayout { List voltageLevelIds; Integer depth; @Override public DiagramLayoutType getDiagramType() { - return DiagramLayoutType.NETWORK_AREA; + return DiagramLayoutType.NETWORK_AREA_DIAGRAM; } @Override diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java index dc67a22..81dd616 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java @@ -1,9 +1,15 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.entities.studylayout.SubstationDiagramLayoutEntity; @SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +@Setter public class SubstationDiagramLayout extends AbstractDiagramLayout { String substationId; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java index aeacd53..9efe8e9 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -1,9 +1,15 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.entities.studylayout.VoltageLevelLayoutEntity; @SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +@Setter public class VoltageLevelDiagramLayout extends AbstractDiagramLayout { String voltageLevelId; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java index 412fbb7..aac660f 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java @@ -17,9 +17,10 @@ @Getter public class StudyLayoutEntity { @Id + @GeneratedValue(strategy = GenerationType.AUTO) UUID uuid; - @OneToMany + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) List diagramGridLayoutEntityList; public StudyLayout toDto() { diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java index 1f5e129..0202963 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java @@ -5,6 +5,7 @@ import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.UUID; @@ -16,6 +17,7 @@ public StudyLayoutService(StudyLayoutRepository studyLayoutRepository) { this.studyLayoutRepository = studyLayoutRepository; } + @Transactional public StudyLayout getByStudyUuidAndUserId(UUID studyLayoutUuid) { return studyLayoutRepository .findById(studyLayoutUuid) @@ -23,6 +25,7 @@ public StudyLayout getByStudyUuidAndUserId(UUID studyLayoutUuid) { .toDto(); } + @Transactional public UUID saveStudyLayout(StudyLayout studyLayout) { StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(studyLayout.toEntity()); diff --git a/src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml new file mode 100644 index 0000000..39e090e --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 5f2c487..caba889 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -62,3 +62,6 @@ databaseChangeLog: - include: file: changesets/changelog_20250619T162423Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20250701T092933Z.xml + relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java new file mode 100644 index 0000000..bf91683 --- /dev/null +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java @@ -0,0 +1,51 @@ +package org.gridsuite.studyconfig.server; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; +import org.gridsuite.studyconfig.server.service.StudyLayoutService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest +@AutoConfigureMockMvc +public class StudyLayoutTest { + + @Autowired + private StudyLayoutRepository studyLayoutRepository; + @Autowired + private StudyLayoutService studyLayoutService; + + @Test + void testCreateStudyLayout() throws Exception { + UUID diagramLayoutUuid = UUID.randomUUID(); + StudyLayout studyLayout = StudyLayout.builder() + .diagramLayoutParams(List.of( + VoltageLevelDiagramLayout.builder() + .voltageLevelId("vl1") + .w(1) + .h(2) + .x(3) + .y(4) + .diagramUuid(diagramLayoutUuid) + .build())) + .build(); + + StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(studyLayout.toEntity()); + + ObjectMapper objectMapper = new ObjectMapper(); + + String test = objectMapper.writeValueAsString(studyLayoutService.getByStudyUuidAndUserId(studyLayoutEntity.getUuid())); + + assertTrue(true); + } +} \ No newline at end of file From f0f22b22adcb0664784decca3a398b6ca647850e Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Wed, 2 Jul 2025 10:11:46 +0200 Subject: [PATCH 03/16] fix: add getter to fix dto generation Signed-off-by: LE SAULNIER Kevin --- .../dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java | 2 ++ .../dto/studylayout/diagramlayout/SubstationDiagramLayout.java | 2 ++ .../studylayout/diagramlayout/VoltageLevelDiagramLayout.java | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java index ad0f77c..8ad025b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -1,6 +1,7 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; @@ -12,6 +13,7 @@ @AllArgsConstructor @NoArgsConstructor @Setter +@Getter public class NetworkAreaDiagramLayout extends AbstractDiagramLayout { List voltageLevelIds; Integer depth; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java index 81dd616..618dd0c 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java @@ -1,6 +1,7 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; @@ -10,6 +11,7 @@ @AllArgsConstructor @NoArgsConstructor @Setter +@Getter public class SubstationDiagramLayout extends AbstractDiagramLayout { String substationId; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java index 9efe8e9..1020510 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -1,6 +1,7 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; @@ -10,6 +11,7 @@ @AllArgsConstructor @NoArgsConstructor @Setter +@Getter public class VoltageLevelDiagramLayout extends AbstractDiagramLayout { String voltageLevelId; From 9c6887b2b4ae86b7b31f049dfd200d5743a28225 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Thu, 10 Jul 2025 14:31:43 +0200 Subject: [PATCH 04/16] fix: layout is now saved for multiple dimensions Signed-off-by: LE SAULNIER Kevin --- .../diagramlayout/AbstractDiagramLayout.java | 6 +- .../diagramlayout/DiagramGridLayout.java | 25 ++++++ .../NetworkAreaDiagramLayout.java | 10 ++- .../SubstationDiagramLayout.java | 11 ++- .../VoltageLevelDiagramLayout.java | 11 ++- .../AbstractDiagramLayoutEntity.java | 9 +- .../studylayout/DiagramGridLayoutEntity.java | 27 ++++++ .../NetworkAreaDiagramLayoutEntity.java | 10 ++- .../SubstationDiagramLayoutEntity.java | 11 ++- .../studylayout/VoltageLevelLayoutEntity.java | 11 ++- .../changesets/changelog_20250708T085438Z.xml | 88 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 2 +- .../studyconfig/server/StudyLayoutTest.java | 19 ++-- 13 files changed, 201 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java create mode 100644 src/main/resources/db/changelog/changesets/changelog_20250708T085438Z.xml diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java index 5550605..06018c0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -10,6 +10,7 @@ import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.entities.studylayout.AbstractDiagramLayoutEntity; +import java.util.Map; import java.util.UUID; @SuperBuilder @@ -31,10 +32,7 @@ public abstract class AbstractDiagramLayout { UUID diagramUuid; - Integer w; - Integer h; - Integer x; - Integer y; + Map gridLayout; // String type = getDiagramType().getLabel(); diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java new file mode 100644 index 0000000..62eb25f --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java @@ -0,0 +1,25 @@ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import org.gridsuite.studyconfig.server.entities.studylayout.DiagramGridLayoutEntity; + +@Builder +@AllArgsConstructor +@Getter +public class DiagramGridLayout { + Integer w; + Integer h; + Integer x; + Integer y; + + public DiagramGridLayoutEntity toEntity() { + return DiagramGridLayoutEntity.builder() + .width(w) + .height(h) + .xPosition(x) + .yPosition(y) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java index 8ad025b..634717e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -8,6 +8,8 @@ import org.gridsuite.studyconfig.server.entities.studylayout.NetworkAreaDiagramLayoutEntity; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @SuperBuilder @AllArgsConstructor @@ -27,10 +29,10 @@ public DiagramLayoutType getDiagramType() { public NetworkAreaDiagramLayoutEntity toEntity() { return NetworkAreaDiagramLayoutEntity.builder() .diagramUuid(diagramUuid) - .width(w) - .height(h) - .xPosition(x) - .yPosition(y) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toEntity() + ))) .voltageLevelIds(voltageLevelIds) .depth(depth) .build(); diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java index 618dd0c..1aea4e1 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java @@ -7,6 +7,9 @@ import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.entities.studylayout.SubstationDiagramLayoutEntity; +import java.util.Map; +import java.util.stream.Collectors; + @SuperBuilder @AllArgsConstructor @NoArgsConstructor @@ -24,10 +27,10 @@ public DiagramLayoutType getDiagramType() { public SubstationDiagramLayoutEntity toEntity() { return SubstationDiagramLayoutEntity.builder() .diagramUuid(diagramUuid) - .width(w) - .height(h) - .xPosition(x) - .yPosition(y) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toEntity() + ))) .substationId(substationId) .build(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java index 1020510..f543155 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -7,6 +7,9 @@ import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.entities.studylayout.VoltageLevelLayoutEntity; +import java.util.Map; +import java.util.stream.Collectors; + @SuperBuilder @AllArgsConstructor @NoArgsConstructor @@ -24,10 +27,10 @@ public DiagramLayoutType getDiagramType() { public VoltageLevelLayoutEntity toEntity() { return VoltageLevelLayoutEntity.builder() .diagramUuid(diagramUuid) - .width(w) - .height(h) - .xPosition(x) - .yPosition(y) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toEntity() + ))) .voltageLevelId(voltageLevelId) .build(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java index d25135c..31ff38d 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java @@ -6,6 +6,7 @@ import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; +import java.util.Map; import java.util.UUID; @Entity @@ -19,10 +20,10 @@ public abstract class AbstractDiagramLayoutEntity { private UUID id; UUID diagramUuid; - Integer width; - Integer height; - Integer xPosition; - Integer yPosition; + + @ElementCollection + @MapKeyColumn(name = "grid_layout_key") + Map gridLayout; public abstract AbstractDiagramLayout toDto(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java new file mode 100644 index 0000000..56ed34e --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java @@ -0,0 +1,27 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Embeddable +public class DiagramGridLayoutEntity { + Integer width; + Integer height; + Integer xPosition; + Integer yPosition; + + public DiagramGridLayout toDto() { + return DiagramGridLayout.builder() + .w(width) + .h(height) + .x(xPosition) + .y(yPosition) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java index 0bf0b6a..597329b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java @@ -7,6 +7,8 @@ import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Entity @SuperBuilder @@ -19,10 +21,10 @@ public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity public NetworkAreaDiagramLayout toDto() { return NetworkAreaDiagramLayout.builder() .diagramUuid(diagramUuid) - .w(width) - .h(height) - .x(xPosition) - .y(yPosition) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toDto() + ))) .depth(depth) .voltageLevelIds(voltageLevelIds) .build(); diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java index 2bf9270..7cf7434 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java @@ -6,6 +6,9 @@ import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; +import java.util.Map; +import java.util.stream.Collectors; + @AllArgsConstructor @NoArgsConstructor @SuperBuilder @@ -16,10 +19,10 @@ public class SubstationDiagramLayoutEntity extends AbstractDiagramLayoutEntity { public SubstationDiagramLayout toDto() { return SubstationDiagramLayout.builder() .diagramUuid(diagramUuid) - .w(width) - .h(height) - .x(xPosition) - .y(yPosition) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toDto() + ))) .substationId(substationId) .build(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java index eb93af5..f00fabc 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java @@ -6,6 +6,9 @@ import lombok.experimental.SuperBuilder; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; +import java.util.Map; +import java.util.stream.Collectors; + @AllArgsConstructor @NoArgsConstructor @SuperBuilder @@ -16,10 +19,10 @@ public class VoltageLevelLayoutEntity extends AbstractDiagramLayoutEntity { public VoltageLevelDiagramLayout toDto() { return VoltageLevelDiagramLayout.builder() .diagramUuid(diagramUuid) - .w(width) - .h(height) - .x(xPosition) - .y(yPosition) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toDto() + ))) .voltageLevelId(voltageLevelId) .build(); } diff --git a/src/main/resources/db/changelog/changesets/changelog_20250708T085438Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250708T085438Z.xml new file mode 100644 index 0000000..a6f32a6 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20250708T085438Z.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index caba889..28d2904 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -63,5 +63,5 @@ databaseChangeLog: file: changesets/changelog_20250619T162423Z.xml relativeToChangelogFile: true - include: - file: changesets/changelog_20250701T092933Z.xml + file: changesets/changelog_20250708T085438Z.xml relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java index bf91683..9ab66f9 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; @@ -12,13 +13,14 @@ import org.springframework.boot.test.context.SpringBootTest; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest @AutoConfigureMockMvc -public class StudyLayoutTest { +class StudyLayoutTest { @Autowired private StudyLayoutRepository studyLayoutRepository; @@ -32,10 +34,15 @@ void testCreateStudyLayout() throws Exception { .diagramLayoutParams(List.of( VoltageLevelDiagramLayout.builder() .voltageLevelId("vl1") - .w(1) - .h(2) - .x(3) - .y(4) + .gridLayout(Map.of( + "lg", + DiagramGridLayout.builder().w(1) + .h(2) + .x(3) + .y(4) + .build() + )) + .diagramUuid(diagramLayoutUuid) .build())) .build(); @@ -48,4 +55,4 @@ void testCreateStudyLayout() throws Exception { assertTrue(true); } -} \ No newline at end of file +} From 01c851f693f68d8477fc667b7f2b9eaafe446446 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Fri, 11 Jul 2025 15:17:18 +0200 Subject: [PATCH 05/16] fix: coverage and update Signed-off-by: LE SAULNIER Kevin --- .../controller/StudyLayoutController.java | 13 +- .../studylayout/StudyLayoutEntity.java | 11 +- .../server/service/StudyLayoutService.java | 13 +- .../changesets/changelog_20250701T092933Z.xml | 75 ----------- .../server/StudyLayoutControllerTest.java | 121 ++++++++++++++++++ .../studyconfig/server/StudyLayoutTest.java | 2 +- 6 files changed, 151 insertions(+), 84 deletions(-) delete mode 100644 src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml create mode 100644 src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java index 49a3cb1..ddca4b6 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java @@ -1,6 +1,5 @@ package org.gridsuite.studyconfig.server.controller; -import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -31,12 +30,20 @@ public ResponseEntity saveStudyLayout(@RequestBody StudyLayout studyLayout return ResponseEntity.ok().body(studyLayoutService.saveStudyLayout(studyLayout)); } + @PutMapping(value = "/{id}", consumes = APPLICATION_JSON_VALUE) + @Operation(summary = "Update study layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout has been updated")}) + public ResponseEntity updateStudyLayout(@PathVariable("id") UUID studyLayoutUuid, + @RequestBody StudyLayout studyLayout) { + studyLayoutService.updateStudyLayout(studyLayoutUuid, studyLayout); + return ResponseEntity.ok().build(); + } + @GetMapping(value = "/{id}", produces = APPLICATION_JSON_VALUE) @Operation(summary = "Get study layout") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout is returned")}) public ResponseEntity getStudyLayout( @PathVariable("id") UUID studyLayoutUuid) { - ObjectMapper objectMapper = new ObjectMapper(); - return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyLayoutService.getByStudyUuidAndUserId(studyLayoutUuid)); + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyLayoutService.getByStudyLayoutUuid(studyLayoutUuid)); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java index aac660f..5876b3d 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java @@ -1,10 +1,7 @@ package org.gridsuite.studyconfig.server.entities.studylayout; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; import java.util.List; @@ -15,6 +12,7 @@ @NoArgsConstructor @Entity @Getter +@Setter public class StudyLayoutEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -28,4 +26,9 @@ public StudyLayout toDto() { .diagramLayoutParams(diagramGridLayoutEntityList.stream().map(AbstractDiagramLayoutEntity::toDto).toList()) .build(); } + + public void replaceAllDiagramLayouts(List diagramGridLayoutEntityList) { + this.diagramGridLayoutEntityList.clear(); + this.diagramGridLayoutEntityList.addAll(diagramGridLayoutEntityList); + } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java index 0202963..8ac0bef 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java @@ -2,6 +2,8 @@ import jakarta.persistence.EntityNotFoundException; import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; import org.springframework.stereotype.Service; @@ -18,7 +20,7 @@ public StudyLayoutService(StudyLayoutRepository studyLayoutRepository) { } @Transactional - public StudyLayout getByStudyUuidAndUserId(UUID studyLayoutUuid) { + public StudyLayout getByStudyLayoutUuid(UUID studyLayoutUuid) { return studyLayoutRepository .findById(studyLayoutUuid) .orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)) @@ -31,4 +33,13 @@ public UUID saveStudyLayout(StudyLayout studyLayout) { return studyLayoutEntity.getUuid(); } + + @Transactional + public void updateStudyLayout(UUID studyLayoutUuid, StudyLayout studyLayout) { + StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.findById(studyLayoutUuid).orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)); + + studyLayoutEntity.replaceAllDiagramLayouts(studyLayout.getDiagramLayoutParams().stream().map(AbstractDiagramLayout::toEntity).toList()); + + studyLayoutRepository.save(studyLayoutEntity); + } } diff --git a/src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml deleted file mode 100644 index 39e090e..0000000 --- a/src/main/resources/db/changelog/changesets/changelog_20250701T092933Z.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java new file mode 100644 index 0000000..e0a226b --- /dev/null +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java @@ -0,0 +1,121 @@ +package org.gridsuite.studyconfig.server; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; +import org.gridsuite.studyconfig.server.service.StudyLayoutService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@AutoConfigureMockMvc +class StudyLayoutControllerTest { + @Autowired + MockMvc mockMvc; + @Autowired + private StudyLayoutRepository studyLayoutRepository; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private StudyLayoutService studyLayoutService; + + @Test + void testGetStudyLayout() throws Exception { + StudyLayoutEntity expectedResult = studyLayoutRepository.save(createStudyLayout().toEntity()); + MvcResult mockMvcResult = mockMvc.perform(get("/v1/study-layout/{studyLayoutUuid}", expectedResult.getUuid())) + .andExpect(status().isOk()) + .andReturn(); + + StudyLayout result = objectMapper.readValue(mockMvcResult.getResponse().getContentAsString(), StudyLayout.class); + + assertThat(result).usingRecursiveComparison().isEqualTo(expectedResult.toDto()); + } + + @Test + void testSaveStudyLayout() throws Exception { + StudyLayout studyLayoutToSave = createStudyLayout(); + + MvcResult mockMvcResult = mockMvc.perform(post("/v1/study-layout") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(studyLayoutToSave))) + .andExpect(status().isOk()) + .andReturn(); + + UUID studyLayoutUUID = objectMapper.readValue(mockMvcResult.getResponse().getContentAsString(), UUID.class); + + StudyLayout studyLayoutToCheck = studyLayoutService.getByStudyLayoutUuid(studyLayoutUUID); + assertThat(studyLayoutToCheck).usingRecursiveComparison().isEqualTo(studyLayoutToSave); + } + + @Test + void testUpdateStudyLayout() throws Exception { + StudyLayoutEntity existingStudyLayout = studyLayoutRepository.save(createStudyLayout().toEntity()); + + UUID newDiagramLayoutUuid = UUID.randomUUID(); + StudyLayout updatedStudyLayout = createStudyLayout(); + updatedStudyLayout.getDiagramLayoutParams().add(SubstationDiagramLayout.builder() + .substationId("s1") + .gridLayout(Map.of( + "lg", + DiagramGridLayout.builder().w(5) + .h(6) + .x(7) + .y(8) + .build() + )) + + .diagramUuid(newDiagramLayoutUuid) + .build()); + + mockMvc.perform(put("/v1/study-layout/{studyLayoutUuid}", existingStudyLayout.getUuid()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updatedStudyLayout))) + .andExpect(status().isOk()) + .andReturn(); + + + StudyLayout studyLayoutToCheck = studyLayoutService.getByStudyLayoutUuid(existingStudyLayout.getUuid()); + assertThat(studyLayoutToCheck).usingRecursiveComparison().isEqualTo(updatedStudyLayout); + } + + private StudyLayout createStudyLayout() { + UUID diagramLayoutUuid = UUID.randomUUID(); + return StudyLayout.builder() + .diagramLayoutParams(new ArrayList<>(List.of( + VoltageLevelDiagramLayout.builder() + .voltageLevelId("vl1") + .gridLayout(Map.of( + "lg", + DiagramGridLayout.builder().w(1) + .h(2) + .x(3) + .y(4) + .build() + )) + + .diagramUuid(diagramLayoutUuid) + .build()))) + .build(); + } +} diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java index 9ab66f9..2fc3eb7 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java @@ -51,7 +51,7 @@ void testCreateStudyLayout() throws Exception { ObjectMapper objectMapper = new ObjectMapper(); - String test = objectMapper.writeValueAsString(studyLayoutService.getByStudyUuidAndUserId(studyLayoutEntity.getUuid())); + String test = objectMapper.writeValueAsString(studyLayoutService.getByStudyLayoutUuid(studyLayoutEntity.getUuid())); assertTrue(true); } From e89d02066fe393226297534f8c1cda463c629bb1 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Fri, 11 Jul 2025 15:20:46 +0200 Subject: [PATCH 06/16] fix: checkstyle Signed-off-by: LE SAULNIER Kevin --- .../studyconfig/server/service/StudyLayoutService.java | 1 - .../gridsuite/studyconfig/server/StudyLayoutControllerTest.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java index 8ac0bef..4c30334 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java @@ -3,7 +3,6 @@ import jakarta.persistence.EntityNotFoundException; import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; import org.springframework.stereotype.Service; diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java index e0a226b..bec2440 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; @@ -94,7 +93,6 @@ void testUpdateStudyLayout() throws Exception { .andExpect(status().isOk()) .andReturn(); - StudyLayout studyLayoutToCheck = studyLayoutService.getByStudyLayoutUuid(existingStudyLayout.getUuid()); assertThat(studyLayoutToCheck).usingRecursiveComparison().isEqualTo(updatedStudyLayout); } From f73e8b12f5d75eaecf17ad69d55ce9c4c2d39fa3 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Tue, 15 Jul 2025 11:18:09 +0200 Subject: [PATCH 07/16] fix: remove unused file Signed-off-by: LE SAULNIER Kevin --- .../diagramlayout/AbstractDiagramLayout.java | 5 ----- .../diagramlayout/DiagramLayoutType.java | 17 ----------------- .../diagramlayout/NetworkAreaDiagramLayout.java | 5 ----- .../diagramlayout/SubstationDiagramLayout.java | 5 ----- .../VoltageLevelDiagramLayout.java | 5 ----- 5 files changed, 37 deletions(-) delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java index 06018c0..38edca2 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -34,10 +34,5 @@ public abstract class AbstractDiagramLayout { Map gridLayout; -// String type = getDiagramType().getLabel(); - - @JsonIgnore - public abstract DiagramLayoutType getDiagramType(); - public abstract AbstractDiagramLayoutEntity toEntity(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java deleted file mode 100644 index 032f8a1..0000000 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramLayoutType.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; - -import lombok.Getter; - -@Getter -public enum DiagramLayoutType { - NETWORK_AREA_DIAGRAM("network-area-diagram"), - SUBSTATION("substation"), - VOLTAGE_LEVEL("voltage-level"); - - private final String label; - - DiagramLayoutType(String label) { - this.label = label; - } - -} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java index 634717e..2c9d558 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -20,11 +20,6 @@ public class NetworkAreaDiagramLayout extends AbstractDiagramLayout { List voltageLevelIds; Integer depth; - @Override - public DiagramLayoutType getDiagramType() { - return DiagramLayoutType.NETWORK_AREA_DIAGRAM; - } - @Override public NetworkAreaDiagramLayoutEntity toEntity() { return NetworkAreaDiagramLayoutEntity.builder() diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java index 1aea4e1..71badd0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java @@ -18,11 +18,6 @@ public class SubstationDiagramLayout extends AbstractDiagramLayout { String substationId; - @Override - public DiagramLayoutType getDiagramType() { - return DiagramLayoutType.SUBSTATION; - } - @Override public SubstationDiagramLayoutEntity toEntity() { return SubstationDiagramLayoutEntity.builder() diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java index f543155..8f8b1a0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -18,11 +18,6 @@ public class VoltageLevelDiagramLayout extends AbstractDiagramLayout { String voltageLevelId; - @Override - public DiagramLayoutType getDiagramType() { - return DiagramLayoutType.VOLTAGE_LEVEL; - } - @Override public VoltageLevelLayoutEntity toEntity() { return VoltageLevelLayoutEntity.builder() From 3b5ecffb55e478c44f2331ffba51e522da7c0834 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Tue, 15 Jul 2025 11:19:06 +0200 Subject: [PATCH 08/16] fix: remove unused test Signed-off-by: LE SAULNIER Kevin --- .../studyconfig/server/StudyLayoutTest.java | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java deleted file mode 100644 index 2fc3eb7..0000000 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.gridsuite.studyconfig.server; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; -import org.gridsuite.studyconfig.server.service.StudyLayoutService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -@SpringBootTest -@AutoConfigureMockMvc -class StudyLayoutTest { - - @Autowired - private StudyLayoutRepository studyLayoutRepository; - @Autowired - private StudyLayoutService studyLayoutService; - - @Test - void testCreateStudyLayout() throws Exception { - UUID diagramLayoutUuid = UUID.randomUUID(); - StudyLayout studyLayout = StudyLayout.builder() - .diagramLayoutParams(List.of( - VoltageLevelDiagramLayout.builder() - .voltageLevelId("vl1") - .gridLayout(Map.of( - "lg", - DiagramGridLayout.builder().w(1) - .h(2) - .x(3) - .y(4) - .build() - )) - - .diagramUuid(diagramLayoutUuid) - .build())) - .build(); - - StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(studyLayout.toEntity()); - - ObjectMapper objectMapper = new ObjectMapper(); - - String test = objectMapper.writeValueAsString(studyLayoutService.getByStudyLayoutUuid(studyLayoutEntity.getUuid())); - - assertTrue(true); - } -} From 86d46b50e0e935464fc7bd42abbdcdee7fe0592d Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Tue, 15 Jul 2025 11:21:19 +0200 Subject: [PATCH 09/16] fix: checkstyle Signed-off-by: LE SAULNIER Kevin --- .../dto/studylayout/diagramlayout/AbstractDiagramLayout.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java index 38edca2..ae49091 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -1,6 +1,5 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.AllArgsConstructor; From f2de482a9d7337d534577b7888dbb88d9e9a2f80 Mon Sep 17 00:00:00 2001 From: Ayoub LABIDI Date: Tue, 15 Jul 2025 18:27:19 +0200 Subject: [PATCH 10/16] Fix networkAreadDiagramLayout retrieval + better constaint names Signed-off-by: Ayoub LABIDI --- .../AbstractDiagramLayoutEntity.java | 1 + .../NetworkAreaDiagramLayoutEntity.java | 12 +++- .../studylayout/StudyLayoutEntity.java | 1 + .../SubstationDiagramLayoutEntity.java | 3 +- .../studylayout/VoltageLevelLayoutEntity.java | 3 +- ...38Z.xml => changelog_20250715T161714Z.xml} | 59 +++++++++---------- .../db/changelog/db.changelog-master.yaml | 2 +- .../server/StudyLayoutControllerTest.java | 20 +++++++ 8 files changed, 64 insertions(+), 37 deletions(-) rename src/main/resources/db/changelog/changesets/{changelog_20250708T085438Z.xml => changelog_20250715T161714Z.xml} (56%) diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java index 31ff38d..95ab1b0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java @@ -22,6 +22,7 @@ public abstract class AbstractDiagramLayoutEntity { UUID diagramUuid; @ElementCollection + @CollectionTable(foreignKey = @ForeignKey(name = "fk_grid_layout_abstract_diagram")) @MapKeyColumn(name = "grid_layout_key") Map gridLayout; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java index 597329b..aa02628 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java @@ -1,6 +1,6 @@ package org.gridsuite.studyconfig.server.entities.studylayout; -import jakarta.persistence.Entity; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -14,8 +14,16 @@ @SuperBuilder @NoArgsConstructor @AllArgsConstructor +@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_network_area_diagram_layout_abstract")) public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity { + @ElementCollection() + @CollectionTable( + name = "network_area_diagram_voltage_level_ids", + joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), + foreignKey = @ForeignKey(name = "fk_network_area_diagram_voltage_level_ids") + ) List voltageLevelIds; + Integer depth; public NetworkAreaDiagramLayout toDto() { @@ -26,7 +34,7 @@ public NetworkAreaDiagramLayout toDto() { entry -> entry.getValue().toDto() ))) .depth(depth) - .voltageLevelIds(voltageLevelIds) + .voltageLevelIds(voltageLevelIds != null ? List.copyOf(voltageLevelIds) : null) .build(); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java index 5876b3d..bb337a5 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java @@ -19,6 +19,7 @@ public class StudyLayoutEntity { UUID uuid; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "study_layout_id", foreignKey = @ForeignKey(name = "fk_diagram_layout_study_layout")) List diagramGridLayoutEntityList; public StudyLayout toDto() { diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java index 7cf7434..23afd84 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java @@ -1,6 +1,6 @@ package org.gridsuite.studyconfig.server.entities.studylayout; -import jakarta.persistence.Entity; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -13,6 +13,7 @@ @NoArgsConstructor @SuperBuilder @Entity +@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_substation_diagram_layout_abstract")) public class SubstationDiagramLayoutEntity extends AbstractDiagramLayoutEntity { String substationId; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java index f00fabc..f0322d1 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java @@ -1,6 +1,6 @@ package org.gridsuite.studyconfig.server.entities.studylayout; -import jakarta.persistence.Entity; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -13,6 +13,7 @@ @NoArgsConstructor @SuperBuilder @Entity +@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_voltage_level_layout_abstract")) public class VoltageLevelLayoutEntity extends AbstractDiagramLayoutEntity { String voltageLevelId; diff --git a/src/main/resources/db/changelog/changesets/changelog_20250708T085438Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250715T161714Z.xml similarity index 56% rename from src/main/resources/db/changelog/changesets/changelog_20250708T085438Z.xml rename to src/main/resources/db/changelog/changesets/changelog_20250715T161714Z.xml index a6f32a6..8c150e3 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20250708T085438Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20250715T161714Z.xml @@ -1,14 +1,15 @@ - + + - + @@ -22,33 +23,30 @@ - + - - - - - + + + + + - - - - - - - + + + + - + @@ -56,7 +54,7 @@ - + @@ -64,25 +62,22 @@ - - - - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 28d2904..2dc1032 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -63,5 +63,5 @@ databaseChangeLog: file: changesets/changelog_20250619T162423Z.xml relativeToChangelogFile: true - include: - file: changesets/changelog_20250708T085438Z.xml + file: changesets/changelog_20250715T161714Z.xml relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java index bec2440..ff161d1 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; @@ -87,6 +88,25 @@ void testUpdateStudyLayout() throws Exception { .diagramUuid(newDiagramLayoutUuid) .build()); + UUID diagramUuid = UUID.randomUUID(); + List voltageLevelIds = List.of("vl1", "vl2", "vl3"); + Integer depth = 5; + + updatedStudyLayout.getDiagramLayoutParams().add(NetworkAreaDiagramLayout.builder() + .diagramUuid(diagramUuid) + .gridLayout(Map.of( + "lg", + DiagramGridLayout.builder() + .w(10) + .h(20) + .x(30) + .y(40) + .build() + )) + .voltageLevelIds(voltageLevelIds) + .depth(depth) + .build()); + mockMvc.perform(put("/v1/study-layout/{studyLayoutUuid}", existingStudyLayout.getUuid()) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(updatedStudyLayout))) From e7ebe25f4077a4c9590190a41bae96eba850ce2c Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Wed, 16 Jul 2025 10:57:14 +0200 Subject: [PATCH 11/16] fix: add nad from file diagram type Signed-off-by: LE SAULNIER Kevin --- .../diagramlayout/AbstractDiagramLayout.java | 1 + .../NadFromElementDiagramLayout.java | 37 ++++++++++++++++++ .../NadFromElementDiagramLayoutEntity.java | 38 ++++++++++++++++++ ...14Z.xml => changelog_20250716T081145Z.xml} | 39 ++++++++++++------- .../db/changelog/db.changelog-master.yaml | 2 +- 5 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java rename src/main/resources/db/changelog/changesets/{changelog_20250715T161714Z.xml => changelog_20250716T081145Z.xml} (73%) diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java index ae49091..efb60fb 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -27,6 +27,7 @@ @JsonSubTypes.Type(value = SubstationDiagramLayout.class, name = "substation"), @JsonSubTypes.Type(value = VoltageLevelDiagramLayout.class, name = "voltage-level"), @JsonSubTypes.Type(value = NetworkAreaDiagramLayout.class, name = "network-area-diagram"), + @JsonSubTypes.Type(value = NadFromElementDiagramLayout.class, name = "nad-from-element"), }) public abstract class AbstractDiagramLayout { UUID diagramUuid; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java new file mode 100644 index 0000000..602e202 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java @@ -0,0 +1,37 @@ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.entities.studylayout.NadFromElementDiagramLayoutEntity; + +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +public class NadFromElementDiagramLayout extends AbstractDiagramLayout { + String elementName; + String elementType; + UUID elementUuid; + + @Override + public NadFromElementDiagramLayoutEntity toEntity() { + return NadFromElementDiagramLayoutEntity.builder() + .diagramUuid(diagramUuid) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toEntity() + ))) + .elementName(elementName) + .elementType(elementType) + .elementUuid(elementUuid) + .build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java new file mode 100644 index 0000000..77d2a93 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java @@ -0,0 +1,38 @@ +package org.gridsuite.studyconfig.server.entities.studylayout; + +import jakarta.persistence.Entity; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.PrimaryKeyJoinColumn; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NadFromElementDiagramLayout; + +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +@Entity +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_nad_from_element_diagram_layout_abstract")) +public class NadFromElementDiagramLayoutEntity extends AbstractDiagramLayoutEntity { + String elementName; + String elementType; + UUID elementUuid; + + @Override + public NadFromElementDiagramLayout toDto() { + return NadFromElementDiagramLayout.builder() + .diagramUuid(diagramUuid) + .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().toDto() + ))) + .elementName(elementName) + .elementType(elementType) + .elementUuid(elementUuid) + .build(); + } +} diff --git a/src/main/resources/db/changelog/changesets/changelog_20250715T161714Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250716T081145Z.xml similarity index 73% rename from src/main/resources/db/changelog/changesets/changelog_20250715T161714Z.xml rename to src/main/resources/db/changelog/changesets/changelog_20250716T081145Z.xml index 8c150e3..10b2917 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20250715T161714Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20250716T081145Z.xml @@ -1,6 +1,6 @@ - + @@ -9,7 +9,7 @@ - + @@ -23,7 +23,17 @@ - + + + + + + + + + + + @@ -31,7 +41,7 @@ - + @@ -39,14 +49,14 @@ - + - + @@ -54,7 +64,7 @@ - + @@ -62,22 +72,25 @@ - + - + - + + + + - + - + - + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 2dc1032..9cd7dae 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -63,5 +63,5 @@ databaseChangeLog: file: changesets/changelog_20250619T162423Z.xml relativeToChangelogFile: true - include: - file: changesets/changelog_20250715T161714Z.xml + file: changesets/changelog_20250716T081145Z.xml relativeToChangelogFile: true From 0a6a5fab4fb7b3b60d6e7e98bfec95ba5cf8d1fc Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Wed, 16 Jul 2025 11:37:32 +0200 Subject: [PATCH 12/16] fix: delete study layout on study deletion Signed-off-by: LE SAULNIER Kevin --- .../server/controller/StudyLayoutController.java | 9 +++++++++ .../server/service/StudyLayoutService.java | 5 +++++ .../server/StudyLayoutControllerTest.java | 15 ++++++++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java index ddca4b6..961a61a 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java @@ -46,4 +46,13 @@ public ResponseEntity getStudyLayout( @PathVariable("id") UUID studyLayoutUuid) { return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyLayoutService.getByStudyLayoutUuid(studyLayoutUuid)); } + + @DeleteMapping(value = "/{id}") + @Operation(summary = "Delete study layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout is deleted")}) + public ResponseEntity deleteStudyLayout( + @PathVariable("id") UUID studyLayoutUuid) { + studyLayoutService.deleteStudyLayout(studyLayoutUuid); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java index 4c30334..522f292 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java @@ -26,6 +26,11 @@ public StudyLayout getByStudyLayoutUuid(UUID studyLayoutUuid) { .toDto(); } + @Transactional + public void deleteStudyLayout(UUID studyLayoutUuid) { + studyLayoutRepository.deleteById(studyLayoutUuid); + } + @Transactional public UUID saveStudyLayout(StudyLayout studyLayout) { StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(studyLayout.toEntity()); diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java index ff161d1..263352f 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java @@ -22,9 +22,9 @@ import java.util.Map; import java.util.UUID; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.assertj.core.api.Assertions.assertThat; @@ -52,6 +52,15 @@ void testGetStudyLayout() throws Exception { assertThat(result).usingRecursiveComparison().isEqualTo(expectedResult.toDto()); } + @Test + void testDeleteStudyLayout() throws Exception { + StudyLayoutEntity expectedResult = studyLayoutRepository.save(createStudyLayout().toEntity()); + mockMvc.perform(delete("/v1/study-layout/{studyLayoutUuid}", expectedResult.getUuid())) + .andExpect(status().isOk()); + + assertTrue(studyLayoutRepository.findById(expectedResult.getUuid()).isEmpty()); + } + @Test void testSaveStudyLayout() throws Exception { StudyLayout studyLayoutToSave = createStudyLayout(); From f05dff8f921b1ebfc2840f0c2127482c8167346c Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Wed, 16 Jul 2025 15:35:40 +0200 Subject: [PATCH 13/16] fix: checkstyle Signed-off-by: LE SAULNIER Kevin --- .../gridsuite/studyconfig/server/StudyLayoutControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java index 263352f..96e8458 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; From 65442fe78032db7d045c341ba35e414d181786ef Mon Sep 17 00:00:00 2001 From: Ayoub LABIDI Date: Thu, 17 Jul 2025 14:55:49 +0200 Subject: [PATCH 14/16] Fix cyclic dependencies Signed-off-by: Ayoub LABIDI --- .../DiagramLayoutJacksonConfiguration.java | 42 +++++ .../server/dto/studylayout/StudyLayout.java | 7 - .../diagramlayout/AbstractDiagramLayout.java | 10 -- .../diagramlayout/DiagramGridLayout.java | 10 -- .../NadFromElementDiagramLayout.java | 17 -- .../NetworkAreaDiagramLayout.java | 16 -- .../SubstationDiagramLayout.java | 16 -- .../VoltageLevelDiagramLayout.java | 16 -- .../AbstractDiagramLayoutEntity.java | 5 +- .../studylayout/DiagramGridLayoutEntity.java | 12 +- .../NadFromElementDiagramLayoutEntity.java | 19 +-- .../NetworkAreaDiagramLayoutEntity.java | 19 +-- .../studylayout/StudyLayoutEntity.java | 7 - .../SubstationDiagramLayoutEntity.java | 17 +- .../studylayout/VoltageLevelLayoutEntity.java | 17 +- .../server/mapper/StudyLayoutMapper.java | 154 ++++++++++++++++++ .../server/service/StudyLayoutService.java | 19 ++- .../server/StudyLayoutControllerTest.java | 10 +- 18 files changed, 225 insertions(+), 188 deletions(-) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java create mode 100644 src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java diff --git a/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java b/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java new file mode 100644 index 0000000..63e5b8d --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java @@ -0,0 +1,42 @@ +/* + Copyright (c) 2024, RTE (http://www.rte-france.com) + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.configuration; + +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.jsontype.NamedType; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NadFromElementDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Jackson configuration for diagram layout polymorphic serialization. + * This external configuration avoids circular dependencies between the abstract base class + * and its subtypes by registering the type mappings outside the class hierarchy. + */ +@Configuration +public class DiagramLayoutJacksonConfiguration { + + @Bean + public Module diagramLayoutTypeModule() { + SimpleModule module = new SimpleModule("DiagramLayoutTypeModule"); + + // Register subtypes for polymorphic serialization/deserialization + // This approach avoids circular dependencies that would occur with @JsonSubTypes + module.registerSubtypes( + new NamedType(SubstationDiagramLayout.class, "substation"), + new NamedType(VoltageLevelDiagramLayout.class, "voltage-level"), + new NamedType(NetworkAreaDiagramLayout.class, "network-area-diagram"), + new NamedType(NadFromElementDiagramLayout.class, "nad-from-element") + ); + + return module; + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java index d531c1a..57f2eef 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java @@ -2,7 +2,6 @@ import lombok.*; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import java.util.List; @@ -13,10 +12,4 @@ @Getter public class StudyLayout { List diagramLayoutParams; - - public StudyLayoutEntity toEntity() { - return StudyLayoutEntity.builder() - .diagramGridLayoutEntityList(diagramLayoutParams.stream().map(AbstractDiagramLayout::toEntity).toList()) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java index efb60fb..1a1aecd 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -1,13 +1,11 @@ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; -import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.entities.studylayout.AbstractDiagramLayoutEntity; import java.util.Map; import java.util.UUID; @@ -23,16 +21,8 @@ property = "type", visible = true ) -@JsonSubTypes({ - @JsonSubTypes.Type(value = SubstationDiagramLayout.class, name = "substation"), - @JsonSubTypes.Type(value = VoltageLevelDiagramLayout.class, name = "voltage-level"), - @JsonSubTypes.Type(value = NetworkAreaDiagramLayout.class, name = "network-area-diagram"), - @JsonSubTypes.Type(value = NadFromElementDiagramLayout.class, name = "nad-from-element"), -}) public abstract class AbstractDiagramLayout { UUID diagramUuid; Map gridLayout; - - public abstract AbstractDiagramLayoutEntity toEntity(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java index 62eb25f..d729987 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java @@ -3,7 +3,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import org.gridsuite.studyconfig.server.entities.studylayout.DiagramGridLayoutEntity; @Builder @AllArgsConstructor @@ -13,13 +12,4 @@ public class DiagramGridLayout { Integer h; Integer x; Integer y; - - public DiagramGridLayoutEntity toEntity() { - return DiagramGridLayoutEntity.builder() - .width(w) - .height(h) - .xPosition(x) - .yPosition(y) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java index 602e202..584339b 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java @@ -5,11 +5,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.entities.studylayout.NadFromElementDiagramLayoutEntity; -import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; @SuperBuilder @AllArgsConstructor @@ -20,18 +17,4 @@ public class NadFromElementDiagramLayout extends AbstractDiagramLayout { String elementName; String elementType; UUID elementUuid; - - @Override - public NadFromElementDiagramLayoutEntity toEntity() { - return NadFromElementDiagramLayoutEntity.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toEntity() - ))) - .elementName(elementName) - .elementType(elementType) - .elementUuid(elementUuid) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java index 2c9d558..7537300 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -5,11 +5,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.entities.studylayout.NetworkAreaDiagramLayoutEntity; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @SuperBuilder @AllArgsConstructor @@ -19,17 +16,4 @@ public class NetworkAreaDiagramLayout extends AbstractDiagramLayout { List voltageLevelIds; Integer depth; - - @Override - public NetworkAreaDiagramLayoutEntity toEntity() { - return NetworkAreaDiagramLayoutEntity.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toEntity() - ))) - .voltageLevelIds(voltageLevelIds) - .depth(depth) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java index 71badd0..3628a75 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java @@ -5,10 +5,6 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.entities.studylayout.SubstationDiagramLayoutEntity; - -import java.util.Map; -import java.util.stream.Collectors; @SuperBuilder @AllArgsConstructor @@ -17,16 +13,4 @@ @Getter public class SubstationDiagramLayout extends AbstractDiagramLayout { String substationId; - - @Override - public SubstationDiagramLayoutEntity toEntity() { - return SubstationDiagramLayoutEntity.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toEntity() - ))) - .substationId(substationId) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java index 8f8b1a0..d608b55 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -5,10 +5,6 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.entities.studylayout.VoltageLevelLayoutEntity; - -import java.util.Map; -import java.util.stream.Collectors; @SuperBuilder @AllArgsConstructor @@ -17,16 +13,4 @@ @Getter public class VoltageLevelDiagramLayout extends AbstractDiagramLayout { String voltageLevelId; - - @Override - public VoltageLevelLayoutEntity toEntity() { - return VoltageLevelLayoutEntity.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toEntity() - ))) - .voltageLevelId(voltageLevelId) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java index 95ab1b0..1ed73c2 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java @@ -2,9 +2,9 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; import java.util.Map; import java.util.UUID; @@ -14,6 +14,7 @@ @SuperBuilder @NoArgsConstructor @AllArgsConstructor +@Getter public abstract class AbstractDiagramLayoutEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -25,6 +26,4 @@ public abstract class AbstractDiagramLayoutEntity { @CollectionTable(foreignKey = @ForeignKey(name = "fk_grid_layout_abstract_diagram")) @MapKeyColumn(name = "grid_layout_key") Map gridLayout; - - public abstract AbstractDiagramLayout toDto(); } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java index 56ed34e..f6df1c7 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java @@ -3,25 +3,17 @@ import jakarta.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.Getter; import lombok.NoArgsConstructor; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; @Builder @AllArgsConstructor @NoArgsConstructor @Embeddable +@Getter public class DiagramGridLayoutEntity { Integer width; Integer height; Integer xPosition; Integer yPosition; - - public DiagramGridLayout toDto() { - return DiagramGridLayout.builder() - .w(width) - .h(height) - .x(xPosition) - .y(yPosition) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java index 77d2a93..a470151 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java @@ -4,35 +4,20 @@ import jakarta.persistence.ForeignKey; import jakarta.persistence.PrimaryKeyJoinColumn; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NadFromElementDiagramLayout; -import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; @Entity @SuperBuilder @NoArgsConstructor @AllArgsConstructor +@Getter @PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_nad_from_element_diagram_layout_abstract")) public class NadFromElementDiagramLayoutEntity extends AbstractDiagramLayoutEntity { String elementName; String elementType; UUID elementUuid; - - @Override - public NadFromElementDiagramLayout toDto() { - return NadFromElementDiagramLayout.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toDto() - ))) - .elementName(elementName) - .elementType(elementType) - .elementUuid(elementUuid) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java index aa02628..491450c 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java @@ -2,21 +2,20 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @Entity @SuperBuilder @NoArgsConstructor @AllArgsConstructor +@Getter @PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_network_area_diagram_layout_abstract")) public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity { - @ElementCollection() + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable( name = "network_area_diagram_voltage_level_ids", joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), @@ -25,16 +24,4 @@ public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity List voltageLevelIds; Integer depth; - - public NetworkAreaDiagramLayout toDto() { - return NetworkAreaDiagramLayout.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toDto() - ))) - .depth(depth) - .voltageLevelIds(voltageLevelIds != null ? List.copyOf(voltageLevelIds) : null) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java index bb337a5..fa3e606 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java @@ -2,7 +2,6 @@ import jakarta.persistence.*; import lombok.*; -import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; import java.util.List; import java.util.UUID; @@ -22,12 +21,6 @@ public class StudyLayoutEntity { @JoinColumn(name = "study_layout_id", foreignKey = @ForeignKey(name = "fk_diagram_layout_study_layout")) List diagramGridLayoutEntityList; - public StudyLayout toDto() { - return StudyLayout.builder() - .diagramLayoutParams(diagramGridLayoutEntityList.stream().map(AbstractDiagramLayoutEntity::toDto).toList()) - .build(); - } - public void replaceAllDiagramLayouts(List diagramGridLayoutEntityList) { this.diagramGridLayoutEntityList.clear(); this.diagramGridLayoutEntityList.addAll(diagramGridLayoutEntityList); diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java index 23afd84..5775e35 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java @@ -2,29 +2,16 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; - -import java.util.Map; -import java.util.stream.Collectors; @AllArgsConstructor @NoArgsConstructor @SuperBuilder @Entity +@Getter @PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_substation_diagram_layout_abstract")) public class SubstationDiagramLayoutEntity extends AbstractDiagramLayoutEntity { String substationId; - - public SubstationDiagramLayout toDto() { - return SubstationDiagramLayout.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toDto() - ))) - .substationId(substationId) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java index f0322d1..4a6a4ff 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java @@ -2,29 +2,16 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; - -import java.util.Map; -import java.util.stream.Collectors; @AllArgsConstructor @NoArgsConstructor @SuperBuilder @Entity +@Getter @PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_voltage_level_layout_abstract")) public class VoltageLevelLayoutEntity extends AbstractDiagramLayoutEntity { String voltageLevelId; - - public VoltageLevelDiagramLayout toDto() { - return VoltageLevelDiagramLayout.builder() - .diagramUuid(diagramUuid) - .gridLayout(gridLayout.entrySet().stream().collect(Collectors.toMap( - Map.Entry::getKey, - entry -> entry.getValue().toDto() - ))) - .voltageLevelId(voltageLevelId) - .build(); - } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java new file mode 100644 index 0000000..8f4a375 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java @@ -0,0 +1,154 @@ +/* + Copyright (c) 2024, RTE (http://www.rte-france.com) + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.mapper; + +import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NadFromElementDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; +import org.gridsuite.studyconfig.server.entities.studylayout.AbstractDiagramLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.DiagramGridLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.NadFromElementDiagramLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.NetworkAreaDiagramLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.SubstationDiagramLayoutEntity; +import org.gridsuite.studyconfig.server.entities.studylayout.VoltageLevelLayoutEntity; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Mapper for conversion between StudyLayout DTOs and Entities + * + * @author Generated based on StudyLayoutConversionService + */ +public final class StudyLayoutMapper { + + private StudyLayoutMapper() { + // Private constructor to prevent instantiation + } + + public static StudyLayoutEntity toEntity(StudyLayout dto) { + return Optional.ofNullable(dto) + .map(d -> StudyLayoutEntity.builder() + .diagramGridLayoutEntityList(convertDiagramLayouts(d.getDiagramLayoutParams(), StudyLayoutMapper::toDiagramLayoutEntity)) + .build()) + .orElse(null); + } + + public static StudyLayout toDto(StudyLayoutEntity entity) { + return Optional.ofNullable(entity) + .map(e -> StudyLayout.builder() + .diagramLayoutParams(convertDiagramLayouts(e.getDiagramGridLayoutEntityList(), StudyLayoutMapper::toDiagramLayoutDto)) + .build()) + .orElse(null); + } + + public static AbstractDiagramLayoutEntity toDiagramLayoutEntity(AbstractDiagramLayout dto) { + return switch (dto) { + case SubstationDiagramLayout s -> SubstationDiagramLayoutEntity.builder() + .diagramUuid(s.getDiagramUuid()) + .substationId(s.getSubstationId()) + .gridLayout(convertGridLayoutMap(s.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) + .build(); + case VoltageLevelDiagramLayout v -> VoltageLevelLayoutEntity.builder() + .diagramUuid(v.getDiagramUuid()) + .voltageLevelId(v.getVoltageLevelId()) + .gridLayout(convertGridLayoutMap(v.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) + .build(); + case NetworkAreaDiagramLayout n -> NetworkAreaDiagramLayoutEntity.builder() + .diagramUuid(n.getDiagramUuid()) + .voltageLevelIds(n.getVoltageLevelIds()) + .depth(n.getDepth()) + .gridLayout(convertGridLayoutMap(n.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) + .build(); + case NadFromElementDiagramLayout nad -> NadFromElementDiagramLayoutEntity.builder() + .diagramUuid(nad.getDiagramUuid()) + .elementName(nad.getElementName()) + .elementType(nad.getElementType()) + .elementUuid(nad.getElementUuid()) + .gridLayout(convertGridLayoutMap(nad.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) + .build(); + case null -> null; + default -> throw new IllegalArgumentException("Unknown diagram layout DTO type: " + dto.getClass()); + }; + } + + public static AbstractDiagramLayout toDiagramLayoutDto(AbstractDiagramLayoutEntity entity) { + return switch (entity) { + case SubstationDiagramLayoutEntity s -> SubstationDiagramLayout.builder() + .diagramUuid(s.getDiagramUuid()) + .substationId(s.getSubstationId()) + .gridLayout(convertGridLayoutMap(s.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) + .build(); + case VoltageLevelLayoutEntity v -> VoltageLevelDiagramLayout.builder() + .diagramUuid(v.getDiagramUuid()) + .voltageLevelId(v.getVoltageLevelId()) + .gridLayout(convertGridLayoutMap(v.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) + .build(); + case NetworkAreaDiagramLayoutEntity n -> NetworkAreaDiagramLayout.builder() + .diagramUuid(n.getDiagramUuid()) + .voltageLevelIds(n.getVoltageLevelIds()) + .depth(n.getDepth()) + .gridLayout(convertGridLayoutMap(n.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) + .build(); + case NadFromElementDiagramLayoutEntity nad -> NadFromElementDiagramLayout.builder() + .diagramUuid(nad.getDiagramUuid()) + .elementName(nad.getElementName()) + .elementType(nad.getElementType()) + .elementUuid(nad.getElementUuid()) + .gridLayout(convertGridLayoutMap(nad.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) + .build(); + case null -> null; + default -> throw new IllegalArgumentException("Unknown diagram layout entity type: " + entity.getClass()); + }; + } + + public static DiagramGridLayoutEntity toGridLayoutEntity(DiagramGridLayout dto) { + return Optional.ofNullable(dto) + .map(d -> DiagramGridLayoutEntity.builder() + .xPosition(d.getX()) + .yPosition(d.getY()) + .width(d.getW()) + .height(d.getH()) + .build()) + .orElse(null); + } + + public static DiagramGridLayout toGridLayoutDto(DiagramGridLayoutEntity entity) { + return Optional.ofNullable(entity) + .map(e -> DiagramGridLayout.builder() + .x(e.getXPosition()) + .y(e.getYPosition()) + .w(e.getWidth()) + .h(e.getHeight()) + .build()) + .orElse(null); + } + + private static List convertDiagramLayouts(List items, Function converter) { + return Optional.ofNullable(items) + .map(list -> list.stream().map(converter).toList()) + .orElse(List.of()); + } + + private static Map convertGridLayoutMap(Map sourceMap, Function converter) { + return Optional.ofNullable(sourceMap) + .map(map -> map.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> converter.apply(entry.getValue()) + ))) + .orElse(null); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java index 522f292..6d42e81 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java @@ -2,9 +2,9 @@ import jakarta.persistence.EntityNotFoundException; import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; +import org.gridsuite.studyconfig.server.mapper.StudyLayoutMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,12 +18,13 @@ public StudyLayoutService(StudyLayoutRepository studyLayoutRepository) { this.studyLayoutRepository = studyLayoutRepository; } - @Transactional + @Transactional(readOnly = true) public StudyLayout getByStudyLayoutUuid(UUID studyLayoutUuid) { - return studyLayoutRepository - .findById(studyLayoutUuid) - .orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)) - .toDto(); + StudyLayoutEntity entity = studyLayoutRepository + .findById(studyLayoutUuid) + .orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)); + + return StudyLayoutMapper.toDto(entity); } @Transactional @@ -33,7 +34,7 @@ public void deleteStudyLayout(UUID studyLayoutUuid) { @Transactional public UUID saveStudyLayout(StudyLayout studyLayout) { - StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(studyLayout.toEntity()); + StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(StudyLayoutMapper.toEntity(studyLayout)); return studyLayoutEntity.getUuid(); } @@ -42,7 +43,9 @@ public UUID saveStudyLayout(StudyLayout studyLayout) { public void updateStudyLayout(UUID studyLayoutUuid, StudyLayout studyLayout) { StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.findById(studyLayoutUuid).orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)); - studyLayoutEntity.replaceAllDiagramLayouts(studyLayout.getDiagramLayoutParams().stream().map(AbstractDiagramLayout::toEntity).toList()); + studyLayoutEntity.replaceAllDiagramLayouts(studyLayout.getDiagramLayoutParams().stream() + .map(StudyLayoutMapper::toDiagramLayoutEntity) + .toList()); studyLayoutRepository.save(studyLayoutEntity); } diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java index 96e8458..f3c4f3b 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java @@ -8,6 +8,7 @@ import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; +import org.gridsuite.studyconfig.server.mapper.StudyLayoutMapper; import org.gridsuite.studyconfig.server.service.StudyLayoutService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -41,19 +42,18 @@ class StudyLayoutControllerTest { @Test void testGetStudyLayout() throws Exception { - StudyLayoutEntity expectedResult = studyLayoutRepository.save(createStudyLayout().toEntity()); + StudyLayoutEntity expectedResult = studyLayoutRepository.save(StudyLayoutMapper.toEntity(createStudyLayout())); MvcResult mockMvcResult = mockMvc.perform(get("/v1/study-layout/{studyLayoutUuid}", expectedResult.getUuid())) .andExpect(status().isOk()) .andReturn(); StudyLayout result = objectMapper.readValue(mockMvcResult.getResponse().getContentAsString(), StudyLayout.class); - - assertThat(result).usingRecursiveComparison().isEqualTo(expectedResult.toDto()); + assertThat(result).usingRecursiveComparison().isEqualTo(StudyLayoutMapper.toDto(expectedResult)); } @Test void testDeleteStudyLayout() throws Exception { - StudyLayoutEntity expectedResult = studyLayoutRepository.save(createStudyLayout().toEntity()); + StudyLayoutEntity expectedResult = studyLayoutRepository.save(StudyLayoutMapper.toEntity(createStudyLayout())); mockMvc.perform(delete("/v1/study-layout/{studyLayoutUuid}", expectedResult.getUuid())) .andExpect(status().isOk()); @@ -78,7 +78,7 @@ void testSaveStudyLayout() throws Exception { @Test void testUpdateStudyLayout() throws Exception { - StudyLayoutEntity existingStudyLayout = studyLayoutRepository.save(createStudyLayout().toEntity()); + StudyLayoutEntity existingStudyLayout = studyLayoutRepository.save(StudyLayoutMapper.toEntity(createStudyLayout())); UUID newDiagramLayoutUuid = UUID.randomUUID(); StudyLayout updatedStudyLayout = createStudyLayout(); From 142beb53117b0d7add22ba723b100c5781fcd846 Mon Sep 17 00:00:00 2001 From: Ayoub LABIDI Date: Fri, 18 Jul 2025 00:16:44 +0200 Subject: [PATCH 15/16] Remove useless NadFromElement and add attributes to NetworkAreaDiagram Signed-off-by: Ayoub LABIDI --- .../DiagramLayoutJacksonConfiguration.java | 44 ++++++------- .../controller/StudyLayoutController.java | 6 ++ .../server/dto/studylayout/StudyLayout.java | 6 ++ .../diagramlayout/AbstractDiagramLayout.java | 13 ++-- .../AbstractDiagramLayoutJsonMapper.java | 25 ++++++++ .../diagramlayout/DiagramGridLayout.java | 6 ++ .../NadFromElementDiagramLayout.java | 20 ------ .../NetworkAreaDiagramLayout.java | 11 ++++ .../SubstationDiagramLayout.java | 6 ++ .../VoltageLevelDiagramLayout.java | 6 ++ .../AbstractDiagramLayoutEntity.java | 6 ++ .../studylayout/DiagramGridLayoutEntity.java | 6 ++ .../NadFromElementDiagramLayoutEntity.java | 23 ------- .../NetworkAreaDiagramLayoutEntity.java | 32 +++++++++- .../studylayout/StudyLayoutEntity.java | 6 ++ .../studylayout/StudyLayoutRepository.java | 6 ++ .../SubstationDiagramLayoutEntity.java | 6 ++ .../studylayout/VoltageLevelLayoutEntity.java | 6 ++ .../server/mapper/StudyLayoutMapper.java | 34 +++------- .../server/service/StudyLayoutService.java | 6 ++ ...45Z.xml => changelog_20250717T215546Z.xml} | 63 +++++++++++-------- .../db/changelog/db.changelog-master.yaml | 2 +- .../server/StudyLayoutControllerTest.java | 12 ++++ 23 files changed, 223 insertions(+), 128 deletions(-) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java rename src/main/resources/db/changelog/changesets/{changelog_20250716T081145Z.xml => changelog_20250717T215546Z.xml} (67%) diff --git a/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java b/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java index 63e5b8d..5b0a751 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java +++ b/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java @@ -1,42 +1,34 @@ -/* - Copyright (c) 2024, RTE (http://www.rte-france.com) - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.gridsuite.studyconfig.server.configuration; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.jsontype.NamedType; -import com.fasterxml.jackson.databind.module.SimpleModule; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NadFromElementDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; -import org.springframework.context.annotation.Bean; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; +import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayoutJsonMapper; import org.springframework.context.annotation.Configuration; +import jakarta.annotation.PostConstruct; + /** * Jackson configuration for diagram layout polymorphic serialization. * This external configuration avoids circular dependencies between the abstract base class - * and its subtypes by registering the type mappings outside the class hierarchy. + * and its subtypes by using a mixin approach with type mappings. */ @Configuration public class DiagramLayoutJacksonConfiguration { - @Bean - public Module diagramLayoutTypeModule() { - SimpleModule module = new SimpleModule("DiagramLayoutTypeModule"); + private final ObjectMapper objectMapper; - // Register subtypes for polymorphic serialization/deserialization - // This approach avoids circular dependencies that would occur with @JsonSubTypes - module.registerSubtypes( - new NamedType(SubstationDiagramLayout.class, "substation"), - new NamedType(VoltageLevelDiagramLayout.class, "voltage-level"), - new NamedType(NetworkAreaDiagramLayout.class, "network-area-diagram"), - new NamedType(NadFromElementDiagramLayout.class, "nad-from-element") - ); + public DiagramLayoutJacksonConfiguration(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } - return module; + @PostConstruct + public void configureDiagramLayoutMixIn() { + objectMapper.addMixIn(AbstractDiagramLayout.class, AbstractDiagramLayoutJsonMapper.class); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java index 961a61a..c6d0890 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.controller; import io.swagger.v3.oas.annotations.Operation; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java index 57f2eef..75b2c89 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.dto.studylayout; import lombok.*; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java index 1a1aecd..9e923a9 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java @@ -1,6 +1,11 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; -import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,12 +20,6 @@ @NoArgsConstructor @Setter @Getter -@JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, - include = JsonTypeInfo.As.PROPERTY, - property = "type", - visible = true -) public abstract class AbstractDiagramLayout { UUID diagramUuid; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java new file mode 100644 index 0000000..bf43a93 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +/** + * MixIn interface for AbstractDiagramLayout to define polymorphic serialization + * without creating circular dependencies in the class hierarchy. + * This approach avoids circular dependencies that would occur with @JsonSubTypes + * directly on the abstract class. + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true) +@JsonSubTypes({ + @JsonSubTypes.Type(value = SubstationDiagramLayout.class, name = "substation"), + @JsonSubTypes.Type(value = VoltageLevelDiagramLayout.class, name = "voltage-level"), + @JsonSubTypes.Type(value = NetworkAreaDiagramLayout.class, name = "network-area-diagram") +}) +public interface AbstractDiagramLayoutJsonMapper { +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java index d729987..74d7eb9 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import lombok.AllArgsConstructor; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java deleted file mode 100644 index 584339b..0000000 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NadFromElementDiagramLayout.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -import java.util.UUID; - -@SuperBuilder -@AllArgsConstructor -@NoArgsConstructor -@Setter -@Getter -public class NadFromElementDiagramLayout extends AbstractDiagramLayout { - String elementName; - String elementType; - UUID elementUuid; -} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java index 7537300..bb05808 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import lombok.AllArgsConstructor; @@ -7,6 +13,7 @@ import lombok.experimental.SuperBuilder; import java.util.List; +import java.util.UUID; @SuperBuilder @AllArgsConstructor @@ -14,6 +21,10 @@ @Setter @Getter public class NetworkAreaDiagramLayout extends AbstractDiagramLayout { + UUID filterUuid; + UUID nadConfigUuid; List voltageLevelIds; + List voltageLevelToExpandIds; + List voltageLevelToOmitIds; Integer depth; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java index 3628a75..9be2293 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import lombok.AllArgsConstructor; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java index d608b55..760a031 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; import lombok.AllArgsConstructor; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java index 1ed73c2..e9dece9 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.entities.studylayout; import jakarta.persistence.*; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java index f6df1c7..3a35e4f 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.entities.studylayout; import jakarta.persistence.Embeddable; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java deleted file mode 100644 index a470151..0000000 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NadFromElementDiagramLayoutEntity.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.gridsuite.studyconfig.server.entities.studylayout; - -import jakarta.persistence.Entity; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.PrimaryKeyJoinColumn; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.util.UUID; - -@Entity -@SuperBuilder -@NoArgsConstructor -@AllArgsConstructor -@Getter -@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_nad_from_element_diagram_layout_abstract")) -public class NadFromElementDiagramLayoutEntity extends AbstractDiagramLayoutEntity { - String elementName; - String elementType; - UUID elementUuid; -} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java index 491450c..a6d21a0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.entities.studylayout; import jakarta.persistence.*; @@ -7,6 +13,7 @@ import lombok.experimental.SuperBuilder; import java.util.List; +import java.util.UUID; @Entity @SuperBuilder @@ -15,7 +22,13 @@ @Getter @PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_network_area_diagram_layout_abstract")) public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity { - @ElementCollection(fetch = FetchType.EAGER) + @Column(name = "filter_uuid") + UUID filterUuid; + + @Column(name = "nad_config_uuid") + UUID nadConfigUuid; + + @ElementCollection @CollectionTable( name = "network_area_diagram_voltage_level_ids", joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), @@ -23,5 +36,22 @@ public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity ) List voltageLevelIds; + @ElementCollection + @CollectionTable( + name = "network_area_diagram_voltage_level_to_expand_ids", + joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), + foreignKey = @ForeignKey(name = "fk_network_area_diagram_voltage_level_to_expand_ids") + ) + List voltageLevelToExpandIds; + + @ElementCollection + @CollectionTable( + name = "network_area_diagram_voltage_level_to_omit_ids", + joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), + foreignKey = @ForeignKey(name = "fk_network_area_diagram_voltage_level_to_omit_ids") + ) + List voltageLevelToOmitIds; + + @Column(name = "depth") Integer depth; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java index fa3e606..2daf561 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.entities.studylayout; import jakarta.persistence.*; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java index a1c28fc..11ed823 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.entities.studylayout; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java index 5775e35..ca8498e 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.entities.studylayout; import jakarta.persistence.*; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java index 4a6a4ff..2c7283a 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.entities.studylayout; import jakarta.persistence.*; diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java index 8f4a375..d8deadb 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java @@ -1,5 +1,5 @@ /* - Copyright (c) 2024, RTE (http://www.rte-france.com) + Copyright (c) 2025, RTE (http://www.rte-france.com) This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -9,13 +9,11 @@ import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NadFromElementDiagramLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; import org.gridsuite.studyconfig.server.entities.studylayout.AbstractDiagramLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.DiagramGridLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.NadFromElementDiagramLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.NetworkAreaDiagramLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; import org.gridsuite.studyconfig.server.entities.studylayout.SubstationDiagramLayoutEntity; @@ -27,15 +25,9 @@ import java.util.function.Function; import java.util.stream.Collectors; -/** - * Mapper for conversion between StudyLayout DTOs and Entities - * - * @author Generated based on StudyLayoutConversionService - */ public final class StudyLayoutMapper { private StudyLayoutMapper() { - // Private constructor to prevent instantiation } public static StudyLayoutEntity toEntity(StudyLayout dto) { @@ -68,17 +60,14 @@ public static AbstractDiagramLayoutEntity toDiagramLayoutEntity(AbstractDiagramL .build(); case NetworkAreaDiagramLayout n -> NetworkAreaDiagramLayoutEntity.builder() .diagramUuid(n.getDiagramUuid()) + .filterUuid(n.getFilterUuid()) + .nadConfigUuid(n.getNadConfigUuid()) .voltageLevelIds(n.getVoltageLevelIds()) + .voltageLevelToExpandIds(n.getVoltageLevelToExpandIds()) + .voltageLevelToOmitIds(n.getVoltageLevelToOmitIds()) .depth(n.getDepth()) .gridLayout(convertGridLayoutMap(n.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) .build(); - case NadFromElementDiagramLayout nad -> NadFromElementDiagramLayoutEntity.builder() - .diagramUuid(nad.getDiagramUuid()) - .elementName(nad.getElementName()) - .elementType(nad.getElementType()) - .elementUuid(nad.getElementUuid()) - .gridLayout(convertGridLayoutMap(nad.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) - .build(); case null -> null; default -> throw new IllegalArgumentException("Unknown diagram layout DTO type: " + dto.getClass()); }; @@ -98,17 +87,14 @@ public static AbstractDiagramLayout toDiagramLayoutDto(AbstractDiagramLayoutEnti .build(); case NetworkAreaDiagramLayoutEntity n -> NetworkAreaDiagramLayout.builder() .diagramUuid(n.getDiagramUuid()) - .voltageLevelIds(n.getVoltageLevelIds()) + .filterUuid(n.getFilterUuid()) + .nadConfigUuid(n.getNadConfigUuid()) + .voltageLevelIds(n.getVoltageLevelIds() != null ? List.copyOf(n.getVoltageLevelIds()) : null) + .voltageLevelToExpandIds(n.getVoltageLevelToExpandIds() != null ? List.copyOf(n.getVoltageLevelToExpandIds()) : null) + .voltageLevelToOmitIds(n.getVoltageLevelToOmitIds() != null ? List.copyOf(n.getVoltageLevelToOmitIds()) : null) .depth(n.getDepth()) .gridLayout(convertGridLayoutMap(n.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) .build(); - case NadFromElementDiagramLayoutEntity nad -> NadFromElementDiagramLayout.builder() - .diagramUuid(nad.getDiagramUuid()) - .elementName(nad.getElementName()) - .elementType(nad.getElementType()) - .elementUuid(nad.getElementUuid()) - .gridLayout(convertGridLayoutMap(nad.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) - .build(); case null -> null; default -> throw new IllegalArgumentException("Unknown diagram layout entity type: " + entity.getClass()); }; diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java index 6d42e81..7a5ddb6 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java +++ b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server.service; import jakarta.persistence.EntityNotFoundException; diff --git a/src/main/resources/db/changelog/changesets/changelog_20250716T081145Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250717T215546Z.xml similarity index 67% rename from src/main/resources/db/changelog/changesets/changelog_20250716T081145Z.xml rename to src/main/resources/db/changelog/changesets/changelog_20250717T215546Z.xml index 10b2917..8c8c366 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20250716T081145Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20250717T215546Z.xml @@ -1,6 +1,6 @@ - + @@ -9,7 +9,7 @@ - + @@ -23,25 +23,17 @@ - - - - - - - - - - - + + + - + @@ -49,14 +41,30 @@ - + + + + + + + + + + + + + + + + + - + @@ -64,7 +72,7 @@ - + @@ -72,25 +80,28 @@ - + - + - - - - + - + - + + + + + + + - + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 9cd7dae..b29bfb7 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -63,5 +63,5 @@ databaseChangeLog: file: changesets/changelog_20250619T162423Z.xml relativeToChangelogFile: true - include: - file: changesets/changelog_20250716T081145Z.xml + file: changesets/changelog_20250717T215546Z.xml relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java index f3c4f3b..a8b607d 100644 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java +++ b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ package org.gridsuite.studyconfig.server; import com.fasterxml.jackson.databind.ObjectMapper; @@ -98,6 +104,8 @@ void testUpdateStudyLayout() throws Exception { UUID diagramUuid = UUID.randomUUID(); List voltageLevelIds = List.of("vl1", "vl2", "vl3"); + List voltageLevelToExpandIds = List.of("vl1"); + List voltageLevelToOmitIds = List.of("vl2"); Integer depth = 5; updatedStudyLayout.getDiagramLayoutParams().add(NetworkAreaDiagramLayout.builder() @@ -112,6 +120,10 @@ void testUpdateStudyLayout() throws Exception { .build() )) .voltageLevelIds(voltageLevelIds) + .voltageLevelToExpandIds(voltageLevelToExpandIds) + .voltageLevelToOmitIds(voltageLevelToOmitIds) + .filterUuid(UUID.randomUUID()) + .nadConfigUuid(UUID.randomUUID()) .depth(depth) .build()); From bcc270e7951d1c92a8ff564e0bf2eafd9c6b468f Mon Sep 17 00:00:00 2001 From: Ayoub LABIDI Date: Wed, 23 Jul 2025 09:19:44 +0200 Subject: [PATCH 16/16] Rework Signed-off-by: Ayoub LABIDI --- .../DiagramLayoutJacksonConfiguration.java | 5 +- .../DiagramGridLayoutController.java | 64 +++++++ .../controller/StudyLayoutController.java | 64 ------- .../DiagramGridLayout.java} | 9 +- .../diagramlayout/AbstractDiagramLayout.java | 4 +- .../AbstractDiagramLayoutJsonMapper.java | 2 +- .../diagramlayout/DiagramPosition.java} | 4 +- .../NetworkAreaDiagramLayout.java | 11 +- .../SubstationDiagramLayout.java | 2 +- .../VoltageLevelDiagramLayout.java | 2 +- .../DiagramGridLayoutEntity.java} | 16 +- .../DiagramGridLayoutRepository.java} | 4 +- .../AbstractDiagramLayoutEntity.java | 6 +- .../diagramlayout/DiagramPositionEntity.java} | 4 +- .../NetworkAreaDiagramLayoutEntity.java | 35 ++++ .../SubstationDiagramLayoutEntity.java | 2 +- .../VoltageLevelLayoutEntity.java | 2 +- .../NetworkAreaDiagramLayoutEntity.java | 57 ------- ...pper.java => DiagramGridLayoutMapper.java} | 86 +++++----- .../service/DiagramGridLayoutService.java | 59 +++++++ .../server/service/StudyLayoutService.java | 58 ------- .../changesets/changelog_20250717T215546Z.xml | 107 ------------ .../changesets/changelog_20250722T151152Z.xml | 75 +++++++++ .../db/changelog/db.changelog-master.yaml | 2 +- .../DiagramGridLayoutControllerTest.java | 152 +++++++++++++++++ .../server/StudyLayoutControllerTest.java | 159 ------------------ 26 files changed, 464 insertions(+), 527 deletions(-) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/controller/DiagramGridLayoutController.java delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java rename src/main/java/org/gridsuite/studyconfig/server/dto/{studylayout/StudyLayout.java => diagramgridlayout/DiagramGridLayout.java} (60%) rename src/main/java/org/gridsuite/studyconfig/server/dto/{studylayout => diagramgridlayout}/diagramlayout/AbstractDiagramLayout.java (82%) rename src/main/java/org/gridsuite/studyconfig/server/dto/{studylayout => diagramgridlayout}/diagramlayout/AbstractDiagramLayoutJsonMapper.java (93%) rename src/main/java/org/gridsuite/studyconfig/server/dto/{studylayout/diagramlayout/DiagramGridLayout.java => diagramgridlayout/diagramlayout/DiagramPosition.java} (80%) rename src/main/java/org/gridsuite/studyconfig/server/dto/{studylayout => diagramgridlayout}/diagramlayout/NetworkAreaDiagramLayout.java (70%) rename src/main/java/org/gridsuite/studyconfig/server/dto/{studylayout => diagramgridlayout}/diagramlayout/SubstationDiagramLayout.java (88%) rename src/main/java/org/gridsuite/studyconfig/server/dto/{studylayout => diagramgridlayout}/diagramlayout/VoltageLevelDiagramLayout.java (88%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{studylayout/StudyLayoutEntity.java => diagramgridlayout/DiagramGridLayoutEntity.java} (56%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{studylayout/StudyLayoutRepository.java => diagramgridlayout/DiagramGridLayoutRepository.java} (71%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{studylayout => diagramgridlayout/diagramlayout}/AbstractDiagramLayoutEntity.java (77%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{studylayout/DiagramGridLayoutEntity.java => diagramgridlayout/diagramlayout/DiagramPositionEntity.java} (82%) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/NetworkAreaDiagramLayoutEntity.java rename src/main/java/org/gridsuite/studyconfig/server/entities/{studylayout => diagramgridlayout/diagramlayout}/SubstationDiagramLayoutEntity.java (89%) rename src/main/java/org/gridsuite/studyconfig/server/entities/{studylayout => diagramgridlayout/diagramlayout}/VoltageLevelLayoutEntity.java (89%) delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java rename src/main/java/org/gridsuite/studyconfig/server/mapper/{StudyLayoutMapper.java => DiagramGridLayoutMapper.java} (51%) create mode 100644 src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java delete mode 100644 src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java delete mode 100644 src/main/resources/db/changelog/changesets/changelog_20250717T215546Z.xml create mode 100644 src/main/resources/db/changelog/changesets/changelog_20250722T151152Z.xml create mode 100644 src/test/java/org/gridsuite/studyconfig/server/DiagramGridLayoutControllerTest.java delete mode 100644 src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java diff --git a/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java b/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java index 5b0a751..3690ca4 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java +++ b/src/main/java/org/gridsuite/studyconfig/server/configuration/DiagramLayoutJacksonConfiguration.java @@ -7,8 +7,9 @@ package org.gridsuite.studyconfig.server.configuration; import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayoutJsonMapper; + +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.AbstractDiagramLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.AbstractDiagramLayoutJsonMapper; import org.springframework.context.annotation.Configuration; import jakarta.annotation.PostConstruct; diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/DiagramGridLayoutController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/DiagramGridLayoutController.java new file mode 100644 index 0000000..1bb4d63 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/controller/DiagramGridLayoutController.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.gridsuite.studyconfig.server.StudyConfigApi; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.DiagramGridLayout; +import org.gridsuite.studyconfig.server.service.DiagramGridLayoutService; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +@RestController +@RequestMapping(value = "/" + StudyConfigApi.API_VERSION + "/diagram-grid-layout") +@RequiredArgsConstructor +@Tag(name = "Diagram Grid Layout Config", description = "Diagram Grid Layout Configuration API") +public class DiagramGridLayoutController { + private final DiagramGridLayoutService diagramGridLayoutService; + + @PostMapping(consumes = APPLICATION_JSON_VALUE) + @Operation(summary = "Save diagram grid layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The newly created diagram grid layout UUID returned")}) + public ResponseEntity saveDiagramGridLayout(@RequestBody DiagramGridLayout diagramGridLayout) { + return ResponseEntity.ok().body(diagramGridLayoutService.saveDiagramGridLayout(diagramGridLayout)); + } + + @PutMapping(value = "/{id}", consumes = APPLICATION_JSON_VALUE) + @Operation(summary = "Update diagram grid layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The diagram grid layout has been updated")}) + public ResponseEntity updateDiagramGridLayout(@PathVariable("id") UUID diagramGridLayoutUuid, + @RequestBody DiagramGridLayout diagramGridLayout) { + diagramGridLayoutService.updateDiagramGridLayout(diagramGridLayoutUuid, diagramGridLayout); + return ResponseEntity.ok().build(); + } + + @GetMapping(value = "/{id}", produces = APPLICATION_JSON_VALUE) + @Operation(summary = "Get diagram grid layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The diagram grid layout is returned")}) + public ResponseEntity getDiagramGridLayout( + @PathVariable("id") UUID diagramGridLayoutUuid) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(diagramGridLayoutService.getByDiagramGridLayoutUuid(diagramGridLayoutUuid)); + } + + @DeleteMapping(value = "/{id}") + @Operation(summary = "Delete diagram grid layout") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The diagram grid layout is deleted")}) + public ResponseEntity deleteDiagramGridLayout( + @PathVariable("id") UUID diagramGridLayoutUuid) { + diagramGridLayoutService.deleteDiagramGridLayout(diagramGridLayoutUuid); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java b/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java deleted file mode 100644 index c6d0890..0000000 --- a/src/main/java/org/gridsuite/studyconfig/server/controller/StudyLayoutController.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.studyconfig.server.controller; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.gridsuite.studyconfig.server.StudyConfigApi; -import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; -import org.gridsuite.studyconfig.server.service.StudyLayoutService; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.UUID; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -@RestController -@RequestMapping(value = "/" + StudyConfigApi.API_VERSION + "/study-layout") -@RequiredArgsConstructor -@Tag(name = "Study Layout Config", description = "Study Layout Configuration API") -public class StudyLayoutController { - private final StudyLayoutService studyLayoutService; - - @PostMapping(consumes = APPLICATION_JSON_VALUE) - @Operation(summary = "Save study layout") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The newly created study layout UUID returned")}) - public ResponseEntity saveStudyLayout(@RequestBody StudyLayout studyLayout) { - return ResponseEntity.ok().body(studyLayoutService.saveStudyLayout(studyLayout)); - } - - @PutMapping(value = "/{id}", consumes = APPLICATION_JSON_VALUE) - @Operation(summary = "Update study layout") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout has been updated")}) - public ResponseEntity updateStudyLayout(@PathVariable("id") UUID studyLayoutUuid, - @RequestBody StudyLayout studyLayout) { - studyLayoutService.updateStudyLayout(studyLayoutUuid, studyLayout); - return ResponseEntity.ok().build(); - } - - @GetMapping(value = "/{id}", produces = APPLICATION_JSON_VALUE) - @Operation(summary = "Get study layout") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout is returned")}) - public ResponseEntity getStudyLayout( - @PathVariable("id") UUID studyLayoutUuid) { - return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyLayoutService.getByStudyLayoutUuid(studyLayoutUuid)); - } - - @DeleteMapping(value = "/{id}") - @Operation(summary = "Delete study layout") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The study layout is deleted")}) - public ResponseEntity deleteStudyLayout( - @PathVariable("id") UUID studyLayoutUuid) { - studyLayoutService.deleteStudyLayout(studyLayoutUuid); - return ResponseEntity.ok().build(); - } -} diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/DiagramGridLayout.java similarity index 60% rename from src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/DiagramGridLayout.java index 75b2c89..3bb148a 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/StudyLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/DiagramGridLayout.java @@ -4,18 +4,19 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.dto.studylayout; +package org.gridsuite.studyconfig.server.dto.diagramgridlayout; import lombok.*; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; import java.util.List; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.AbstractDiagramLayout; + @Builder @AllArgsConstructor @NoArgsConstructor @Setter @Getter -public class StudyLayout { - List diagramLayoutParams; +public class DiagramGridLayout { + List diagramLayouts; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/AbstractDiagramLayout.java similarity index 82% rename from src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/AbstractDiagramLayout.java index 9e923a9..ea5cf1f 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/AbstractDiagramLayout.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +package org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout; import lombok.AllArgsConstructor; import lombok.Getter; @@ -23,5 +23,5 @@ public abstract class AbstractDiagramLayout { UUID diagramUuid; - Map gridLayout; + Map diagramPositions; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java similarity index 93% rename from src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java index bf43a93..15d51fc 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/AbstractDiagramLayoutJsonMapper.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +package org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/DiagramPosition.java similarity index 80% rename from src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/DiagramPosition.java index 74d7eb9..f558604 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/DiagramGridLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/DiagramPosition.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +package org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout; import lombok.AllArgsConstructor; import lombok.Builder; @@ -13,7 +13,7 @@ @Builder @AllArgsConstructor @Getter -public class DiagramGridLayout { +public class DiagramPosition { Integer w; Integer h; Integer x; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/NetworkAreaDiagramLayout.java similarity index 70% rename from src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/NetworkAreaDiagramLayout.java index bb05808..5b74e1a 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/NetworkAreaDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/NetworkAreaDiagramLayout.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +package org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout; import lombok.AllArgsConstructor; import lombok.Getter; @@ -12,7 +12,6 @@ import lombok.Setter; import lombok.experimental.SuperBuilder; -import java.util.List; import java.util.UUID; @SuperBuilder @@ -21,10 +20,8 @@ @Setter @Getter public class NetworkAreaDiagramLayout extends AbstractDiagramLayout { + UUID originalNadConfigUuid; + UUID currentNadConfigUuid; UUID filterUuid; - UUID nadConfigUuid; - List voltageLevelIds; - List voltageLevelToExpandIds; - List voltageLevelToOmitIds; - Integer depth; + String name; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/SubstationDiagramLayout.java similarity index 88% rename from src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/SubstationDiagramLayout.java index 9be2293..bce50ae 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/SubstationDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/SubstationDiagramLayout.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +package org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/VoltageLevelDiagramLayout.java similarity index 88% rename from src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java rename to src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/VoltageLevelDiagramLayout.java index 760a031..13d33d4 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/dto/studylayout/diagramlayout/VoltageLevelDiagramLayout.java +++ b/src/main/java/org/gridsuite/studyconfig/server/dto/diagramgridlayout/diagramlayout/VoltageLevelDiagramLayout.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout; +package org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/DiagramGridLayoutEntity.java similarity index 56% rename from src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/DiagramGridLayoutEntity.java index 2daf561..fab5f63 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/DiagramGridLayoutEntity.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities.studylayout; +package org.gridsuite.studyconfig.server.entities.diagramgridlayout; import jakarta.persistence.*; import lombok.*; @@ -12,23 +12,25 @@ import java.util.List; import java.util.UUID; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout.AbstractDiagramLayoutEntity; + @Builder @AllArgsConstructor @NoArgsConstructor @Entity @Getter @Setter -public class StudyLayoutEntity { +public class DiagramGridLayoutEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) UUID uuid; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "study_layout_id", foreignKey = @ForeignKey(name = "fk_diagram_layout_study_layout")) - List diagramGridLayoutEntityList; + @JoinColumn(name = "diagram_grid_layout_id", foreignKey = @ForeignKey(name = "fk_diagram_layout_grid_layout")) + List diagramLayouts; - public void replaceAllDiagramLayouts(List diagramGridLayoutEntityList) { - this.diagramGridLayoutEntityList.clear(); - this.diagramGridLayoutEntityList.addAll(diagramGridLayoutEntityList); + public void replaceAllDiagramLayouts(List diagramLayouts) { + this.diagramLayouts.clear(); + this.diagramLayouts.addAll(diagramLayouts); } } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/DiagramGridLayoutRepository.java similarity index 71% rename from src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/DiagramGridLayoutRepository.java index 11ed823..ea7c9e0 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/StudyLayoutRepository.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/DiagramGridLayoutRepository.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities.studylayout; +package org.gridsuite.studyconfig.server.entities.diagramgridlayout; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -12,5 +12,5 @@ import java.util.UUID; @Repository -public interface StudyLayoutRepository extends JpaRepository { +public interface DiagramGridLayoutRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/AbstractDiagramLayoutEntity.java similarity index 77% rename from src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/AbstractDiagramLayoutEntity.java index e9dece9..882f262 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/AbstractDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/AbstractDiagramLayoutEntity.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities.studylayout; +package org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -29,7 +29,7 @@ public abstract class AbstractDiagramLayoutEntity { UUID diagramUuid; @ElementCollection - @CollectionTable(foreignKey = @ForeignKey(name = "fk_grid_layout_abstract_diagram")) + @CollectionTable(foreignKey = @ForeignKey(name = "fk_diagram_positions_abstract_diagram")) @MapKeyColumn(name = "grid_layout_key") - Map gridLayout; + Map diagramPositions; } diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/DiagramPositionEntity.java similarity index 82% rename from src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/DiagramPositionEntity.java index 3a35e4f..64a12b6 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/DiagramGridLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/DiagramPositionEntity.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities.studylayout; +package org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout; import jakarta.persistence.Embeddable; import lombok.AllArgsConstructor; @@ -17,7 +17,7 @@ @NoArgsConstructor @Embeddable @Getter -public class DiagramGridLayoutEntity { +public class DiagramPositionEntity { Integer width; Integer height; Integer xPosition; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/NetworkAreaDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/NetworkAreaDiagramLayoutEntity.java new file mode 100644 index 0000000..559c8b2 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/NetworkAreaDiagramLayoutEntity.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.UUID; + +@Entity +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@Getter +@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_network_area_diagram_layout_abstract")) +public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity { + @Column(name = "original_nad_config_uuid") + UUID originalNadConfigUuid; + + @Column(name = "current_nad_config_uuid") + UUID currentNadConfigUuid; + + @Column(name = "filter_uuid") + UUID filterUuid; + + @Column(name = "name") + String name; +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/SubstationDiagramLayoutEntity.java similarity index 89% rename from src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/SubstationDiagramLayoutEntity.java index ca8498e..2f23ba1 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/SubstationDiagramLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/SubstationDiagramLayoutEntity.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities.studylayout; +package org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/VoltageLevelLayoutEntity.java similarity index 89% rename from src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java rename to src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/VoltageLevelLayoutEntity.java index 2c7283a..bb9390d 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/VoltageLevelLayoutEntity.java +++ b/src/main/java/org/gridsuite/studyconfig/server/entities/diagramgridlayout/diagramlayout/VoltageLevelLayoutEntity.java @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.studyconfig.server.entities.studylayout; +package org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java b/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java deleted file mode 100644 index a6d21a0..0000000 --- a/src/main/java/org/gridsuite/studyconfig/server/entities/studylayout/NetworkAreaDiagramLayoutEntity.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.studyconfig.server.entities.studylayout; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.util.List; -import java.util.UUID; - -@Entity -@SuperBuilder -@NoArgsConstructor -@AllArgsConstructor -@Getter -@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "fk_network_area_diagram_layout_abstract")) -public class NetworkAreaDiagramLayoutEntity extends AbstractDiagramLayoutEntity { - @Column(name = "filter_uuid") - UUID filterUuid; - - @Column(name = "nad_config_uuid") - UUID nadConfigUuid; - - @ElementCollection - @CollectionTable( - name = "network_area_diagram_voltage_level_ids", - joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), - foreignKey = @ForeignKey(name = "fk_network_area_diagram_voltage_level_ids") - ) - List voltageLevelIds; - - @ElementCollection - @CollectionTable( - name = "network_area_diagram_voltage_level_to_expand_ids", - joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), - foreignKey = @ForeignKey(name = "fk_network_area_diagram_voltage_level_to_expand_ids") - ) - List voltageLevelToExpandIds; - - @ElementCollection - @CollectionTable( - name = "network_area_diagram_voltage_level_to_omit_ids", - joinColumns = @JoinColumn(name = "network_area_diagram_layout_id"), - foreignKey = @ForeignKey(name = "fk_network_area_diagram_voltage_level_to_omit_ids") - ) - List voltageLevelToOmitIds; - - @Column(name = "depth") - Integer depth; -} diff --git a/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java b/src/main/java/org/gridsuite/studyconfig/server/mapper/DiagramGridLayoutMapper.java similarity index 51% rename from src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java rename to src/main/java/org/gridsuite/studyconfig/server/mapper/DiagramGridLayoutMapper.java index d8deadb..eba37d3 100644 --- a/src/main/java/org/gridsuite/studyconfig/server/mapper/StudyLayoutMapper.java +++ b/src/main/java/org/gridsuite/studyconfig/server/mapper/DiagramGridLayoutMapper.java @@ -6,42 +6,42 @@ */ package org.gridsuite.studyconfig.server.mapper; -import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.AbstractDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; -import org.gridsuite.studyconfig.server.entities.studylayout.AbstractDiagramLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.DiagramGridLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.NetworkAreaDiagramLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.SubstationDiagramLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.VoltageLevelLayoutEntity; - import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; -public final class StudyLayoutMapper { +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.DiagramGridLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.AbstractDiagramLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.DiagramPosition; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.SubstationDiagramLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.VoltageLevelDiagramLayout; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.DiagramGridLayoutEntity; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout.AbstractDiagramLayoutEntity; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout.DiagramPositionEntity; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayoutEntity; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout.SubstationDiagramLayoutEntity; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.diagramlayout.VoltageLevelLayoutEntity; + +public final class DiagramGridLayoutMapper { - private StudyLayoutMapper() { + private DiagramGridLayoutMapper() { } - public static StudyLayoutEntity toEntity(StudyLayout dto) { + public static DiagramGridLayoutEntity toEntity(DiagramGridLayout dto) { return Optional.ofNullable(dto) - .map(d -> StudyLayoutEntity.builder() - .diagramGridLayoutEntityList(convertDiagramLayouts(d.getDiagramLayoutParams(), StudyLayoutMapper::toDiagramLayoutEntity)) + .map(d -> DiagramGridLayoutEntity.builder() + .diagramLayouts(convertDiagramLayouts(d.getDiagramLayouts(), DiagramGridLayoutMapper::toDiagramLayoutEntity)) .build()) .orElse(null); } - public static StudyLayout toDto(StudyLayoutEntity entity) { + public static DiagramGridLayout toDto(DiagramGridLayoutEntity entity) { return Optional.ofNullable(entity) - .map(e -> StudyLayout.builder() - .diagramLayoutParams(convertDiagramLayouts(e.getDiagramGridLayoutEntityList(), StudyLayoutMapper::toDiagramLayoutDto)) + .map(e -> DiagramGridLayout.builder() + .diagramLayouts(convertDiagramLayouts(e.getDiagramLayouts(), DiagramGridLayoutMapper::toDiagramLayoutDto)) .build()) .orElse(null); } @@ -51,22 +51,20 @@ public static AbstractDiagramLayoutEntity toDiagramLayoutEntity(AbstractDiagramL case SubstationDiagramLayout s -> SubstationDiagramLayoutEntity.builder() .diagramUuid(s.getDiagramUuid()) .substationId(s.getSubstationId()) - .gridLayout(convertGridLayoutMap(s.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) + .diagramPositions(convertDiagramPositionsMap(s.getDiagramPositions(), DiagramGridLayoutMapper::toDiagramPositionEntity)) .build(); case VoltageLevelDiagramLayout v -> VoltageLevelLayoutEntity.builder() .diagramUuid(v.getDiagramUuid()) .voltageLevelId(v.getVoltageLevelId()) - .gridLayout(convertGridLayoutMap(v.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) + .diagramPositions(convertDiagramPositionsMap(v.getDiagramPositions(), DiagramGridLayoutMapper::toDiagramPositionEntity)) .build(); - case NetworkAreaDiagramLayout n -> NetworkAreaDiagramLayoutEntity.builder() - .diagramUuid(n.getDiagramUuid()) - .filterUuid(n.getFilterUuid()) - .nadConfigUuid(n.getNadConfigUuid()) - .voltageLevelIds(n.getVoltageLevelIds()) - .voltageLevelToExpandIds(n.getVoltageLevelToExpandIds()) - .voltageLevelToOmitIds(n.getVoltageLevelToOmitIds()) - .depth(n.getDepth()) - .gridLayout(convertGridLayoutMap(n.getGridLayout(), StudyLayoutMapper::toGridLayoutEntity)) + case NetworkAreaDiagramLayout v -> NetworkAreaDiagramLayoutEntity.builder() + .diagramUuid(v.getDiagramUuid()) + .originalNadConfigUuid(v.getOriginalNadConfigUuid()) + .currentNadConfigUuid(v.getCurrentNadConfigUuid()) + .filterUuid(v.getFilterUuid()) + .name(v.getName()) + .diagramPositions(convertDiagramPositionsMap(v.getDiagramPositions(), DiagramGridLayoutMapper::toDiagramPositionEntity)) .build(); case null -> null; default -> throw new IllegalArgumentException("Unknown diagram layout DTO type: " + dto.getClass()); @@ -78,31 +76,29 @@ public static AbstractDiagramLayout toDiagramLayoutDto(AbstractDiagramLayoutEnti case SubstationDiagramLayoutEntity s -> SubstationDiagramLayout.builder() .diagramUuid(s.getDiagramUuid()) .substationId(s.getSubstationId()) - .gridLayout(convertGridLayoutMap(s.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) + .diagramPositions(convertDiagramPositionsMap(s.getDiagramPositions(), DiagramGridLayoutMapper::toDiagramPositionDto)) .build(); case VoltageLevelLayoutEntity v -> VoltageLevelDiagramLayout.builder() .diagramUuid(v.getDiagramUuid()) .voltageLevelId(v.getVoltageLevelId()) - .gridLayout(convertGridLayoutMap(v.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) + .diagramPositions(convertDiagramPositionsMap(v.getDiagramPositions(), DiagramGridLayoutMapper::toDiagramPositionDto)) .build(); case NetworkAreaDiagramLayoutEntity n -> NetworkAreaDiagramLayout.builder() .diagramUuid(n.getDiagramUuid()) + .originalNadConfigUuid(n.getOriginalNadConfigUuid()) + .currentNadConfigUuid(n.getCurrentNadConfigUuid()) .filterUuid(n.getFilterUuid()) - .nadConfigUuid(n.getNadConfigUuid()) - .voltageLevelIds(n.getVoltageLevelIds() != null ? List.copyOf(n.getVoltageLevelIds()) : null) - .voltageLevelToExpandIds(n.getVoltageLevelToExpandIds() != null ? List.copyOf(n.getVoltageLevelToExpandIds()) : null) - .voltageLevelToOmitIds(n.getVoltageLevelToOmitIds() != null ? List.copyOf(n.getVoltageLevelToOmitIds()) : null) - .depth(n.getDepth()) - .gridLayout(convertGridLayoutMap(n.getGridLayout(), StudyLayoutMapper::toGridLayoutDto)) + .name(n.getName()) + .diagramPositions(convertDiagramPositionsMap(n.getDiagramPositions(), DiagramGridLayoutMapper::toDiagramPositionDto)) .build(); case null -> null; default -> throw new IllegalArgumentException("Unknown diagram layout entity type: " + entity.getClass()); }; } - public static DiagramGridLayoutEntity toGridLayoutEntity(DiagramGridLayout dto) { + public static DiagramPositionEntity toDiagramPositionEntity(DiagramPosition dto) { return Optional.ofNullable(dto) - .map(d -> DiagramGridLayoutEntity.builder() + .map(d -> DiagramPositionEntity.builder() .xPosition(d.getX()) .yPosition(d.getY()) .width(d.getW()) @@ -111,9 +107,9 @@ public static DiagramGridLayoutEntity toGridLayoutEntity(DiagramGridLayout dto) .orElse(null); } - public static DiagramGridLayout toGridLayoutDto(DiagramGridLayoutEntity entity) { + public static DiagramPosition toDiagramPositionDto(DiagramPositionEntity entity) { return Optional.ofNullable(entity) - .map(e -> DiagramGridLayout.builder() + .map(e -> DiagramPosition.builder() .x(e.getXPosition()) .y(e.getYPosition()) .w(e.getWidth()) @@ -128,7 +124,7 @@ private static List convertDiagramLayouts(List items, Function Map convertGridLayoutMap(Map sourceMap, Function converter) { + private static Map convertDiagramPositionsMap(Map sourceMap, Function converter) { return Optional.ofNullable(sourceMap) .map(map -> map.entrySet().stream() .collect(Collectors.toMap( diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java new file mode 100644 index 0000000..6530f98 --- /dev/null +++ b/src/main/java/org/gridsuite/studyconfig/server/service/DiagramGridLayoutService.java @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server.service; + +import jakarta.persistence.EntityNotFoundException; + +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.DiagramGridLayout; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.DiagramGridLayoutEntity; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.DiagramGridLayoutRepository; +import org.gridsuite.studyconfig.server.mapper.DiagramGridLayoutMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@Service +public class DiagramGridLayoutService { + private final DiagramGridLayoutRepository diagramGridLayoutRepository; + + public DiagramGridLayoutService(DiagramGridLayoutRepository diagramGridLayoutRepository) { + this.diagramGridLayoutRepository = diagramGridLayoutRepository; + } + + @Transactional(readOnly = true) + public DiagramGridLayout getByDiagramGridLayoutUuid(UUID diagramGridLayoutUuid) { + DiagramGridLayoutEntity entity = diagramGridLayoutRepository + .findById(diagramGridLayoutUuid) + .orElseThrow(() -> new EntityNotFoundException("Diagram grid layout not found with id: " + diagramGridLayoutUuid)); + + return DiagramGridLayoutMapper.toDto(entity); + } + + @Transactional + public void deleteDiagramGridLayout(UUID diagramGridLayoutUuid) { + diagramGridLayoutRepository.deleteById(diagramGridLayoutUuid); + } + + @Transactional + public UUID saveDiagramGridLayout(DiagramGridLayout diagramGridLayout) { + DiagramGridLayoutEntity diagramGridLayoutEntity = diagramGridLayoutRepository.save(DiagramGridLayoutMapper.toEntity(diagramGridLayout)); + + return diagramGridLayoutEntity.getUuid(); + } + + @Transactional + public void updateDiagramGridLayout(UUID diagramGridLayoutUuid, DiagramGridLayout diagramGridLayout) { + DiagramGridLayoutEntity diagramGridLayoutEntity = diagramGridLayoutRepository.findById(diagramGridLayoutUuid).orElseThrow(() -> new EntityNotFoundException("Diagram grid layout not found with id: " + diagramGridLayoutUuid)); + + diagramGridLayoutEntity.replaceAllDiagramLayouts(diagramGridLayout.getDiagramLayouts().stream() + .map(DiagramGridLayoutMapper::toDiagramLayoutEntity) + .toList()); + + diagramGridLayoutRepository.save(diagramGridLayoutEntity); + } +} diff --git a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java b/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java deleted file mode 100644 index 7a5ddb6..0000000 --- a/src/main/java/org/gridsuite/studyconfig/server/service/StudyLayoutService.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.studyconfig.server.service; - -import jakarta.persistence.EntityNotFoundException; -import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; -import org.gridsuite.studyconfig.server.mapper.StudyLayoutMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.UUID; - -@Service -public class StudyLayoutService { - private final StudyLayoutRepository studyLayoutRepository; - - public StudyLayoutService(StudyLayoutRepository studyLayoutRepository) { - this.studyLayoutRepository = studyLayoutRepository; - } - - @Transactional(readOnly = true) - public StudyLayout getByStudyLayoutUuid(UUID studyLayoutUuid) { - StudyLayoutEntity entity = studyLayoutRepository - .findById(studyLayoutUuid) - .orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)); - - return StudyLayoutMapper.toDto(entity); - } - - @Transactional - public void deleteStudyLayout(UUID studyLayoutUuid) { - studyLayoutRepository.deleteById(studyLayoutUuid); - } - - @Transactional - public UUID saveStudyLayout(StudyLayout studyLayout) { - StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.save(StudyLayoutMapper.toEntity(studyLayout)); - - return studyLayoutEntity.getUuid(); - } - - @Transactional - public void updateStudyLayout(UUID studyLayoutUuid, StudyLayout studyLayout) { - StudyLayoutEntity studyLayoutEntity = studyLayoutRepository.findById(studyLayoutUuid).orElseThrow(() -> new EntityNotFoundException("Study layout not found with id: " + studyLayoutUuid)); - - studyLayoutEntity.replaceAllDiagramLayouts(studyLayout.getDiagramLayoutParams().stream() - .map(StudyLayoutMapper::toDiagramLayoutEntity) - .toList()); - - studyLayoutRepository.save(studyLayoutEntity); - } -} diff --git a/src/main/resources/db/changelog/changesets/changelog_20250717T215546Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250717T215546Z.xml deleted file mode 100644 index 8c8c366..0000000 --- a/src/main/resources/db/changelog/changesets/changelog_20250717T215546Z.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/db/changelog/changesets/changelog_20250722T151152Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250722T151152Z.xml new file mode 100644 index 0000000..914bf78 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20250722T151152Z.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index b29bfb7..3752796 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -63,5 +63,5 @@ databaseChangeLog: file: changesets/changelog_20250619T162423Z.xml relativeToChangelogFile: true - include: - file: changesets/changelog_20250717T215546Z.xml + file: changesets/changelog_20250722T151152Z.xml relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/studyconfig/server/DiagramGridLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/DiagramGridLayoutControllerTest.java new file mode 100644 index 0000000..6a1cda3 --- /dev/null +++ b/src/test/java/org/gridsuite/studyconfig/server/DiagramGridLayoutControllerTest.java @@ -0,0 +1,152 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.studyconfig.server; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.DiagramGridLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.DiagramPosition; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.NetworkAreaDiagramLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.SubstationDiagramLayout; +import org.gridsuite.studyconfig.server.dto.diagramgridlayout.diagramlayout.VoltageLevelDiagramLayout; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.DiagramGridLayoutEntity; +import org.gridsuite.studyconfig.server.entities.diagramgridlayout.DiagramGridLayoutRepository; +import org.gridsuite.studyconfig.server.mapper.DiagramGridLayoutMapper; +import org.gridsuite.studyconfig.server.service.DiagramGridLayoutService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@AutoConfigureMockMvc +class DiagramGridLayoutControllerTest { + @Autowired + MockMvc mockMvc; + @Autowired + private DiagramGridLayoutRepository diagramGridLayoutRepository; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private DiagramGridLayoutService diagramGridLayoutService; + + @Test + void testGetDiagramGridLayout() throws Exception { + DiagramGridLayoutEntity expectedResult = diagramGridLayoutRepository.save(DiagramGridLayoutMapper.toEntity(createDiagramGridLayout())); + MvcResult mockMvcResult = mockMvc.perform(get("/v1/diagram-grid-layout/{diagramGridLayoutUuid}", expectedResult.getUuid())) + .andExpect(status().isOk()) + .andReturn(); + + DiagramGridLayout result = objectMapper.readValue(mockMvcResult.getResponse().getContentAsString(), DiagramGridLayout.class); + assertThat(result).usingRecursiveComparison().isEqualTo(DiagramGridLayoutMapper.toDto(expectedResult)); + } + + @Test + void testDeleteDiagramGridLayout() throws Exception { + DiagramGridLayoutEntity expectedResult = diagramGridLayoutRepository.save(DiagramGridLayoutMapper.toEntity(createDiagramGridLayout())); + mockMvc.perform(delete("/v1/diagram-grid-layout/{diagramGridLayoutUuid}", expectedResult.getUuid())) + .andExpect(status().isOk()); + + assertTrue(diagramGridLayoutRepository.findById(expectedResult.getUuid()).isEmpty()); + } + + @Test + void testSaveDiagramGridLayout() throws Exception { + DiagramGridLayout diagramGridLayoutToSave = createDiagramGridLayout(); + + MvcResult mockMvcResult = mockMvc.perform(post("/v1/diagram-grid-layout") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(diagramGridLayoutToSave))) + .andExpect(status().isOk()) + .andReturn(); + + UUID diagramGridLayoutUUID = objectMapper.readValue(mockMvcResult.getResponse().getContentAsString(), UUID.class); + + DiagramGridLayout diagramGridLayoutToCheck = diagramGridLayoutService.getByDiagramGridLayoutUuid(diagramGridLayoutUUID); + assertThat(diagramGridLayoutToCheck).usingRecursiveComparison().isEqualTo(diagramGridLayoutToSave); + } + + @Test + void testUpdateDiagramGridLayout() throws Exception { + DiagramGridLayoutEntity existingDiagramGridLayout = diagramGridLayoutRepository.save(DiagramGridLayoutMapper.toEntity(createDiagramGridLayout())); + + UUID newDiagramLayoutUuid = UUID.randomUUID(); + DiagramGridLayout updatedDiagramGridLayout = createDiagramGridLayout(); + updatedDiagramGridLayout.getDiagramLayouts().add(SubstationDiagramLayout.builder() + .substationId("s1") + .diagramPositions(Map.of( + "lg", + DiagramPosition.builder().w(5) + .h(6) + .x(7) + .y(8) + .build() + )) + + .diagramUuid(newDiagramLayoutUuid) + .build()); + + updatedDiagramGridLayout.getDiagramLayouts().add(NetworkAreaDiagramLayout.builder() + .diagramUuid(UUID.randomUUID()) + .diagramPositions(Map.of( + "lg", + DiagramPosition.builder() + .w(10) + .h(20) + .x(30) + .y(40) + .build() + )) + .originalNadConfigUuid(UUID.randomUUID()) + .currentNadConfigUuid(UUID.randomUUID()) + .filterUuid(UUID.randomUUID()) + .name("Network Area Layout") + .build()); + + mockMvc.perform(put("/v1/diagram-grid-layout/{diagramLayoutUuid}", existingDiagramGridLayout.getUuid()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updatedDiagramGridLayout))) + .andExpect(status().isOk()) + .andReturn(); + + DiagramGridLayout diagramGridLayoutToCheck = diagramGridLayoutService.getByDiagramGridLayoutUuid(existingDiagramGridLayout.getUuid()); + assertThat(diagramGridLayoutToCheck).usingRecursiveComparison().isEqualTo(updatedDiagramGridLayout); + } + + private DiagramGridLayout createDiagramGridLayout() { + UUID diagramLayoutUuid = UUID.randomUUID(); + return DiagramGridLayout.builder() + .diagramLayouts(new ArrayList<>(List.of( + VoltageLevelDiagramLayout.builder() + .voltageLevelId("vl1") + .diagramPositions(Map.of( + "lg", + DiagramPosition.builder().w(1) + .h(2) + .x(3) + .y(4) + .build() + )) + + .diagramUuid(diagramLayoutUuid) + .build()))) + .build(); + } +} diff --git a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java b/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java deleted file mode 100644 index a8b607d..0000000 --- a/src/test/java/org/gridsuite/studyconfig/server/StudyLayoutControllerTest.java +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.studyconfig.server; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.studyconfig.server.dto.studylayout.StudyLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.DiagramGridLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.NetworkAreaDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.SubstationDiagramLayout; -import org.gridsuite.studyconfig.server.dto.studylayout.diagramlayout.VoltageLevelDiagramLayout; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutEntity; -import org.gridsuite.studyconfig.server.entities.studylayout.StudyLayoutRepository; -import org.gridsuite.studyconfig.server.mapper.StudyLayoutMapper; -import org.gridsuite.studyconfig.server.service.StudyLayoutService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest -@AutoConfigureMockMvc -class StudyLayoutControllerTest { - @Autowired - MockMvc mockMvc; - @Autowired - private StudyLayoutRepository studyLayoutRepository; - @Autowired - private ObjectMapper objectMapper; - @Autowired - private StudyLayoutService studyLayoutService; - - @Test - void testGetStudyLayout() throws Exception { - StudyLayoutEntity expectedResult = studyLayoutRepository.save(StudyLayoutMapper.toEntity(createStudyLayout())); - MvcResult mockMvcResult = mockMvc.perform(get("/v1/study-layout/{studyLayoutUuid}", expectedResult.getUuid())) - .andExpect(status().isOk()) - .andReturn(); - - StudyLayout result = objectMapper.readValue(mockMvcResult.getResponse().getContentAsString(), StudyLayout.class); - assertThat(result).usingRecursiveComparison().isEqualTo(StudyLayoutMapper.toDto(expectedResult)); - } - - @Test - void testDeleteStudyLayout() throws Exception { - StudyLayoutEntity expectedResult = studyLayoutRepository.save(StudyLayoutMapper.toEntity(createStudyLayout())); - mockMvc.perform(delete("/v1/study-layout/{studyLayoutUuid}", expectedResult.getUuid())) - .andExpect(status().isOk()); - - assertTrue(studyLayoutRepository.findById(expectedResult.getUuid()).isEmpty()); - } - - @Test - void testSaveStudyLayout() throws Exception { - StudyLayout studyLayoutToSave = createStudyLayout(); - - MvcResult mockMvcResult = mockMvc.perform(post("/v1/study-layout") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(studyLayoutToSave))) - .andExpect(status().isOk()) - .andReturn(); - - UUID studyLayoutUUID = objectMapper.readValue(mockMvcResult.getResponse().getContentAsString(), UUID.class); - - StudyLayout studyLayoutToCheck = studyLayoutService.getByStudyLayoutUuid(studyLayoutUUID); - assertThat(studyLayoutToCheck).usingRecursiveComparison().isEqualTo(studyLayoutToSave); - } - - @Test - void testUpdateStudyLayout() throws Exception { - StudyLayoutEntity existingStudyLayout = studyLayoutRepository.save(StudyLayoutMapper.toEntity(createStudyLayout())); - - UUID newDiagramLayoutUuid = UUID.randomUUID(); - StudyLayout updatedStudyLayout = createStudyLayout(); - updatedStudyLayout.getDiagramLayoutParams().add(SubstationDiagramLayout.builder() - .substationId("s1") - .gridLayout(Map.of( - "lg", - DiagramGridLayout.builder().w(5) - .h(6) - .x(7) - .y(8) - .build() - )) - - .diagramUuid(newDiagramLayoutUuid) - .build()); - - UUID diagramUuid = UUID.randomUUID(); - List voltageLevelIds = List.of("vl1", "vl2", "vl3"); - List voltageLevelToExpandIds = List.of("vl1"); - List voltageLevelToOmitIds = List.of("vl2"); - Integer depth = 5; - - updatedStudyLayout.getDiagramLayoutParams().add(NetworkAreaDiagramLayout.builder() - .diagramUuid(diagramUuid) - .gridLayout(Map.of( - "lg", - DiagramGridLayout.builder() - .w(10) - .h(20) - .x(30) - .y(40) - .build() - )) - .voltageLevelIds(voltageLevelIds) - .voltageLevelToExpandIds(voltageLevelToExpandIds) - .voltageLevelToOmitIds(voltageLevelToOmitIds) - .filterUuid(UUID.randomUUID()) - .nadConfigUuid(UUID.randomUUID()) - .depth(depth) - .build()); - - mockMvc.perform(put("/v1/study-layout/{studyLayoutUuid}", existingStudyLayout.getUuid()) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(updatedStudyLayout))) - .andExpect(status().isOk()) - .andReturn(); - - StudyLayout studyLayoutToCheck = studyLayoutService.getByStudyLayoutUuid(existingStudyLayout.getUuid()); - assertThat(studyLayoutToCheck).usingRecursiveComparison().isEqualTo(updatedStudyLayout); - } - - private StudyLayout createStudyLayout() { - UUID diagramLayoutUuid = UUID.randomUUID(); - return StudyLayout.builder() - .diagramLayoutParams(new ArrayList<>(List.of( - VoltageLevelDiagramLayout.builder() - .voltageLevelId("vl1") - .gridLayout(Map.of( - "lg", - DiagramGridLayout.builder().w(1) - .h(2) - .x(3) - .y(4) - .build() - )) - - .diagramUuid(diagramLayoutUuid) - .build()))) - .build(); - } -}