Skip to content

Commit 1b55f69

Browse files
authored
Refactor ES definitions and config for Supervision (#567)
* refactor(): Add ESIndex class to centralize index name definitions, adapt SupervisionController to get ESConfig directly refactor Supervision Endpoints to return PLAIN_TEXT when it's sufficient Signed-off-by: sBouzols <[email protected]>
1 parent 4fbedfc commit 1b55f69

20 files changed

+324
-149
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationParametersInfos;
2323
import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus;
2424
import org.gridsuite.study.server.dto.dynamicsimulation.event.EventInfos;
25+
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
2526
import org.gridsuite.study.server.dto.modification.ModificationType;
2627
import org.gridsuite.study.server.dto.nonevacuatedenergy.NonEvacuatedEnergyParametersInfos;
2728
import org.gridsuite.study.server.dto.sensianalysis.SensitivityAnalysisCsvFileInfos;

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

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
import java.util.UUID;
1919

2020
import org.gridsuite.study.server.dto.ComputationType;
21-
import org.springframework.beans.factory.annotation.Value;
21+
import org.gridsuite.study.server.elasticsearch.EquipmentInfosService;
22+
import org.springframework.data.elasticsearch.client.ClientConfiguration;
2223
import org.springframework.http.MediaType;
2324
import org.springframework.http.ResponseEntity;
2425
import org.springframework.web.bind.annotation.*;
@@ -31,24 +32,19 @@
3132
@Tag(name = "Study server - Supervision")
3233
public class SupervisionController {
3334

34-
// Simple solution to get index name (with the prefix by environment).
35-
// Maybe use the Spring boot actuator or other solution ?
36-
// Keep indexName in sync with the annotation @Document in EquipmentInfos and TombstonedEquipmentInfos
37-
@Value("#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}equipments")
38-
public String indexNameEquipments;
39-
@Value("#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}tombstoned-equipments")
40-
public String indexNameTombstonedEquipments;
41-
42-
@Value("#{@environment.getProperty('spring.data.elasticsearch.host')}" + ":" + "#{@environment.getProperty('spring.data.elasticsearch.port')}")
43-
public String elasticSerachHost;
44-
4535
private final SupervisionService supervisionService;
4636

4737
private final StudyService studyService;
4838

49-
public SupervisionController(SupervisionService supervisionService, StudyService studyService) {
39+
private final EquipmentInfosService equipmentInfosService;
40+
41+
private final ClientConfiguration elasticsearchClientConfiguration;
42+
43+
public SupervisionController(SupervisionService supervisionService, StudyService studyService, EquipmentInfosService equipmentInfosService, ClientConfiguration elasticsearchClientConfiguration) {
5044
this.supervisionService = supervisionService;
5145
this.studyService = studyService;
46+
this.equipmentInfosService = equipmentInfosService;
47+
this.elasticsearchClientConfiguration = elasticsearchClientConfiguration;
5248
}
5349

5450
@DeleteMapping(value = "/computation/results")
@@ -63,42 +59,45 @@ public ResponseEntity<Integer> deleteComputationResults(@Parameter(description =
6359
@Operation(summary = "get the elasticsearch address")
6460
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "the elasticsearch address")})
6561
public ResponseEntity<String> getElasticsearchHost() {
66-
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(elasticSerachHost);
62+
String host = elasticsearchClientConfiguration.getEndpoints().get(0).getHostName()
63+
+ ":"
64+
+ elasticsearchClientConfiguration.getEndpoints().get(0).getPort();
65+
return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(host);
6766
}
6867

69-
@GetMapping(value = "/indexed-equipments-index-name")
68+
@GetMapping(value = "/equipments/index-name")
7069
@Operation(summary = "get the indexed equipments index name")
7170
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Indexed equipments index name")})
7271
public ResponseEntity<String> getIndexedEquipmentsIndexName() {
73-
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(indexNameEquipments);
72+
return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(equipmentInfosService.getEquipmentsIndexName());
7473
}
7574

76-
@GetMapping(value = "/indexed-tombstoned-equipments-index-name")
75+
@GetMapping(value = "/tombstoned-equipments/index-name")
7776
@Operation(summary = "get the indexed tombstoned equipments index name")
7877
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Indexed tombstoned equipments index name")})
7978
public ResponseEntity<String> getIndexedTombstonedEquipmentsIndexName() {
80-
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(indexNameTombstonedEquipments);
79+
return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(equipmentInfosService.getTombstonedEquipmentsIndexName());
8180
}
8281

83-
@GetMapping(value = "/indexed-equipments-count")
82+
@GetMapping(value = "/equipments/indexation-count")
8483
@Operation(summary = "get indexed equipments count for all studies")
8584
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Indexed equipments count")})
86-
public ResponseEntity<Long> getIndexedEquipmentsCount() {
87-
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(supervisionService.getIndexedEquipmentsCount());
85+
public ResponseEntity<String> getIndexedEquipmentsCount() {
86+
return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(Long.toString(supervisionService.getIndexedEquipmentsCount()));
8887
}
8988

90-
@GetMapping(value = "/indexed-tombstoned-equipments-count")
89+
@GetMapping(value = "/tombstoned-equipments/indexation-count")
9190
@Operation(summary = "get indexed tombstoned equipments count for all studies")
9291
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Tombstoned equipments count")})
93-
public ResponseEntity<Long> getIndexedTombstonedEquipmentsCount() {
94-
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(supervisionService.getIndexedTombstonedEquipmentsCount());
92+
public ResponseEntity<String> getIndexedTombstonedEquipmentsCount() {
93+
return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(Long.toString(supervisionService.getIndexedTombstonedEquipmentsCount()));
9594
}
9695

97-
@DeleteMapping(value = "/studies/{studyUuid}/indexed-equipments")
96+
@DeleteMapping(value = "/studies/{studyUuid}/equipments/indexation")
9897
@Operation(summary = "delete indexed equipments and tombstoned equipments for the given study")
9998
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "all indexed equipments and tombstoned equipments for the given study have been deleted")})
100-
public ResponseEntity<Long> deleteStudyIndexedEquipmentsAndTombstoned(@PathVariable("studyUuid") UUID studyUuid) {
101-
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(supervisionService.deleteStudyIndexedEquipmentsAndTombstoned(studyUuid));
99+
public ResponseEntity<String> deleteStudyIndexedEquipmentsAndTombstoned(@PathVariable("studyUuid") UUID studyUuid) {
100+
return ResponseEntity.ok().contentType(MediaType.TEXT_PLAIN).body(Long.toString(supervisionService.deleteStudyIndexedEquipmentsAndTombstoned(studyUuid)));
102101
}
103102

104103
@GetMapping(value = "/orphan_indexed_network_uuids")

src/main/java/org/gridsuite/study/server/dto/CreatedStudyBasicInfos.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import io.swagger.v3.oas.annotations.media.Schema;
1010
import lombok.*;
1111
import lombok.experimental.SuperBuilder;
12+
13+
import org.gridsuite.study.server.elasticsearch.ESConfig;
1214
import org.springframework.data.annotation.TypeAlias;
1315
import org.springframework.data.elasticsearch.annotations.Document;
1416

@@ -24,7 +26,7 @@
2426
@EqualsAndHashCode(callSuper = true)
2527
@ToString(callSuper = true)
2628
@Schema(description = "Basic study attributes after creation succeeded ")
27-
@Document(indexName = "#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}studies")
29+
@Document(indexName = ESConfig.STUDY_INDEX_NAME)
2830
@TypeAlias(value = "StudyInfos")
2931
public class CreatedStudyBasicInfos extends BasicStudyInfos {
3032
String caseFormat;

src/main/java/org/gridsuite/study/server/dto/BasicEquipmentInfos.java renamed to src/main/java/org/gridsuite/study/server/dto/elasticsearch/BasicEquipmentInfos.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
License, v. 2.0. If a copy of the MPL was not distributed with this
55
file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
7-
package org.gridsuite.study.server.dto;
7+
package org.gridsuite.study.server.dto.elasticsearch;
88

99
import io.swagger.v3.oas.annotations.media.Schema;
1010
import lombok.*;

src/main/java/org/gridsuite/study/server/dto/EquipmentInfos.java renamed to src/main/java/org/gridsuite/study/server/dto/elasticsearch/EquipmentInfos.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
License, v. 2.0. If a copy of the MPL was not distributed with this
55
file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
7-
package org.gridsuite.study.server.dto;
7+
package org.gridsuite.study.server.dto.elasticsearch;
88

99
import io.swagger.v3.oas.annotations.media.Schema;
1010
import lombok.*;
1111
import lombok.experimental.SuperBuilder;
12+
13+
import org.gridsuite.study.server.dto.VoltageLevelInfos;
14+
import org.gridsuite.study.server.elasticsearch.ESConfig;
1215
import org.springframework.data.annotation.TypeAlias;
1316
import org.springframework.data.elasticsearch.annotations.Document;
1417
import org.springframework.data.elasticsearch.annotations.Field;
@@ -30,7 +33,7 @@
3033
@EqualsAndHashCode(callSuper = true)
3134
@Schema(description = "Equipment infos")
3235
// Keep indexname in sync with the value in SupervisionController
33-
@Document(indexName = "#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}equipments")
36+
@Document(indexName = ESConfig.EQUIPMENTS_INDEX_NAME)
3437
@Setting(settingPath = "elasticsearch_settings.json")
3538
@TypeAlias(value = "EquipmentInfos")
3639
public class EquipmentInfos extends BasicEquipmentInfos {

src/main/java/org/gridsuite/study/server/dto/TombstonedEquipmentInfos.java renamed to src/main/java/org/gridsuite/study/server/dto/elasticsearch/TombstonedEquipmentInfos.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
License, v. 2.0. If a copy of the MPL was not distributed with this
55
file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
7-
package org.gridsuite.study.server.dto;
7+
package org.gridsuite.study.server.dto.elasticsearch;
88

99
import io.swagger.v3.oas.annotations.media.Schema;
1010
import lombok.*;
1111
import lombok.experimental.SuperBuilder;
12+
13+
import org.gridsuite.study.server.elasticsearch.ESConfig;
1214
import org.springframework.data.annotation.TypeAlias;
1315
import org.springframework.data.elasticsearch.annotations.Document;
1416
import org.springframework.data.elasticsearch.annotations.Setting;
@@ -23,7 +25,7 @@
2325
@EqualsAndHashCode(callSuper = true)
2426
@Schema(description = "Tombstoned equipment infos")
2527
// Keep indexname in sync with the value in SupervisionController
26-
@Document(indexName = "#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}tombstoned-equipments")
28+
@Document(indexName = ESConfig.TOMBSTONED_EQUIPMENTS_INDEX_NAME)
2729
@Setting(settingPath = "elasticsearch_settings.json")
2830
@TypeAlias(value = "TombstonedEquipmentInfos")
2931
public class TombstonedEquipmentInfos extends BasicEquipmentInfos {

src/main/java/org/gridsuite/study/server/elasticsearch/ESConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
@EnableElasticsearchRepositories
2727
public class ESConfig extends ElasticsearchConfiguration {
2828

29+
// It's not simple SPEL but this syntax is managed by both ES and Spring
30+
public static final String STUDY_INDEX_NAME = "#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}studies";
31+
public static final String EQUIPMENTS_INDEX_NAME = "#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}equipments";
32+
public static final String TOMBSTONED_EQUIPMENTS_INDEX_NAME = "#{@environment.getProperty('powsybl-ws.elasticsearch.index.prefix')}tombstoned-equipments";
33+
2934
@Value("#{'${spring.data.elasticsearch.embedded:false}' ? 'localhost' : '${spring.data.elasticsearch.host}'}")
3035
private String esHost;
3136

src/main/java/org/gridsuite/study/server/elasticsearch/EquipmentInfosRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
package org.gridsuite.study.server.elasticsearch;
88

9-
import org.gridsuite.study.server.dto.EquipmentInfos;
9+
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
1010
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
1111
import org.springframework.lang.NonNull;
1212

src/main/java/org/gridsuite/study/server/elasticsearch/EquipmentInfosService.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
import co.elastic.clients.elasticsearch._types.aggregations.*;
1111
import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
1212
import co.elastic.clients.elasticsearch._types.query_dsl.*;
13+
import lombok.Getter;
1314

1415
import com.powsybl.iidm.network.VariantManagerConstants;
1516
import org.apache.commons.lang3.StringUtils;
1617
import org.apache.commons.lang3.tuple.Pair;
17-
import org.gridsuite.study.server.dto.BasicEquipmentInfos;
18-
import org.gridsuite.study.server.dto.EquipmentInfos;
19-
import org.gridsuite.study.server.dto.TombstonedEquipmentInfos;
20-
import org.slf4j.Logger;
21-
import org.slf4j.LoggerFactory;
18+
import org.gridsuite.study.server.dto.elasticsearch.BasicEquipmentInfos;
19+
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
20+
import org.gridsuite.study.server.dto.elasticsearch.TombstonedEquipmentInfos;
21+
import org.springframework.beans.factory.annotation.Value;
2222
import org.springframework.data.domain.PageRequest;
2323
import org.springframework.data.elasticsearch.client.elc.*;
2424
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
@@ -80,7 +80,17 @@ public enum FieldSelector {
8080

8181
private final ElasticsearchOperations elasticsearchOperations;
8282

83-
private static final Logger LOGGER = LoggerFactory.getLogger(EquipmentInfosService.class);
83+
@Value(ESConfig.STUDY_INDEX_NAME)
84+
@Getter
85+
private String studyIndexName;
86+
87+
@Value(ESConfig.EQUIPMENTS_INDEX_NAME)
88+
@Getter
89+
private String equipmentsIndexName;
90+
91+
@Value(ESConfig.TOMBSTONED_EQUIPMENTS_INDEX_NAME)
92+
@Getter
93+
private String tombstonedEquipmentsIndexName;
8494

8595
public EquipmentInfosService(EquipmentInfosRepository equipmentInfosRepository, TombstonedEquipmentInfosRepository tombstonedEquipmentInfosRepository, ElasticsearchOperations elasticsearchOperations) {
8696
this.equipmentInfosRepository = equipmentInfosRepository;

src/main/java/org/gridsuite/study/server/elasticsearch/StudyInfosService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.gridsuite.study.server.elasticsearch;
88

99
import co.elastic.clients.elasticsearch._types.query_dsl.QueryStringQuery;
10+
1011
import org.gridsuite.study.server.dto.CreatedStudyBasicInfos;
1112
import org.springframework.data.elasticsearch.client.elc.NativeQuery;
1213
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;

src/main/java/org/gridsuite/study/server/elasticsearch/TombstonedEquipmentInfosRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
package org.gridsuite.study.server.elasticsearch;
88

9-
import org.gridsuite.study.server.dto.TombstonedEquipmentInfos;
9+
import org.gridsuite.study.server.dto.elasticsearch.TombstonedEquipmentInfos;
1010
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
1111
import org.springframework.lang.NonNull;
1212

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationParametersInfos;
2525
import org.gridsuite.study.server.dto.dynamicsimulation.DynamicSimulationStatus;
2626
import org.gridsuite.study.server.dto.dynamicsimulation.event.EventInfos;
27+
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
2728
import org.gridsuite.study.server.dto.impacts.SimpleElementImpact;
2829
import org.gridsuite.study.server.dto.modification.NetworkModificationResult;
2930
import org.gridsuite.study.server.dto.nonevacuatedenergy.*;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,19 +102,19 @@ public Integer deleteComputationResults(ComputationType computationType, boolean
102102
};
103103
}
104104

105-
public Long getStudyIndexedEquipmentsCount(UUID networkUUID) {
105+
public long getStudyIndexedEquipmentsCount(UUID networkUUID) {
106106
return equipmentInfosService.getEquipmentInfosCount(networkUUID);
107107
}
108108

109-
public Long getStudyIndexedTombstonedEquipmentsCount(UUID networkUUID) {
109+
public long getStudyIndexedTombstonedEquipmentsCount(UUID networkUUID) {
110110
return equipmentInfosService.getTombstonedEquipmentInfosCount(networkUUID);
111111
}
112112

113-
public Long getIndexedEquipmentsCount() {
113+
public long getIndexedEquipmentsCount() {
114114
return equipmentInfosService.getEquipmentInfosCount();
115115
}
116116

117-
public Long getIndexedTombstonedEquipmentsCount() {
117+
public long getIndexedTombstonedEquipmentsCount() {
118118
return equipmentInfosService.getTombstonedEquipmentInfosCount();
119119
}
120120

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717
import com.powsybl.iidm.network.VariantManagerConstants;
1818
import com.powsybl.iidm.serde.XMLImporter;
1919
import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl;
20-
import org.gridsuite.study.server.dto.EquipmentInfos;
21-
import org.gridsuite.study.server.dto.TombstonedEquipmentInfos;
20+
2221
import org.gridsuite.study.server.dto.VoltageLevelInfos;
22+
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
23+
import org.gridsuite.study.server.dto.elasticsearch.TombstonedEquipmentInfos;
2324
import org.gridsuite.study.server.elasticsearch.EquipmentInfosService;
2425
import org.gridsuite.study.server.service.NetworkModificationTreeService;
2526
import org.gridsuite.study.server.service.NetworkService;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
package org.gridsuite.study.server;
88

99
import com.powsybl.iidm.network.VariantManagerConstants;
10-
import org.gridsuite.study.server.dto.EquipmentInfos;
10+
1111
import org.gridsuite.study.server.dto.VoltageLevelInfos;
12+
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
1213
import org.gridsuite.study.server.elasticsearch.EquipmentInfosService;
1314
import org.junit.After;
1415
import org.junit.Test;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.gridsuite.study.server;
88

99
import com.google.common.collect.Iterables;
10+
1011
import org.gridsuite.study.server.dto.CreatedStudyBasicInfos;
1112
import org.gridsuite.study.server.elasticsearch.StudyInfosRepository;
1213
import org.gridsuite.study.server.elasticsearch.StudyInfosService;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
package org.gridsuite.study.server;
88

99
import com.powsybl.iidm.network.VariantManagerConstants;
10-
import org.gridsuite.study.server.dto.EquipmentInfos;
11-
import org.gridsuite.study.server.dto.TombstonedEquipmentInfos;
10+
1211
import org.gridsuite.study.server.dto.VoltageLevelInfos;
12+
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
13+
import org.gridsuite.study.server.dto.elasticsearch.TombstonedEquipmentInfos;
1314
import org.gridsuite.study.server.elasticsearch.EquipmentInfosService;
1415
import org.gridsuite.study.server.service.NetworkModificationTreeService;
1516
import org.gridsuite.study.server.service.NetworkService;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.powsybl.commons.PowsyblException;
1414
import com.powsybl.commons.exceptions.UncheckedInterruptedException;
1515
import com.powsybl.network.store.client.NetworkStoreService;
16+
1617
import org.gridsuite.study.server.dto.BasicStudyInfos;
1718
import org.gridsuite.study.server.notification.NotificationService;
1819
import org.gridsuite.study.server.repository.StudyRepository;

0 commit comments

Comments
 (0)