Skip to content

Commit a1d389b

Browse files
authored
Handle the nad generation mode (#812)
Signed-off-by: AAJELLAL <[email protected]>
1 parent d88b747 commit a1d389b

File tree

10 files changed

+98
-46
lines changed

10 files changed

+98
-46
lines changed

src/main/java/org/gridsuite/study/server/RestResponseEntityExceptionHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ protected ResponseEntity<Object> handleStudyException(StudyException exception)
8181
BAD_MODIFICATION_TYPE,
8282
BAD_JSON_FORMAT,
8383
TIME_SERIES_BAD_TYPE,
84-
TIMELINE_BAD_TYPE
84+
TIMELINE_BAD_TYPE,
85+
BAD_PARAMETER
8586
-> ResponseEntity.status(HttpStatus.BAD_REQUEST).body(exception.getMessage());
8687
case NETWORK_NOT_FOUND,
8788
NETWORK_INDEXATION_FAILED,

src/main/java/org/gridsuite/study/server/StudyConstants.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ private StudyConstants() {
8989
public static final String PATH_PARAM_PARAMETERS = "parameters";
9090
public static final String DYNA_FLOW_PROVIDER = "DynaFlow";
9191

92-
9392
public enum SldDisplayMode {
9493
FEEDER_POSITION,
9594
STATE_VARIABLE

src/main/java/org/gridsuite/study/server/StudyException.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public enum Type {
7272
GET_NETWORK_NOMINAL_VOLTAGES_FAILED,
7373
BAD_JSON_FORMAT,
7474
UNKNOWN_ACTION_TYPE,
75+
BAD_PARAMETER,
7576
MISSING_PARAMETER,
7677
LOAD_SCALING_FAILED,
7778
DELETE_VOLTAGE_LEVEL_ON_LINE,

src/main/java/org/gridsuite/study/server/controller/StudyController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import jakarta.servlet.http.HttpServletResponse;
1818
import org.apache.commons.lang3.StringUtils;
1919
import org.gridsuite.study.server.StudyApi;
20-
import org.gridsuite.study.server.StudyConstants.*;
2120
import org.gridsuite.study.server.StudyException;
2221
import org.gridsuite.study.server.StudyException.Type;
2322
import org.gridsuite.study.server.dto.*;
@@ -56,6 +55,7 @@
5655
import org.springframework.util.CollectionUtils;
5756
import org.springframework.web.bind.WebDataBinder;
5857
import org.springframework.web.bind.annotation.*;
58+
import org.springframework.web.multipart.MultipartFile;
5959

6060
import javax.annotation.Nullable;
6161
import java.beans.PropertyEditorSupport;
@@ -2097,6 +2097,14 @@ public ResponseEntity<Void> setNetworkVisualizationParametersValues(
20972097
return ResponseEntity.ok().build();
20982098
}
20992099

2100+
@PostMapping(value = "/studies/network-visualizations/nad-positions-config", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
2101+
@Operation(summary = "create a nad positions configuration using data from a csv")
2102+
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The nad positions configuration created")})
2103+
public ResponseEntity<Void> createNadPositionsConfigFromCsv(@RequestParam("file") MultipartFile file) {
2104+
studyService.createNadPositionsConfigFromCsv(file);
2105+
return ResponseEntity.ok().build();
2106+
}
2107+
21002108
@GetMapping(value = "/optional-services")
21012109
@Operation(summary = "Get all the optional services and their status")
21022110
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "List of optional services")})

src/main/java/org/gridsuite/study/server/service/SingleLineDiagramService.java

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,6 @@
1111
* @author Kevin Le Saulnier <kevin.lesaulnier at rte-france.com>
1212
*/
1313

14-
import static org.gridsuite.study.server.StudyConstants.*;
15-
import static org.gridsuite.study.server.StudyException.Type.*;
16-
import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError;
17-
18-
import java.util.List;
19-
import java.util.Objects;
20-
import java.util.UUID;
21-
2214
import org.apache.commons.lang3.StringUtils;
2315
import org.gridsuite.study.server.StudyException;
2416
import org.gridsuite.study.server.dto.DiagramParameters;
@@ -28,10 +20,21 @@
2820
import org.springframework.core.ParameterizedTypeReference;
2921
import org.springframework.http.*;
3022
import org.springframework.stereotype.Service;
23+
import org.springframework.util.LinkedMultiValueMap;
24+
import org.springframework.util.MultiValueMap;
3125
import org.springframework.web.client.HttpStatusCodeException;
3226
import org.springframework.web.client.RestTemplate;
27+
import org.springframework.web.multipart.MultipartFile;
3328
import org.springframework.web.util.UriComponentsBuilder;
3429

30+
import java.util.List;
31+
import java.util.Objects;
32+
import java.util.UUID;
33+
34+
import static org.gridsuite.study.server.StudyConstants.*;
35+
import static org.gridsuite.study.server.StudyException.Type.*;
36+
import static org.gridsuite.study.server.utils.StudyUtils.handleHttpError;
37+
3538
@Service
3639
public class SingleLineDiagramService {
3740

@@ -188,26 +191,14 @@ public String getNetworkAreaDiagram(UUID networkUuid, String variantId, String n
188191
} catch (HttpStatusCodeException e) {
189192
if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
190193
throw new StudyException(SVG_NOT_FOUND, VOLTAGE_LEVEL + NOT_FOUND);
194+
} else if (HttpStatus.BAD_REQUEST.equals(e.getStatusCode())) {
195+
throw new StudyException(BAD_PARAMETER, e.getMessage());
191196
} else {
192197
throw e;
193198
}
194199
}
195200
}
196201

197-
public UUID createDiagramConfig(NetworkAreaDiagramLayoutDetails nadLayoutDetails) {
198-
var path = UriComponentsBuilder
199-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/config")
200-
.buildAndExpand()
201-
.toUriString();
202-
203-
HttpHeaders headers = new HttpHeaders();
204-
headers.setContentType(MediaType.APPLICATION_JSON);
205-
206-
HttpEntity<NetworkAreaDiagramLayoutDetails> httpEntity = new HttpEntity<>(nadLayoutDetails, headers);
207-
208-
return restTemplate.exchange(singleLineDiagramServerBaseUri + path, HttpMethod.POST, httpEntity, UUID.class).getBody();
209-
}
210-
211202
public void createMultipleDiagramConfigs(List<NadConfigInfos> nadConfigs) {
212203
var path = UriComponentsBuilder
213204
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/configs")
@@ -268,4 +259,21 @@ public UUID duplicateNadConfig(UUID sourceNadConfigUuid) {
268259
throw handleHttpError(e, DUPLICATE_DIAGRAM_GRID_LAYOUT_FAILED);
269260
}
270261
}
262+
263+
public void createNadPositionsConfigFromCsv(MultipartFile file) {
264+
var path = UriComponentsBuilder.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION +
265+
"/network-area-diagram/config/positions").buildAndExpand()
266+
.toUriString();
267+
268+
HttpHeaders headers = new HttpHeaders();
269+
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
270+
271+
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
272+
body.add("file_name", file.getOriginalFilename());
273+
body.add("file", file.getResource());
274+
275+
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
276+
277+
restTemplate.exchange(singleLineDiagramServerBaseUri + path, HttpMethod.POST, requestEntity, Void.class);
278+
}
271279
}

