Lukasz Lenart created WW-5668:
---------------------------------
Summary: Make the localized-text provider caches size-bounded and
align request-locale resolution across entry points
Key: WW-5668
URL: https://issues.apache.org/jira/browse/WW-5668
Project: Struts 2
Issue Type: Improvement
Reporter: Lukasz Lenart
Fix For: 7.3.0
Two related follow-ups to the localized-text provider work in WW-5540.
h2. 1. Bounded caches, consistent with the rest of the framework
{{AbstractLocalizedTextProvider}} keeps several internal caches --
{{bundlesMap}}, {{messageFormats}}, {{missingBundles}}, and the
{{classHierarchyCache}} / {{packageHierarchyCache}} added in WW-5540. These are
plain {{ConcurrentHashMap}}s with no configurable upper bound or eviction
policy.
Elsewhere the framework already standardises on bounded, configurable caches:
the OGNL expression cache ({{struts.ognl.expressionCacheType=wtlfu}},
{{struts.ognl.expressionCacheMaxSize=10000}}), the BeanInfo cache, and the
proxy detection cache ({{struts.proxy.cacheMaxSize=10000}}) all support a cache
type and a maximum size via {{OgnlCacheFactory}} / {{DefaultOgnlCacheFactory}}.
The localized-text caches are the outlier.
Bring them in line: give the localized-text caches a configurable maximum size
and eviction (reusing the existing cache abstraction), with new constants
following the established naming, e.g. {{struts.i18n.cacheType}} and
{{struts.i18n.cacheMaxSize}}, defaulting to the same {{wtlfu}} / {{10000}} as
the OGNL and proxy caches. Normal localized-text behaviour must be unchanged
for typical applications.
h2. 2. Consistent request-locale resolution
Struts resolves a request locale from more than one place, and the two paths
behave differently:
* {{I18nInterceptor}} (the {{request_locale}} parameter / cookie / session
path) resolves the value and then checks it against the available-locale set
via {{LocaleProvider.isValidLocale(...)}}, falling back to the configured
default when the resolved locale is not an available one.
* {{Dispatcher.getLocale(...)}} -- used when {{struts.locale}} is unset --
returns {{request.getLocale()}} directly, without that availability check.
Align the two so a request-derived locale is resolved consistently regardless
of entry point (a shared resolve/validate boundary, applying the same
available-locale check the interceptor already uses).
h2. Scope / acceptance
* Localized-text caches honour a configurable maximum size with eviction;
defaults match the existing OGNL/proxy cache conventions.
* Request-locale resolution is consistent across {{Dispatcher}} and
{{I18nInterceptor}}.
* Documented in {{default.properties}} alongside the other cache settings.
* Tests: cache size stays within the configured bound as locale/key diversity
grows; correct localized text is still returned for normal and repeated
locales; locale resolution behaviour is covered for both entry points.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)