Browse Source

Merge pull request #49324 from qnnn

* pr/49324:
  Polish 'Fix inconsistent ordering of config imports'
  Fix inconsistent ordering of config imports

Closes gh-49324
pull/49591/head
Phillip Webb 2 weeks ago
parent
commit
a80fce72b0
  1. 16
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java
  2. 8
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java
  3. 13
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java
  4. 28
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java
  5. 20
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java
  6. 2
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java

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

@ -57,6 +57,7 @@ import org.springframework.util.StringUtils; @@ -57,6 +57,7 @@ import org.springframework.util.StringUtils;
*
* @author Phillip Webb
* @author Madhura Bhave
* @author Nan Chiu
*/
class ConfigDataEnvironment {
@ -211,14 +212,17 @@ class ConfigDataEnvironment { @@ -211,14 +212,17 @@ class ConfigDataEnvironment {
private void addInitialImportContributors(List<ConfigDataEnvironmentContributor> initialContributors,
ConfigDataLocation[] locations) {
for (int i = locations.length - 1; i >= 0; i--) {
initialContributors.add(createInitialImportContributor(locations[i]));
}
addInitialImportContributors(initialContributors, List.of(locations));
}
private ConfigDataEnvironmentContributor createInitialImportContributor(ConfigDataLocation location) {
this.logger.trace(LogMessage.format("Adding initial config data import from location '%s'", location));
return ConfigDataEnvironmentContributor.ofInitialImport(location, this.environment.getConversionService());
private void addInitialImportContributors(List<ConfigDataEnvironmentContributor> initialContributors,
List<ConfigDataLocation> locations) {
if (!locations.isEmpty()) {
this.logger.trace(LogMessage.format("Adding initial config data import from locations %s", locations));
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(locations,
this.environment.getConversionService());
initialContributors.add(contributor);
}
}
/**

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

@ -52,6 +52,7 @@ import org.springframework.util.CollectionUtils; @@ -52,6 +52,7 @@ import org.springframework.util.CollectionUtils;
*
* @author Phillip Webb
* @author Madhura Bhave
* @author Nan Chiu
*/
class ConfigDataEnvironmentContributor implements Iterable<ConfigDataEnvironmentContributor> {
@ -392,14 +393,13 @@ class ConfigDataEnvironmentContributor implements Iterable<ConfigDataEnvironment @@ -392,14 +393,13 @@ class ConfigDataEnvironmentContributor implements Iterable<ConfigDataEnvironment
* Factory method to create a {@link Kind#INITIAL_IMPORT initial import} contributor.
* This contributor is used to trigger initial imports of additional contributors. It
* does not contribute any properties itself.
* @param initialImport the initial import location (with placeholders resolved)
* @param initialImports the initial import locations (with placeholders resolved)
* @param conversionService the conversion service to use
* @return a new {@link ConfigDataEnvironmentContributor} instance
*/
static ConfigDataEnvironmentContributor ofInitialImport(ConfigDataLocation initialImport,
static ConfigDataEnvironmentContributor ofInitialImports(List<ConfigDataLocation> initialImports,
ConversionService conversionService) {
List<ConfigDataLocation> imports = Collections.singletonList(initialImport);
ConfigDataProperties properties = new ConfigDataProperties(imports, null);
ConfigDataProperties properties = new ConfigDataProperties(initialImports, null);
return new ConfigDataEnvironmentContributor(Kind.INITIAL_IMPORT, null, null, false, null, null, properties,
null, null, conversionService);
}

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

@ -44,11 +44,14 @@ import static org.mockito.Mockito.mock; @@ -44,11 +44,14 @@ import static org.mockito.Mockito.mock;
* @author Phillip Webb
* @author Madhura Bhave
* @author Scott Frederick
* @author Nan Chiu
*/
class ConfigDataEnvironmentContributorTests {
private static final ConfigDataLocation TEST_LOCATION = ConfigDataLocation.of("test");
private static final List<ConfigDataLocation> TEST_LOCATIONS = List.of(TEST_LOCATION);
private final ConfigDataActivationContext activationContext = new ConfigDataActivationContext(
CloudPlatform.KUBERNETES, null);
@ -56,14 +59,14 @@ class ConfigDataEnvironmentContributorTests { @@ -56,14 +59,14 @@ class ConfigDataEnvironmentContributorTests {
@Test
void getKindReturnsKind() {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION,
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS,
this.conversionService);
assertThat(contributor.getKind()).isEqualTo(Kind.INITIAL_IMPORT);
}
@Test
void isActiveWhenPropertiesIsNullReturnsTrue() {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION,
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS,
this.conversionService);
assertThat(contributor.isActive(null)).isTrue();
}
@ -286,12 +289,12 @@ class ConfigDataEnvironmentContributorTests { @@ -286,12 +289,12 @@ class ConfigDataEnvironmentContributorTests {
}
@Test
void ofInitialImportCreatedInitialImportContributor() {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION,
void ofInitialImportsCreatedInitialImportContributor() {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS,
this.conversionService);
assertThat(contributor.getKind()).isEqualTo(Kind.INITIAL_IMPORT);
assertThat(contributor.getResource()).isNull();
assertThat(contributor.getImports()).containsExactly(TEST_LOCATION);
assertThat(contributor.getImports()).isEqualTo(TEST_LOCATIONS);
assertThat(contributor.isActive(this.activationContext)).isTrue();
assertThat(contributor.getPropertySource()).isNull();
assertThat(contributor.getConfigurationPropertySource()).isNull();

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

@ -91,8 +91,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -91,8 +91,8 @@ class ConfigDataEnvironmentContributorsTests {
@Test
void createCreatesWithInitialContributors() {
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
@ -123,8 +123,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -123,8 +123,8 @@ class ConfigDataEnvironmentContributorsTests {
new ConfigData(List.of(propertySource)));
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
.willReturn(imported);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
@ -155,8 +155,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -155,8 +155,8 @@ class ConfigDataEnvironmentContributorsTests {
new ConfigData(List.of(secondPropertySource)));
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(secondLocations)))
.willReturn(secondImported);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
@ -184,8 +184,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -184,8 +184,8 @@ class ConfigDataEnvironmentContributorsTests {
new ConfigData(List.of(propertySource)));
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
.willReturn(imported);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
@ -215,8 +215,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -215,8 +215,8 @@ class ConfigDataEnvironmentContributorsTests {
new ConfigData(List.of(secondPropertySource)));
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(secondLocations)))
.willReturn(secondImported);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, List.of(contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
@ -243,8 +243,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -243,8 +243,8 @@ class ConfigDataEnvironmentContributorsTests {
new ConfigData(List.of(propertySource)));
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
.willReturn(imported);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);
@ -269,8 +269,8 @@ class ConfigDataEnvironmentContributorsTests { @@ -269,8 +269,8 @@ class ConfigDataEnvironmentContributorsTests {
new ConfigData(List.of(propertySource)));
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
.willReturn(imported);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
this.conversionService);
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
ConfigDataEnvironmentUpdateListener.NONE);

20
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java

@ -78,6 +78,7 @@ import static org.assertj.core.api.Assertions.assertThatNoException; @@ -78,6 +78,7 @@ import static org.assertj.core.api.Assertions.assertThatNoException;
*
* @author Madhura Bhave
* @author Phillip Webb
* @author Nan Chiu
*/
class ConfigDataEnvironmentPostProcessorIntegrationTests {
@ -330,6 +331,25 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests { @@ -330,6 +331,25 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests {
assertThat(property).isEqualTo("frommyprofilepropertiesfile");
}
@Test
@WithResource(name = "testproperties-1.properties", content = """
my.property=fromtestproperties-1.properties
""")
@WithResource(name = "testproperties-1-myprofile.properties", content = """
my.property=fromtestproperties-1-myprofile.properties
""")
@WithResource(name = "testproperties-2.properties", content = """
my.property=fromtestproperties-2.properties
""")
void runWhenHasImportPropertyWithProfileSpecificFileTakesPrecedence() {
ConfigurableApplicationContext context = this.application.run(
"--spring.config.import=classpath:testproperties-1.properties,classpath:testproperties-2.properties",
"--spring.profiles.active=myprofile");
ConfigurableEnvironment environment = context.getEnvironment();
String property = environment.getProperty("my.property");
assertThat(property).isEqualTo("fromtestproperties-1-myprofile.properties");
}
@Test
void runWhenHasLocalFileLoadsWithLocalFileTakingPrecedenceOverClasspath() throws Exception {
File localFile = new File(new File("."), "application.properties");

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

@ -144,7 +144,7 @@ class ConfigDataEnvironmentTests { @@ -144,7 +144,7 @@ class ConfigDataEnvironmentTests {
.map(ConfigDataEnvironmentContributor::getImports)
.map(Object::toString)
.toArray();
assertThat(imports).containsExactly("[i2]", "[i1]", "[a2]", "[a1]", "[l2]", "[l1]");
assertThat(imports).containsExactly("[i1, i2]", "[a1, a2]", "[l1, l2]");
}
@Test

Loading…
Cancel
Save