SystemEnvironmentPropertySource replaces hyphens in property names as well
Issue: SPR-13594
This commit is contained in:
parent
07fd7b905e
commit
95d62658ff
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -24,8 +24,8 @@ import org.springframework.util.Assert;
|
|||
* Specialization of {@link MapPropertySource} designed for use with
|
||||
* {@linkplain AbstractEnvironment#getSystemEnvironment() system environment variables}.
|
||||
* Compensates for constraints in Bash and other shells that do not allow for variables
|
||||
* containing the period character; also allows for uppercase variations on property
|
||||
* names for more idiomatic shell use.
|
||||
* containing the period character and/or hyphen character; also allows for uppercase
|
||||
* variations on property names for more idiomatic shell use.
|
||||
*
|
||||
* <p>For example, a call to {@code getProperty("foo.bar")} will attempt to find a value
|
||||
* for the original property or any 'equivalent' property, returning the first found:
|
||||
|
|
@ -35,8 +35,9 @@ import org.springframework.util.Assert;
|
|||
* <li>{@code FOO.BAR} - original, with upper case</li>
|
||||
* <li>{@code FOO_BAR} - with underscores and upper case</li>
|
||||
* </ul>
|
||||
* Any hyphen variant of the above would work as well, or even mix dot/hyphen variants.
|
||||
*
|
||||
* The same applies for calls to {@link #containsProperty(String)}, which returns
|
||||
* <p>The same applies for calls to {@link #containsProperty(String)}, which returns
|
||||
* {@code true} if any of the above properties are present, otherwise {@code false}.
|
||||
*
|
||||
* <p>This feature is particularly useful when specifying active or default profiles as
|
||||
|
|
@ -102,29 +103,42 @@ public class SystemEnvironmentPropertySource extends MapPropertySource {
|
|||
*/
|
||||
private String resolvePropertyName(String name) {
|
||||
Assert.notNull(name, "Property name must not be null");
|
||||
String resolvedName = checkPropertyName(name);
|
||||
if (resolvedName != null) {
|
||||
return resolvedName;
|
||||
}
|
||||
String uppercasedName = name.toUpperCase();
|
||||
if (!name.equals(uppercasedName)) {
|
||||
resolvedName = checkPropertyName(uppercasedName);
|
||||
if (resolvedName != null) {
|
||||
return resolvedName;
|
||||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
private String checkPropertyName(String name) {
|
||||
// Check name as-is
|
||||
if (containsKey(name)) {
|
||||
return name;
|
||||
}
|
||||
|
||||
String usName = name.replace('.', '_');
|
||||
if (!name.equals(usName) && containsKey(usName)) {
|
||||
return usName;
|
||||
// Check name with just dots replaced
|
||||
String noDotName = name.replace('.', '_');
|
||||
if (!name.equals(noDotName) && containsKey(noDotName)) {
|
||||
return noDotName;
|
||||
}
|
||||
|
||||
String ucName = name.toUpperCase();
|
||||
if (!name.equals(ucName)) {
|
||||
if (containsKey(ucName)) {
|
||||
return ucName;
|
||||
// Check name with just hyphens replaced
|
||||
String noHyphenName = name.replace('-', '_');
|
||||
if (!name.equals(noHyphenName) && containsKey(noHyphenName)) {
|
||||
return noHyphenName;
|
||||
}
|
||||
else {
|
||||
String usUcName = ucName.replace('.', '_');
|
||||
if (!ucName.equals(usUcName) && containsKey(usUcName)) {
|
||||
return usUcName;
|
||||
// Check name with dots and hyphens replaced
|
||||
String noDotNoHyphenName = noDotName.replace('-', '_');
|
||||
if (!noDotName.equals(noDotNoHyphenName) && containsKey(noDotNoHyphenName)) {
|
||||
return noDotNoHyphenName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return name;
|
||||
// Give up
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean containsKey(String name) {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -93,16 +93,59 @@ public class SystemEnvironmentPropertySourceTests {
|
|||
@Test
|
||||
public void withUppercase() {
|
||||
envMap.put("A_KEY", "a_value");
|
||||
envMap.put("A_LONG_KEY", "a_long_value");
|
||||
envMap.put("A_DOT.KEY", "a_dot_value");
|
||||
envMap.put("A_HYPHEN-KEY", "a_hyphen_value");
|
||||
|
||||
assertThat(ps.containsProperty("A_KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("a_key"), equalTo(true));
|
||||
assertThat(ps.containsProperty("a.key"), equalTo(true));
|
||||
assertThat(ps.containsProperty("a-key"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A_LONG_KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A.LONG.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A-LONG-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A.LONG-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A-LONG.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A_long_KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A.long.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A-long-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A.long-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A-long.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A_DOT.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A-DOT.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A_dot.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A-dot.KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A_HYPHEN-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A.HYPHEN-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A_hyphen-KEY"), equalTo(true));
|
||||
assertThat(ps.containsProperty("A.hyphen-KEY"), equalTo(true));
|
||||
|
||||
assertThat(ps.getProperty("A_KEY"), equalTo((Object)"a_value"));
|
||||
assertThat(ps.getProperty("A.KEY"), equalTo((Object)"a_value"));
|
||||
assertThat(ps.getProperty("a_key"), equalTo((Object)"a_value"));
|
||||
assertThat(ps.getProperty("a.key"), equalTo((Object)"a_value"));
|
||||
assertThat(ps.getProperty("A_KEY"), equalTo("a_value"));
|
||||
assertThat(ps.getProperty("A.KEY"), equalTo("a_value"));
|
||||
assertThat(ps.getProperty("A-KEY"), equalTo("a_value"));
|
||||
assertThat(ps.getProperty("a_key"), equalTo("a_value"));
|
||||
assertThat(ps.getProperty("a.key"), equalTo("a_value"));
|
||||
assertThat(ps.getProperty("a-key"), equalTo("a_value"));
|
||||
assertThat(ps.getProperty("A_LONG_KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A.LONG.KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A-LONG-KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A.LONG-KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A-LONG.KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A_long_KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A.long.KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A-long-KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A.long-KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A-long.KEY"), equalTo("a_long_value"));
|
||||
assertThat(ps.getProperty("A_DOT.KEY"), equalTo("a_dot_value"));
|
||||
assertThat(ps.getProperty("A-DOT.KEY"), equalTo("a_dot_value"));
|
||||
assertThat(ps.getProperty("A_dot.KEY"), equalTo("a_dot_value"));
|
||||
assertThat(ps.getProperty("A-dot.KEY"), equalTo("a_dot_value"));
|
||||
assertThat(ps.getProperty("A_HYPHEN-KEY"), equalTo("a_hyphen_value"));
|
||||
assertThat(ps.getProperty("A.HYPHEN-KEY"), equalTo("a_hyphen_value"));
|
||||
assertThat(ps.getProperty("A_hyphen-KEY"), equalTo("a_hyphen_value"));
|
||||
assertThat(ps.getProperty("A.hyphen-KEY"), equalTo("a_hyphen_value"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
Loading…
Reference in New Issue