-
Notifications
You must be signed in to change notification settings - Fork 1
Implement Strategy Design Pattern for process configs #95
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
885de80
8defaed
752ca97
16d54de
bd760ea
e572b18
61d17d8
715a1d5
7673e6d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -29,4 +29,6 @@ public interface ProcessConfig { | |
| ProcessType processType(); | ||
|
|
||
| List<UUID> modificationUuids(); | ||
|
|
||
| List<ProcessConfigFieldComparison> compareWith(ProcessConfig other); | ||
|
Comment on lines
+32
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win Make the Both current implementations dereference 🤖 Prompt for AI Agents |
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,105 @@ | ||
| /* | ||
| * Copyright (c) 2026, RTE (http://www.rte-france.com) | ||
| * This Source Code Form is subject to the terms of the Mozilla Public | ||
| * License, v. 2.0. If a copy of the MPL was not distributed with this | ||
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
| */ | ||
| package org.gridsuite.monitor.commons.types.processconfig; | ||
|
|
||
| import org.junit.jupiter.api.Test; | ||
|
|
||
| import java.util.List; | ||
| import java.util.UUID; | ||
|
|
||
| import static org.assertj.core.api.Assertions.assertThat; | ||
| import static org.assertj.core.api.Assertions.assertThatThrownBy; | ||
|
|
||
| /** | ||
| * @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>} | ||
| */ | ||
| class LoadFlowConfigTest { | ||
| @Test | ||
| void compareWithShouldReturnNoDifferenceWhenConfigsAreEqual() { | ||
| LoadFlowConfig processConfig = new LoadFlowConfig(UUID.randomUUID(), List.of(UUID.randomUUID())); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig.compareWith(processConfig); | ||
|
|
||
| assertThat(result) | ||
| .hasSize(2) | ||
| .allMatch(ProcessConfigFieldComparison::identical) | ||
| .allMatch(fieldComparison -> fieldComparison.value1().equals(fieldComparison.value2())); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldReturnDifferentModificationsWhenModificationsAreDifferent() { | ||
| UUID loadflowParametersUuid = UUID.randomUUID(); | ||
| List<UUID> modificationUuids1 = List.of(UUID.randomUUID(), UUID.randomUUID()); | ||
| List<UUID> modificationUuids2 = List.of(UUID.randomUUID(), UUID.randomUUID()); | ||
|
|
||
| LoadFlowConfig processConfig1 = new LoadFlowConfig(loadflowParametersUuid, modificationUuids1); | ||
| LoadFlowConfig processConfig2 = new LoadFlowConfig(loadflowParametersUuid, modificationUuids2); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig1.compareWith(processConfig2); | ||
|
|
||
| assertThat(result).hasSize(2); | ||
| ProcessConfigFieldComparison comparison = result.stream() | ||
| .filter(d -> "modifications".equals(d.field())) | ||
| .findFirst() | ||
| .orElseThrow(); | ||
| assertThat(comparison.identical()).isFalse(); | ||
| assertThat(comparison.value1()).isEqualTo(modificationUuids1); | ||
| assertThat(comparison.value2()).isEqualTo(modificationUuids2); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldDetectOrderDifferenceInModifications() { | ||
| UUID loadflowParametersUuid = UUID.randomUUID(); | ||
| UUID mod1 = UUID.randomUUID(); | ||
| UUID mod2 = UUID.randomUUID(); | ||
| List<UUID> modificationUuids1 = List.of(mod1, mod2); | ||
| List<UUID> modificationUuids2 = List.of(mod2, mod1); // Different order | ||
|
|
||
| LoadFlowConfig processConfig1 = new LoadFlowConfig(loadflowParametersUuid, modificationUuids1); | ||
| LoadFlowConfig processConfig2 = new LoadFlowConfig(loadflowParametersUuid, modificationUuids2); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig1.compareWith(processConfig2); | ||
|
|
||
| assertThat(result).hasSize(2); | ||
| ProcessConfigFieldComparison comparison = result.stream() | ||
| .filter(d -> "modifications".equals(d.field())) | ||
| .findFirst() | ||
| .orElseThrow(); | ||
| assertThat(comparison.identical()).isFalse(); | ||
| assertThat(comparison.value1()).isEqualTo(modificationUuids1); | ||
| assertThat(comparison.value2()).isEqualTo(modificationUuids2); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldReturnDifferencesWhenParametersAreDifferent() { | ||
| UUID loadflowParametersUuid1 = UUID.randomUUID(); | ||
| UUID loadflowParametersUuid2 = UUID.randomUUID(); | ||
| List<UUID> modificationUuids = List.of(UUID.randomUUID(), UUID.randomUUID()); | ||
|
|
||
| LoadFlowConfig processConfig1 = new LoadFlowConfig(loadflowParametersUuid1, modificationUuids); | ||
| LoadFlowConfig processConfig2 = new LoadFlowConfig(loadflowParametersUuid2, modificationUuids); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig1.compareWith(processConfig2); | ||
|
|
||
| assertThat(result).hasSize(2); | ||
| ProcessConfigFieldComparison comparison = result.stream() | ||
| .filter(d -> "loadflowParameters".equals(d.field())) | ||
| .findFirst() | ||
| .orElseThrow(); | ||
| assertThat(comparison.identical()).isFalse(); | ||
| assertThat(comparison.value1()).isEqualTo(loadflowParametersUuid1); | ||
| assertThat(comparison.value2()).isEqualTo(loadflowParametersUuid2); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldThrowWhenProcessTypesAreDifferent() { | ||
| LoadFlowConfig loadFlowConfig = new LoadFlowConfig(UUID.randomUUID(), List.of(UUID.randomUUID())); | ||
| SecurityAnalysisConfig securityAnalysisConfig = new SecurityAnalysisConfig(UUID.randomUUID(), List.of(UUID.randomUUID()), UUID.randomUUID()); | ||
|
|
||
| assertThatThrownBy(() -> loadFlowConfig.compareWith(securityAnalysisConfig)).isInstanceOf(ClassCastException.class); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,130 @@ | ||
| /* | ||
| * Copyright (c) 2026, RTE (http://www.rte-france.com) | ||
| * This Source Code Form is subject to the terms of the Mozilla Public | ||
| * License, v. 2.0. If a copy of the MPL was not distributed with this | ||
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
| */ | ||
| package org.gridsuite.monitor.commons.types.processconfig; | ||
|
|
||
| import org.junit.jupiter.api.Test; | ||
|
|
||
| import java.util.List; | ||
| import java.util.UUID; | ||
|
|
||
| import static org.assertj.core.api.Assertions.assertThat; | ||
| import static org.assertj.core.api.Assertions.assertThatThrownBy; | ||
|
|
||
| /** | ||
| * @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>} | ||
| */ | ||
| class SecurityAnalysisConfigTest { | ||
| @Test | ||
| void compareWithShouldReturnNoDifferenceWhenConfigsAreEqual() { | ||
| SecurityAnalysisConfig securityAnalysisConfig = new SecurityAnalysisConfig(UUID.randomUUID(), List.of(UUID.randomUUID()), UUID.randomUUID()); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = securityAnalysisConfig.compareWith(securityAnalysisConfig); | ||
|
|
||
| assertThat(result) | ||
| .hasSize(3) | ||
| .allMatch(ProcessConfigFieldComparison::identical) | ||
| .allMatch(fieldComparison -> fieldComparison.value1().equals(fieldComparison.value2())); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldReturnDifferentModificationsWhenModificationsAreDifferent() { | ||
| UUID securityAnalysisParametersUuid = UUID.randomUUID(); | ||
| List<UUID> modificationUuids1 = List.of(UUID.randomUUID(), UUID.randomUUID()); | ||
| List<UUID> modificationUuids2 = List.of(UUID.randomUUID(), UUID.randomUUID()); | ||
| UUID loadflowParametersUuid = UUID.randomUUID(); | ||
|
|
||
| SecurityAnalysisConfig processConfig1 = new SecurityAnalysisConfig(securityAnalysisParametersUuid, modificationUuids1, loadflowParametersUuid); | ||
| SecurityAnalysisConfig processConfig2 = new SecurityAnalysisConfig(securityAnalysisParametersUuid, modificationUuids2, loadflowParametersUuid); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig1.compareWith(processConfig2); | ||
|
|
||
| assertThat(result).hasSize(3); | ||
| ProcessConfigFieldComparison comparison = result.stream() | ||
| .filter(d -> "modifications".equals(d.field())) | ||
| .findFirst() | ||
| .orElseThrow(); | ||
| assertThat(comparison.identical()).isFalse(); | ||
| assertThat(comparison.value1()).isEqualTo(modificationUuids1); | ||
| assertThat(comparison.value2()).isEqualTo(modificationUuids2); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldDetectOrderDifferenceInModifications() { | ||
| UUID securityAnalysisParametersUuid = UUID.randomUUID(); | ||
| UUID mod1 = UUID.randomUUID(); | ||
| UUID mod2 = UUID.randomUUID(); | ||
| List<UUID> modificationUuids1 = List.of(mod1, mod2); | ||
| List<UUID> modificationUuids2 = List.of(mod2, mod1); // Different order | ||
| UUID loadflowParametersUuid = UUID.randomUUID(); | ||
|
|
||
| SecurityAnalysisConfig processConfig1 = new SecurityAnalysisConfig(securityAnalysisParametersUuid, modificationUuids1, loadflowParametersUuid); | ||
| SecurityAnalysisConfig processConfig2 = new SecurityAnalysisConfig(securityAnalysisParametersUuid, modificationUuids2, loadflowParametersUuid); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig1.compareWith(processConfig2); | ||
|
|
||
| assertThat(result).hasSize(3); | ||
| ProcessConfigFieldComparison comparison = result.stream() | ||
| .filter(d -> "modifications".equals(d.field())) | ||
| .findFirst() | ||
| .orElseThrow(); | ||
| assertThat(comparison.identical()).isFalse(); | ||
| assertThat(comparison.value1()).isEqualTo(modificationUuids1); | ||
| assertThat(comparison.value2()).isEqualTo(modificationUuids2); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldReturnDifferencesWhenSecurityAnalysisParametersAreDifferent() { | ||
| UUID securityAnalysisParametersUuid1 = UUID.randomUUID(); | ||
| UUID securityAnalysisParametersUuid2 = UUID.randomUUID(); | ||
| List<UUID> modificationUuids = List.of(UUID.randomUUID(), UUID.randomUUID()); | ||
| UUID loadflowParametersUuid = UUID.randomUUID(); | ||
|
|
||
| SecurityAnalysisConfig processConfig1 = new SecurityAnalysisConfig(securityAnalysisParametersUuid1, modificationUuids, loadflowParametersUuid); | ||
| SecurityAnalysisConfig processConfig2 = new SecurityAnalysisConfig(securityAnalysisParametersUuid2, modificationUuids, loadflowParametersUuid); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig1.compareWith(processConfig2); | ||
|
|
||
| assertThat(result).hasSize(3); | ||
| ProcessConfigFieldComparison comparison = result.stream() | ||
| .filter(d -> "securityAnalysisParameters".equals(d.field())) | ||
| .findFirst() | ||
| .orElseThrow(); | ||
| assertThat(comparison.identical()).isFalse(); | ||
| assertThat(comparison.value1()).isEqualTo(securityAnalysisParametersUuid1); | ||
| assertThat(comparison.value2()).isEqualTo(securityAnalysisParametersUuid2); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldReturnDifferencesWhenLoadflowParametersAreDifferent() { | ||
| UUID securityAnalysisParametersUuid = UUID.randomUUID(); | ||
| List<UUID> modificationUuids = List.of(UUID.randomUUID(), UUID.randomUUID()); | ||
| UUID loadflowParametersUuid1 = UUID.randomUUID(); | ||
| UUID loadflowParametersUuid2 = UUID.randomUUID(); | ||
|
|
||
| SecurityAnalysisConfig processConfig1 = new SecurityAnalysisConfig(securityAnalysisParametersUuid, modificationUuids, loadflowParametersUuid1); | ||
| SecurityAnalysisConfig processConfig2 = new SecurityAnalysisConfig(securityAnalysisParametersUuid, modificationUuids, loadflowParametersUuid2); | ||
|
|
||
| List<ProcessConfigFieldComparison> result = processConfig1.compareWith(processConfig2); | ||
|
|
||
| assertThat(result).hasSize(3); | ||
| ProcessConfigFieldComparison comparison = result.stream() | ||
| .filter(d -> "loadflowParameters".equals(d.field())) | ||
| .findFirst() | ||
| .orElseThrow(); | ||
| assertThat(comparison.identical()).isFalse(); | ||
| assertThat(comparison.value1()).isEqualTo(loadflowParametersUuid1); | ||
| assertThat(comparison.value2()).isEqualTo(loadflowParametersUuid2); | ||
| } | ||
|
|
||
| @Test | ||
| void compareWithShouldThrowWhenProcessTypesAreDifferent() { | ||
| SecurityAnalysisConfig securityAnalysisConfig = new SecurityAnalysisConfig(UUID.randomUUID(), List.of(UUID.randomUUID()), UUID.randomUUID()); | ||
| LoadFlowConfig loadFlowConfig = new LoadFlowConfig(UUID.randomUUID(), List.of(UUID.randomUUID())); | ||
|
|
||
| assertThatThrownBy(() -> securityAnalysisConfig.compareWith(loadFlowConfig)).isInstanceOf(ClassCastException.class); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -134,7 +134,11 @@ public ResponseEntity<ProcessConfigComparison> compareProcessConfigs( | |
| @Parameter(description = "First process config UUID") @RequestParam("uuid1") UUID uuid1, | ||
| @Parameter(description = "Second process config UUID") @RequestParam("uuid2") UUID uuid2) { | ||
|
|
||
| Optional<ProcessConfigComparison> comparison = processConfigService.compareProcessConfigs(uuid1, uuid2); | ||
| return comparison.map(c -> ResponseEntity.status(HttpStatus.OK).body(c)).orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build()); | ||
| try { | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. keep exisitig |
||
| Optional<ProcessConfigComparison> comparison = processConfigService.compareProcessConfigs(uuid1, uuid2); | ||
| return comparison.map(c -> ResponseEntity.status(HttpStatus.OK).body(c)).orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build()); | ||
| } catch (ClassCastException e) { | ||
| return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); | ||
| } | ||
|
Comment on lines
+137
to
+142
|
||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| /* | ||
| * Copyright (c) 2026, RTE (http://www.rte-france.com) | ||
| * This Source Code Form is subject to the terms of the Mozilla Public | ||
| * License, v. 2.0. If a copy of the MPL was not distributed with this | ||
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
| */ | ||
| package org.gridsuite.monitor.server.mappers.processconfig; | ||
|
|
||
| import org.gridsuite.monitor.commons.types.processconfig.ProcessConfig; | ||
| import org.gridsuite.monitor.server.entities.processconfig.ProcessConfigEntity; | ||
|
|
||
| /** | ||
| * @author Caroline Jeandat {@literal <caroline.jeandat at rte-france.com>} | ||
| */ | ||
| public interface ProcessConfigMapper<C extends ProcessConfig, E extends ProcessConfigEntity> { | ||
| E toEntity(C dto); | ||
|
|
||
| C toDto(E entity); | ||
|
|
||
| void updateEntityFromDto(C dto, E entity); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
?