Bypass SystemEnvironmentPropertySource.resolvePropertyName

Update `ConfigurationPropertySource` adapters so accessing the
`SystemEnvironmentPropertySource` is handled by directly calling
the source.

This saves potentially expensive calls to `resolvePropertyName`
which are unnecessary since mappings are handled directly.

Closes gh-44862
This commit is contained in:
Phillip Webb
2025-03-22 22:05:29 -07:00
parent 54afa69ba5
commit d9d206a761
5 changed files with 116 additions and 75 deletions

View File

@@ -56,7 +56,7 @@ public class MapConfigurationPropertySource implements IterableConfigurationProp
public MapConfigurationPropertySource(Map<?, ?> map) {
this.source = new LinkedHashMap<>();
MapPropertySource mapPropertySource = new MapPropertySource("source", this.source);
this.delegate = new SpringIterableConfigurationPropertySource(mapPropertySource, DEFAULT_MAPPERS);
this.delegate = new SpringIterableConfigurationPropertySource(mapPropertySource, false, DEFAULT_MAPPERS);
putAll(map);
}

View File

@@ -59,17 +59,22 @@ class SpringConfigurationPropertySource implements ConfigurationPropertySource {
private final PropertySource<?> propertySource;
private final boolean systemEnvironmentSource;
private final PropertyMapper[] mappers;
/**
* Create a new {@link SpringConfigurationPropertySource} implementation.
* @param propertySource the source property source
* @param systemEnvironmentSource if the source is from the system environment
* @param mappers the property mappers
*/
SpringConfigurationPropertySource(PropertySource<?> propertySource, PropertyMapper... mappers) {
SpringConfigurationPropertySource(PropertySource<?> propertySource, boolean systemEnvironmentSource,
PropertyMapper... mappers) {
Assert.notNull(propertySource, "'propertySource' must not be null");
Assert.isTrue(mappers.length > 0, "'mappers' must contain at least one item");
this.propertySource = propertySource;
this.systemEnvironmentSource = systemEnvironmentSource;
this.mappers = mappers;
}
@@ -81,7 +86,7 @@ class SpringConfigurationPropertySource implements ConfigurationPropertySource {
for (PropertyMapper mapper : this.mappers) {
try {
for (String candidate : mapper.map(name)) {
Object value = getPropertySource().getProperty(candidate);
Object value = getPropertySourceProperty(candidate);
if (value != null) {
Origin origin = PropertySourceOrigin.get(this.propertySource, candidate);
return ConfigurationProperty.of(this, name, value, origin);
@@ -95,6 +100,18 @@ class SpringConfigurationPropertySource implements ConfigurationPropertySource {
return null;
}
protected final Object getPropertySourceProperty(String name) {
// Save calls to SystemEnvironmentPropertySource.resolvePropertyName(...)
// since we've already done the mapping
PropertySource<?> propertySource = getPropertySource();
return (!this.systemEnvironmentSource) ? propertySource.getProperty(name)
: getSystemEnvironmentProperty(((SystemEnvironmentPropertySource) propertySource).getSource(), name);
}
Object getSystemEnvironmentProperty(Map<String, Object> systemEnvironment, String name) {
return systemEnvironment.get(name);
}
@Override
public ConfigurationPropertyState containsDescendantOf(ConfigurationPropertyName name) {
PropertySource<?> source = getPropertySource();
@@ -127,6 +144,10 @@ class SpringConfigurationPropertySource implements ConfigurationPropertySource {
return this.propertySource;
}
protected final boolean isSystemEnvironmentSource() {
return this.systemEnvironmentSource;
}
protected final PropertyMapper[] getMappers() {
return this.mappers;
}
@@ -145,24 +166,19 @@ class SpringConfigurationPropertySource implements ConfigurationPropertySource {
*/
static SpringConfigurationPropertySource from(PropertySource<?> source) {
Assert.notNull(source, "'source' must not be null");
PropertyMapper[] mappers = getPropertyMappers(source);
if (isFullEnumerable(source)) {
return new SpringIterableConfigurationPropertySource((EnumerablePropertySource<?>) source, mappers);
}
return new SpringConfigurationPropertySource(source, mappers);
boolean systemEnvironmentSource = isSystemEnvironmentPropertySource(source);
PropertyMapper[] mappers = (!systemEnvironmentSource) ? DEFAULT_MAPPERS : SYSTEM_ENVIRONMENT_MAPPERS;
return (!isFullEnumerable(source))
? new SpringConfigurationPropertySource(source, systemEnvironmentSource, mappers)
: new SpringIterableConfigurationPropertySource((EnumerablePropertySource<?>) source,
systemEnvironmentSource, mappers);
}
private static PropertyMapper[] getPropertyMappers(PropertySource<?> source) {
if (source instanceof SystemEnvironmentPropertySource && hasSystemEnvironmentName(source)) {
return SYSTEM_ENVIRONMENT_MAPPERS;
}
return DEFAULT_MAPPERS;
}
private static boolean hasSystemEnvironmentName(PropertySource<?> source) {
private static boolean isSystemEnvironmentPropertySource(PropertySource<?> source) {
String name = source.getName();
return StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME.equals(name)
|| name.endsWith("-" + StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME);
return (source instanceof SystemEnvironmentPropertySource)
&& (StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME.equals(name)
|| name.endsWith("-" + StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME));
}
private static boolean isFullEnumerable(PropertySource<?> source) {

View File

@@ -19,6 +19,7 @@ package org.springframework.boot.context.properties.source;
import java.util.Arrays;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -27,7 +28,6 @@ import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.function.Supplier;
import java.util.stream.Stream;
import org.springframework.boot.origin.Origin;
@@ -59,11 +59,13 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
private volatile ConfigurationPropertyName[] configurationPropertyNames;
SpringIterableConfigurationPropertySource(EnumerablePropertySource<?> propertySource, PropertyMapper... mappers) {
super(propertySource, mappers);
SpringIterableConfigurationPropertySource(EnumerablePropertySource<?> propertySource,
boolean systemEnvironmentSource, PropertyMapper... mappers) {
super(propertySource, systemEnvironmentSource, mappers);
assertEnumerablePropertySource();
boolean immutable = isImmutablePropertySource();
this.ancestorOfCheck = getAncestorOfCheck(mappers);
this.cache = new SoftReferenceConfigurationPropertyCache<>(isImmutablePropertySource());
this.cache = new SoftReferenceConfigurationPropertyCache<>(immutable);
}
private BiPredicate<ConfigurationPropertyName, ConfigurationPropertyName> getAncestorOfCheck(
@@ -102,7 +104,7 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
return configurationProperty;
}
for (String candidate : getCache().getMapped(name)) {
Object value = getPropertySource().getProperty(candidate);
Object value = getPropertySourceProperty(candidate);
if (value != null) {
Origin origin = PropertySourceOrigin.get(getPropertySource(), candidate);
return ConfigurationProperty.of(this, name, value, origin);
@@ -111,6 +113,11 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
return null;
}
@Override
protected Object getSystemEnvironmentProperty(Map<String, Object> systemEnvironment, String name) {
return getCache().getSystemEnvironmentProperty(name);
}
@Override
public Stream<ConfigurationPropertyName> stream() {
ConfigurationPropertyName[] names = getConfigurationPropertyNames();
@@ -129,7 +136,14 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
return result;
}
if (this.ancestorOfCheck == PropertyMapper.DEFAULT_ANCESTOR_OF_CHECK) {
return getCache().containsDescendantOf(name, this.ancestorOfCheck);
Set<ConfigurationPropertyName> descendants = getCache().getDescendants();
if (descendants != null) {
if (name.isEmpty() && !descendants.isEmpty()) {
return ConfigurationPropertyState.PRESENT;
}
return !descendants.contains(name) ? ConfigurationPropertyState.ABSENT
: ConfigurationPropertyState.PRESENT;
}
}
ConfigurationPropertyName[] candidates = getConfigurationPropertyNames();
for (ConfigurationPropertyName candidate : candidates) {
@@ -158,12 +172,13 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
}
private Cache createCache() {
return new Cache(getMappers(), isImmutablePropertySource(),
this.ancestorOfCheck == PropertyMapper.DEFAULT_ANCESTOR_OF_CHECK);
boolean immutable = isImmutablePropertySource();
boolean captureDescendants = this.ancestorOfCheck == PropertyMapper.DEFAULT_ANCESTOR_OF_CHECK;
return new Cache(getMappers(), immutable, captureDescendants, isSystemEnvironmentSource());
}
private Cache updateCache(Cache cache) {
cache.update(getPropertySource()::getPropertyNames);
cache.update(getPropertySource());
return cache;
}
@@ -193,20 +208,24 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
private final boolean captureDescendants;
private final boolean systemEnvironmentSource;
private volatile Data data;
Cache(PropertyMapper[] mappers, boolean immutable, boolean captureDescendants) {
Cache(PropertyMapper[] mappers, boolean immutable, boolean captureDescendants,
boolean systemEnvironmentSource) {
this.mappers = mappers;
this.immutable = immutable;
this.captureDescendants = captureDescendants;
this.systemEnvironmentSource = systemEnvironmentSource;
}
void update(Supplier<String[]> propertyNames) {
void update(EnumerablePropertySource<?> propertySource) {
if (this.data == null || !this.immutable) {
int count = 0;
while (true) {
try {
tryUpdate(propertyNames.get());
tryUpdate(propertySource);
return;
}
catch (ConcurrentModificationException ex) {
@@ -218,9 +237,10 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
}
}
private void tryUpdate(String[] propertyNames) {
private void tryUpdate(EnumerablePropertySource<?> propertySource) {
Data data = this.data;
String[] lastUpdated = (data != null) ? data.lastUpdated() : null;
String[] propertyNames = propertySource.getPropertyNames();
if (lastUpdated != null && Arrays.equals(lastUpdated, propertyNames)) {
return;
}
@@ -229,8 +249,9 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
(data != null) ? data.mappings() : null, size);
Map<String, ConfigurationPropertyName> reverseMappings = cloneOrCreate(
(data != null) ? data.reverseMappings() : null, size);
Map<ConfigurationPropertyName, Set<ConfigurationPropertyName>> descendants = cloneOrCreate(
(data != null) ? data.descendants() : null, size);
Set<ConfigurationPropertyName> descendants = (!this.captureDescendants) ? null : new HashSet<>();
Map<String, Object> systemEnvironmentCopy = (!this.systemEnvironmentSource) ? null
: copySource(propertySource);
for (PropertyMapper propertyMapper : this.mappers) {
for (String propertyName : propertyNames) {
if (!reverseMappings.containsKey(propertyName)) {
@@ -238,9 +259,7 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
if (configurationPropertyName != null && !configurationPropertyName.isEmpty()) {
add(mappings, configurationPropertyName, propertyName);
reverseMappings.put(propertyName, configurationPropertyName);
if (this.captureDescendants) {
addParents(descendants, configurationPropertyName);
}
addParents(descendants, configurationPropertyName);
}
}
}
@@ -248,18 +267,28 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
ConfigurationPropertyName[] configurationPropertyNames = this.immutable
? reverseMappings.values().toArray(new ConfigurationPropertyName[0]) : null;
lastUpdated = this.immutable ? null : propertyNames;
this.data = new Data(mappings, reverseMappings, descendants, configurationPropertyNames, lastUpdated);
this.data = new Data(mappings, reverseMappings, descendants, configurationPropertyNames,
systemEnvironmentCopy, lastUpdated);
}
@SuppressWarnings("unchecked")
private HashMap<String, Object> copySource(EnumerablePropertySource<?> propertySource) {
return new HashMap<>((Map<String, Object>) propertySource.getSource());
}
private <K, V> Map<K, V> cloneOrCreate(Map<K, V> source, int size) {
return (source != null) ? new LinkedHashMap<>(source) : new LinkedHashMap<>(size);
}
private void addParents(Map<ConfigurationPropertyName, Set<ConfigurationPropertyName>> descendants,
ConfigurationPropertyName name) {
ConfigurationPropertyName parent = name;
private void addParents(Set<ConfigurationPropertyName> descendants, ConfigurationPropertyName name) {
if (descendants == null || name.isEmpty()) {
return;
}
ConfigurationPropertyName parent = name.getParent();
while (!parent.isEmpty()) {
add(descendants, parent, name);
if (!descendants.add(parent)) {
return;
}
parent = parent.getParent();
}
}
@@ -289,25 +318,18 @@ class SpringIterableConfigurationPropertySource extends SpringConfigurationPrope
return names;
}
ConfigurationPropertyState containsDescendantOf(ConfigurationPropertyName name,
BiPredicate<ConfigurationPropertyName, ConfigurationPropertyName> ancestorOfCheck) {
Data data = this.data;
if (name.isEmpty() && !data.descendants().isEmpty()) {
return ConfigurationPropertyState.PRESENT;
}
Set<ConfigurationPropertyName> candidates = data.descendants().getOrDefault(name, Collections.emptySet());
for (ConfigurationPropertyName candidate : candidates) {
if (ancestorOfCheck.test(name, candidate)) {
return ConfigurationPropertyState.PRESENT;
}
}
return ConfigurationPropertyState.ABSENT;
Set<ConfigurationPropertyName> getDescendants() {
return this.data.descendants();
}
Object getSystemEnvironmentProperty(String name) {
return this.data.systemEnvironmentCopy().get(name);
}
private record Data(Map<ConfigurationPropertyName, Set<String>> mappings,
Map<String, ConfigurationPropertyName> reverseMappings,
Map<ConfigurationPropertyName, Set<ConfigurationPropertyName>> descendants,
ConfigurationPropertyName[] configurationPropertyNames, String[] lastUpdated) {
Map<String, ConfigurationPropertyName> reverseMappings, Set<ConfigurationPropertyName> descendants,
ConfigurationPropertyName[] configurationPropertyNames, Map<String, Object> systemEnvironmentCopy,
String[] lastUpdated) {
}

View File

@@ -43,7 +43,7 @@ class SpringConfigurationPropertySourceTests {
@Test
void createWhenPropertySourceIsNullShouldThrowException() {
assertThatIllegalArgumentException()
.isThrownBy(() -> new SpringConfigurationPropertySource(null, mock(PropertyMapper.class)))
.isThrownBy(() -> new SpringConfigurationPropertySource(null, false, mock(PropertyMapper.class)))
.withMessageContaining("'propertySource' must not be null");
}
@@ -57,7 +57,8 @@ class SpringConfigurationPropertySourceTests {
TestPropertyMapper mapper = new TestPropertyMapper();
ConfigurationPropertyName name = ConfigurationPropertyName.of("my.key");
mapper.addFromConfigurationProperty(name, "key2");
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource, mapper);
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource, false,
mapper);
assertThat(adapter.getConfigurationProperty(name).getValue()).isEqualTo("value2");
}
@@ -69,7 +70,8 @@ class SpringConfigurationPropertySourceTests {
TestPropertyMapper mapper = new TestPropertyMapper();
ConfigurationPropertyName name = ConfigurationPropertyName.of("my.key");
mapper.addFromConfigurationProperty(name, "key");
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource, mapper);
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource, false,
mapper);
ConfigurationProperty configurationProperty = adapter.getConfigurationProperty(name);
assertThat(configurationProperty.getOrigin()).hasToString("\"key\" from property source \"test\"");
assertThat(configurationProperty.getSource()).isEqualTo(adapter);
@@ -83,7 +85,8 @@ class SpringConfigurationPropertySourceTests {
TestPropertyMapper mapper = new TestPropertyMapper();
ConfigurationPropertyName name = ConfigurationPropertyName.of("my.key");
mapper.addFromConfigurationProperty(name, "key");
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource, mapper);
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource, false,
mapper);
assertThat(adapter.getConfigurationProperty(name).getOrigin()).hasToString("TestOrigin key");
}
@@ -92,7 +95,7 @@ class SpringConfigurationPropertySourceTests {
Map<String, Object> source = new LinkedHashMap<>();
source.put("foo.bar", "value");
PropertySource<?> propertySource = new MapPropertySource("test", source);
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource,
SpringConfigurationPropertySource adapter = new SpringConfigurationPropertySource(propertySource, false,
DefaultPropertyMapper.INSTANCE);
assertThat(adapter.containsDescendantOf(ConfigurationPropertyName.of("foo")))
.isEqualTo(ConfigurationPropertyState.UNKNOWN);

View File

@@ -50,7 +50,7 @@ class SpringIterableConfigurationPropertySourceTests {
@Test
void createWhenPropertySourceIsNullShouldThrowException() {
assertThatIllegalArgumentException()
.isThrownBy(() -> new SpringIterableConfigurationPropertySource(null, mock(PropertyMapper.class)))
.isThrownBy(() -> new SpringIterableConfigurationPropertySource(null, false, mock(PropertyMapper.class)))
.withMessageContaining("'propertySource' must not be null");
}
@@ -69,7 +69,7 @@ class SpringIterableConfigurationPropertySourceTests {
TestPropertyMapper mapper2 = new TestPropertyMapper();
mapper2.addFromPropertySource("key2", "my.key2b");
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(
propertySource, mapper1, mapper2);
propertySource, false, mapper1, mapper2);
assertThat(adapter.iterator()).toIterable()
.extracting(Object::toString)
.containsExactly("my.key1", "my.key2a", "my.key4");
@@ -86,7 +86,7 @@ class SpringIterableConfigurationPropertySourceTests {
ConfigurationPropertyName name = ConfigurationPropertyName.of("my.key");
mapper.addFromConfigurationProperty(name, "key2");
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(
propertySource, mapper);
propertySource, false, mapper);
assertThat(adapter.getConfigurationProperty(name).getValue()).isEqualTo("value2");
}
@@ -101,7 +101,7 @@ class SpringIterableConfigurationPropertySourceTests {
mapper.addFromPropertySource("key1", "my.missing");
mapper.addFromPropertySource("key2", "my.k-e-y");
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(
propertySource, mapper);
propertySource, false, mapper);
ConfigurationPropertyName name = ConfigurationPropertyName.of("my.key");
assertThat(adapter.getConfigurationProperty(name).getValue()).isEqualTo("value2");
}
@@ -115,7 +115,7 @@ class SpringIterableConfigurationPropertySourceTests {
ConfigurationPropertyName name = ConfigurationPropertyName.of("my.key");
mapper.addFromConfigurationProperty(name, "key");
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(
propertySource, mapper);
propertySource, false, mapper);
assertThat(adapter.getConfigurationProperty(name).getOrigin())
.hasToString("\"key\" from property source \"test\"");
}
@@ -130,7 +130,7 @@ class SpringIterableConfigurationPropertySourceTests {
ConfigurationPropertyName name = ConfigurationPropertyName.of("my.key");
mapper.addFromConfigurationProperty(name, "key");
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(
propertySource, mapper);
propertySource, false, mapper);
assertThat(adapter.getConfigurationProperty(name).getOrigin()).hasToString("TestOrigin key");
}
@@ -142,7 +142,7 @@ class SpringIterableConfigurationPropertySourceTests {
EnumerablePropertySource<?> propertySource = new OriginCapablePropertySource<>(
new MapPropertySource("test", source));
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(
propertySource, DefaultPropertyMapper.INSTANCE);
propertySource, false, DefaultPropertyMapper.INSTANCE);
assertThat(adapter.containsDescendantOf(ConfigurationPropertyName.of("foo")))
.isEqualTo(ConfigurationPropertyState.PRESENT);
assertThat(adapter.containsDescendantOf(ConfigurationPropertyName.of("faf")))
@@ -159,7 +159,7 @@ class SpringIterableConfigurationPropertySourceTests {
SystemEnvironmentPropertySource propertySource = new SystemEnvironmentPropertySource(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, source);
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(
propertySource, SystemEnvironmentPropertyMapper.INSTANCE);
propertySource, true, SystemEnvironmentPropertyMapper.INSTANCE);
assertThat(adapter.containsDescendantOf(ConfigurationPropertyName.of("foo.bar-baz")))
.isEqualTo(ConfigurationPropertyState.PRESENT);
assertThat(adapter.containsDescendantOf(ConfigurationPropertyName.of("foo.alpha-bravo")))
@@ -175,7 +175,7 @@ class SpringIterableConfigurationPropertySourceTests {
map.put("key1", "value1");
map.put("key2", "value2");
EnumerablePropertySource<?> source = new MapPropertySource("test", map);
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source,
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source, false,
DefaultPropertyMapper.INSTANCE);
assertThat(adapter.stream()).hasSize(2);
map.put("key3", "value3");
@@ -189,7 +189,7 @@ class SpringIterableConfigurationPropertySourceTests {
map.put("key1", "value1");
map.put("key2", "value2");
EnumerablePropertySource<?> source = new MapPropertySource("test", map);
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source,
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source, false,
DefaultPropertyMapper.INSTANCE);
assertThat(adapter.stream()).hasSize(2);
map.setThrowException(true);
@@ -204,7 +204,7 @@ class SpringIterableConfigurationPropertySourceTests {
map.put("key1", "value1");
map.put("key2", "value2");
EnumerablePropertySource<?> source = new OriginTrackedMapPropertySource("test", map);
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source,
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source, false,
DefaultPropertyMapper.INSTANCE);
assertThat(adapter.stream()).hasSize(2);
map.put("key3", "value3");
@@ -218,7 +218,7 @@ class SpringIterableConfigurationPropertySourceTests {
map.put("key1", "value1");
map.put("key2", "value2");
EnumerablePropertySource<?> source = new OriginTrackedMapPropertySource("test", map, true);
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source,
SpringIterableConfigurationPropertySource adapter = new SpringIterableConfigurationPropertySource(source, false,
DefaultPropertyMapper.INSTANCE);
assertThat(adapter.stream()).hasSize(2);
map.put("key3", "value3");
@@ -234,7 +234,7 @@ class SpringIterableConfigurationPropertySourceTests {
map.put("test.map.delta", "value4");
EnumerablePropertySource<?> source = new OriginTrackedMapPropertySource("test", map, true);
SpringIterableConfigurationPropertySource propertySource = new SpringIterableConfigurationPropertySource(source,
DefaultPropertyMapper.INSTANCE);
false, DefaultPropertyMapper.INSTANCE);
assertThat(propertySource.stream().map(ConfigurationPropertyName::toString)).containsExactly("test.map.alpha",
"test.map.bravo", "test.map.charlie", "test.map.delta");
}