Skip to content

Commit 9f3fe7d

Browse files
committed
first version
1 parent 0c8f3ef commit 9f3fe7d

File tree

9 files changed

+200
-3
lines changed

9 files changed

+200
-3
lines changed

src/main/java/org/gridsuite/actions/server/ContingencyListController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,16 @@ public ResponseEntity<Void> modifyIdentifierContingencyList(
149149
}
150150
}
151151

152+
@PostMapping(value = "/filter-based-contingency-lists", consumes = MediaType.APPLICATION_JSON_VALUE)
153+
@Operation(summary = "Create an filter base contingency list")
154+
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The filter based contingency list has been created successfully")})
155+
public ResponseEntity<PersistentContingencyList> createFilterBasedContingencyList(@RequestParam(required = false, value = "id") UUID id,
156+
@RequestBody FilterBasedContingencyList filterBasedContingencyList) {
157+
return ResponseEntity.ok()
158+
.contentType(MediaType.APPLICATION_JSON)
159+
.body(service.createFilterBasedContingencyList(id, filterBasedContingencyList));
160+
}
161+
152162
@PostMapping(value = "/form-contingency-lists", params = "duplicateFrom")
153163
@Operation(summary = "Create a form contingency list from another existing one")
154164
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The form contingency list have been duplicated successfully"),

src/main/java/org/gridsuite/actions/server/ContingencyListService.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl;
2323
import org.gridsuite.actions.server.dto.*;
2424
import org.gridsuite.actions.server.entities.*;
25+
import org.gridsuite.actions.server.repositories.FilterBasedContingencyListRepository;
2526
import org.gridsuite.actions.server.repositories.FormContingencyListRepository;
2627
import org.gridsuite.actions.server.repositories.IdBasedContingencyListRepository;
2728
import org.gridsuite.actions.server.utils.ContingencyListType;
@@ -49,16 +50,20 @@ public class ContingencyListService {
4950

5051
private final IdBasedContingencyListRepository idBasedContingencyListRepository;
5152

53+
private final FilterBasedContingencyListRepository filterBasedContingencyListRepository;
54+
5255
private final NetworkStoreService networkStoreService;
5356

5457
private final NotificationService notificationService;
5558

5659
public ContingencyListService(FormContingencyListRepository formContingencyListRepository,
5760
IdBasedContingencyListRepository idBasedContingencyListRepository,
61+
FilterBasedContingencyListRepository filterBasedContingencyListRepository,
5862
NetworkStoreService networkStoreService,
5963
NotificationService notificationService) {
6064
this.formContingencyListRepository = formContingencyListRepository;
6165
this.idBasedContingencyListRepository = idBasedContingencyListRepository;
66+
this.filterBasedContingencyListRepository = filterBasedContingencyListRepository;
6267
this.networkStoreService = networkStoreService;
6368
this.notificationService = notificationService;
6469
}
@@ -79,7 +84,9 @@ List<ContingencyListMetadata> getContingencyListsMetadata() {
7984
formContingencyListRepository.findAll().stream().map(formContingencyListEntity ->
8085
fromContingencyListEntity(formContingencyListEntity, ContingencyListType.FORM)),
8186
idBasedContingencyListRepository.findAll().stream().map(idBasedContingencyListEntity ->
82-
fromContingencyListEntity(idBasedContingencyListEntity, ContingencyListType.IDENTIFIERS))
87+
fromContingencyListEntity(idBasedContingencyListEntity, ContingencyListType.IDENTIFIERS)),
88+
filterBasedContingencyListRepository.findAll().stream().map(filterBasedContingencyListEntity ->
89+
fromContingencyListEntity(filterBasedContingencyListEntity, ContingencyListType.FILTERS))
8390
).flatMap(Function.identity()).collect(Collectors.toList());
8491
}
8592

@@ -88,7 +95,9 @@ List<ContingencyListMetadata> getContingencyListsMetadata(List<UUID> ids) {
8895
formContingencyListRepository.findAllById(ids).stream().map(formContingencyListEntity ->
8996
fromContingencyListEntity(formContingencyListEntity, ContingencyListType.FORM)),
9097
idBasedContingencyListRepository.findAllById(ids).stream().map(idBasedContingencyListEntity ->
91-
fromContingencyListEntity(idBasedContingencyListEntity, ContingencyListType.IDENTIFIERS))
98+
fromContingencyListEntity(idBasedContingencyListEntity, ContingencyListType.IDENTIFIERS)),
99+
filterBasedContingencyListRepository.findAllById(ids).stream().map(filterBasedContingencyListEntity ->
100+
fromContingencyListEntity(filterBasedContingencyListEntity, ContingencyListType.FILTERS))
92101
).flatMap(Function.identity()).collect(Collectors.toList());
93102
}
94103

