Merge branch '2.4.x'

Closes gh-26581
Closes gh-26582
Closes gh-26583
pull/26586/head
Phillip Webb 4 years ago
commit ba0fe1edbd

@ -19,6 +19,7 @@ package org.springframework.boot.context.config;
import java.io.File; import java.io.File;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Deque; import java.util.Deque;
@ -27,6 +28,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -244,17 +246,31 @@ public class StandardConfigDataLocationResolver
Set<StandardConfigDataReference> references) { Set<StandardConfigDataReference> references) {
Set<StandardConfigDataResource> empty = new LinkedHashSet<>(); Set<StandardConfigDataResource> empty = new LinkedHashSet<>();
for (StandardConfigDataReference reference : references) { for (StandardConfigDataReference reference : references) {
if (reference.isMandatoryDirectory()) { empty.addAll(resolveEmptyDirectories(reference));
Resource resource = this.resourceLoader.getResource(reference.getDirectory());
if (resource instanceof ClassPathResource) {
continue;
} }
StandardConfigDataResource configDataResource = new StandardConfigDataResource(reference, resource); return empty;
ConfigDataResourceNotFoundException.throwIfDoesNotExist(configDataResource, resource);
empty.add(new StandardConfigDataResource(reference, resource, true));
} }
private Set<StandardConfigDataResource> resolveEmptyDirectories(StandardConfigDataReference reference) {
if (!this.resourceLoader.isPattern(reference.getResourceLocation())) {
return resolveNonPatternEmptyDirectories(reference);
} }
return empty; return resolvePatternEmptyDirectories(reference);
}
private Set<StandardConfigDataResource> resolveNonPatternEmptyDirectories(StandardConfigDataReference reference) {
Resource resource = this.resourceLoader.getResource(reference.getDirectory());
return (resource instanceof ClassPathResource || !resource.exists()) ? Collections.emptySet()
: Collections.singleton(new StandardConfigDataResource(reference, resource, true));
}
private Set<StandardConfigDataResource> resolvePatternEmptyDirectories(StandardConfigDataReference reference) {
Resource[] resources = this.resourceLoader.getResources(reference.getDirectory(), ResourceType.DIRECTORY);
Assert.state(resources.length > 0,
"No subdirectories found for mandatory directory location '" + reference.getDirectory() + "'.");
return Arrays.stream(resources).filter(Resource::exists)
.map((resource) -> new StandardConfigDataResource(reference, resource, true))
.collect(Collectors.toCollection(LinkedHashSet::new));
} }
private List<StandardConfigDataResource> resolve(StandardConfigDataReference reference) { private List<StandardConfigDataResource> resolve(StandardConfigDataReference reference) {

@ -547,7 +547,7 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests {
@Test @Test
void runWhenConfigLocationHasNonOptionalMissingFileDirectoryThrowsResourceNotFoundException() { void runWhenConfigLocationHasNonOptionalMissingFileDirectoryThrowsResourceNotFoundException() {
File location = new File(this.temp, "application.unknown"); File location = new File(this.temp, "application.unknown");
assertThatExceptionOfType(ConfigDataResourceNotFoundException.class).isThrownBy(() -> this.application assertThatExceptionOfType(ConfigDataLocationNotFoundException.class).isThrownBy(() -> this.application
.run("--spring.config.location=" + StringUtils.cleanPath(location.getAbsolutePath()) + "/")); .run("--spring.config.location=" + StringUtils.cleanPath(location.getAbsolutePath()) + "/"));
} }
@ -566,6 +566,12 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests {
.run("--spring.config.location=" + StringUtils.cleanPath(location.getAbsolutePath()) + "/")); .run("--spring.config.location=" + StringUtils.cleanPath(location.getAbsolutePath()) + "/"));
} }
@Test
void runWhenConfigLocationHasMandatoryDirectoryThatDoesntExistThrowsException() {
assertThatExceptionOfType(ConfigDataLocationNotFoundException.class).isThrownBy(
() -> this.application.run("--spring.config.location=" + StringUtils.cleanPath("invalid/")));
}
@Test @Test
void runWhenConfigLocationHasNonOptionalEmptyFileDoesNotThrowException() throws IOException { void runWhenConfigLocationHasNonOptionalEmptyFileDoesNotThrowException() throws IOException {
File location = new File(this.temp, "application.properties"); File location = new File(this.temp, "application.properties");
@ -686,13 +692,32 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests {
@Test @Test
void runWhenHasWildcardLocationLoadsFromAllMatchingLocations() { void runWhenHasWildcardLocationLoadsFromAllMatchingLocations() {
ConfigurableApplicationContext context = this.application.run( ConfigurableApplicationContext context = this.application.run(
"--spring.config.location=optional:file:src/test/resources/config/*/", "--spring.config.location=file:src/test/resources/config/*/", "--spring.config.name=testproperties");
"--spring.config.name=testproperties");
ConfigurableEnvironment environment = context.getEnvironment(); ConfigurableEnvironment environment = context.getEnvironment();
assertThat(environment.getProperty("first.property")).isEqualTo("apple"); assertThat(environment.getProperty("first.property")).isEqualTo("apple");
assertThat(environment.getProperty("second.property")).isEqualTo("ball"); assertThat(environment.getProperty("second.property")).isEqualTo("ball");
} }
@Test
void runWhenMandatoryWildcardLocationHasEmptyFileDirectory() {
assertThatNoException()
.isThrownBy(() -> this.application.run("--spring.config.location=file:src/test/resources/config/*/"));
}
@Test
void runWhenMandatoryWildcardLocationHasNoSubdirectories() {
assertThatIllegalStateException().isThrownBy(
() -> this.application.run("--spring.config.location=file:src/test/resources/config/0-empty/*/"))
.withMessage(
"No subdirectories found for mandatory directory location 'file:src/test/resources/config/0-empty/*/'.");
}
@Test
void runWhenHasMandatoryWildcardLocationThatDoesNotExist() {
assertThatExceptionOfType(ConfigDataLocationNotFoundException.class)
.isThrownBy(() -> this.application.run("--spring.config.location=file:invalid/*/"));
}
@Test // gh-24990 @Test // gh-24990
void runWhenHasProfileSpecificFileWithActiveOnProfileProperty() { void runWhenHasProfileSpecificFileWithActiveOnProfileProperty() {
ConfigurableApplicationContext context = this.application ConfigurableApplicationContext context = this.application

Loading…
Cancel
Save