Skip to content

Commit 28d7794

Browse files
authored
use sld-server to clone the nad config associated to the study (#835)
Signed-off-by: BEN-REJEB Mohamed <[email protected]>
1 parent c7a7af7 commit 28d7794

File tree

6 files changed

+232
-121
lines changed

6 files changed

+232
-121
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public class ConsumerService {
7373
private final VoltageInitService voltageInitService;
7474
private final DynamicSecurityAnalysisService dynamicSecurityAnalysisService;
7575
private final StateEstimationService stateEstimationService;
76+
private final SingleLineDiagramService singleLineDiagramService;
7677

7778
@Autowired
7879
public ConsumerService(ObjectMapper objectMapper,
@@ -89,7 +90,8 @@ public ConsumerService(ObjectMapper objectMapper,
8990
RootNetworkNodeInfoService rootNetworkNodeInfoService,
9091
VoltageInitService voltageInitService,
9192
DynamicSecurityAnalysisService dynamicSecurityAnalysisService,
92-
StateEstimationService stateEstimationService) {
93+
StateEstimationService stateEstimationService,
94+
SingleLineDiagramService singleLineDiagramService) {
9395
this.objectMapper = objectMapper;
9496
this.notificationService = notificationService;
9597
this.studyService = studyService;
@@ -105,6 +107,7 @@ public ConsumerService(ObjectMapper objectMapper,
105107
this.voltageInitService = voltageInitService;
106108
this.dynamicSecurityAnalysisService = dynamicSecurityAnalysisService;
107109
this.stateEstimationService = stateEstimationService;
110+
this.singleLineDiagramService = singleLineDiagramService;
108111
}
109112

110113
@Bean
@@ -306,7 +309,8 @@ private void insertStudy(UUID studyUuid, String userId, NetworkInfos networkInfo
306309
private UUID createGridLayoutFromNadDiagram(String userId, UserProfileInfos userProfileInfos) {
307310
if (userProfileInfos != null && userProfileInfos.getDiagramConfigId() != null) {
308311
try {
309-
return studyConfigService.createGridLayoutFromNadDiagram(userProfileInfos.getDiagramConfigId());
312+
UUID clonedNadConfig = singleLineDiagramService.duplicateNadConfig(userProfileInfos.getDiagramConfigId());
313+
return studyConfigService.createGridLayoutFromNadDiagram(userProfileInfos.getDiagramConfigId(), clonedNadConfig);
310314
} catch (Exception e) {
311315
LOGGER.error(String.format("Could not create a diagram grid layout with NAD elment id '%s' from user/profile '%s/%s'. No layout created",
312316
userProfileInfos.getDiagramConfigId(), userId, userProfileInfos.getName()), e);

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

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

14-
import static org.gridsuite.study.server.StudyConstants.DELIMITER;
15-
import static org.gridsuite.study.server.StudyConstants.QUERY_PARAM_VARIANT_ID;
16-
import static org.gridsuite.study.server.StudyConstants.SINGLE_LINE_DIAGRAM_API_VERSION;
17-
import static org.gridsuite.study.server.StudyException.Type.SVG_NOT_FOUND;
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;
1817

1918
import java.util.List;
19+
import java.util.Objects;
2020
import java.util.UUID;
2121

2222
import org.apache.commons.lang3.StringUtils;
@@ -62,21 +62,21 @@ public SingleLineDiagramService(@Value("${powsybl.services.single-line-diagram-s
6262

6363
public List<String> getAvailableSvgComponentLibraries() {
6464
String path = UriComponentsBuilder
65-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/svg-component-libraries").toUriString();
65+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/svg-component-libraries").toUriString();
6666

6767
return restTemplate.exchange(singleLineDiagramServerBaseUri + path, HttpMethod.GET, null,
68-
new ParameterizedTypeReference<List<String>>() {
69-
}).getBody();
68+
new ParameterizedTypeReference<List<String>>() {
69+
}).getBody();
7070
}
7171

7272
public byte[] getVoltageLevelSvg(UUID networkUuid, String variantId, String voltageLevelId, DiagramParameters diagramParameters) {
7373
var uriComponentsBuilder = UriComponentsBuilder
74-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/svg/{networkUuid}/{voltageLevelId}")
75-
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
76-
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
77-
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
78-
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
79-
.queryParam(LANGUAGE, diagramParameters.getLanguage());
74+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/svg/{networkUuid}/{voltageLevelId}")
75+
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
76+
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
77+
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
78+
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
79+
.queryParam(LANGUAGE, diagramParameters.getLanguage());
8080
addParameters(diagramParameters, uriComponentsBuilder, variantId);
8181

8282
var path = uriComponentsBuilder
@@ -98,14 +98,14 @@ public byte[] getVoltageLevelSvg(UUID networkUuid, String variantId, String volt
9898

9999
public String getVoltageLevelSvgAndMetadata(UUID networkUuid, String variantId, String voltageLevelId, DiagramParameters diagramParameters) {
100100
var uriComponentsBuilder = UriComponentsBuilder
101-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION
102-
+ "/svg-and-metadata/{networkUuid}/{voltageLevelId}")
103-
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
104-
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
105-
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
106-
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
107-
.queryParam(QUERY_PARAM_DISPLAY_MODE, diagramParameters.getSldDisplayMode())
108-
.queryParam(LANGUAGE, diagramParameters.getLanguage());
101+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION
102+
+ "/svg-and-metadata/{networkUuid}/{voltageLevelId}")
103+
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
104+
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
105+
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
106+
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
107+
.queryParam(QUERY_PARAM_DISPLAY_MODE, diagramParameters.getSldDisplayMode())
108+
.queryParam(LANGUAGE, diagramParameters.getLanguage());
109109
addParameters(diagramParameters, uriComponentsBuilder, variantId);
110110

111111
String result;
@@ -123,12 +123,12 @@ public String getVoltageLevelSvgAndMetadata(UUID networkUuid, String variantId,
123123

124124
public byte[] getSubstationSvg(UUID networkUuid, String variantId, String substationId, DiagramParameters diagramParameters, String substationLayout) {
125125
var uriComponentsBuilder = UriComponentsBuilder
126-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/substation-svg/{networkUuid}/{substationId}")
127-
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
128-
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
129-
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
130-
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
131-
.queryParam(QUERY_PARAM_SUBSTATION_LAYOUT, substationLayout);
126+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/substation-svg/{networkUuid}/{substationId}")
127+
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
128+
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
129+
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
130+
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
131+
.queryParam(QUERY_PARAM_SUBSTATION_LAYOUT, substationLayout);
132132
addParameters(diagramParameters, uriComponentsBuilder, variantId);
133133
var path = uriComponentsBuilder.buildAndExpand(networkUuid, substationId).toUriString();
134134

@@ -147,13 +147,13 @@ public byte[] getSubstationSvg(UUID networkUuid, String variantId, String substa
147147

148148
public String getSubstationSvgAndMetadata(UUID networkUuid, String variantId, String substationId, DiagramParameters diagramParameters, String substationLayout) {
149149
var uriComponentsBuilder = UriComponentsBuilder
150-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/substation-svg-and-metadata/{networkUuid}/{substationId}")
151-
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
152-
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
153-
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
154-
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
155-
.queryParam(QUERY_PARAM_SUBSTATION_LAYOUT, substationLayout)
156-
.queryParam(LANGUAGE, diagramParameters.getLanguage());
150+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/substation-svg-and-metadata/{networkUuid}/{substationId}")
151+
.queryParam(QUERY_PARAM_USE_NAME, diagramParameters.isUseName())
152+
.queryParam(QUERY_PARAM_CENTER_LABEL, diagramParameters.isLabelCentered())
153+
.queryParam(QUERY_PARAM_DIAGONAL_LABEL, diagramParameters.isDiagonalLabel())
154+
.queryParam(QUERY_PARAM_TOPOLOGICAL_COLORING, diagramParameters.isTopologicalColoring())
155+
.queryParam(QUERY_PARAM_SUBSTATION_LAYOUT, substationLayout)
156+
.queryParam(LANGUAGE, diagramParameters.getLanguage());
157157
addParameters(diagramParameters, uriComponentsBuilder, variantId);
158158

159159
String result;
@@ -171,13 +171,13 @@ public String getSubstationSvgAndMetadata(UUID networkUuid, String variantId, St
171171

172172
public String getNetworkAreaDiagram(UUID networkUuid, String variantId, String nadRequestInfos) {
173173
var uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION +
174-
"/network-area-diagram/{networkUuid}");
174+
"/network-area-diagram/{networkUuid}");
175175
if (!StringUtils.isBlank(variantId)) {
176176
uriComponentsBuilder.queryParam(QUERY_PARAM_VARIANT_ID, variantId);
177177
}
178178
var path = uriComponentsBuilder
179-
.buildAndExpand(networkUuid)
180-
.toUriString();
179+
.buildAndExpand(networkUuid)
180+
.toUriString();
181181

182182
var headers = new HttpHeaders();
183183
headers.setContentType(MediaType.APPLICATION_JSON);
@@ -196,9 +196,9 @@ public String getNetworkAreaDiagram(UUID networkUuid, String variantId, String n
196196

197197
public UUID createDiagramConfig(NetworkAreaDiagramLayoutDetails nadLayoutDetails) {
198198
var path = UriComponentsBuilder
199-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/config")
200-
.buildAndExpand()
201-
.toUriString();
199+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/config")
200+
.buildAndExpand()
201+
.toUriString();
202202

203203
HttpHeaders headers = new HttpHeaders();
204204
headers.setContentType(MediaType.APPLICATION_JSON);
@@ -210,9 +210,9 @@ public UUID createDiagramConfig(NetworkAreaDiagramLayoutDetails nadLayoutDetails
210210

211211
public void createMultipleDiagramConfigs(List<NadConfigInfos> nadConfigs) {
212212
var path = UriComponentsBuilder
213-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/configs")
214-
.buildAndExpand()
215-
.toUriString();
213+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/configs")
214+
.buildAndExpand()
215+
.toUriString();
216216

217217
HttpHeaders headers = new HttpHeaders();
218218
headers.setContentType(MediaType.APPLICATION_JSON);
@@ -224,9 +224,9 @@ public void createMultipleDiagramConfigs(List<NadConfigInfos> nadConfigs) {
224224

225225
public void deleteMultipleDiagramConfigs(List<UUID> configUuids) {
226226
var path = UriComponentsBuilder
227-
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/configs")
228-
.buildAndExpand()
229-
.toUriString();
227+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/configs")
228+
.buildAndExpand()
229+
.toUriString();
230230

231231
HttpHeaders headers = new HttpHeaders();
232232
headers.setContentType(MediaType.APPLICATION_JSON);
@@ -248,4 +248,24 @@ public void addParameters(DiagramParameters diagramParameters, UriComponentsBuil
248248
uriComponentsBuilder.queryParam(QUERY_PARAM_VARIANT_ID, variantId);
249249
}
250250
}
251+
252+
public UUID duplicateNadConfig(UUID sourceNadConfigUuid) {
253+
Objects.requireNonNull(sourceNadConfigUuid);
254+
255+
var path = UriComponentsBuilder
256+
.fromPath(DELIMITER + SINGLE_LINE_DIAGRAM_API_VERSION + "/network-area-diagram/config")
257+
.queryParam("duplicateFrom", sourceNadConfigUuid)
258+
.buildAndExpand()
259+
.toUriString();
260+
261+
HttpHeaders headers = new HttpHeaders();
262+
headers.setContentType(MediaType.APPLICATION_JSON);
263+
HttpEntity<NetworkAreaDiagramLayoutDetails> httpEntity = new HttpEntity<>(headers);
264+
265+
try {
266+
return restTemplate.postForObject(singleLineDiagramServerBaseUri + path, httpEntity, UUID.class);
267+
} catch (HttpStatusCodeException e) {
268+
throw handleHttpError(e, DUPLICATE_DIAGRAM_GRID_LAYOUT_FAILED);
269+
}
270+
}
251271
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -478,14 +478,14 @@ public void updateDiagramGridLayout(UUID diagramGridLayoutUuid, DiagramGridLayou
478478
}
479479
}
480480

481-
public UUID createGridLayoutFromNadDiagram(UUID nadDiagramConfigId) {
482-
if (nadDiagramConfigId == null) {
481+
public UUID createGridLayoutFromNadDiagram(UUID sourceNadConfigUuid, UUID clonedNadConfigUuid) {
482+
if (sourceNadConfigUuid == null) {
483483
return null;
484484
}
485485
DiagramGridLayout diagramGridLayout = DiagramGridLayout.builder()
486486
.diagramLayouts(List.of(NetworkAreaDiagramLayout.builder()
487-
.originalNadConfigUuid(nadDiagramConfigId)
488-
.currentNadConfigUuid(nadDiagramConfigId)
487+
.originalNadConfigUuid(sourceNadConfigUuid)
488+
.currentNadConfigUuid(clonedNadConfigUuid)
489489
.build()))
490490
.build();
491491

src/test/java/org/gridsuite/study/server/service/ConsumerServiceTest.java

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,53 +3,65 @@
33
import org.gridsuite.study.server.dto.UserProfileInfos;
44
import org.junit.jupiter.api.BeforeEach;
55
import org.junit.jupiter.api.Test;
6-
import org.mockito.InjectMocks;
7-
import org.mockito.Mock;
8-
import org.mockito.MockitoAnnotations;
6+
import org.springframework.test.util.ReflectionTestUtils;
97

10-
import java.lang.reflect.Method;
118
import java.util.UUID;
129

13-
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.*;
1411
import static org.mockito.Mockito.*;
1512

1613
class ConsumerServiceTest {
1714

18-
@Mock
1915
private StudyConfigService studyConfigService;
20-
21-
@InjectMocks
16+
private SingleLineDiagramService singleLineDiagramService;
2217
private ConsumerService consumerService;
2318

24-
private Method createGridLayoutFromNadDiagram;
25-
2619
@BeforeEach
27-
void setUp() throws Exception {
28-
MockitoAnnotations.openMocks(this);
29-
createGridLayoutFromNadDiagram = ConsumerService.class
30-
.getDeclaredMethod("createGridLayoutFromNadDiagram", String.class, UserProfileInfos.class);
31-
createGridLayoutFromNadDiagram.setAccessible(true);
20+
void setUp() {
21+
studyConfigService = mock(StudyConfigService.class);
22+
singleLineDiagramService = mock(SingleLineDiagramService.class);
23+
consumerService = new ConsumerService(null, null, null, null, null,
24+
null, null, null, null, null,
25+
studyConfigService, null, null, null, null,
26+
singleLineDiagramService);
3227
}
3328

3429
@Test
35-
void whenProfileHasAssociatedNadConfig() throws Exception {
36-
UUID configId = UUID.randomUUID();
37-
UUID expected = UUID.randomUUID();
38-
UserProfileInfos profile = UserProfileInfos.builder().diagramConfigId(configId).name("name").build();
39-
when(studyConfigService.createGridLayoutFromNadDiagram(configId)).thenReturn(expected);
30+
void createGridLayoutFromNadDiagram() {
31+
UUID diagramConfigId = UUID.randomUUID();
32+
UUID clonedConfigId = UUID.randomUUID();
33+
UUID gridLayoutUuid = UUID.randomUUID();
34+
UserProfileInfos profile = UserProfileInfos.builder().diagramConfigId(diagramConfigId).build();
35+
36+
when(singleLineDiagramService.duplicateNadConfig(diagramConfigId)).thenReturn(clonedConfigId);
37+
when(studyConfigService.createGridLayoutFromNadDiagram(diagramConfigId, clonedConfigId)).thenReturn(gridLayoutUuid);
4038

41-
UUID result = (UUID) createGridLayoutFromNadDiagram.invoke(consumerService, "user", profile);
39+
UUID result = ReflectionTestUtils.invokeMethod(consumerService, "createGridLayoutFromNadDiagram", "user", profile);
4240

43-
assertEquals(expected, result);
44-
verify(studyConfigService).createGridLayoutFromNadDiagram(configId);
41+
assertEquals(gridLayoutUuid, result);
42+
verify(singleLineDiagramService).duplicateNadConfig(diagramConfigId);
43+
verify(studyConfigService).createGridLayoutFromNadDiagram(diagramConfigId, clonedConfigId);
4544
}
4645

4746
@Test
48-
void whenProfileHasNoAssociatedNadConfig() throws Exception {
49-
UUID expected = null;
50-
UserProfileInfos profile = UserProfileInfos.builder().diagramConfigId(null).build();
51-
when(studyConfigService.createGridLayoutFromNadDiagram(null)).thenReturn(expected);
52-
UUID result = (UUID) createGridLayoutFromNadDiagram.invoke(consumerService, "user", profile);
53-
assertEquals(expected, result);
47+
void createGridLayoutFromNadDiagramNoConfig() {
48+
UUID result = ReflectionTestUtils.invokeMethod(consumerService, "createGridLayoutFromNadDiagram", "user", UserProfileInfos.builder().build());
49+
50+
assertNull(result);
51+
verifyNoInteractions(singleLineDiagramService, studyConfigService);
52+
}
53+
54+
@Test
55+
void createGridLayoutFromNadDiagramCloneFailure() {
56+
UUID diagramConfigId = UUID.randomUUID();
57+
UserProfileInfos profile = UserProfileInfos.builder().diagramConfigId(diagramConfigId).build();
58+
when(singleLineDiagramService.duplicateNadConfig(diagramConfigId))
59+
.thenThrow(new RuntimeException("boom"));
60+
61+
UUID result = ReflectionTestUtils.invokeMethod(consumerService, "createGridLayoutFromNadDiagram", "user", profile);
62+
63+
assertNull(result);
64+
verify(singleLineDiagramService).duplicateNadConfig(diagramConfigId);
65+
verifyNoInteractions(studyConfigService);
5466
}
5567
}

0 commit comments

Comments
 (0)