From 3d92d8603cf85ecdf86753f80efcca2870c0f753 Mon Sep 17 00:00:00 2001 From: Roberto Cortez Date: Tue, 18 Feb 2025 19:56:56 +0000 Subject: [PATCH] Correct check of ConfigValue having a value with indexed APIs (#1320) --- .../io/smallrye/config/SmallRyeConfig.java | 8 ++-- .../smallrye/config/SmallRyeConfigTest.java | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/implementation/src/main/java/io/smallrye/config/SmallRyeConfig.java b/implementation/src/main/java/io/smallrye/config/SmallRyeConfig.java index cdcbcaea5..c256a0889 100644 --- a/implementation/src/main/java/io/smallrye/config/SmallRyeConfig.java +++ b/implementation/src/main/java/io/smallrye/config/SmallRyeConfig.java @@ -204,7 +204,7 @@ public > C getValues(String name, Converter conver // Use indexed if comma separated empty or higher in ordinality ConfigValue commaSeparated = getConfigValue(name); - if (commaSeparated == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { + if (commaSeparated.getValue() == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { return collection; } else { return getValue(name, newCollectionConverter(converter, collectionFactory)); @@ -397,7 +397,7 @@ public T getValue(String name, Class propertyType) { // Use indexed if comma separated empty or higher in ordinality ConfigValue commaSeparated = getConfigValue(name); - if (commaSeparated == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { + if (commaSeparated.getValue() == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { return (T) array; } else { return convertValue(commaSeparated, requireConverter(propertyType)); @@ -531,7 +531,7 @@ public Optional getOptionalValue(String name, Class propertyType) { // Use indexed if comma separated empty or higher in ordinality ConfigValue commaSeparated = getConfigValue(name); - if (commaSeparated == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { + if (commaSeparated.getValue() == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { return (Optional) Optional.of(array); } else { return getValue(name, getOptionalConverter(propertyType)); @@ -574,7 +574,7 @@ public > Optional getOptionalValues(String name, C // Use indexed if comma separated empty or higher in ordinality ConfigValue commaSeparated = getConfigValue(name); - if (commaSeparated == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { + if (commaSeparated.getValue() == null || indexedOrdinality >= commaSeparated.getConfigSourceOrdinal()) { return collection.isEmpty() ? Optional.empty() : Optional.of(collection); } else { return getOptionalValue(name, newCollectionConverter(converter, collectionFactory)); diff --git a/implementation/src/test/java/io/smallrye/config/SmallRyeConfigTest.java b/implementation/src/test/java/io/smallrye/config/SmallRyeConfigTest.java index 9d1d8a379..6b44379fb 100644 --- a/implementation/src/test/java/io/smallrye/config/SmallRyeConfigTest.java +++ b/implementation/src/test/java/io/smallrye/config/SmallRyeConfigTest.java @@ -129,6 +129,49 @@ void getValueArray() { assertArrayEquals(new String[] { "one", "two", "three" }, strings); } + @Test + void indexedNegativeOrdinal() { + SmallRyeConfig config = new SmallRyeConfigBuilder() + .withSources(config("config_ordinal", "-1000", "indexed[0]", "one", "indexed[1]", "two", "indexed[2]", "three")) + .build(); + + List indexed = config.getValues("indexed", String.class); + assertEquals(3, indexed.size()); + assertEquals("one", indexed.get(0)); + assertEquals("two", indexed.get(1)); + assertEquals("three", indexed.get(2)); + + Optional> indexedOptional = config.getOptionalValues("indexed", String.class); + assertTrue(indexedOptional.isPresent()); + indexedOptional.ifPresent(new Consumer>() { + @Override + public void accept(final List indexed) { + assertEquals(3, indexed.size()); + assertEquals("one", indexed.get(0)); + assertEquals("two", indexed.get(1)); + assertEquals("three", indexed.get(2)); + } + }); + + String[] array = config.getValue("indexed", String[].class); + assertEquals(3, array.length); + assertEquals("one", array[0]); + assertEquals("two", array[1]); + assertEquals("three", array[2]); + + Optional arrayOptional = config.getOptionalValue("indexed", String[].class); + assertTrue(arrayOptional.isPresent()); + arrayOptional.ifPresent(new Consumer() { + @Override + public void accept(final String[] array) { + assertEquals(3, array.length); + assertEquals("one", array[0]); + assertEquals("two", array[1]); + assertEquals("three", array[2]); + } + }); + } + @Test void getIndexedValues() { SmallRyeConfig config = new SmallRyeConfigBuilder()