Browse Source

Allow override of ConfigData.Options

Update `ConfigDataEnvironmentUpdateListener` to allow Spring Cloud
to override the actual ConfigData.Options that will be used for
any specific contributor.

Closes gh-42932
pull/45964/head
Phillip Webb 7 months ago
parent
commit
23afabc5fd
  1. 3
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigData.java
  2. 4
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java
  3. 4
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java
  4. 21
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributors.java
  5. 17
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentUpdateListener.java
  6. 13
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java
  7. 53
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java
  8. 50
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorTests.java
  9. 8
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java

3
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigData.java

@ -239,7 +239,8 @@ public final class ConfigData { @@ -239,7 +239,8 @@ public final class ConfigData {
}
private Options copy(Consumer<EnumSet<Option>> processor) {
EnumSet<Option> options = EnumSet.copyOf(this.options);
EnumSet<Option> options = (!this.options.isEmpty()) ? EnumSet.copyOf(this.options)
: EnumSet.noneOf(Option.class);
processor.accept(options);
return new Options(options);
}

4
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2024 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -188,7 +188,7 @@ class ConfigDataEnvironment { @@ -188,7 +188,7 @@ class ConfigDataEnvironment {
protected ConfigDataEnvironmentContributors createContributors(
List<ConfigDataEnvironmentContributor> contributors) {
return new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, contributors,
this.environment.getConversionService());
this.environment.getConversionService(), this.environmentUpdateListener);
}
ConfigDataEnvironmentContributors getContributors() {

4
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java

@ -428,13 +428,15 @@ class ConfigDataEnvironmentContributor implements Iterable<ConfigDataEnvironment @@ -428,13 +428,15 @@ class ConfigDataEnvironmentContributor implements Iterable<ConfigDataEnvironment
* @param configData the config data
* @param propertySourceIndex the index of the property source that should be used
* @param conversionService the conversion service to use
* @param environmentUpdateListener the environment update listener
* @return a new {@link ConfigDataEnvironmentContributor} instance
*/
static ConfigDataEnvironmentContributor ofUnboundImport(ConfigDataLocation location, ConfigDataResource resource,
boolean profileSpecific, ConfigData configData, int propertySourceIndex,
ConversionService conversionService) {
ConversionService conversionService, ConfigDataEnvironmentUpdateListener environmentUpdateListener) {
PropertySource<?> propertySource = configData.getPropertySources().get(propertySourceIndex);
ConfigData.Options options = configData.getOptions(propertySource);
options = environmentUpdateListener.onConfigDataOptions(configData, propertySource, options);
return new ConfigDataEnvironmentContributor(Kind.UNBOUND_IMPORT, location, resource, profileSpecific,
propertySource, asConfigurationPropertySource(propertySource), null, options, null, conversionService);
}

21
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributors.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2024 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -62,27 +62,34 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen @@ -62,27 +62,34 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen
private final ConversionService conversionService;
private final ConfigDataEnvironmentUpdateListener environmentUpdateListener;
/**
* Create a new {@link ConfigDataEnvironmentContributors} instance.
* @param logFactory the log factory
* @param bootstrapContext the bootstrap context
* @param contributors the initial set of contributors
* @param conversionService the conversion service to use
* @param environmentUpdateListener the environment update listener
*/
ConfigDataEnvironmentContributors(DeferredLogFactory logFactory, ConfigurableBootstrapContext bootstrapContext,
List<ConfigDataEnvironmentContributor> contributors, ConversionService conversionService) {
List<ConfigDataEnvironmentContributor> contributors, ConversionService conversionService,
ConfigDataEnvironmentUpdateListener environmentUpdateListener) {
this.logger = logFactory.getLog(getClass());
this.bootstrapContext = bootstrapContext;
this.root = ConfigDataEnvironmentContributor.of(contributors, conversionService);
this.conversionService = conversionService;
this.environmentUpdateListener = environmentUpdateListener;
}
private ConfigDataEnvironmentContributors(Log logger, ConfigurableBootstrapContext bootstrapContext,
ConfigDataEnvironmentContributor root, ConversionService conversionService) {
ConfigDataEnvironmentContributor root, ConversionService conversionService,
ConfigDataEnvironmentUpdateListener environmentUpdateListener) {
this.logger = logger;
this.bootstrapContext = bootstrapContext;
this.root = root;
this.conversionService = conversionService;
this.environmentUpdateListener = environmentUpdateListener;
}
/**
@ -110,7 +117,8 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen @@ -110,7 +117,8 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen
if (contributor.getKind() == Kind.UNBOUND_IMPORT) {
ConfigDataEnvironmentContributor bound = contributor.withBoundProperties(result, activationContext);
result = new ConfigDataEnvironmentContributors(this.logger, this.bootstrapContext,
result.getRoot().withReplacement(contributor, bound), this.conversionService);
result.getRoot().withReplacement(contributor, bound), this.conversionService,
this.environmentUpdateListener);
continue;
}
ConfigDataLocationResolverContext locationResolverContext = new ContributorConfigDataLocationResolverContext(
@ -124,7 +132,8 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen @@ -124,7 +132,8 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen
ConfigDataEnvironmentContributor contributorAndChildren = contributor.withChildren(importPhase,
asContributors(imported));
result = new ConfigDataEnvironmentContributors(this.logger, this.bootstrapContext,
result.getRoot().withReplacement(contributor, contributorAndChildren), this.conversionService);
result.getRoot().withReplacement(contributor, contributorAndChildren), this.conversionService,
this.environmentUpdateListener);
processed++;
}
}
@ -173,7 +182,7 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen @@ -173,7 +182,7 @@ class ConfigDataEnvironmentContributors implements Iterable<ConfigDataEnvironmen
else {
for (int i = data.getPropertySources().size() - 1; i >= 0; i--) {
contributors.add(ConfigDataEnvironmentContributor.ofUnboundImport(location, resource,
profileSpecific, data, i, this.conversionService));
profileSpecific, data, i, this.conversionService, this.environmentUpdateListener));
}
}
});

17
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentUpdateListener.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2020 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -18,6 +18,7 @@ package org.springframework.boot.context.config; @@ -18,6 +18,7 @@ package org.springframework.boot.context.config;
import java.util.EventListener;
import org.springframework.boot.context.config.ConfigData.Options;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertySource;
@ -53,4 +54,18 @@ public interface ConfigDataEnvironmentUpdateListener extends EventListener { @@ -53,4 +54,18 @@ public interface ConfigDataEnvironmentUpdateListener extends EventListener {
default void onSetProfiles(Profiles profiles) {
}
/**
* Called when config data options are obtained for a particular property source.
* @param configData the config data
* @param propertySource the property source
* @param options the options as provided by
* {@link ConfigData#getOptions(PropertySource)}
* @return the actual options that should be used
* @since 3.5.1
*/
default ConfigData.Options onConfigDataOptions(ConfigData configData, PropertySource<?> propertySource,
Options options) {
return options;
}
}

13
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2024 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -91,7 +91,7 @@ class ConfigDataEnvironmentContributorTests { @@ -91,7 +91,7 @@ class ConfigDataEnvironmentContributorTests {
ConfigData configData = new ConfigData(Collections.singleton(new MockPropertySource()));
ConfigDataResource resource = mock(ConfigDataResource.class);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofUnboundImport(TEST_LOCATION,
resource, false, configData, 0, this.conversionService);
resource, false, configData, 0, this.conversionService, ConfigDataEnvironmentUpdateListener.NONE);
assertThat(contributor.getResource()).isSameAs(resource);
}
@ -109,7 +109,7 @@ class ConfigDataEnvironmentContributorTests { @@ -109,7 +109,7 @@ class ConfigDataEnvironmentContributorTests {
propertySource.setProperty("spring", "boot");
ConfigData configData = new ConfigData(Collections.singleton(propertySource));
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofUnboundImport(null, null,
false, configData, 0, this.conversionService);
false, configData, 0, this.conversionService, ConfigDataEnvironmentUpdateListener.NONE);
assertThat(contributor.getConfigurationPropertySource()
.getConfigurationProperty(ConfigurationPropertyName.of("spring"))
.getValue()).isEqualTo("boot");
@ -321,7 +321,7 @@ class ConfigDataEnvironmentContributorTests { @@ -321,7 +321,7 @@ class ConfigDataEnvironmentContributorTests {
propertySource.setProperty("spring.config.import", "test");
ConfigData configData = new ConfigData(Collections.singleton(propertySource));
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofUnboundImport(TEST_LOCATION,
resource, false, configData, 0, this.conversionService);
resource, false, configData, 0, this.conversionService, ConfigDataEnvironmentUpdateListener.NONE);
assertThat(contributor.getKind()).isEqualTo(Kind.UNBOUND_IMPORT);
assertThat(contributor.getResource()).isSameAs(resource);
assertThat(contributor.getImports()).isEmpty();
@ -368,7 +368,7 @@ class ConfigDataEnvironmentContributorTests { @@ -368,7 +368,7 @@ class ConfigDataEnvironmentContributorTests {
TestResource resource = new TestResource("a");
ConfigData configData = new ConfigData(Collections.singleton(new MockPropertySource()), Option.IGNORE_IMPORTS);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofUnboundImport(TEST_LOCATION,
resource, false, configData, 0, this.conversionService);
resource, false, configData, 0, this.conversionService, ConfigDataEnvironmentUpdateListener.NONE);
ConfigDataEnvironmentContributor bound = contributor.withBoundProperties(Collections.singleton(contributor),
null);
assertThat(bound).isNotNull();
@ -382,7 +382,8 @@ class ConfigDataEnvironmentContributorTests { @@ -382,7 +382,8 @@ class ConfigDataEnvironmentContributorTests {
private ConfigDataEnvironmentContributor createBoundContributor(ConfigDataResource resource, ConfigData configData,
int propertySourceIndex) {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofUnboundImport(TEST_LOCATION,
resource, false, configData, propertySourceIndex, this.conversionService);
resource, false, configData, propertySourceIndex, this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
return contributor.withBoundProperties(Collections.singleton(contributor), null);
}

53
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2024 the original author or authors.
* Copyright 2012-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -94,7 +94,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -94,7 +94,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService);
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Iterator<ConfigDataEnvironmentContributor> iterator = contributors.iterator();
assertThat(iterator.next()).isSameAs(contributor);
assertThat(iterator.next().getKind()).isEqualTo(Kind.ROOT);
@ -105,7 +106,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -105,7 +106,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofExisting(new MockPropertySource(), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService);
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
ConfigDataEnvironmentContributors withProcessedImports = contributors.withProcessedImports(this.importer,
this.activationContext);
assertThat(withProcessedImports).isSameAs(contributors);
@ -124,7 +126,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -124,7 +126,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService);
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
ConfigDataEnvironmentContributors withProcessedImports = contributors.withProcessedImports(this.importer,
this.activationContext);
Iterator<ConfigDataEnvironmentContributor> iterator = withProcessedImports.iterator();
@ -155,7 +158,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -155,7 +158,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService);
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
ConfigDataEnvironmentContributors withProcessedImports = contributors.withProcessedImports(this.importer,
this.activationContext);
Iterator<ConfigDataEnvironmentContributor> iterator = withProcessedImports.iterator();
@ -183,7 +187,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -183,7 +187,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService);
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
contributors.withProcessedImports(this.importer, this.activationContext);
then(this.importer).should()
.resolveAndLoad(any(),
@ -213,7 +218,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -213,7 +218,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService);
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
ArgumentCaptor<ConfigDataLocationResolverContext> locationResolverContext = ArgumentCaptor
.forClass(ConfigDataLocationResolverContext.class);
contributors.withProcessedImports(this.importer, this.activationContext);
@ -240,7 +246,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -240,7 +246,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService);
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
contributors.withProcessedImports(this.importer, this.activationContext);
then(this.importer).should()
.resolveAndLoad(any(),
@ -265,7 +272,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -265,7 +272,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService);
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
contributors.withProcessedImports(this.importer, this.activationContext);
then(this.importer).should()
.resolveAndLoad(any(), any(),
@ -280,7 +288,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -280,7 +288,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofExisting(propertySource,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService);
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext);
assertThat(binder.bind("test", String.class).get()).isEqualTo("springboot");
}
@ -295,7 +304,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -295,7 +304,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor firstContributor = createBoundImportContributor(configData, 0);
ConfigDataEnvironmentContributor secondContributor = createBoundImportContributor(configData, 1);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService);
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext);
assertThat(binder.bind("test", String.class).get()).isEqualTo("one");
}
@ -311,7 +321,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -311,7 +321,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor firstContributor = createBoundImportContributor(configData, 0);
ConfigDataEnvironmentContributor secondContributor = createBoundImportContributor(configData, 1);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService);
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext);
assertThat(binder.bind("test", String.class).get()).isEqualTo("two");
}
@ -324,7 +335,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -324,7 +335,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofExisting(propertySource,
this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService);
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext);
assertThat(binder.bind("test", String.class).get()).isEqualTo("springboot");
}
@ -341,7 +353,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -341,7 +353,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor firstContributor = createBoundImportContributor(configData, 0);
ConfigDataEnvironmentContributor secondContributor = createBoundImportContributor(configData, 1);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService);
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext);
assertThat(binder.bind("test", String.class).get()).isEqualTo("two");
}
@ -357,7 +370,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -357,7 +370,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor firstContributor = createBoundImportContributor(configData, 0);
ConfigDataEnvironmentContributor secondContributor = createBoundImportContributor(configData, 1);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService);
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE);
assertThatExceptionOfType(BindException.class).isThrownBy(() -> binder.bind("test", String.class))
.satisfies((ex) -> assertThat(ex.getCause()).isInstanceOf(InactiveConfigDataAccessException.class));
@ -374,7 +388,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -374,7 +388,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor firstContributor = createBoundImportContributor(configData, 0);
ConfigDataEnvironmentContributor secondContributor = createBoundImportContributor(configData, 1);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService);
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE);
assertThatExceptionOfType(BindException.class).isThrownBy(() -> binder.bind("test", String.class))
.satisfies((ex) -> assertThat(ex.getCause()).isInstanceOf(InactiveConfigDataAccessException.class));
@ -392,7 +407,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -392,7 +407,8 @@ class ConfigDataEnvironmentContributorsTests {
ConfigDataEnvironmentContributor firstContributor = createBoundImportContributor(configData, 0);
ConfigDataEnvironmentContributor secondContributor = createBoundImportContributor(configData, 1);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService);
this.bootstrapContext, Arrays.asList(firstContributor, secondContributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
Binder binder = contributors.getBinder(this.activationContext, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE);
assertThatExceptionOfType(BindException.class).isThrownBy(() -> binder.bind("test", String.class))
.satisfies((ex) -> assertThat(ex.getCause()).isInstanceOf(InactiveConfigDataAccessException.class));
@ -401,7 +417,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -401,7 +417,8 @@ class ConfigDataEnvironmentContributorsTests {
private ConfigDataEnvironmentContributor createBoundImportContributor(ConfigData configData,
int propertySourceIndex) {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofUnboundImport(null, null,
false, configData, propertySourceIndex, this.conversionService);
false, configData, propertySourceIndex, this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
return contributor.withBoundProperties(Collections.singleton(contributor), null);
}

50
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorTests.java

@ -20,15 +20,13 @@ import java.util.Collections; @@ -20,15 +20,13 @@ import java.util.Collections;
import java.util.function.Supplier;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.DefaultBootstrapContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.TestApplicationEnvironment;
import org.springframework.boot.context.config.ConfigData.Options;
import org.springframework.boot.testsupport.classpath.resources.WithResource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
@ -38,6 +36,7 @@ import static org.mockito.ArgumentMatchers.assertArg; @@ -38,6 +36,7 @@ import static org.mockito.ArgumentMatchers.assertArg;
import static org.mockito.BDDMockito.then;
import static org.mockito.BDDMockito.willReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
/**
* Tests for {@link ConfigDataEnvironmentPostProcessor}.
@ -46,22 +45,19 @@ import static org.mockito.Mockito.mock; @@ -46,22 +45,19 @@ import static org.mockito.Mockito.mock;
* @author Madhura Bhave
* @author Nguyen Bao Sach
*/
@ExtendWith(MockitoExtension.class)
class ConfigDataEnvironmentPostProcessorTests {
private final StandardEnvironment environment = new StandardEnvironment();
private final TestApplicationEnvironment environment = new TestApplicationEnvironment();
private final SpringApplication application = new SpringApplication();
@Mock
private ConfigDataEnvironment configDataEnvironment;
@Spy
private ConfigDataEnvironmentPostProcessor postProcessor = new ConfigDataEnvironmentPostProcessor(Supplier::get,
new DefaultBootstrapContext());
private ConfigDataEnvironmentPostProcessor postProcessor;
@Test
void postProcessEnvironmentWhenNoLoaderCreatesDefaultLoaderInstance() {
setupMocksAndSpies();
willReturn(this.configDataEnvironment).given(this.postProcessor).getConfigDataEnvironment(any(), any(), any());
this.postProcessor.postProcessEnvironment(this.environment, this.application);
then(this.postProcessor).should()
@ -73,6 +69,7 @@ class ConfigDataEnvironmentPostProcessorTests { @@ -73,6 +69,7 @@ class ConfigDataEnvironmentPostProcessorTests {
@Test
void postProcessEnvironmentWhenCustomLoaderUsesSpecifiedLoaderInstance() {
setupMocksAndSpies();
ResourceLoader resourceLoader = mock(ResourceLoader.class);
this.application.setResourceLoader(resourceLoader);
willReturn(this.configDataEnvironment).given(this.postProcessor).getConfigDataEnvironment(any(), any(), any());
@ -85,6 +82,7 @@ class ConfigDataEnvironmentPostProcessorTests { @@ -85,6 +82,7 @@ class ConfigDataEnvironmentPostProcessorTests {
@Test
void postProcessEnvironmentWhenHasAdditionalProfilesOnSpringApplicationUsesAdditionalProfiles() {
setupMocksAndSpies();
this.application.setAdditionalProfiles("dev");
willReturn(this.configDataEnvironment).given(this.postProcessor).getConfigDataEnvironment(any(), any(), any());
this.postProcessor.postProcessEnvironment(this.environment, this.application);
@ -96,6 +94,7 @@ class ConfigDataEnvironmentPostProcessorTests { @@ -96,6 +94,7 @@ class ConfigDataEnvironmentPostProcessorTests {
@Test
void postProcessEnvironmentWhenNoActiveProfiles() {
setupMocksAndSpies();
willReturn(this.configDataEnvironment).given(this.postProcessor).getConfigDataEnvironment(any(), any(), any());
this.postProcessor.postProcessEnvironment(this.environment, this.application);
then(this.postProcessor).should().getConfigDataEnvironment(any(), any(ResourceLoader.class), any());
@ -119,6 +118,35 @@ class ConfigDataEnvironmentPostProcessorTests { @@ -119,6 +118,35 @@ class ConfigDataEnvironmentPostProcessorTests {
.isTrue();
}
@Test
@WithResource(name = "application.properties", content = """
spring.profiles.active=dev
property=value
#---
spring.config.activate.on-profile=dev
property=dev-value1
""")
@WithResource(name = "application-dev.properties", content = "property=dev-value2")
void applyToCanOverrideConfigDataOptions() {
ConfigDataEnvironmentUpdateListener listener = new ConfigDataEnvironmentUpdateListener() {
@Override
public Options onConfigDataOptions(ConfigData configData, PropertySource<?> propertySource,
Options options) {
return options.with(ConfigData.Option.IGNORE_PROFILES);
}
};
ConfigDataEnvironmentPostProcessor.applyTo(this.environment, null, null, Collections.emptyList(), listener);
assertThat(this.environment.getProperty("property")).isEqualTo("value");
assertThat(this.environment.getActiveProfiles()).isEmpty();
}
private void setupMocksAndSpies() {
this.configDataEnvironment = mock(ConfigDataEnvironment.class);
this.postProcessor = spy(new ConfigDataEnvironmentPostProcessor(Supplier::get, new DefaultBootstrapContext()));
}
private boolean hasDevProfile(ConfigDataResource resource) {
return (resource instanceof StandardConfigDataResource standardResource)
&& "dev".equals(standardResource.getProfile());

8
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java

@ -230,7 +230,7 @@ class ConfigDataEnvironmentTests { @@ -230,7 +230,7 @@ class ConfigDataEnvironmentTests {
ConfigData.Option.IGNORE_PROFILES);
contributors.add(ConfigDataEnvironmentContributor.ofUnboundImport(ConfigDataLocation.of("test"),
mock(ConfigDataResource.class), false, data, 0,
ConfigDataEnvironmentTests.this.conversionService));
ConfigDataEnvironmentTests.this.conversionService, ConfigDataEnvironmentUpdateListener.NONE));
return super.createContributors(contributors);
}
@ -255,7 +255,7 @@ class ConfigDataEnvironmentTests { @@ -255,7 +255,7 @@ class ConfigDataEnvironmentTests {
ConfigData data = new ConfigData(Collections.singleton(new MapPropertySource("test", source)));
contributors.add(ConfigDataEnvironmentContributor.ofUnboundImport(ConfigDataLocation.of("test"),
mock(ConfigDataResource.class), false, data, 0,
ConfigDataEnvironmentTests.this.conversionService));
ConfigDataEnvironmentTests.this.conversionService, ConfigDataEnvironmentUpdateListener.NONE));
return super.createContributors(contributors);
}
@ -279,7 +279,7 @@ class ConfigDataEnvironmentTests { @@ -279,7 +279,7 @@ class ConfigDataEnvironmentTests {
ConfigData data = new ConfigData(Collections.singleton(new MapPropertySource("test", source)));
contributors.add(ConfigDataEnvironmentContributor.ofUnboundImport(ConfigDataLocation.of("test"),
mock(ConfigDataResource.class), false, data, 0,
ConfigDataEnvironmentTests.this.conversionService));
ConfigDataEnvironmentTests.this.conversionService, ConfigDataEnvironmentUpdateListener.NONE));
return super.createContributors(contributors);
}
@ -304,7 +304,7 @@ class ConfigDataEnvironmentTests { @@ -304,7 +304,7 @@ class ConfigDataEnvironmentTests {
ConfigData.Option.IGNORE_PROFILES);
contributors.add(ConfigDataEnvironmentContributor.ofUnboundImport(ConfigDataLocation.of("test"),
mock(ConfigDataResource.class), false, data, 0,
ConfigDataEnvironmentTests.this.conversionService));
ConfigDataEnvironmentTests.this.conversionService, ConfigDataEnvironmentUpdateListener.NONE));
return super.createContributors(contributors);
}

Loading…
Cancel
Save