diff --git a/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java b/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java index 6c5a71974f5..c44f5d622f4 100644 --- a/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java +++ b/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java @@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.SpringProperties; import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import static java.lang.String.*; @@ -103,9 +104,9 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { protected final Log logger = LogFactory.getLog(getClass()); - private Set activeProfiles = new LinkedHashSet(); + private final Set activeProfiles = new LinkedHashSet(); - private Set defaultProfiles = new LinkedHashSet(getReservedDefaultProfiles()); + private final Set defaultProfiles = new LinkedHashSet(getReservedDefaultProfiles()); private final MutablePropertySources propertySources = new MutablePropertySources(this.logger); @@ -237,22 +238,26 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { * @see #ACTIVE_PROFILES_PROPERTY_NAME */ protected Set doGetActiveProfiles() { - if (this.activeProfiles.isEmpty()) { - String profiles = getProperty(ACTIVE_PROFILES_PROPERTY_NAME); - if (StringUtils.hasText(profiles)) { - setActiveProfiles(commaDelimitedListToStringArray(trimAllWhitespace(profiles))); + synchronized (this.activeProfiles) { + if (this.activeProfiles.isEmpty()) { + String profiles = getProperty(ACTIVE_PROFILES_PROPERTY_NAME); + if (StringUtils.hasText(profiles)) { + setActiveProfiles(commaDelimitedListToStringArray(trimAllWhitespace(profiles))); + } } + return this.activeProfiles; } - return this.activeProfiles; } @Override public void setActiveProfiles(String... profiles) { Assert.notNull(profiles, "Profile array must not be null"); - this.activeProfiles.clear(); - for (String profile : profiles) { - validateProfile(profile); - this.activeProfiles.add(profile); + synchronized (this.activeProfiles) { + this.activeProfiles.clear(); + for (String profile : profiles) { + validateProfile(profile); + this.activeProfiles.add(profile); + } } } @@ -263,7 +268,9 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { } validateProfile(profile); doGetActiveProfiles(); - this.activeProfiles.add(profile); + synchronized (this.activeProfiles) { + this.activeProfiles.add(profile); + } } @@ -285,13 +292,15 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { * @see #getReservedDefaultProfiles() */ protected Set doGetDefaultProfiles() { - if (this.defaultProfiles.equals(getReservedDefaultProfiles())) { - String profiles = getProperty(DEFAULT_PROFILES_PROPERTY_NAME); - if (StringUtils.hasText(profiles)) { - setDefaultProfiles(commaDelimitedListToStringArray(trimAllWhitespace(profiles))); + synchronized (this.defaultProfiles) { + if (this.defaultProfiles.equals(getReservedDefaultProfiles())) { + String profiles = getProperty(DEFAULT_PROFILES_PROPERTY_NAME); + if (StringUtils.hasText(profiles)) { + setDefaultProfiles(commaDelimitedListToStringArray(trimAllWhitespace(profiles))); + } } + return this.defaultProfiles; } - return this.defaultProfiles; } /** @@ -305,10 +314,12 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { @Override public void setDefaultProfiles(String... profiles) { Assert.notNull(profiles, "Profile array must not be null"); - this.defaultProfiles.clear(); - for (String profile : profiles) { - validateProfile(profile); - this.defaultProfiles.add(profile); + synchronized (this.defaultProfiles) { + this.defaultProfiles.clear(); + for (String profile : profiles) { + validateProfile(profile); + this.defaultProfiles.add(profile); + } } } @@ -316,7 +327,7 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { public boolean acceptsProfiles(String... profiles) { Assert.notEmpty(profiles, "Must specify at least one profile"); for (String profile : profiles) { - if (profile != null && profile.length() > 0 && profile.charAt(0) == '!') { + if (StringUtils.hasLength(profile) && profile.charAt(0) == '!') { if (!isProfileActive(profile.substring(1))) { return true; } @@ -335,8 +346,9 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { */ protected boolean isProfileActive(String profile) { validateProfile(profile); - return doGetActiveProfiles().contains(profile) || - (doGetActiveProfiles().isEmpty() && doGetDefaultProfiles().contains(profile)); + Set currentActiveProfiles = doGetActiveProfiles(); + return (currentActiveProfiles.contains(profile) || + (currentActiveProfiles.isEmpty() && doGetDefaultProfiles().contains(profile))); } /** @@ -364,7 +376,7 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { } @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({"unchecked", "rawtypes"}) public Map getSystemEnvironment() { if (suppressGetenvAccess()) { return Collections.emptyMap(); @@ -408,7 +420,7 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { } @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({"unchecked", "rawtypes"}) public Map getSystemProperties() { try { return (Map) System.getProperties(); @@ -440,13 +452,21 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { this.propertySources.addLast(ps); } } - for (String profile : parent.getActiveProfiles()) { - this.activeProfiles.add(profile); + String[] parentActiveProfiles = parent.getActiveProfiles(); + if (!ObjectUtils.isEmpty(parentActiveProfiles)) { + synchronized (this.activeProfiles) { + for (String profile : parentActiveProfiles) { + this.activeProfiles.add(profile); + } + } } - if (parent.getDefaultProfiles().length > 0) { - this.defaultProfiles.remove(RESERVED_DEFAULT_PROFILE_NAME); - for (String profile : parent.getDefaultProfiles()) { - this.defaultProfiles.add(profile); + String[] parentDefaultProfiles = parent.getDefaultProfiles(); + if (!ObjectUtils.isEmpty(parentDefaultProfiles)) { + synchronized (this.defaultProfiles) { + this.defaultProfiles.remove(RESERVED_DEFAULT_PROFILE_NAME); + for (String profile : parentDefaultProfiles) { + this.defaultProfiles.add(profile); + } } } }