Commit 47c19281 authored by Phillip Webb's avatar Phillip Webb

Polish 'Optimize SystemEnvironmentPropertyMapper'

Introduce a new `ConfigurationPropertyName.ofIfValid` method to
save us needing to throw and catch an exception unnecessarily.

See gh-21523
parent 0378de7b
...@@ -510,6 +510,18 @@ public final class ConfigurationPropertyName implements Comparable<Configuration ...@@ -510,6 +510,18 @@ public final class ConfigurationPropertyName implements Comparable<Configuration
return of(name, false); return of(name, false);
} }
/**
* Return a {@link ConfigurationPropertyName} for the specified string or {@code null}
* if the name is not valid.
* @param name the source name
* @return a {@link ConfigurationPropertyName} instance
* @throws InvalidConfigurationPropertyNameException if the name is not valid
* @since 2.3.1
*/
public static ConfigurationPropertyName ofIfValid(CharSequence name) {
return of(name, true);
}
/** /**
* Return a {@link ConfigurationPropertyName} for the specified string. * Return a {@link ConfigurationPropertyName} for the specified string.
* @param name the source name * @param name the source name
......
...@@ -116,16 +116,11 @@ final class SystemEnvironmentPropertyMapper implements PropertyMapper { ...@@ -116,16 +116,11 @@ final class SystemEnvironmentPropertyMapper implements PropertyMapper {
if (!hasDashedEntries(name)) { if (!hasDashedEntries(name)) {
return false; return false;
} }
StringBuilder legacyCompatibleName = buildLegacyCompatibleName(name); ConfigurationPropertyName legacyCompatibleName = buildLegacyCompatibleName(name);
try { return legacyCompatibleName != null && legacyCompatibleName.isAncestorOf(candidate);
return ConfigurationPropertyName.of(legacyCompatibleName).isAncestorOf(candidate);
}
catch (Exception ex) {
return false;
}
} }
private StringBuilder buildLegacyCompatibleName(ConfigurationPropertyName name) { private ConfigurationPropertyName buildLegacyCompatibleName(ConfigurationPropertyName name) {
StringBuilder legacyCompatibleName = new StringBuilder(); StringBuilder legacyCompatibleName = new StringBuilder();
for (int i = 0; i < name.getNumberOfElements(); i++) { for (int i = 0; i < name.getNumberOfElements(); i++) {
if (i != 0) { if (i != 0) {
...@@ -133,7 +128,7 @@ final class SystemEnvironmentPropertyMapper implements PropertyMapper { ...@@ -133,7 +128,7 @@ final class SystemEnvironmentPropertyMapper implements PropertyMapper {
} }
legacyCompatibleName.append(name.getElement(i, Form.DASHED).replace('-', '.')); legacyCompatibleName.append(name.getElement(i, Form.DASHED).replace('-', '.'));
} }
return legacyCompatibleName; return ConfigurationPropertyName.ofIfValid(legacyCompatibleName);
} }
boolean hasDashedEntries(ConfigurationPropertyName name) { boolean hasDashedEntries(ConfigurationPropertyName name) {
......
...@@ -210,6 +210,18 @@ class ConfigurationPropertyNameTests { ...@@ -210,6 +210,18 @@ class ConfigurationPropertyNameTests {
assertThat(name.append("foo").toString()).isEqualTo("foo"); assertThat(name.append("foo").toString()).isEqualTo("foo");
} }
@Test
void ofIfValidWhenNameIsValidReturnsName() {
ConfigurationPropertyName name = ConfigurationPropertyName.ofIfValid("spring.bo-ot");
assertThat(name).hasToString("spring.bo-ot");
}
@Test
void ofIfValidWhenNameIsNotValidReturnsNull() {
ConfigurationPropertyName name = ConfigurationPropertyName.ofIfValid("spring.bo!oot");
assertThat(name).isNull();
}
@Test @Test
void adaptWhenNameIsNullShouldThrowException() { void adaptWhenNameIsNullShouldThrowException() {
assertThatIllegalArgumentException().isThrownBy(() -> ConfigurationPropertyName.adapt(null, '.')) assertThatIllegalArgumentException().isThrownBy(() -> ConfigurationPropertyName.adapt(null, '.'))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment