Comprehensive update to the framework's TimeZone handling, including a new TimeZoneAwareLocaleContext and a LocaleContextResolver for Spring MVC
A few noteworthy minor changes: LocaleContext.getLocale() may return null in special cases (not by default), which our own accessing classes are able to handle now. If there is a non-null TimeZone user setting, we're exposing it to all collaborating libraries, in particular to JSTL, Velocity and JasperReports. Our JSR-310 and Joda-Time support falls back to checking the general LocaleContext TimeZone now, adapting it to their time zone types, if no more specific setting has been provided. Our DefaultConversionService has TimeZone<->ZoneId converters registered. And finally, we're using a custom parseTimeZoneString method now that doesn't accept the TimeZone.getTimeZone(String) GMT fallback for an invalid time zone id anymore. Issue: SPR-1528
This commit is contained in:
@@ -20,6 +20,7 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
import javax.servlet.Servlet;
|
||||
import javax.servlet.ServletConfig;
|
||||
import javax.servlet.ServletException;
|
||||
@@ -60,6 +61,7 @@ import org.springframework.web.servlet.i18n.SessionLocaleResolver;
|
||||
import org.springframework.web.servlet.mvc.Controller;
|
||||
import org.springframework.web.servlet.mvc.ParameterizableViewController;
|
||||
import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter;
|
||||
import org.springframework.web.servlet.support.RequestContext;
|
||||
import org.springframework.web.servlet.support.RequestContextUtils;
|
||||
import org.springframework.web.servlet.theme.SessionThemeResolver;
|
||||
import org.springframework.web.servlet.theme.ThemeChangeInterceptor;
|
||||
@@ -402,21 +404,6 @@ public class ComplexWebApplicationContext extends StaticWebApplicationContext {
|
||||
if (!(request instanceof MultipartHttpServletRequest)) {
|
||||
throw new ServletException("Not in a MultipartHttpServletRequest");
|
||||
}
|
||||
if (!(RequestContextUtils.getLocaleResolver(request) instanceof SessionLocaleResolver)) {
|
||||
throw new ServletException("Incorrect LocaleResolver");
|
||||
}
|
||||
if (!Locale.CANADA.equals(RequestContextUtils.getLocale(request))) {
|
||||
throw new ServletException("Incorrect Locale");
|
||||
}
|
||||
if (!Locale.CANADA.equals(LocaleContextHolder.getLocale())) {
|
||||
throw new ServletException("Incorrect Locale");
|
||||
}
|
||||
if (!(RequestContextUtils.getThemeResolver(request) instanceof SessionThemeResolver)) {
|
||||
throw new ServletException("Incorrect ThemeResolver");
|
||||
}
|
||||
if (!"theme".equals(RequestContextUtils.getThemeResolver(request).resolveThemeName(request))) {
|
||||
throw new ServletException("Incorrect theme name");
|
||||
}
|
||||
if (request.getParameter("fail") != null) {
|
||||
throw new ModelAndViewDefiningException(new ModelAndView("failed1"));
|
||||
}
|
||||
@@ -429,6 +416,45 @@ public class ComplexWebApplicationContext extends StaticWebApplicationContext {
|
||||
if (request.getParameter("exception") != null) {
|
||||
throw new RuntimeException("servlet");
|
||||
}
|
||||
if (!(RequestContextUtils.getLocaleResolver(request) instanceof SessionLocaleResolver)) {
|
||||
throw new ServletException("Incorrect LocaleResolver");
|
||||
}
|
||||
if (!Locale.CANADA.equals(RequestContextUtils.getLocale(request))) {
|
||||
throw new ServletException("Incorrect Locale");
|
||||
}
|
||||
if (!Locale.CANADA.equals(LocaleContextHolder.getLocale())) {
|
||||
throw new ServletException("Incorrect Locale");
|
||||
}
|
||||
if (RequestContextUtils.getTimeZone(request) != null) {
|
||||
throw new ServletException("Incorrect TimeZone");
|
||||
}
|
||||
if (!TimeZone.getDefault().equals(LocaleContextHolder.getTimeZone())) {
|
||||
throw new ServletException("Incorrect TimeZone");
|
||||
}
|
||||
if (!(RequestContextUtils.getThemeResolver(request) instanceof SessionThemeResolver)) {
|
||||
throw new ServletException("Incorrect ThemeResolver");
|
||||
}
|
||||
if (!"theme".equals(RequestContextUtils.getThemeResolver(request).resolveThemeName(request))) {
|
||||
throw new ServletException("Incorrect theme name");
|
||||
}
|
||||
RequestContext rc = new RequestContext(request);
|
||||
rc.changeLocale(Locale.US, TimeZone.getTimeZone("GMT+1"));
|
||||
rc.changeTheme("theme2");
|
||||
if (!Locale.US.equals(RequestContextUtils.getLocale(request))) {
|
||||
throw new ServletException("Incorrect Locale");
|
||||
}
|
||||
if (!Locale.US.equals(LocaleContextHolder.getLocale())) {
|
||||
throw new ServletException("Incorrect Locale");
|
||||
}
|
||||
if (!TimeZone.getTimeZone("GMT+1").equals(RequestContextUtils.getTimeZone(request))) {
|
||||
throw new ServletException("Incorrect TimeZone");
|
||||
}
|
||||
if (!TimeZone.getTimeZone("GMT+1").equals(LocaleContextHolder.getTimeZone())) {
|
||||
throw new ServletException("Incorrect TimeZone");
|
||||
}
|
||||
if (!"theme2".equals(RequestContextUtils.getThemeResolver(request).resolveThemeName(request))) {
|
||||
throw new ServletException("Incorrect theme name");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -17,25 +17,32 @@
|
||||
package org.springframework.web.servlet.i18n;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import java.util.TimeZone;
|
||||
import javax.servlet.http.Cookie;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.context.i18n.LocaleContext;
|
||||
import org.springframework.context.i18n.SimpleLocaleContext;
|
||||
import org.springframework.context.i18n.SimpleTimeZoneAwareLocaleContext;
|
||||
import org.springframework.context.i18n.TimeZoneAwareLocaleContext;
|
||||
import org.springframework.mock.web.test.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.test.MockHttpServletResponse;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* @author Alef Arendsen
|
||||
* @author Juergen Hoeller
|
||||
* @author Rick Evans
|
||||
*/
|
||||
public class CookieLocaleResolverTests extends TestCase {
|
||||
public class CookieLocaleResolverTests {
|
||||
|
||||
@Test
|
||||
public void testResolveLocale() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
Cookie cookie = new Cookie("LanguageKoekje", "nl");
|
||||
request.setCookies(new Cookie[]{cookie});
|
||||
request.setCookies(cookie);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
// yup, koekje is the Dutch name for Cookie ;-)
|
||||
@@ -44,6 +51,37 @@ public class CookieLocaleResolverTests extends TestCase {
|
||||
assertEquals(loc.getLanguage(), "nl");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleContext() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
Cookie cookie = new Cookie("LanguageKoekje", "nl");
|
||||
request.setCookies(cookie);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
// yup, koekje is the Dutch name for Cookie ;-)
|
||||
resolver.setCookieName("LanguageKoekje");
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals("nl", loc.getLocale().getLanguage());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertNull(((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleContextWithTimeZone() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
Cookie cookie = new Cookie("LanguageKoekje", "nl GMT+1");
|
||||
request.setCookies(cookie);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
// yup, koekje is the Dutch name for Cookie ;-)
|
||||
resolver.setCookieName("LanguageKoekje");
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals("nl", loc.getLocale().getLanguage());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertEquals(TimeZone.getTimeZone("GMT+1"), ((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetAndResolveLocale() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
@@ -59,13 +97,74 @@ public class CookieLocaleResolverTests extends TestCase {
|
||||
assertFalse(cookie.getSecure());
|
||||
|
||||
request = new MockHttpServletRequest();
|
||||
request.setCookies(new Cookie[]{cookie});
|
||||
request.setCookies(cookie);
|
||||
|
||||
resolver = new CookieLocaleResolver();
|
||||
Locale loc = resolver.resolveLocale(request);
|
||||
assertEquals(loc.getLanguage(), "nl");
|
||||
assertEquals("nl", loc.getLanguage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetAndResolveLocaleContext() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
resolver.setLocaleContext(request, response, new SimpleLocaleContext(new Locale("nl", "")));
|
||||
|
||||
Cookie cookie = response.getCookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME);
|
||||
request = new MockHttpServletRequest();
|
||||
request.setCookies(cookie);
|
||||
|
||||
resolver = new CookieLocaleResolver();
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals("nl", loc.getLocale().getLanguage());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertNull(((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetAndResolveLocaleContextWithTimeZone() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
resolver.setLocaleContext(request, response,
|
||||
new SimpleTimeZoneAwareLocaleContext(new Locale("nl", ""), TimeZone.getTimeZone("GMT+1")));
|
||||
|
||||
Cookie cookie = response.getCookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME);
|
||||
request = new MockHttpServletRequest();
|
||||
request.setCookies(cookie);
|
||||
|
||||
resolver = new CookieLocaleResolver();
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals("nl", loc.getLocale().getLanguage());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertEquals(TimeZone.getTimeZone("GMT+1"), ((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetAndResolveLocaleContextWithTimeZoneOnly() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
resolver.setLocaleContext(request, response,
|
||||
new SimpleTimeZoneAwareLocaleContext(null, TimeZone.getTimeZone("GMT+1")));
|
||||
|
||||
Cookie cookie = response.getCookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME);
|
||||
request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.GERMANY);
|
||||
request.setCookies(cookie);
|
||||
|
||||
resolver = new CookieLocaleResolver();
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals(Locale.GERMANY, loc.getLocale());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertEquals(TimeZone.getTimeZone("GMT+1"), ((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomCookie() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
@@ -87,24 +186,39 @@ public class CookieLocaleResolverTests extends TestCase {
|
||||
assertTrue(cookie.getSecure());
|
||||
|
||||
request = new MockHttpServletRequest();
|
||||
request.setCookies(new Cookie[]{cookie});
|
||||
request.setCookies(cookie);
|
||||
|
||||
resolver = new CookieLocaleResolver();
|
||||
resolver.setCookieName("LanguageKoek");
|
||||
Locale loc = resolver.resolveLocale(request);
|
||||
assertEquals(loc.getLanguage(), "nl");
|
||||
assertEquals("nl", loc.getLanguage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleWithoutCookie() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
|
||||
Locale locale = resolver.resolveLocale(request);
|
||||
assertEquals(request.getLocale(), locale);
|
||||
Locale loc = resolver.resolveLocale(request);
|
||||
assertEquals(request.getLocale(), loc);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleContextWithoutCookie() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals(request.getLocale(), loc.getLocale());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertNull(((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleWithoutCookieAndDefaultLocale() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
@@ -112,27 +226,59 @@ public class CookieLocaleResolverTests extends TestCase {
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
resolver.setDefaultLocale(Locale.GERMAN);
|
||||
|
||||
Locale locale = resolver.resolveLocale(request);
|
||||
assertEquals(Locale.GERMAN, locale);
|
||||
Locale loc = resolver.resolveLocale(request);
|
||||
assertEquals(Locale.GERMAN, loc);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleContextWithoutCookieAndDefaultLocale() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
resolver.setDefaultLocale(Locale.GERMAN);
|
||||
resolver.setDefaultTimeZone(TimeZone.getTimeZone("GMT+1"));
|
||||
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals(Locale.GERMAN, loc.getLocale());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertEquals(TimeZone.getTimeZone("GMT+1"), ((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleWithCookieWithoutLocale() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.LOCALE_REQUEST_ATTRIBUTE_NAME, "");
|
||||
request.setCookies(new Cookie[]{cookie});
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME, "");
|
||||
request.setCookies(cookie);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
|
||||
Locale locale = resolver.resolveLocale(request);
|
||||
assertEquals(request.getLocale(), locale);
|
||||
Locale loc = resolver.resolveLocale(request);
|
||||
assertEquals(request.getLocale(), loc);
|
||||
}
|
||||
|
||||
public void testSetLocaleToNullLocale() throws Exception {
|
||||
@Test
|
||||
public void testResolveLocaleContextWithCookieWithoutLocale() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.LOCALE_REQUEST_ATTRIBUTE_NAME, Locale.UK.toString());
|
||||
request.setCookies(new Cookie[]{cookie});
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME, "");
|
||||
request.setCookies(cookie);
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
|
||||
LocaleContext loc = resolver.resolveLocaleContext(request);
|
||||
assertEquals(request.getLocale(), loc.getLocale());
|
||||
assertTrue(loc instanceof TimeZoneAwareLocaleContext);
|
||||
assertNull(((TimeZoneAwareLocaleContext) loc).getTimeZone());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetLocaleToNull() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME, Locale.UK.toString());
|
||||
request.setCookies(cookie);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
@@ -143,15 +289,38 @@ public class CookieLocaleResolverTests extends TestCase {
|
||||
Cookie[] cookies = response.getCookies();
|
||||
assertEquals(1, cookies.length);
|
||||
Cookie localeCookie = cookies[0];
|
||||
assertEquals(CookieLocaleResolver.LOCALE_REQUEST_ATTRIBUTE_NAME, localeCookie.getName());
|
||||
assertEquals(CookieLocaleResolver.DEFAULT_COOKIE_NAME, localeCookie.getName());
|
||||
assertEquals("", localeCookie.getValue());
|
||||
}
|
||||
|
||||
public void testSetLocaleToNullLocaleWithDefault() throws Exception {
|
||||
@Test
|
||||
public void testSetLocaleContextToNull() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.LOCALE_REQUEST_ATTRIBUTE_NAME, Locale.UK.toString());
|
||||
request.setCookies(new Cookie[]{cookie});
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME, Locale.UK.toString());
|
||||
request.setCookies(cookie);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
resolver.setLocaleContext(request, response, null);
|
||||
Locale locale = (Locale) request.getAttribute(CookieLocaleResolver.LOCALE_REQUEST_ATTRIBUTE_NAME);
|
||||
assertEquals(Locale.TAIWAN, locale);
|
||||
TimeZone timeZone = (TimeZone) request.getAttribute(CookieLocaleResolver.TIME_ZONE_REQUEST_ATTRIBUTE_NAME);
|
||||
assertNull(timeZone);
|
||||
|
||||
Cookie[] cookies = response.getCookies();
|
||||
assertEquals(1, cookies.length);
|
||||
Cookie localeCookie = cookies[0];
|
||||
assertEquals(CookieLocaleResolver.DEFAULT_COOKIE_NAME, localeCookie.getName());
|
||||
assertEquals("", localeCookie.getValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetLocaleToNullWithDefault() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME, Locale.UK.toString());
|
||||
request.setCookies(cookie);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
@@ -163,8 +332,32 @@ public class CookieLocaleResolverTests extends TestCase {
|
||||
Cookie[] cookies = response.getCookies();
|
||||
assertEquals(1, cookies.length);
|
||||
Cookie localeCookie = cookies[0];
|
||||
assertEquals(CookieLocaleResolver.LOCALE_REQUEST_ATTRIBUTE_NAME, localeCookie.getName());
|
||||
assertEquals(CookieLocaleResolver.DEFAULT_COOKIE_NAME, localeCookie.getName());
|
||||
assertEquals("", localeCookie.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetLocaleContextToNullWithDefault() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
Cookie cookie = new Cookie(CookieLocaleResolver.DEFAULT_COOKIE_NAME, Locale.UK.toString());
|
||||
request.setCookies(cookie);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
CookieLocaleResolver resolver = new CookieLocaleResolver();
|
||||
resolver.setDefaultLocale(Locale.CANADA_FRENCH);
|
||||
resolver.setDefaultTimeZone(TimeZone.getTimeZone("GMT+1"));
|
||||
resolver.setLocaleContext(request, response, null);
|
||||
Locale locale = (Locale) request.getAttribute(CookieLocaleResolver.LOCALE_REQUEST_ATTRIBUTE_NAME);
|
||||
assertEquals(Locale.CANADA_FRENCH, locale);
|
||||
TimeZone timeZone = (TimeZone) request.getAttribute(CookieLocaleResolver.TIME_ZONE_REQUEST_ATTRIBUTE_NAME);
|
||||
assertEquals(TimeZone.getTimeZone("GMT+1"), timeZone);
|
||||
|
||||
Cookie[] cookies = response.getCookies();
|
||||
assertEquals(1, cookies.length);
|
||||
Cookie localeCookie = cookies[0];
|
||||
assertEquals(CookieLocaleResolver.DEFAULT_COOKIE_NAME, localeCookie.getName());
|
||||
assertEquals("", localeCookie.getValue());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -17,26 +17,55 @@
|
||||
package org.springframework.web.servlet.i18n;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.context.i18n.LocaleContext;
|
||||
import org.springframework.context.i18n.SimpleLocaleContext;
|
||||
import org.springframework.context.i18n.SimpleTimeZoneAwareLocaleContext;
|
||||
import org.springframework.context.i18n.TimeZoneAwareLocaleContext;
|
||||
import org.springframework.mock.web.test.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.test.MockHttpServletResponse;
|
||||
import org.springframework.mock.web.test.MockServletContext;
|
||||
import org.springframework.web.servlet.LocaleContextResolver;
|
||||
import org.springframework.web.servlet.LocaleResolver;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
* @since 20.03.2003
|
||||
*/
|
||||
public class LocaleResolverTests extends TestCase {
|
||||
public class LocaleResolverTests {
|
||||
|
||||
private void internalTest(LocaleResolver localeResolver, boolean shouldSet) {
|
||||
@Test
|
||||
public void testAcceptHeaderLocaleResolver() {
|
||||
doTest(new AcceptHeaderLocaleResolver(), false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFixedLocaleResolver() {
|
||||
doTest(new FixedLocaleResolver(Locale.UK), false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCookieLocaleResolver() {
|
||||
doTest(new CookieLocaleResolver(), true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSessionLocaleResolver() {
|
||||
doTest(new SessionLocaleResolver(), true);
|
||||
}
|
||||
|
||||
private void doTest(LocaleResolver localeResolver, boolean shouldSet) {
|
||||
// create mocks
|
||||
MockServletContext context = new MockServletContext();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest(context);
|
||||
request.addPreferredLocale(Locale.UK);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
// check original locale
|
||||
Locale locale = localeResolver.resolveLocale(request);
|
||||
assertEquals(locale, Locale.UK);
|
||||
@@ -50,21 +79,68 @@ public class LocaleResolverTests extends TestCase {
|
||||
assertEquals(locale, Locale.GERMANY);
|
||||
}
|
||||
catch (UnsupportedOperationException ex) {
|
||||
if (shouldSet)
|
||||
if (shouldSet) {
|
||||
fail("should be able to set Locale");
|
||||
}
|
||||
}
|
||||
|
||||
// check LocaleContext
|
||||
if (localeResolver instanceof LocaleContextResolver) {
|
||||
LocaleContextResolver localeContextResolver = (LocaleContextResolver) localeResolver;
|
||||
LocaleContext localeContext = localeContextResolver.resolveLocaleContext(request);
|
||||
if (shouldSet) {
|
||||
assertEquals(localeContext.getLocale(), Locale.GERMANY);
|
||||
}
|
||||
else {
|
||||
assertEquals(localeContext.getLocale(), Locale.UK);
|
||||
}
|
||||
assertTrue(localeContext instanceof TimeZoneAwareLocaleContext);
|
||||
assertNull(((TimeZoneAwareLocaleContext) localeContext).getTimeZone());
|
||||
|
||||
if (localeContextResolver instanceof AbstractLocaleContextResolver) {
|
||||
((AbstractLocaleContextResolver) localeContextResolver).setDefaultTimeZone(TimeZone.getTimeZone("GMT+1"));
|
||||
assertEquals(((TimeZoneAwareLocaleContext) localeContext).getTimeZone(), TimeZone.getTimeZone("GMT+1"));
|
||||
}
|
||||
|
||||
try {
|
||||
localeContextResolver.setLocaleContext(request, response, new SimpleLocaleContext(Locale.US));
|
||||
if (!shouldSet) {
|
||||
fail("should not be able to set Locale");
|
||||
}
|
||||
localeContext = localeContextResolver.resolveLocaleContext(request);
|
||||
assertEquals(localeContext.getLocale(), Locale.US);
|
||||
if (localeContextResolver instanceof AbstractLocaleContextResolver) {
|
||||
assertEquals(((TimeZoneAwareLocaleContext) localeContext).getTimeZone(), TimeZone.getTimeZone("GMT+1"));
|
||||
}
|
||||
else {
|
||||
assertNull(((TimeZoneAwareLocaleContext) localeContext).getTimeZone());
|
||||
}
|
||||
|
||||
localeContextResolver.setLocaleContext(request, response,
|
||||
new SimpleTimeZoneAwareLocaleContext(Locale.GERMANY, TimeZone.getTimeZone("GMT+2")));
|
||||
localeContext = localeContextResolver.resolveLocaleContext(request);
|
||||
assertEquals(localeContext.getLocale(), Locale.GERMANY);
|
||||
assertTrue(localeContext instanceof TimeZoneAwareLocaleContext);
|
||||
assertEquals(((TimeZoneAwareLocaleContext) localeContext).getTimeZone(), TimeZone.getTimeZone("GMT+2"));
|
||||
|
||||
localeContextResolver.setLocaleContext(request, response,
|
||||
new SimpleTimeZoneAwareLocaleContext(null, TimeZone.getTimeZone("GMT+3")));
|
||||
localeContext = localeContextResolver.resolveLocaleContext(request);
|
||||
assertEquals(localeContext.getLocale(), Locale.UK);
|
||||
assertTrue(localeContext instanceof TimeZoneAwareLocaleContext);
|
||||
assertEquals(((TimeZoneAwareLocaleContext) localeContext).getTimeZone(), TimeZone.getTimeZone("GMT+3"));
|
||||
|
||||
if (localeContextResolver instanceof AbstractLocaleContextResolver) {
|
||||
((AbstractLocaleContextResolver) localeContextResolver).setDefaultLocale(Locale.GERMANY);
|
||||
assertEquals(localeContext.getLocale(), Locale.GERMANY);
|
||||
}
|
||||
}
|
||||
catch (UnsupportedOperationException ex) {
|
||||
if (shouldSet) {
|
||||
fail("should be able to set Locale");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testAcceptHeaderLocaleResolver() {
|
||||
internalTest(new AcceptHeaderLocaleResolver(), false);
|
||||
}
|
||||
|
||||
public void testCookieLocaleResolver() {
|
||||
internalTest(new CookieLocaleResolver(), true);
|
||||
}
|
||||
|
||||
public void testSessionLocaleResolver() {
|
||||
internalTest(new SessionLocaleResolver(), true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -17,19 +17,21 @@
|
||||
package org.springframework.web.servlet.i18n;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.mock.web.test.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.test.MockHttpServletResponse;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class SessionLocaleResolverTests extends TestCase {
|
||||
public class SessionLocaleResolverTests {
|
||||
|
||||
@Test
|
||||
public void testResolveLocale() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, Locale.GERMAN);
|
||||
@@ -38,6 +40,7 @@ public class SessionLocaleResolverTests extends TestCase {
|
||||
assertEquals(Locale.GERMAN, resolver.resolveLocale(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetAndResolveLocale() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
@@ -54,6 +57,7 @@ public class SessionLocaleResolverTests extends TestCase {
|
||||
assertEquals(Locale.GERMAN, resolver.resolveLocale(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleWithoutSession() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
@@ -63,6 +67,7 @@ public class SessionLocaleResolverTests extends TestCase {
|
||||
assertEquals(request.getLocale(), resolver.resolveLocale(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolveLocaleWithoutSessionAndDefaultLocale() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
@@ -73,6 +78,7 @@ public class SessionLocaleResolverTests extends TestCase {
|
||||
assertEquals(Locale.GERMAN, resolver.resolveLocale(request));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetLocaleToNullLocale() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -20,7 +20,9 @@ import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.Principal;
|
||||
import java.time.ZoneId;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
@@ -35,15 +37,15 @@ import org.springframework.web.context.request.ServletWebRequest;
|
||||
import org.springframework.web.context.request.WebRequest;
|
||||
import org.springframework.web.method.support.ModelAndViewContainer;
|
||||
import org.springframework.web.multipart.MultipartRequest;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver;
|
||||
import org.springframework.web.servlet.DispatcherServlet;
|
||||
import org.springframework.web.servlet.i18n.FixedLocaleResolver;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Test fixture with {@link ServletRequestMethodArgumentResolver}.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Nicholas Williams
|
||||
*/
|
||||
public class ServletRequestMethodArgumentResolverTests {
|
||||
|
||||
@@ -60,7 +62,8 @@ public class ServletRequestMethodArgumentResolverTests {
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
method = getClass().getMethod("supportedParams", ServletRequest.class, MultipartRequest.class,
|
||||
HttpSession.class, Principal.class, Locale.class, InputStream.class, Reader.class, WebRequest.class);
|
||||
HttpSession.class, Principal.class, Locale.class, InputStream.class, Reader.class,
|
||||
WebRequest.class, TimeZone.class, ZoneId.class);
|
||||
mavContainer = new ModelAndViewContainer();
|
||||
servletRequest = new MockHttpServletRequest();
|
||||
webRequest = new ServletWebRequest(servletRequest, new MockHttpServletResponse());
|
||||
@@ -121,6 +124,65 @@ public class ServletRequestMethodArgumentResolverTests {
|
||||
assertSame("Invalid result", locale, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void localeFromResolver() throws Exception {
|
||||
Locale locale = Locale.ENGLISH;
|
||||
servletRequest.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE,
|
||||
new FixedLocaleResolver(locale));
|
||||
MethodParameter localeParameter = new MethodParameter(method, 4);
|
||||
|
||||
assertTrue("Locale not supported", resolver.supportsParameter(localeParameter));
|
||||
|
||||
Object result = resolver.resolveArgument(localeParameter, null, webRequest, null);
|
||||
assertSame("Invalid result", locale, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void timeZone() throws Exception {
|
||||
MethodParameter timeZoneParameter = new MethodParameter(method, 8);
|
||||
|
||||
assertTrue("TimeZone not supported", resolver.supportsParameter(timeZoneParameter));
|
||||
|
||||
Object result = resolver.resolveArgument(timeZoneParameter, null, webRequest, null);
|
||||
assertEquals("Invalid result", TimeZone.getDefault(), result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void timeZoneFromResolver() throws Exception {
|
||||
TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
|
||||
servletRequest.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE,
|
||||
new FixedLocaleResolver(Locale.US, timeZone));
|
||||
MethodParameter timeZoneParameter = new MethodParameter(method, 8);
|
||||
|
||||
assertTrue("TimeZone not supported", resolver.supportsParameter(timeZoneParameter));
|
||||
|
||||
Object result = resolver.resolveArgument(timeZoneParameter, null, webRequest, null);
|
||||
assertEquals("Invalid result", timeZone, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void zoneId() throws Exception {
|
||||
MethodParameter zoneIdParameter = new MethodParameter(method, 9);
|
||||
|
||||
assertTrue("ZoneId not supported", resolver.supportsParameter(zoneIdParameter));
|
||||
|
||||
Object result = resolver.resolveArgument(zoneIdParameter, null, webRequest, null);
|
||||
assertEquals("Invalid result", ZoneId.systemDefault(), result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void zoneIdFromResolver() throws Exception {
|
||||
TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
|
||||
servletRequest.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE,
|
||||
new FixedLocaleResolver(Locale.US, timeZone));
|
||||
MethodParameter zoneIdParameter = new MethodParameter(method, 9);
|
||||
|
||||
assertTrue("ZoneId not supported", resolver.supportsParameter(zoneIdParameter));
|
||||
|
||||
Object result = resolver.resolveArgument(zoneIdParameter, null, webRequest, null);
|
||||
assertEquals("Invalid result", timeZone.toZoneId(), result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void inputStream() throws Exception {
|
||||
MethodParameter inputStreamParameter = new MethodParameter(method, 5);
|
||||
@@ -151,6 +213,7 @@ public class ServletRequestMethodArgumentResolverTests {
|
||||
assertSame("Invalid result", webRequest, result);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public void supportedParams(ServletRequest p0,
|
||||
MultipartRequest p1,
|
||||
HttpSession p2,
|
||||
@@ -158,7 +221,9 @@ public class ServletRequestMethodArgumentResolverTests {
|
||||
Locale p4,
|
||||
InputStream p5,
|
||||
Reader p6,
|
||||
WebRequest p7) {
|
||||
WebRequest p7,
|
||||
TimeZone p8,
|
||||
ZoneId p9) {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user