From 0a7a53af6dab61f1b004264a143476ae2e29fa4e Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Fri, 3 Jun 2022 11:49:27 +0200 Subject: [PATCH] Polish contribution See gh-27609 --- .../web/servlet/LocaleContextResolver.java | 26 +++++++++++++++++-- .../i18n/AbstractLocaleContextResolver.java | 4 +-- .../servlet/i18n/CookieLocaleResolver.java | 22 ++++++++-------- .../servlet/i18n/SessionLocaleResolver.java | 21 +++++++-------- .../servlet/support/RequestContextUtils.java | 8 +++--- .../i18n/CookieLocaleResolverTests.java | 4 +-- .../i18n/SessionLocaleResolverTests.java | 5 ++-- 7 files changed, 55 insertions(+), 35 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java index bcb30269c2f..4331c017f88 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java @@ -29,10 +29,12 @@ import org.springframework.lang.Nullable; * Extension of {@link LocaleResolver} that adds support for a rich locale context * (potentially including locale and time zone information). * - *

Also provides pre-implemented versions of {@link #resolveLocale} and {@link #setLocale}, - * delegating to {@link #resolveLocaleContext} and {@link #setLocaleContext}. + *

Also provides {@code default} implementations of {@link #resolveLocale} and + * {@link #setLocale} which delegate to {@link #resolveLocaleContext} and + * {@link #setLocaleContext}, respectively. * * @author Juergen Hoeller + * @author Sam Brannen * @since 4.0 * @see org.springframework.context.i18n.LocaleContext * @see org.springframework.context.i18n.TimeZoneAwareLocaleContext @@ -77,12 +79,32 @@ public interface LocaleContextResolver extends LocaleResolver { void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable LocaleContext localeContext); + /** + * Default implementation of {@link LocaleResolver#resolveLocale(HttpServletRequest)} + * that delegates to {@link #resolveLocaleContext(HttpServletRequest)}, falling + * back to {@link HttpServletRequest#getLocale()} if necessary. + * @param request the request to resolve the locale for + * @return the current locale (never {@code null}) + * @since 6.0 + */ @Override default Locale resolveLocale(HttpServletRequest request) { Locale locale = resolveLocaleContext(request).getLocale(); return (locale != null ? locale : request.getLocale()); } + /** + * Default implementation of {@link LocaleResolver#setLocale(HttpServletRequest, + * HttpServletResponse, Locale)} that delegates to + * {@link #setLocaleContext(HttpServletRequest, HttpServletResponse, LocaleContext)}, + * using a {@link SimpleLocaleContext}. + * @param request the request to be used for locale modification + * @param response the response to be used for locale modification + * @param locale the new locale, or {@code null} to clear the locale + * @throws UnsupportedOperationException if the LocaleResolver implementation + * does not support dynamic changing of the locale + * @since 6.0 + */ @Override default void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) { setLocaleContext(request, response, (locale != null ? new SimpleLocaleContext(locale) : null)); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java index 78c0ca77e11..0b07bc682f1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java @@ -24,8 +24,8 @@ import org.springframework.web.servlet.LocaleContextResolver; /** * Abstract base class for {@link LocaleContextResolver} implementations. * - *

Provides support for a {@linkplain #setDefaultLocale(Locale) default locale} - * and a {@linkplain #setDefaultTimeZone(TimeZone) default time zone}. + *

Provides support for a {@linkplain #setDefaultLocale(java.util.Locale) default + * locale} and a {@linkplain #setDefaultTimeZone(TimeZone) default time zone}. * * @author Juergen Hoeller * @since 4.0 diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java index b776c60db17..0572bc70b7a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java @@ -52,6 +52,7 @@ import org.springframework.web.util.WebUtils; * @author Juergen Hoeller * @author Jean-Pierre Pawlak * @author Vedran Pavic + * @author Sam Brannen * @since 27.02.2003 * @see #setDefaultLocale * @see #setDefaultTimeZone @@ -98,10 +99,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte private Function defaultLocaleFunction = request -> { Locale defaultLocale = getDefaultLocale(); - if (defaultLocale == null) { - defaultLocale = request.getLocale(); - } - return defaultLocale; + return (defaultLocale != null ? defaultLocale : request.getLocale()); }; private Function defaultTimeZoneFunction = request -> getDefaultTimeZone(); @@ -199,9 +197,11 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte /** * Set the function used to determine the default locale for the given request, - * called if no {@link Locale} session attribute has been found. - *

The default implementation returns the specified default locale, - * if any, else falls back to the request's accept-header locale. + * called if no locale cookie has been found. + *

The default implementation returns the configured + * {@linkplain #setDefaultLocale(Locale) default locale}, if any, and otherwise + * falls back to the request's {@code Accept-Language} header locale or the + * default locale for the server. * @param defaultLocaleFunction the function used to determine the default locale * @since 6.0 * @see #setDefaultLocale @@ -214,8 +214,8 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte /** * Set the function used to determine the default time zone for the given request, - * called if no {@link TimeZone} session attribute has been found. - *

The default implementation returns the specified default time zone, + * called if no locale cookie has been found. + *

The default implementation returns the configured default time zone, * if any, or {@code null} otherwise. * @param defaultTimeZoneFunction the function used to determine the default time zone * @since 6.0 @@ -321,8 +321,8 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte TimeZone timeZone = null; if (localeContext != null) { locale = localeContext.getLocale(); - if (localeContext instanceof TimeZoneAwareLocaleContext) { - timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); + if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) { + timeZone = timeZoneAwareLocaleContext.getTimeZone(); } addCookie(response, (locale != null ? toLocaleValue(locale) : "-") + (timeZone != null ? '/' + timeZone.getID() : "")); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java index 45ae24649b6..67a19fea944 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java @@ -90,10 +90,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver { private Function defaultLocaleFunction = request -> { Locale defaultLocale = getDefaultLocale(); - if (defaultLocale == null) { - defaultLocale = request.getLocale(); - } - return defaultLocale; + return (defaultLocale != null ? defaultLocale : request.getLocale()); }; private Function defaultTimeZoneFunction = request -> getDefaultTimeZone(); @@ -121,8 +118,10 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver { /** * Set the function used to determine the default locale for the given request, * called if no {@link Locale} session attribute has been found. - *

The default implementation returns the specified default locale, - * if any, else falls back to the request's accept-header locale. + *

The default implementation returns the configured + * {@linkplain #setDefaultLocale(Locale) default locale}, if any, and otherwise + * falls back to the request's {@code Accept-Language} header locale or the + * default locale for the server. * @param defaultLocaleFunction the function used to determine the default locale * @since 6.0 * @see #setDefaultLocale @@ -136,7 +135,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver { /** * Set the function used to determine the default time zone for the given request, * called if no {@link TimeZone} session attribute has been found. - *

The default implementation returns the specified default time zone, + *

The default implementation returns the configured default time zone, * if any, or {@code null} otherwise. * @param defaultTimeZoneFunction the function used to determine the default time zone * @since 6.0 @@ -163,7 +162,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver { public Locale getLocale() { Locale locale = (Locale) WebUtils.getSessionAttribute(request, localeAttributeName); if (locale == null) { - locale = SessionLocaleResolver.this.defaultLocaleFunction.apply(request); + locale = defaultLocaleFunction.apply(request); } return locale; } @@ -172,7 +171,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver { public TimeZone getTimeZone() { TimeZone timeZone = (TimeZone) WebUtils.getSessionAttribute(request, timeZoneAttributeName); if (timeZone == null) { - timeZone = SessionLocaleResolver.this.defaultTimeZoneFunction.apply(request); + timeZone = defaultTimeZoneFunction.apply(request); } return timeZone; } @@ -187,8 +186,8 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver { TimeZone timeZone = null; if (localeContext != null) { locale = localeContext.getLocale(); - if (localeContext instanceof TimeZoneAwareLocaleContext) { - timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); + if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) { + timeZone = timeZoneAwareLocaleContext.getTimeZone(); } } WebUtils.setSessionAttribute(request, this.localeAttributeName, locale); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java index 73f519cb8f2..7063f5964b5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java @@ -171,10 +171,10 @@ public abstract class RequestContextUtils { @Nullable public static TimeZone getTimeZone(HttpServletRequest request) { LocaleResolver localeResolver = getLocaleResolver(request); - if (localeResolver instanceof LocaleContextResolver) { - LocaleContext localeContext = ((LocaleContextResolver) localeResolver).resolveLocaleContext(request); - if (localeContext instanceof TimeZoneAwareLocaleContext) { - return ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); + if (localeResolver instanceof LocaleContextResolver localeContextResolver) { + LocaleContext localeContext = localeContextResolver.resolveLocaleContext(request); + if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) { + return timeZoneAwareLocaleContext.getTimeZone(); } } return null; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java index 2a7c0bd9713..7cc0467b2af 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/CookieLocaleResolverTests.java @@ -412,7 +412,7 @@ class CookieLocaleResolverTests { } @Test - void testCustomDefaultLocaleFunction() { + void customDefaultLocaleFunction() { request.addPreferredLocale(Locale.TAIWAN); resolver.setDefaultLocaleFunction(request -> Locale.GERMAN); @@ -421,7 +421,7 @@ class CookieLocaleResolverTests { } @Test - void testCustomDefaultTimeZoneFunction() { + void customDefaultTimeZoneFunction() { request.addPreferredLocale(Locale.TAIWAN); resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1")); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java index 8b78dfcfd62..de9256f4bde 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/i18n/SessionLocaleResolverTests.java @@ -98,17 +98,16 @@ class SessionLocaleResolverTests { } @Test - void testCustomDefaultLocaleFunction() { + void customDefaultLocaleFunction() { request.addPreferredLocale(Locale.TAIWAN); - SessionLocaleResolver resolver = new SessionLocaleResolver(); resolver.setDefaultLocaleFunction(request -> Locale.GERMAN); assertThat(resolver.resolveLocale(request)).isEqualTo(Locale.GERMAN); } @Test - void testCustomDefaultTimeZoneFunction() { + void customDefaultTimeZoneFunction() { request.addPreferredLocale(Locale.TAIWAN); resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1"));