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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
protected ConfigDataEnvironmentContributors createContributors(
|
||||
List<ConfigDataEnvironmentContributor> contributors) {
|
||||
return new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, contributors,
|
||||
this.environment.getConversionService());
|
||||
this.environment.getConversionService(), this.environmentUpdateListener);
|
||||
}
|
||||
|
||||
ConfigDataEnvironmentContributors getContributors() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
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;
|
||||
* @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 {
|
||||
|
||||
@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 {
|
||||
|
||||
@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 {
|
||||
|
||||
@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 {
|
||||
.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());
|
||||
|
||||
@@ -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 {
|
||||
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 {
|
||||
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 {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user