Allow bypass of active/default properties

Introduce protected methods that can be used to bypass or change the
way that active and default property values are read.

See gh-26461
This commit is contained in:
Phillip Webb 2021-01-27 15:21:30 -08:00 committed by Stephane Nicoll
parent 9c6b1b645d
commit da3ff29e88
2 changed files with 52 additions and 9 deletions

View File

@ -227,15 +227,15 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment {
/**
* Return the set of active profiles as explicitly set through
* {@link #setActiveProfiles} or if the current set of active profiles
* is empty, check for the presence of the {@value #ACTIVE_PROFILES_PROPERTY_NAME}
* property and assign its value to the set of active profiles.
* is empty, check for the presence of {@link #doGetActiveProfilesProperty()}
* and assign its value to the set of active profiles.
* @see #getActiveProfiles()
* @see #ACTIVE_PROFILES_PROPERTY_NAME
* @see #doGetActiveProfilesProperty()
*/
protected Set<String> doGetActiveProfiles() {
synchronized (this.activeProfiles) {
if (this.activeProfiles.isEmpty()) {
String profiles = getProperty(ACTIVE_PROFILES_PROPERTY_NAME);
String profiles = doGetActiveProfilesProperty();
if (StringUtils.hasText(profiles)) {
setActiveProfiles(StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(profiles)));
@ -245,6 +245,15 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment {
}
}
/**
* Return the property value for the active profiles.
* @see #ACTIVE_PROFILES_PROPERTY_NAME
* @since 5.3.4
*/
protected String doGetActiveProfilesProperty() {
return getProperty(ACTIVE_PROFILES_PROPERTY_NAME);
}
@Override
public void setActiveProfiles(String... profiles) {
Assert.notNull(profiles, "Profile array must not be null");
@ -282,18 +291,17 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment {
* Return the set of default profiles explicitly set via
* {@link #setDefaultProfiles(String...)} or if the current set of default profiles
* consists only of {@linkplain #getReservedDefaultProfiles() reserved default
* profiles}, then check for the presence of the
* {@value #DEFAULT_PROFILES_PROPERTY_NAME} property and assign its value (if any)
* to the set of default profiles.
* profiles}, then check for the presence of {@link #doGetActiveProfilesProperty()}
* and assign its value (if any) to the set of default profiles.
* @see #AbstractEnvironment()
* @see #getDefaultProfiles()
* @see #DEFAULT_PROFILES_PROPERTY_NAME
* @see #getReservedDefaultProfiles()
* @see #doGetDefaultProfilesProperty()
*/
protected Set<String> doGetDefaultProfiles() {
synchronized (this.defaultProfiles) {
if (this.defaultProfiles.equals(getReservedDefaultProfiles())) {
String profiles = getProperty(DEFAULT_PROFILES_PROPERTY_NAME);
String profiles = doGetDefaultProfilesProperty();
if (StringUtils.hasText(profiles)) {
setDefaultProfiles(StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(profiles)));
@ -303,6 +311,15 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment {
}
}
/**
* Return the property value for the default profiles.
* @see #DEFAULT_PROFILES_PROPERTY_NAME
* @since 5.3.4
*/
protected String doGetDefaultProfilesProperty() {
return getProperty(DEFAULT_PROFILES_PROPERTY_NAME);
}
/**
* Specify the set of profiles to be made active by default if no other profiles
* are explicitly made active through {@link #setActiveProfiles}.

View File

@ -18,6 +18,8 @@ package org.springframework.core.env;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.junit.jupiter.api.Test;
@ -105,6 +107,30 @@ class CustomEnvironmentTests {
assertThat(env.acceptsProfiles(Profiles.of("a1 | a2"))).isFalse();
}
@Test
public void withNoProfileProperties() {
ConfigurableEnvironment env = new AbstractEnvironment() {
@Override
protected String doGetActiveProfilesProperty() {
return null;
}
@Override
protected String doGetDefaultProfilesProperty() {
return null;
}
};
Map<String, Object> values = new LinkedHashMap<>();
values.put(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "a,b,c");
values.put(AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME, "d,e,f");
PropertySource<?> propertySource = new MapPropertySource("test", values);
env.getPropertySources().addFirst(propertySource);
assertThat(env.getActiveProfiles()).isEmpty();
assertThat(env.getDefaultProfiles()).containsExactly(AbstractEnvironment.RESERVED_DEFAULT_PROFILE_NAME);
}
private Profiles defaultProfile() {
return Profiles.of(AbstractEnvironment.RESERVED_DEFAULT_PROFILE_NAME);
}