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 * Return the set of active profiles as explicitly set through
* {@link #setActiveProfiles} or if the current set of active profiles * {@link #setActiveProfiles} or if the current set of active profiles
* is empty, check for the presence of the {@value #ACTIVE_PROFILES_PROPERTY_NAME} * is empty, check for the presence of {@link #doGetActiveProfilesProperty()}
* property and assign its value to the set of active profiles. * and assign its value to the set of active profiles.
* @see #getActiveProfiles() * @see #getActiveProfiles()
* @see #ACTIVE_PROFILES_PROPERTY_NAME * @see #doGetActiveProfilesProperty()
*/ */
protected Set<String> doGetActiveProfiles() { protected Set<String> doGetActiveProfiles() {
synchronized (this.activeProfiles) { synchronized (this.activeProfiles) {
if (this.activeProfiles.isEmpty()) { if (this.activeProfiles.isEmpty()) {
String profiles = getProperty(ACTIVE_PROFILES_PROPERTY_NAME); String profiles = doGetActiveProfilesProperty();
if (StringUtils.hasText(profiles)) { if (StringUtils.hasText(profiles)) {
setActiveProfiles(StringUtils.commaDelimitedListToStringArray( setActiveProfiles(StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(profiles))); 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 @Override
public void setActiveProfiles(String... profiles) { public void setActiveProfiles(String... profiles) {
Assert.notNull(profiles, "Profile array must not be null"); 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 * Return the set of default profiles explicitly set via
* {@link #setDefaultProfiles(String...)} or if the current set of default profiles * {@link #setDefaultProfiles(String...)} or if the current set of default profiles
* consists only of {@linkplain #getReservedDefaultProfiles() reserved default * consists only of {@linkplain #getReservedDefaultProfiles() reserved default
* profiles}, then check for the presence of the * profiles}, then check for the presence of {@link #doGetActiveProfilesProperty()}
* {@value #DEFAULT_PROFILES_PROPERTY_NAME} property and assign its value (if any) * and assign its value (if any) to the set of default profiles.
* to the set of default profiles.
* @see #AbstractEnvironment() * @see #AbstractEnvironment()
* @see #getDefaultProfiles() * @see #getDefaultProfiles()
* @see #DEFAULT_PROFILES_PROPERTY_NAME
* @see #getReservedDefaultProfiles() * @see #getReservedDefaultProfiles()
* @see #doGetDefaultProfilesProperty()
*/ */
protected Set<String> doGetDefaultProfiles() { protected Set<String> doGetDefaultProfiles() {
synchronized (this.defaultProfiles) { synchronized (this.defaultProfiles) {
if (this.defaultProfiles.equals(getReservedDefaultProfiles())) { if (this.defaultProfiles.equals(getReservedDefaultProfiles())) {
String profiles = getProperty(DEFAULT_PROFILES_PROPERTY_NAME); String profiles = doGetDefaultProfilesProperty();
if (StringUtils.hasText(profiles)) { if (StringUtils.hasText(profiles)) {
setDefaultProfiles(StringUtils.commaDelimitedListToStringArray( setDefaultProfiles(StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(profiles))); 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 * Specify the set of profiles to be made active by default if no other profiles
* are explicitly made active through {@link #setActiveProfiles}. * 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.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set; import java.util.Set;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -105,6 +107,30 @@ class CustomEnvironmentTests {
assertThat(env.acceptsProfiles(Profiles.of("a1 | a2"))).isFalse(); 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() { private Profiles defaultProfile() {
return Profiles.of(AbstractEnvironment.RESERVED_DEFAULT_PROFILE_NAME); return Profiles.of(AbstractEnvironment.RESERVED_DEFAULT_PROFILE_NAME);
} }