Skip to content

Commit d1e825c

Browse files
committed
add method to get optional property from an optional module
Signed-off-by: Samir Romdhani <[email protected]> WIP WIP add methods to get optional property from an optional module Signed-off-by: Samir Romdhani <[email protected]> use default value for both module and property Signed-off-by: Samir Romdhani <[email protected]> add tests Signed-off-by: Samir Romdhani <[email protected]> sonar checks Signed-off-by: Samir Romdhani <[email protected]>
1 parent 8462d87 commit d1e825c

File tree

8 files changed

+161
-29
lines changed

8 files changed

+161
-29
lines changed

commons/src/main/java/com/powsybl/commons/config/ModuleConfigUtil.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.powsybl.commons.config;
99

1010
import java.util.*;
11+
import java.util.function.BiFunction;
1112
import java.util.function.Function;
1213
import java.util.function.Predicate;
1314
import java.util.function.Supplier;
@@ -20,38 +21,43 @@ public final class ModuleConfigUtil {
2021
private ModuleConfigUtil() {
2122
}
2223

23-
public static Optional<Boolean> getOptionalBooleanProperty(ModuleConfig moduleConfig, List<String> names) {
24-
return getOptionalProperty(moduleConfig, names, moduleConfig::getOptionalBooleanProperty);
24+
public static Optional<Boolean> getOptionalBooleanProperty(ModuleConfig moduleConfig, List<String> propertyNames) {
25+
return getOptionalProperty(moduleConfig, propertyNames, moduleConfig::getOptionalBooleanProperty);
2526
}
2627

27-
public static Optional<String> getOptionalStringProperty(ModuleConfig moduleConfig, List<String> names) {
28-
return getOptionalProperty(moduleConfig, names, moduleConfig::getOptionalStringProperty);
28+
public static Optional<String> getOptionalStringProperty(ModuleConfig moduleConfig, List<String> propertyNames) {
29+
return getOptionalProperty(moduleConfig, propertyNames, moduleConfig::getOptionalStringProperty);
2930
}
3031

31-
public static Optional<List<String>> getOptionalStringListProperty(ModuleConfig moduleConfig, List<String> names) {
32-
return getOptionalProperty(moduleConfig, names, moduleConfig::getOptionalStringListProperty);
32+
public static Optional<List<String>> getOptionalStringListProperty(ModuleConfig moduleConfig, List<String> propertyNames) {
33+
return getOptionalProperty(moduleConfig, propertyNames, moduleConfig::getOptionalStringListProperty);
3334
}
3435

35-
public static OptionalDouble getOptionalDoubleProperty(ModuleConfig moduleConfig, List<String> names) {
36-
return getOptionalProperty(moduleConfig, names, moduleConfig::getOptionalDoubleProperty, OptionalDouble::empty, OptionalDouble::isPresent);
36+
public static OptionalDouble getOptionalDoubleProperty(ModuleConfig moduleConfig, List<String> propertyNames) {
37+
return getOptionalProperty(moduleConfig, propertyNames, moduleConfig::getOptionalDoubleProperty, OptionalDouble::empty, OptionalDouble::isPresent);
3738
}
3839

39-
public static OptionalInt getOptionalIntProperty(ModuleConfig moduleConfig, List<String> names) {
40-
return getOptionalProperty(moduleConfig, names, moduleConfig::getOptionalIntProperty, OptionalInt::empty, OptionalInt::isPresent);
40+
public static OptionalInt getOptionalIntProperty(ModuleConfig moduleConfig, List<String> propertyNames) {
41+
return getOptionalProperty(moduleConfig, propertyNames, moduleConfig::getOptionalIntProperty, OptionalInt::empty, OptionalInt::isPresent);
4142
}
4243

43-
private static <T> Optional<T> getOptionalProperty(ModuleConfig moduleConfig, List<String> names, Function<String, Optional<T>> supplier) {
44-
return getOptionalProperty(moduleConfig, names, supplier, Optional::empty, Optional::isPresent);
44+
private static <T> Optional<T> getOptionalProperty(ModuleConfig moduleConfig, List<String> propertyNames, Function<String, Optional<T>> supplier) {
45+
return getOptionalProperty(moduleConfig, propertyNames, supplier, Optional::empty, Optional::isPresent);
4546
}
4647

47-
private static <T> T getOptionalProperty(ModuleConfig moduleConfig, List<String> names, Function<String, T> supplier, Supplier<T> factory, Predicate<T> isPresent) {
48+
private static <T> T getOptionalProperty(ModuleConfig moduleConfig, List<String> propertyNames, Function<String, T> supplier, Supplier<T> factory, Predicate<T> isPresent) {
4849
Objects.requireNonNull(moduleConfig);
49-
Objects.requireNonNull(names);
50+
Objects.requireNonNull(propertyNames);
5051
T res = factory.get();
51-
Iterator<String> it = names.iterator();
52+
Iterator<String> it = propertyNames.iterator();
5253
while (!isPresent.test(res) && it.hasNext()) {
5354
res = supplier.apply(it.next());
5455
}
5556
return res;
5657
}
58+
59+
public static <T> T getProperty(ModuleConfig moduleConfig, String propertyName, T defaultValue, BiFunction<ModuleConfig, String, Optional<T>> function) {
60+
return function.apply(moduleConfig, propertyName).orElse(defaultValue);
61+
}
62+
5763
}

commons/src/main/java/com/powsybl/commons/config/PlatformConfig.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.ServiceLoader;
2222
import java.util.function.Supplier;
2323

24+
import static com.powsybl.commons.config.ModuleConfigUtil.getProperty;
25+
2426
/**
2527
*
2628
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
@@ -97,6 +99,30 @@ public Optional<ModuleConfig> getOptionalModuleConfig(String name) {
9799
return getRepository().getModuleConfig(name);
98100
}
99101

102+
public Integer getIntProperty(String moduleName, String propertyName, int defaultValue) {
103+
return getOptionalModuleConfig(moduleName)
104+
.map(moduleConfig -> moduleConfig.getIntProperty(propertyName, defaultValue))
105+
.orElse(defaultValue);
106+
}
107+
108+
public String getStringProperty(String moduleName, String propertyName, String defaultValue) {
109+
return getOptionalModuleConfig(moduleName)
110+
.map(moduleConfig -> getProperty(moduleConfig, propertyName, defaultValue, ModuleConfig::getOptionalStringProperty))
111+
.orElse(defaultValue);
112+
}
113+
114+
public Boolean getBooleanProperty(String moduleName, String propertyName, boolean defaultValue) {
115+
return getOptionalModuleConfig(moduleName)
116+
.map(moduleConfig -> getProperty(moduleConfig, propertyName, defaultValue, ModuleConfig::getOptionalBooleanProperty))
117+
.orElse(defaultValue);
118+
}
119+
120+
public <E extends Enum<E>> E getEnumProperty(String moduleName, String propertyName, E defaultValue, Class<E> clazz) {
121+
return getOptionalModuleConfig(moduleName)
122+
.map(moduleConfig -> moduleConfig.getEnumProperty(propertyName, clazz, defaultValue))
123+
.orElse(defaultValue);
124+
}
125+
100126
private static final class EmptyModuleConfigRepository implements ModuleConfigRepository {
101127
@Override
102128
public Optional<ModuleConfig> getModuleConfig(String name) {

commons/src/main/java/com/powsybl/commons/config/PlatformConfigNamedProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import java.util.function.Function;
1616

1717
/**
18-
* A provider that can be loaded by by Java's ServiceLoader based on its name
18+
* A provider that can be loaded by Java's ServiceLoader based on its name
1919
* present in an entry in the PlatformConfig.
2020
*
2121
* @author Jon Harper {@literal <jon.harper at rte-france.com>}

commons/src/main/java/com/powsybl/commons/io/table/TableFormatterConfig.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@
77
*/
88
package com.powsybl.commons.io.table;
99

10-
import com.powsybl.commons.config.ModuleConfig;
1110
import com.powsybl.commons.config.PlatformConfig;
1211

1312
import java.util.Locale;
1413
import java.util.Objects;
15-
import java.util.Optional;
1614

1715
/**
1816
@@ -38,13 +36,11 @@ public static TableFormatterConfig load() {
3836
}
3937

4038
public static TableFormatterConfig load(PlatformConfig platformConfig) {
41-
Optional<ModuleConfig> config = platformConfig.getOptionalModuleConfig(CONFIG_MODULE_NAME);
42-
String language = config.flatMap(c -> c.getOptionalStringProperty("language")).orElse(DEFAULT_LANGUAGE);
43-
String separator = config.flatMap(c -> c.getOptionalStringProperty("separator")).orElse(Character.toString(DEFAULT_CSV_SEPARATOR));
44-
String invalidString = config.flatMap(c -> c.getOptionalStringProperty("invalid-string")).orElse(DEFAULT_INVALID_STRING);
45-
boolean printHeader = config.flatMap(c -> c.getOptionalBooleanProperty("print-header")).orElse(DEFAULT_PRINT_HEADER);
46-
boolean printTitle = config.flatMap(c -> c.getOptionalBooleanProperty("print-title")).orElse(DEFAULT_PRINT_TITLE);
47-
39+
String language = platformConfig.getStringProperty(CONFIG_MODULE_NAME, "language", DEFAULT_LANGUAGE);
40+
String separator = platformConfig.getStringProperty(CONFIG_MODULE_NAME, "separator", Character.toString(DEFAULT_CSV_SEPARATOR));
41+
String invalidString = platformConfig.getStringProperty(CONFIG_MODULE_NAME, "invalid-string", DEFAULT_INVALID_STRING);
42+
boolean printHeader = platformConfig.getBooleanProperty(CONFIG_MODULE_NAME, "print-header", DEFAULT_PRINT_HEADER);
43+
boolean printTitle = platformConfig.getBooleanProperty(CONFIG_MODULE_NAME, "print-title", DEFAULT_PRINT_TITLE);
4844
Locale locale = Locale.forLanguageTag(language);
4945
return new TableFormatterConfig(locale, separator.charAt(0), invalidString, printHeader, printTitle);
5046
}

commons/src/main/java/com/powsybl/commons/parameters/Parameter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ public static Object read(String prefix, Properties parameters, Parameter config
149149
}
150150
}
151151

152-
public static Object read(String prefix, Properties paramaters, Parameter configuredParameter) {
153-
return read(prefix, paramaters, configuredParameter, ParameterDefaultValueConfig.INSTANCE);
152+
public static Object read(String prefix, Properties parameters, Parameter configuredParameter) {
153+
return read(prefix, parameters, configuredParameter, ParameterDefaultValueConfig.INSTANCE);
154154
}
155155

156156
public static boolean readBoolean(String prefix, Properties parameters, Parameter configuredParameter, ParameterDefaultValueConfig defaultValueConfig) {
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/**
2+
* Copyright (c) 2026, 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+
* SPDX-License-Identifier: MPL-2.0
7+
*/
8+
package com.powsybl.commons.config;
9+
10+
import com.google.common.jimfs.Configuration;
11+
import com.google.common.jimfs.Jimfs;
12+
import org.junit.jupiter.api.Test;
13+
14+
import java.io.IOException;
15+
import java.nio.file.FileSystem;
16+
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.assertFalse;
19+
import static org.junit.jupiter.api.Assertions.assertTrue;
20+
21+
/**
22+
*
23+
* @author Samir Romdhani {@literal <samir.romdhani_externe at rte-france.com>}
24+
*/
25+
public class PlatformConfigPropertyTest {
26+
27+
private static final String MODULE_NAME = "module";
28+
29+
private enum TestEnum {
30+
FIRST,
31+
SECOND
32+
}
33+
34+
@Test
35+
void testConfiguredValues() throws IOException {
36+
try (FileSystem fileSystem = Jimfs.newFileSystem(Configuration.unix())) {
37+
// Given
38+
InMemoryPlatformConfig platformConfig = new InMemoryPlatformConfig(fileSystem);
39+
MapModuleConfig moduleConfig = platformConfig.createModuleConfig(MODULE_NAME);
40+
moduleConfig.setStringProperty("stringProperty", "value");
41+
moduleConfig.setStringProperty("booleanProperty", "true");
42+
moduleConfig.setStringProperty("intProperty", "22");
43+
moduleConfig.setStringProperty("enumProperty", "FIRST");
44+
// When
45+
String stringValue = platformConfig.getStringProperty(MODULE_NAME, "stringProperty", "default-string");
46+
boolean booleanValue = platformConfig.getBooleanProperty(MODULE_NAME, "booleanProperty", false);
47+
int intValue = platformConfig.getIntProperty(MODULE_NAME, "intProperty", 23);
48+
TestEnum enumValue = platformConfig.getEnumProperty(MODULE_NAME, "enumProperty", TestEnum.SECOND, TestEnum.class);
49+
// Then
50+
assertEquals("value", stringValue);
51+
assertTrue(booleanValue);
52+
assertEquals(22, intValue);
53+
assertEquals(TestEnum.FIRST, enumValue);
54+
}
55+
}
56+
57+
@Test
58+
void testDefaultsWhenModuleMissing() throws IOException {
59+
try (FileSystem fileSystem = Jimfs.newFileSystem(Configuration.unix())) {
60+
// Given
61+
InMemoryPlatformConfig platformConfig = new InMemoryPlatformConfig(fileSystem);
62+
// When
63+
String stringValue = platformConfig.getStringProperty(MODULE_NAME, "stringProperty", "default-string");
64+
boolean booleanValue = platformConfig.getBooleanProperty(MODULE_NAME, "booleanProperty", true);
65+
int intValue = platformConfig.getIntProperty(MODULE_NAME, "intProperty", 23);
66+
TestEnum enumValue = platformConfig.getEnumProperty(MODULE_NAME, "enumProperty", TestEnum.SECOND, TestEnum.class);
67+
// Then
68+
assertEquals("default-string", stringValue);
69+
assertTrue(booleanValue);
70+
assertEquals(23, intValue);
71+
assertEquals(TestEnum.SECOND, enumValue);
72+
}
73+
}
74+
75+
@Test
76+
void testDefaultsWhenPropertyMissing() throws IOException {
77+
try (FileSystem fileSystem = Jimfs.newFileSystem(Configuration.unix())) {
78+
// Given
79+
InMemoryPlatformConfig platformConfig = new InMemoryPlatformConfig(fileSystem);
80+
platformConfig.createModuleConfig(MODULE_NAME);
81+
// When
82+
String stringValue = platformConfig.getStringProperty(MODULE_NAME, "string", "default-string");
83+
boolean booleanValue = platformConfig.getBooleanProperty(MODULE_NAME, "boolean", false);
84+
int intValue = platformConfig.getIntProperty(MODULE_NAME, "int", 23);
85+
TestEnum enumValue = platformConfig.getEnumProperty(MODULE_NAME, "enum", TestEnum.SECOND, TestEnum.class);
86+
// Then
87+
assertEquals("default-string", stringValue);
88+
assertFalse(booleanValue);
89+
assertEquals(23, intValue);
90+
assertEquals(TestEnum.SECOND, enumValue);
91+
}
92+
}
93+
}

commons/src/test/java/com/powsybl/commons/io/table/TableFormatterConfigTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,16 @@ void testConfig() throws IOException {
5151
testConfig(config, Locale.US, '\t', "NaN", false, false);
5252
}
5353
}
54+
55+
@Test
56+
void testLoadDefaultsNoModule() throws IOException {
57+
try (FileSystem fileSystem = Jimfs.newFileSystem(Configuration.unix())) {
58+
// Given
59+
InMemoryPlatformConfig platformConfig = new InMemoryPlatformConfig(fileSystem);
60+
// When
61+
TableFormatterConfig config = TableFormatterConfig.load(platformConfig);
62+
// Then
63+
testConfig(config, Locale.ENGLISH, ';', "inv", true, true);
64+
}
65+
}
5466
}

computation-local/src/main/java/com/powsybl/computation/local/LocalComputationConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,8 @@ public static LocalComputationConfig load(PlatformConfig platformConfig, FileSys
6767
Path localDir = config.flatMap(c -> getTmpDir(c, "tmp-dir").or(() -> getTmpDir(c, "tmpDir")))
6868
.orElse(getDefaultLocalDir(fileSystem));
6969
int availableCore = config.map(c -> c.getOptionalIntProperty("available-core")
70-
.orElse(c.getOptionalIntProperty("availableCore").orElse(DEFAULT_AVAILABLE_CORE)))
70+
.orElse(c.getOptionalIntProperty("availableCore").orElse(DEFAULT_AVAILABLE_CORE)))
7171
.orElse(DEFAULT_AVAILABLE_CORE);
72-
7372
if (availableCore <= 0) {
7473
availableCore = Runtime.getRuntime().availableProcessors();
7574
}

0 commit comments

Comments
 (0)