From fc73ab07099c7f3090eb60e3b2c009a44db33f0e Mon Sep 17 00:00:00 2001 From: Andrei Bastun Date: Thu, 25 Jan 2024 13:02:02 +0100 Subject: [PATCH] Refactor ReloadableResourceBundleMessageSource This change allows subclasses to reuse collecting and merging algorithm when overriding getMergedProperties method. --- ...ReloadableResourceBundleMessageSource.java | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java b/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java index 669be70566e5..1f5154ffd5ba 100644 --- a/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java @@ -257,29 +257,42 @@ protected PropertiesHolder getMergedProperties(Locale locale) { return mergedHolder; } - Properties mergedProps = newProperties(); - long latestTimestamp = -1; + List holders = collectPropertiesToMerge(locale); + + mergedHolder = merge(holders); + PropertiesHolder existing = this.cachedMergedProperties.putIfAbsent(locale, mergedHolder); + if (existing != null) { + mergedHolder = existing; + } + return mergedHolder; + } + + protected List collectPropertiesToMerge(Locale locale) { String[] basenames = StringUtils.toStringArray(getBasenameSet()); + List holders = new ArrayList<>(basenames.length); for (int i = basenames.length - 1; i >= 0; i--) { List filenames = calculateAllFilenames(basenames[i], locale); for (int j = filenames.size() - 1; j >= 0; j--) { String filename = filenames.get(j); PropertiesHolder propHolder = getProperties(filename); if (propHolder.getProperties() != null) { - mergedProps.putAll(propHolder.getProperties()); - if (propHolder.getFileTimestamp() > latestTimestamp) { - latestTimestamp = propHolder.getFileTimestamp(); - } + holders.add(propHolder); } } } + return holders; + } - mergedHolder = new PropertiesHolder(mergedProps, latestTimestamp); - PropertiesHolder existing = this.cachedMergedProperties.putIfAbsent(locale, mergedHolder); - if (existing != null) { - mergedHolder = existing; + protected PropertiesHolder merge(List holders) { + Properties mergedProps = newProperties(); + long latestTimestamp = -1; + for (PropertiesHolder holder : holders) { + mergedProps.putAll(holder.getProperties()); + if (holder.getFileTimestamp() > latestTimestamp) { + latestTimestamp = holder.getFileTimestamp(); + } } - return mergedHolder; + return new PropertiesHolder(mergedProps, latestTimestamp); } /**