Home / Class/ SystemEnvironmentPropertyMapper Class — spring-boot Architecture

SystemEnvironmentPropertyMapper Class — spring-boot Architecture

Architecture documentation for the SystemEnvironmentPropertyMapper class in SystemEnvironmentPropertyMapper.java from the spring-boot codebase.

Entity Profile

Source Code

core/spring-boot/src/main/java/org/springframework/boot/context/properties/source/SystemEnvironmentPropertyMapper.java lines 40–107

final class SystemEnvironmentPropertyMapper implements PropertyMapper {

	public static final PropertyMapper INSTANCE = new SystemEnvironmentPropertyMapper();

	private final Map<String, ConfigurationPropertyName> propertySourceNameCache = new ConcurrentReferenceHashMap<>();

	@Override
	public List<String> map(ConfigurationPropertyName configurationPropertyName) {
		List<String> mapped = new ArrayList<>(4);
		addIfMissing(mapped, configurationPropertyName.toString(ToStringFormat.SYSTEM_ENVIRONMENT, true));
		addIfMissing(mapped, configurationPropertyName.toString(ToStringFormat.LEGACY_SYSTEM_ENVIRONMENT, true));
		addIfMissing(mapped, configurationPropertyName.toString(ToStringFormat.SYSTEM_ENVIRONMENT, false));
		addIfMissing(mapped, configurationPropertyName.toString(ToStringFormat.LEGACY_SYSTEM_ENVIRONMENT, false));
		return mapped;
	}

	private void addIfMissing(List<String> list, String value) {
		if (!list.contains(value)) {
			list.add(value);
		}
	}

	@Override
	public ConfigurationPropertyName map(String propertySourceName) {
		ConfigurationPropertyName configurationPropertyName = this.propertySourceNameCache.get(propertySourceName);
		if (configurationPropertyName == null) {
			configurationPropertyName = convertName(propertySourceName);
			this.propertySourceNameCache.put(propertySourceName, configurationPropertyName);
		}
		return configurationPropertyName;
	}

	private ConfigurationPropertyName convertName(String propertySourceName) {
		try {
			return ConfigurationPropertyName.adapt(propertySourceName, '_', this::processElementValue);
		}
		catch (Exception ex) {
			return ConfigurationPropertyName.EMPTY;
		}
	}

	private CharSequence processElementValue(CharSequence value) {
		String result = value.toString().toLowerCase(Locale.ENGLISH);
		return isNumber(result) ? "[" + result + "]" : result;
	}

	private static boolean isNumber(String string) {
		return string.chars().allMatch(Character::isDigit);
	}

	@Override
	public BiPredicate<ConfigurationPropertyName, ConfigurationPropertyName> getAncestorOfCheck() {
		return this::isAncestorOf;
	}

	private boolean isAncestorOf(ConfigurationPropertyName name, ConfigurationPropertyName candidate) {
		return name.isAncestorOf(candidate) || isLegacyAncestorOf(name, candidate);
	}

	private boolean isLegacyAncestorOf(ConfigurationPropertyName name, ConfigurationPropertyName candidate) {
		if (!name.hasDashedElement()) {
			return false;
		}
		ConfigurationPropertyName legacyCompatibleName = name.asSystemEnvironmentLegacyName();
		return legacyCompatibleName != null && legacyCompatibleName.isAncestorOf(candidate);
	}

}

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free