src/main/java/org/gridsuite/study/server/service/StudyConfigService.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@
2323
import org.springframework.web.client.RestTemplate;
2424
import org.springframework.web.util.UriComponentsBuilder;
2525

26-
import java.util.Collections;
27-
import java.util.List;
28-
import java.util.Objects;
29-
import java.util.UUID;
26+
import java.util.*;
3027

3128
import static org.gridsuite.study.server.StudyConstants.DELIMITER;
3229
import static org.gridsuite.study.server.StudyConstants.STUDY_CONFIG_API_VERSION;

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.springframework.stereotype.Service;
7171
import org.springframework.transaction.annotation.Transactional;
7272
import org.springframework.web.client.HttpStatusCodeException;
73+
import org.springframework.web.multipart.MultipartFile;
7374

7475
import java.io.UncheckedIOException;
7576
import java.net.URLEncoder;
@@ -82,7 +83,7 @@
8283
import java.util.stream.Collectors;
8384
import java.util.stream.Stream;
8485

85-
import static org.gridsuite.study.server.StudyConstants.DYNA_FLOW_PROVIDER;
86+
import static org.gridsuite.study.server.StudyConstants.*;
8687
import static org.gridsuite.study.server.StudyException.Type.*;
8788
import static org.gridsuite.study.server.dto.ComputationType.*;
8889
import static org.gridsuite.study.server.dto.InvalidateNodeTreeParameters.ALL_WITH_BLOCK_NODES;
@@ -3474,4 +3475,9 @@ public UUID saveDiagramGridLayout(UUID studyUuid, DiagramGridLayout diagramGridL
34743475
private void removeDiagramGridLayout(@Nullable UUID diagramGridLayoutUuid) {
34753476
diagramGridLayoutService.removeDiagramGridLayout(diagramGridLayoutUuid);
34763477
}
3478+
3479+
@Transactional
3480+
public void createNadPositionsConfigFromCsv(MultipartFile file) {
3481+
singleLineDiagramService.createNadPositionsConfigFromCsv(file);
3482+
}
34773483
}

src/test/java/org/gridsuite/study/server/StudyServiceTest.java

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,8 @@
1414
import com.powsybl.network.store.client.NetworkStoreService;
1515
import org.gridsuite.study.server.dto.BasicStudyInfos;
1616
import org.gridsuite.study.server.notification.NotificationService;
17-
import org.gridsuite.study.server.repository.StudyCreationRequestRepository;
1817
import org.gridsuite.study.server.repository.StudyRepository;
19-
import org.gridsuite.study.server.service.CaseService;
20-
import org.gridsuite.study.server.service.LoadFlowService;
21-
import org.gridsuite.study.server.service.NetworkConversionService;
22-
import org.gridsuite.study.server.service.NetworkModificationTreeService;
23-
import org.gridsuite.study.server.service.ReportService;
24-
import org.gridsuite.study.server.service.StudyConfigService;
18+
import org.gridsuite.study.server.service.*;
2519
import org.gridsuite.study.server.service.shortcircuit.ShortCircuitService;
2620
import org.gridsuite.study.server.utils.SendInput;
2721
import org.gridsuite.study.server.utils.TestUtils;
@@ -38,25 +32,27 @@
3832
import org.springframework.boot.test.mock.mockito.MockBean;
3933
import org.springframework.cloud.stream.binder.test.InputDestination;
4034
import org.springframework.cloud.stream.binder.test.OutputDestination;
35+
import org.springframework.http.MediaType;
4136
import org.springframework.messaging.Message;
4237
import org.springframework.messaging.MessageHeaders;
38+
import org.springframework.mock.web.MockMultipartFile;
4339
import org.springframework.test.web.servlet.MockMvc;
4440
import org.springframework.test.web.servlet.MvcResult;
41+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
4542

43+
import java.nio.charset.StandardCharsets;
4644
import java.util.HashMap;
4745
import java.util.List;
4846
import java.util.Map;
4947
import java.util.UUID;
5048
import java.util.concurrent.CountDownLatch;
5149

5250
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
53-
import static org.gridsuite.study.server.StudyConstants.HEADER_IMPORT_PARAMETERS;
54-
import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID;
51+
import static org.gridsuite.study.server.StudyConstants.*;
5552
import static org.junit.jupiter.api.Assertions.assertEquals;
5653
import static org.junit.jupiter.api.Assertions.assertTrue;
5754
import static org.mockito.Mockito.when;
58-
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.head;
59-
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
55+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
6056
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
6157

6258
@AutoConfigureMockMvc
@@ -108,9 +104,6 @@ class StudyServiceTest {
108104
@Autowired
109105
private StudyRepository studyRepository;
110106

111-
@Autowired
112-
private StudyCreationRequestRepository studyCreationRequestRepository;
113-
114107
@Autowired
115108
private NetworkModificationTreeService networkModificationTreeService;
116109

@@ -128,6 +121,8 @@ class StudyServiceTest {
128121

129122
@MockBean
130123
private StudyConfigService studyConfigService;
124+
@Autowired
125+
private SingleLineDiagramService singleLineDiagramService;
131126

132127
@BeforeEach
133128
void setup() {
@@ -142,6 +137,8 @@ void setup() {
142137
caseService.setCaseServerBaseUri(wireMockServer.baseUrl());
143138
networkConversionService.setNetworkConversionServerBaseUri(wireMockServer.baseUrl());
144139
reportService.setReportServerBaseUri(wireMockServer.baseUrl());
140+
singleLineDiagramService.setSingleLineDiagramServerBaseUri(wireMockServer.baseUrl());
141+
studyConfigService.setStudyConfigServerBaseUri(wireMockServer.baseUrl());
145142

146143
}
147144

@@ -278,6 +275,24 @@ void testRecreateStudyNetworkFromUnexistingCase() throws Exception {
278275
wireMockUtils.verifyCaseExists(caseExistsStubId, CASE_UUID.toString());
279276
}
280277

278+
@Test
279+
void testImportCsv() throws Exception {
280+
String csvContent = "voltageLevelId;equipmentType;xPosition;yPosition;xLabelPosition;yLabelPosition\n" +
281+
"VL1;4;100;200;110;210";
282+
283+
MockMultipartFile file = new MockMultipartFile(
284+
"file", "positions.csv", "text/csv", csvContent.getBytes(StandardCharsets.UTF_8)
285+
);
286+
UUID positionsFromCsvUuid = wireMockUtils.stubCreatePositionsFromCsv();
287+
mockMvc.perform(MockMvcRequestBuilders.multipart("/v1/studies/network-visualizations/nad-positions-config")
288+
.file(file)
289+
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
290+
.andExpect(status().isOk());
291+
292+
// assert API calls have been made
293+
wireMockUtils.verifyStubCreatePositionsFromCsv(positionsFromCsvUuid);
294+
}
295+
281296
private UUID createStudy(String userId, UUID caseUuid, Map<String, Object> importParameters) throws Exception {
282297
// mock API calls
283298
UUID caseExistsStubId = wireMockUtils.stubCaseExists(caseUuid.toString(), true);
@@ -288,7 +303,6 @@ private UUID createStudy(String userId, UUID caseUuid, Map<String, Object> impor
288303
when(loadFlowService.createDefaultLoadFlowParameters()).thenReturn(LOADFLOW_PARAMETERS_UUID);
289304
when(shortCircuitService.createParameters(null)).thenReturn(SHORTCIRCUIT_PARAMETERS_UUID);
290305
when(studyConfigService.createDefaultSpreadsheetConfigCollection()).thenReturn(SPREADSHEET_CONFIG_COLLECTION_UUID);
291-
292306
MvcResult result = mockMvc.perform(post("/v1/studies/cases/{caseUuid}", caseUuid)
293307
.header("userId", userId)
294308
.param(CASE_FORMAT_PARAM, "UCTE")

src/test/java/org/gridsuite/study/server/utils/WireMockUtils.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class WireMockUtils {
3737
public static final String URI_NETWORK_DATA = "/v1/networks";
3838

3939
private static final String URI_NETWORK_MODIFICATION = "/v1/network-modifications";
40+
private static final String URI_NETWORK_AREA_DIAGRAM = "/v1/network-area-diagram/config/positions";
4041

4142
private static final String URI_NETWORK_MODIFICATION_GROUPS = "/v1/groups";
4243

@@ -580,4 +581,21 @@ public void verifySearchModifications(UUID stubUuid, String networkUuid, String
580581
"userInput", WireMock.equalTo(userInput)));
581582
}
582583

584+
public UUID stubCreatePositionsFromCsv() {
585+
MappingBuilder mappingBuilder = WireMock.post(WireMock.urlPathEqualTo(URI_NETWORK_AREA_DIAGRAM))
586+
.withHeader("Content-Type", WireMock.containing("multipart/form-data"))
587+
.withMultipartRequestBody(WireMock.aMultipart()
588+
.withName("file")
589+
.withHeader("Content-Disposition", WireMock.containing("filename=\"positions.csv\""))
590+
)
591+
.withMultipartRequestBody(WireMock.aMultipart()
592+
.withName("file_name")
593+
.withBody(WireMock.equalTo("positions.csv"))
594+
);
595+
return wireMock.stubFor(mappingBuilder.willReturn(WireMock.ok().withHeader("Content-Type", "application/json"))).getId();
596+
}
597+
598+
public void verifyStubCreatePositionsFromCsv(UUID stubUuid) {
599+
verifyPostRequest(stubUuid, URI_NETWORK_AREA_DIAGRAM, true, Map.of(), null);
600+
}
583601
}

src/test/resources/network-visulization-default-parameters.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@
1616
"componentLibrary": ""
1717
},
1818
"networkAreaDiagramParameters": {
19-
"initNadWithGeoData": true
19+
"nadConfigUuid": "5218bc26-1196-4ac5-a860-d7342359bca7"
2020
}
2121
}

0 commit comments

Comments
 (0)