@@ -317,12 +326,24 @@ private static IdBasedContingencyList fromIdBasedContingencyListEntity(IdBasedCo
317326
notFoundElements);
318327
}
319328

329+
private static FilterBasedContingencyList fromFilterBasedContingencyListEntity(FilterBasedContingencyListEntity entity) {
330+
List<UUID> filterList = new ArrayList<>();
331+
entity.getFiltersListEntities().forEach(f -> filterList.add(f.getId()));
332+
return new FilterBasedContingencyList(entity.getId(), entity.getModificationDate(), filterList);
333+
}
334+
320335
public IdBasedContingencyList createIdBasedContingencyList(UUID id, IdBasedContingencyList idBasedContingencyList) {
321336
IdBasedContingencyListEntity entity = new IdBasedContingencyListEntity(idBasedContingencyList);
322337
entity.setId(id == null ? UUID.randomUUID() : id);
323338
return fromIdBasedContingencyListEntity(idBasedContingencyListRepository.save(entity), null);
324339
}
325340

341+
public FilterBasedContingencyList createFilterBasedContingencyList(UUID id, FilterBasedContingencyList contingencyList) {
342+
FilterBasedContingencyListEntity entity = new FilterBasedContingencyListEntity(contingencyList);
343+
entity.setId(id == null ? UUID.randomUUID() : id);
344+
return fromFilterBasedContingencyListEntity(filterBasedContingencyListRepository.save(entity));
345+
}
346+
326347
public ResponseStatusException createNotFoundException(String resourceId, String resourceType) {
327348
return new ResponseStatusException(HttpStatus.NOT_FOUND, String.format("%s %s not found", resourceType, resourceId));
328349
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.actions.server.dto;
8+
9+
import com.powsybl.contingency.contingency.list.ContingencyList;
10+
import com.powsybl.iidm.network.Network;
11+
import io.swagger.v3.oas.annotations.media.Schema;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
import org.gridsuite.actions.server.utils.ContingencyListType;
15+
16+
import java.time.Instant;
17+
import java.util.List;
18+
import java.util.Map;
19+
import java.util.Set;
20+
import java.util.UUID;
21+
22+
@Getter
23+
@NoArgsConstructor
24+
@Schema(description = "filter based contingency list")
25+
public class FilterBasedContingencyList extends AbstractContingencyList {
26+
27+
@Schema(description = "filter list")
28+
private List<UUID> filterList;
29+
30+
public FilterBasedContingencyList(UUID uuid, Instant date, List<UUID> filterList) {
31+
super(new ContingencyListMetadataImpl(uuid, ContingencyListType.FILTERS, date));
32+
this.filterList = filterList;
33+
}
34+
35+
@Override
36+
public ContingencyList toPowsyblContingencyList(Network network) {
37+
return null;
38+
}
39+
40+
@Override
41+
public Map<String, Set<String>> getNotFoundElements(Network network) {
42+
return Map.of();
43+
}
44+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.actions.server.entities;
8+
9+
import jakarta.persistence.CascadeType;
10+
import jakarta.persistence.Entity;
11+
import jakarta.persistence.OneToMany;
12+
import jakarta.persistence.Table;
13+
import lombok.Getter;
14+
import lombok.NoArgsConstructor;
15+
import lombok.Setter;
16+
import org.gridsuite.actions.server.dto.FilterBasedContingencyList;
17+
import org.springframework.util.CollectionUtils;
18+
19+
import java.util.ArrayList;
20+
import java.util.List;
21+
22+
@NoArgsConstructor
23+
@Getter
24+
@Setter
25+
@Entity
26+
@Table(name = "filter_based_contingency_list")
27+
public class FilterBasedContingencyListEntity extends AbstractContingencyEntity {
28+
29+
@OneToMany(cascade = CascadeType.ALL)
30+
private List<FilterEntity> filtersListEntities;
31+
32+
public FilterBasedContingencyListEntity(FilterBasedContingencyList contingencyList) {
33+
super();
34+
if (CollectionUtils.isEmpty(contingencyList.getFilterList())) {
35+
return;
36+
}
37+
filtersListEntities = new ArrayList<>();
38+
contingencyList.getFilterList().forEach(f -> filtersListEntities.add(new FilterEntity(f)));
39+
}
40+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.gridsuite.actions.server.entities;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.Id;
6+
import jakarta.persistence.Table;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
import lombok.Setter;
11+
12+
import java.util.UUID;
13+
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@Getter
17+
@Setter
18+
@Entity
19+
@Table(name = "filter")
20+
public class FilterEntity {
21+
@Id
22+
@Column(name = "id")
23+
private UUID id;
24+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.actions.server.repositories;
8+
9+
import org.gridsuite.actions.server.entities.FilterBasedContingencyListEntity;
10+
import org.springframework.data.jpa.repository.JpaRepository;
11+
import org.springframework.stereotype.Repository;
12+
13+
import java.util.UUID;
14+
15+
@Repository
16+
public interface FilterBasedContingencyListRepository extends JpaRepository<FilterBasedContingencyListEntity, UUID> {
17+
}

src/main/java/org/gridsuite/actions/server/utils/ContingencyListType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212

1313
public enum ContingencyListType {
1414
FORM,
15-
IDENTIFIERS
15+
IDENTIFIERS,
16+
FILTERS
1617
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
2+
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
3+
<changeSet author="elcheikhbas (generated)" id="1756734757338-7">
4+
<createTable tableName="filter">
5+
<column name="id" type="UUID">
6+
<constraints nullable="false" primaryKey="true" primaryKeyName="filterPK"/>
7+
</column>
8+
</createTable>
9+
</changeSet>
10+
<changeSet author="elcheikhbas (generated)" id="1756734757338-8">
11+
<createTable tableName="filter_based_contingency_list">
12+
<column name="id" type="UUID">
13+
<constraints nullable="false" primaryKey="true" primaryKeyName="filter_based_contingency_listPK"/>
14+
</column>
15+
<column name="modification_date" type="TIMESTAMPTZ"/>
16+
</createTable>
17+
</changeSet>
18+
<changeSet author="elcheikhbas (generated)" id="1756734757338-9">
19+
<createTable tableName="filter_based_contingency_list_filters_list_entities">
20+
<column name="filter_based_contingency_list_entity_id" type="UUID">
21+
<constraints nullable="false"/>
22+
</column>
23+
<column name="filters_list_entities_id" type="UUID">
24+
<constraints nullable="false"/>
25+
</column>
26+
</createTable>
27+
</changeSet>
28+
<changeSet author="elcheikhbas (generated)" id="1756734757338-10">
29+
<addUniqueConstraint columnNames="filters_list_entities_id" constraintName="UC_FILTER_BASED_CONTINGENCY_LIST_FILTERS_LIST_ENTITIESFILTERS_L" tableName="filter_based_contingency_list_filters_list_entities"/>
30+
</changeSet>
31+
<changeSet author="elcheikhbas (generated)" id="1756734757338-14">
32+
<addForeignKeyConstraint baseColumnNames="filter_based_contingency_list_entity_id" baseTableName="filter_based_contingency_list_filters_list_entities" constraintName="FK9edqyxdc33w1i725puwjjfhf5" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="filter_based_contingency_list" validate="true"/>
33+
</changeSet>
34+
<changeSet author="elcheikhbas (generated)" id="1756734757338-15">
35+
<addForeignKeyConstraint baseColumnNames="filters_list_entities_id" baseTableName="filter_based_contingency_list_filters_list_entities" constraintName="FKgvj11ba8of2teiuumbgfho6c8" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="filter" validate="true"/>
36+
</changeSet>
37+
</databaseChangeLog>

src/main/resources/db/changelog/db.changelog-master.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,6 @@ databaseChangeLog:
4040
file: changesets/changelog_20250704T094426Z.xml
4141
relativeToChangelogFile: true
4242

43+
- include:
44+
file: changesets/changelog_20250901T135222Z.xml
45+
relativeToChangelogFile: true

0 commit comments

Comments
 (0)