Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/root-network-creation' into root…
Browse files Browse the repository at this point in the history
…-network-delete
  • Loading branch information
LE SAULNIER Kevin committed Dec 10, 2024
2 parents e06340d + e4cde57 commit 379b6ec
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,17 @@
*/
package org.gridsuite.study.server.dto.caseimport;

import lombok.Getter;

public enum CaseImportAction {
STUDY_CREATION,
ROOT_NETWORK_CREATION,
NETWORK_RECREATION
STUDY_CREATION("Study creation"),
ROOT_NETWORK_CREATION("Root network creation"),
NETWORK_RECREATION("Network recreation");

@Getter
public final String label;

CaseImportAction(String label) {
this.label = label;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings;
import org.gridsuite.study.server.StudyException;
import org.gridsuite.study.server.dto.*;
import org.gridsuite.study.server.dto.caseimport.CaseImportAction;
import org.gridsuite.study.server.dto.caseimport.CaseImportReceiver;
Expand All @@ -20,9 +19,6 @@
import org.gridsuite.study.server.networkmodificationtree.dto.BuildStatus;
import org.gridsuite.study.server.networkmodificationtree.dto.NodeBuildStatus;
import org.gridsuite.study.server.notification.NotificationService;
import org.gridsuite.study.server.repository.StudyEntity;
import org.gridsuite.study.server.repository.StudyRepository;
import org.gridsuite.study.server.repository.rootnetwork.RootNetworkEntity;
import org.gridsuite.study.server.service.dynamicsimulation.DynamicSimulationService;
import org.gridsuite.study.server.service.shortcircuit.ShortCircuitService;
import org.slf4j.Logger;
Expand Down Expand Up @@ -69,10 +65,8 @@ public class ConsumerService {
private final LoadFlowService loadFlowService;
private final UserAdminService userAdminService;
private final NetworkModificationTreeService networkModificationTreeService;
private final StudyRepository studyRepository;
private final ShortCircuitService shortCircuitService;
private final RootNetworkNodeInfoService rootNetworkNodeInfoService;
private final RootNetworkService rootNetworkService;

@Autowired
public ConsumerService(ObjectMapper objectMapper,
Expand All @@ -85,9 +79,7 @@ public ConsumerService(ObjectMapper objectMapper,
UserAdminService userAdminService,
NetworkModificationTreeService networkModificationTreeService,
SensitivityAnalysisService sensitivityAnalysisService,
StudyRepository studyRepository,
RootNetworkNodeInfoService rootNetworkNodeInfoService,
RootNetworkService rootNetworkservice) {
RootNetworkNodeInfoService rootNetworkNodeInfoService) {
this.objectMapper = objectMapper;
this.notificationService = notificationService;
this.studyService = studyService;
Expand All @@ -97,10 +89,8 @@ public ConsumerService(ObjectMapper objectMapper,
this.userAdminService = userAdminService;
this.networkModificationTreeService = networkModificationTreeService;
this.sensitivityAnalysisService = sensitivityAnalysisService;
this.studyRepository = studyRepository;
this.shortCircuitService = shortCircuitService;
this.rootNetworkNodeInfoService = rootNetworkNodeInfoService;
this.rootNetworkService = rootNetworkservice;
}

@Bean
Expand Down Expand Up @@ -211,31 +201,30 @@ public Consumer<Message<String>> consumeCaseImportSucceeded() {

CaseInfos caseInfos = new CaseInfos(caseUuid, caseName, caseFormat);
NetworkInfos networkInfos = new NetworkInfos(networkUuid, networkId);
StudyEntity studyEntity = studyRepository.findWithRootNetworksById(studyUuid).orElse(null);
try {
switch (caseImportAction) {
case STUDY_CREATION ->
insertStudy(studyUuid, userId, networkInfos, caseInfos, importParameters, importReportUuid);
case ROOT_NETWORK_CREATION ->
rootNetworkService.createRootNetworkFromRequest(studyEntity, RootNetworkInfos.builder()
studyService.createRootNetwork(studyUuid, RootNetworkInfos.builder()
.id(rootNetworkUuid)
.caseInfos(caseInfos)
.reportUuid(importReportUuid)
.networkInfos(networkInfos)
.importParameters(importParameters)
.build());
case NETWORK_RECREATION ->
updateRootNetworkNetwork(studyEntity, rootNetworkUuid, userId, networkInfos);
studyService.updateNetwork(studyUuid, rootNetworkUuid, userId, networkInfos);
}
caseService.disableCaseExpiration(caseUuid);
} catch (Exception e) {
LOGGER.error("Error while importing case", e);
} finally {
// if studyEntity is already existing, we don't delete anything in the end of the process
if (studyEntity == null) {
if (caseImportAction == CaseImportAction.STUDY_CREATION) {
studyService.deleteStudyIfNotCreationInProgress(studyUuid, userId);
}
LOGGER.trace("Create study '{}' : {} seconds", studyUuid,
LOGGER.trace(caseImportAction.getLabel() + " for study uuid '{}' : {} seconds", studyUuid,
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime));
}
}
Expand All @@ -252,11 +241,6 @@ private void insertStudy(UUID studyUuid, String userId, NetworkInfos networkInfo
studyService.insertStudy(studyUuid, userId, networkInfos, caseInfos, loadFlowParametersUuid, shortCircuitParametersUuid, DynamicSimulationService.toEntity(dynamicSimulationParameters, objectMapper), null, securityAnalysisParametersUuid, sensitivityAnalysisParametersUuid, importParameters, importReportUuid);
}

private void updateRootNetworkNetwork(StudyEntity studyEntity, UUID rootNetworkUuid, String userId, NetworkInfos networkInfos) {
RootNetworkEntity rootNetworkEntity = rootNetworkService.getRootNetwork(rootNetworkUuid).orElseThrow(() -> new StudyException(StudyException.Type.ROOTNETWORK_NOT_FOUND));
studyService.updateRootNetworkNetwork(studyEntity, rootNetworkEntity, userId, networkInfos);
}

private UserProfileInfos getUserProfile(String userId) {
try {
return userAdminService.getUserProfile(userId).orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ public NetworkConversionService(@Value("${powsybl.services.network-conversion-se
this.restTemplate = restTemplate;
}

/**
* if *variantId* is not null, 2 variant will be created from network-conversion-server
* - one variant for root node - INITIAL_VARIANT
* - one variant cloned from the previous one for the 1st node - *variantId*
*/
public void persistentStore(UUID caseUuid, UUID studyUuid, UUID rootNetworkUuid, String variantId, String userId, UUID importReportUuid, String caseFormat, Map<String, Object> importParameters, CaseImportAction caseImportAction) {
String receiver;
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,27 +81,6 @@ public boolean exists(UUID rootNetworkUuid) {
return rootNetworkRepository.existsById(rootNetworkUuid);
}

/**
* Called by consumer - will create root network only if rootNetworkCreatationRequest is still in database
* Will delete remote resources otherwise
* @param studyEntity
* @param rootNetworkInfos
*/
@Transactional
public void createRootNetworkFromRequest(StudyEntity studyEntity, @NonNull RootNetworkInfos rootNetworkInfos) {
if (studyEntity == null) {
throw new StudyException(StudyException.Type.STUDY_NOT_FOUND);
}
Optional<RootNetworkCreationRequestEntity> rootNetworkCreationRequestEntity = rootNetworkCreationRequestRepository.findById(rootNetworkInfos.getId());
if (rootNetworkCreationRequestEntity.isPresent()) {
self.createRootNetwork(studyEntity, rootNetworkInfos);
rootNetworkCreationRequestRepository.delete(rootNetworkCreationRequestEntity.get());
// TODO: send notification to frontend
} else {
delete(rootNetworkInfos);
}
}

@Transactional
public RootNetworkEntity createRootNetwork(@NonNull StudyEntity studyEntity, @NonNull RootNetworkInfos rootNetworkInfos) {
RootNetworkEntity rootNetworkEntity = rootNetworkRepository.save(rootNetworkInfos.toEntity());
Expand Down Expand Up @@ -145,7 +124,7 @@ public List<RootNetworkInfos> getStudyRootNetworkInfosWithRootNetworkNodeInfos(U
}

@Transactional
public void updateRootNetworkEntityNetwork(RootNetworkEntity rootNetworkEntity, NetworkInfos networkInfos) {
public void updateNetwork(RootNetworkEntity rootNetworkEntity, NetworkInfos networkInfos) {
if (networkInfos != null) {
rootNetworkEntity.setNetworkId(networkInfos.getNetworkId());
rootNetworkEntity.setNetworkUuid(networkInfos.getNetworkUuid());
Expand Down Expand Up @@ -200,7 +179,7 @@ public void delete(UUID rootNetworkUuid) {
delete(rootNetworkRepository.findWithRootNetworkNodeInfosById(rootNetworkUuid).orElseThrow(() -> new StudyException(StudyException.Type.ROOTNETWORK_NOT_FOUND)).toDto());
}

private void delete(RootNetworkInfos rootNetworkInfos) {
public void delete(RootNetworkInfos rootNetworkInfos) {
CompletableFuture<Void> executeInParallel = CompletableFuture.allOf(
getDeleteRootNetworkInfosFutures(List.of(rootNetworkInfos)).toArray(CompletableFuture[]::new)
);
Expand Down Expand Up @@ -230,4 +209,12 @@ public List<CompletableFuture<Void>> getDeleteRootNetworkInfosFutures(List<RootN

return result;
}

public Optional<RootNetworkCreationRequestEntity> getCreationRequest(UUID rootNetworkInCreationUuid) {
return rootNetworkCreationRequestRepository.findById(rootNetworkInCreationUuid);
}

public void deleteCreationRequest(RootNetworkCreationRequestEntity rootNetworkCreationRequestEntity) {
rootNetworkCreationRequestRepository.delete(rootNetworkCreationRequestEntity);
}
}
33 changes: 24 additions & 9 deletions src/main/java/org/gridsuite/study/server/service/StudyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ public BasicStudyInfos createStudy(UUID caseUuid, String userId, UUID studyUuid,
if (duplicateCase) {
caseUuidToUse = caseService.duplicateCase(caseUuid, true);
}
persistentStoreWithNotificationOnError(caseUuidToUse, basicStudyInfos.getId(), null, userId, importReportUuid, caseFormat, importParameters, CaseImportAction.STUDY_CREATION);
persistentStore(caseUuidToUse, basicStudyInfos.getId(), null, NetworkModificationTreeService.FIRST_VARIANT_ID, userId, importReportUuid, caseFormat, importParameters, CaseImportAction.STUDY_CREATION);
} catch (Exception e) {
self.deleteStudyIfNotCreationInProgress(basicStudyInfos.getId(), userId);
throw e;
Expand All @@ -291,10 +291,9 @@ public RootNetworkCreationRequestInfos createRootNetwork(UUID studyUuid, UUID ca

UUID importReportUuid = UUID.randomUUID();
UUID rootNetworkUuid = UUID.randomUUID();
String variantId = UUID.randomUUID().toString();
RootNetworkCreationRequestEntity rootNetworkCreationRequestEntity = rootNetworkService.insertCreationRequest(rootNetworkUuid, studyEntity, userId);
try {
networkConversionService.persistentStore(caseUuid, studyUuid, rootNetworkUuid, variantId, userId, importReportUuid, caseFormat, importParameters, CaseImportAction.ROOT_NETWORK_CREATION);
networkConversionService.persistentStore(caseUuid, studyUuid, rootNetworkUuid, null, userId, importReportUuid, caseFormat, importParameters, CaseImportAction.ROOT_NETWORK_CREATION);
} catch (Exception e) {
//TODO: don't throw another error if deletion fails ?
rootNetworkService.delete(rootNetworkUuid);
Expand All @@ -304,6 +303,19 @@ public RootNetworkCreationRequestInfos createRootNetwork(UUID studyUuid, UUID ca
return rootNetworkCreationRequestEntity.toDto();
}

@Transactional
public void createRootNetwork(@NonNull UUID studyUuid, @NonNull RootNetworkInfos rootNetworkInfos) {
StudyEntity studyEntity = studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND));
Optional<RootNetworkCreationRequestEntity> rootNetworkCreationRequestEntityOpt = rootNetworkService.getCreationRequest(rootNetworkInfos.getId());
if (rootNetworkCreationRequestEntityOpt.isPresent()) {
rootNetworkService.createRootNetwork(studyEntity, rootNetworkInfos);
rootNetworkService.deleteCreationRequest(rootNetworkCreationRequestEntityOpt.get());
// TODO: send notification to frontend
} else {
rootNetworkService.delete(rootNetworkInfos);
}
}

/**
* Recreates study network from <caseUuid> and <importParameters>
* @param caseUuid
Expand Down Expand Up @@ -332,7 +344,7 @@ private void recreateStudyRootNetwork(UUID caseUuid, String userId, UUID studyUu
? new HashMap<>(rootNetworkService.getImportParameters(rootNetworkUuid))
: importParameters;

persistentStoreWithNotificationOnError(caseUuid, studyUuid, rootNetworkUuid, userId, importReportUuid, caseFormat, importParametersToUse, CaseImportAction.NETWORK_RECREATION);
persistentStore(caseUuid, studyUuid, rootNetworkUuid, null, userId, importReportUuid, caseFormat, importParametersToUse, CaseImportAction.NETWORK_RECREATION);
}

public UUID duplicateStudy(UUID sourceStudyUuid, String userId) {
Expand Down Expand Up @@ -491,8 +503,12 @@ public CreatedStudyBasicInfos insertStudy(UUID studyUuid, String userId, Network
return createdStudyBasicInfos;
}

public CreatedStudyBasicInfos updateRootNetworkNetwork(StudyEntity studyEntity, RootNetworkEntity rootNetworkEntity, String userId, NetworkInfos networkInfos) {
rootNetworkService.updateRootNetworkEntityNetwork(rootNetworkEntity, networkInfos);
@Transactional
public CreatedStudyBasicInfos updateNetwork(UUID studyUuid, UUID rootNetworkUuid, String userId, NetworkInfos networkInfos) {
StudyEntity studyEntity = studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND));
RootNetworkEntity rootNetworkEntity = rootNetworkService.getRootNetwork(rootNetworkUuid).orElseThrow(() -> new StudyException(StudyException.Type.ROOTNETWORK_NOT_FOUND));

rootNetworkService.updateNetwork(rootNetworkEntity, networkInfos);

CreatedStudyBasicInfos createdStudyBasicInfos = toCreatedStudyBasicInfos(studyEntity, rootNetworkEntity.getId());
studyInfosService.add(createdStudyBasicInfos);
Expand Down Expand Up @@ -594,10 +610,9 @@ public String getVoltageLevelSvgAndMetadata(String voltageLevelId, DiagramParame
}
}

private void persistentStoreWithNotificationOnError(UUID caseUuid, UUID studyUuid, UUID rootNetworkUuid, String userId, UUID importReportUuid, String caseFormat, Map<String, Object> importParameters, CaseImportAction caseImportAction) {
private void persistentStore(UUID caseUuid, UUID studyUuid, UUID rootNetworkUuid, String variantId, String userId, UUID importReportUuid, String caseFormat, Map<String, Object> importParameters, CaseImportAction caseImportAction) {
try {
//TODO: change variantId
networkConversionService.persistentStore(caseUuid, studyUuid, rootNetworkUuid, NetworkModificationTreeService.FIRST_VARIANT_ID, userId, importReportUuid, caseFormat, importParameters, caseImportAction);
networkConversionService.persistentStore(caseUuid, studyUuid, rootNetworkUuid, variantId, userId, importReportUuid, caseFormat, importParameters, caseImportAction);
} catch (HttpStatusCodeException e) {
throw handleHttpError(e, STUDY_CREATION_FAILED);
}
Expand Down
Loading

0 comments on commit 379b6ec

Please sign in to comment.