From a2deaed175297fb79cc6cb07d151073207451857 Mon Sep 17 00:00:00 2001 From: Caroline Jeandat Date: Thu, 12 Feb 2026 15:44:59 +0100 Subject: [PATCH 1/2] enrich contingency lists export with the list name --- .../server/ContingencyListService.java | 21 +++++- .../server/service/DirectoryService.java | 70 +++++++++++++++++++ src/main/resources/application-local.yaml | 2 + 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/gridsuite/actions/server/service/DirectoryService.java diff --git a/src/main/java/org/gridsuite/actions/server/ContingencyListService.java b/src/main/java/org/gridsuite/actions/server/ContingencyListService.java index cd85191c..7346accc 100644 --- a/src/main/java/org/gridsuite/actions/server/ContingencyListService.java +++ b/src/main/java/org/gridsuite/actions/server/ContingencyListService.java @@ -24,6 +24,7 @@ import org.gridsuite.actions.server.entities.*; import org.gridsuite.actions.server.repositories.FilterBasedContingencyListRepository; import org.gridsuite.actions.server.repositories.IdBasedContingencyListRepository; +import org.gridsuite.actions.server.service.DirectoryService; import org.gridsuite.actions.server.service.FilterService; import org.gridsuite.actions.server.utils.ContingencyListType; import org.gridsuite.actions.server.utils.ContingencyListUtils; @@ -58,16 +59,20 @@ public class ContingencyListService { private final FilterService filterService; + private final DirectoryService directoryService; + public ContingencyListService(IdBasedContingencyListRepository idBasedContingencyListRepository, FilterBasedContingencyListRepository filterBasedContingencyListRepository, NetworkStoreService networkStoreService, NotificationService notificationService, - FilterService filterService) { + FilterService filterService, + DirectoryService directoryService) { this.idBasedContingencyListRepository = idBasedContingencyListRepository; this.filterBasedContingencyListRepository = filterBasedContingencyListRepository; this.networkStoreService = networkStoreService; this.notificationService = notificationService; this.filterService = filterService; + this.directoryService = directoryService; } ContingencyListMetadata fromContingencyListEntity(AbstractContingencyEntity entity, ContingencyListType type) { @@ -200,7 +205,19 @@ private List getContingencies(PersistentContingencyList persistentC @Transactional(readOnly = true) public List exportContingencyInfosList(List ids, UUID networkUuid, String variantId) { Network network = getNetworkFromUuid(networkUuid, variantId); - return ids.stream().map(id -> evaluateContingencyList(findContingencyList(id, network), network, networkUuid, variantId)).flatMap(Collection::stream).toList(); + return ids.stream().map(id -> { + try { + return evaluateContingencyList(findContingencyList(id, network), network, networkUuid, variantId); + } catch (PowsyblException powsyblEx) { + String contingencyListName; + try { + contingencyListName = directoryService.getElementName(id); + } catch (Exception e) { + contingencyListName = id.toString(); + } + throw new PowsyblException("Error in contingency list: '" + contingencyListName + "': " + powsyblEx.getMessage()); + } + }).flatMap(Collection::stream).toList(); } private PersistentContingencyList findContingencyList(UUID id, Network network) { diff --git a/src/main/java/org/gridsuite/actions/server/service/DirectoryService.java b/src/main/java/org/gridsuite/actions/server/service/DirectoryService.java new file mode 100644 index 00000000..448b56b1 --- /dev/null +++ b/src/main/java/org/gridsuite/actions/server/service/DirectoryService.java @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2026, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.actions.server.service; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.net.URI; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; + +/** + * @author Caroline Jeandat {@literal } + */ +@Service +public class DirectoryService { + static final String DIRECTORY_API_VERSION = "v1"; + private static final String DELIMITER = "/"; + + @Getter + private final String baseUri; + private final RestTemplate restTemplate; + + @Autowired + public DirectoryService( + @Value("${gridsuite.services.directory-server.base-uri:http://directory-server}") String baseUri, + RestTemplateBuilder restTemplateBuilder) { + this.baseUri = baseUri; + this.restTemplate = restTemplateBuilder.build(); + } + + public String getElementName(UUID elementUuid) { + Objects.requireNonNull(elementUuid); + + URI path = UriComponentsBuilder + .fromPath(DELIMITER + DIRECTORY_API_VERSION + "/elements/{elementUuid}") + .buildAndExpand(elementUuid) + .toUri(); + + try { + ResponseEntity> response = + restTemplate.exchange( + getBaseUri() + path, + HttpMethod.GET, + null, + new ParameterizedTypeReference<>() { } + ); + + Map responseBody = response.getBody(); + return responseBody != null ? (String) responseBody.get("elementName") : null; + + } catch (HttpClientErrorException.NotFound e) { + return null; + } + } +} diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index e12feb24..50abf192 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -18,3 +18,5 @@ gridsuite: services: filter-server: base-uri: http://localhost:5027 + directory-server: + base-uri: http://localhost:5026 From f0aecd1e0ae2e4d8642d22a8119b9e15ab117fda Mon Sep 17 00:00:00 2001 From: Caroline Jeandat Date: Thu, 12 Feb 2026 16:10:31 +0100 Subject: [PATCH 2/2] fix --- .../gridsuite/actions/server/service/DirectoryService.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/gridsuite/actions/server/service/DirectoryService.java b/src/main/java/org/gridsuite/actions/server/service/DirectoryService.java index 448b56b1..8b1fb030 100644 --- a/src/main/java/org/gridsuite/actions/server/service/DirectoryService.java +++ b/src/main/java/org/gridsuite/actions/server/service/DirectoryService.java @@ -6,7 +6,6 @@ */ package org.gridsuite.actions.server.service; -import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -31,7 +30,6 @@ public class DirectoryService { static final String DIRECTORY_API_VERSION = "v1"; private static final String DELIMITER = "/"; - @Getter private final String baseUri; private final RestTemplate restTemplate; @@ -54,7 +52,7 @@ public String getElementName(UUID elementUuid) { try { ResponseEntity> response = restTemplate.exchange( - getBaseUri() + path, + baseUri + path, HttpMethod.GET, null, new ParameterizedTypeReference<>() { }