/** * Prepare the given HTTP connection. * <p>The default implementation specifies POST as method, * "application/x-java-serialized-object" as "Content-Type" header, * and the given content length as "Content-Length" header. * @param connection the HTTP connection to prepare * @param contentLength the length of the content to send * @throws IOException if thrown by HttpURLConnection methods * @see java.net.HttpURLConnection#setRequestMethod * @see java.net.HttpURLConnection#setRequestProperty */ protected void prepareConnection(HttpURLConnection connection, int contentLength) throws IOException { if (this.connectTimeout >= 0) { connection.setConnectTimeout(this.connectTimeout); } if (this.readTimeout >= 0) { connection.setReadTimeout(this.readTimeout); } connection.setDoOutput(true); connection.setRequestMethod(HTTP_METHOD_POST); connection.setRequestProperty(HTTP_HEADER_CONTENT_TYPE, getContentType()); connection.setRequestProperty(HTTP_HEADER_CONTENT_LENGTH, Integer.toString(contentLength)); LocaleContext localeContext = LocaleContextHolder.getLocaleContext(); if (localeContext != null) { Locale locale = localeContext.getLocale(); if (locale != null) { connection.setRequestProperty(HTTP_HEADER_ACCEPT_LANGUAGE, StringUtils.toLanguageTag(locale)); } } if (isAcceptGzipEncoding()) { connection.setRequestProperty(HTTP_HEADER_ACCEPT_ENCODING, ENCODING_GZIP); } }
@Override public void setLocaleContext(HttpServletRequest request, HttpServletResponse response, LocaleContext localeContext) { Locale locale = null; TimeZone timeZone = null; if (localeContext != null) { locale = localeContext.getLocale(); if (localeContext instanceof TimeZoneAwareLocaleContext) { timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); } addCookie(response, (locale != null ? locale : "-") + (timeZone != null ? ' ' + timeZone.getID() : "")); } else { removeCookie(response); } request.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME, (locale != null ? locale: determineDefaultLocale(request))); request.setAttribute(TIME_ZONE_REQUEST_ATTRIBUTE_NAME, (timeZone != null ? timeZone : determineDefaultTimeZone(request))); }
@Override public LocaleContext resolveLocaleContext(final HttpServletRequest request) { return new TimeZoneAwareLocaleContext() { @Override public Locale getLocale() { Locale locale = (Locale) WebUtils.getSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME); if (locale == null) { locale = determineDefaultLocale(request); } return locale; } @Override public TimeZone getTimeZone() { TimeZone timeZone = (TimeZone) WebUtils.getSessionAttribute(request, TIME_ZONE_SESSION_ATTRIBUTE_NAME); if (timeZone == null) { timeZone = determineDefaultTimeZone(request); } return timeZone; } }; }
@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()); }
/** * Create a HttpPost for the given configuration. * <p>The default implementation creates a standard HttpPost with * "application/x-java-serialized-object" as "Content-Type" header. * @param config the HTTP invoker configuration that specifies the * target service * @return the HttpPost instance * @throws java.io.IOException if thrown by I/O methods */ protected HttpPost createHttpPost(HttpInvokerClientConfiguration config) throws IOException { HttpPost httpPost = new HttpPost(config.getServiceUrl()); RequestConfig requestConfig = createRequestConfig(config); if (requestConfig != null) { httpPost.setConfig(requestConfig); } LocaleContext localeContext = LocaleContextHolder.getLocaleContext(); if (localeContext != null) { Locale locale = localeContext.getLocale(); if (locale != null) { httpPost.addHeader(HTTP_HEADER_ACCEPT_LANGUAGE, StringUtils.toLanguageTag(locale)); } } if (isAcceptGzipEncoding()) { httpPost.addHeader(HTTP_HEADER_ACCEPT_ENCODING, ENCODING_GZIP); } return httpPost; }
@Test public void testPresets() { when(request.getAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME)).thenReturn(LOCALE_DEFAULT); when(request.getAttribute(TIME_ZONE_REQUEST_ATTRIBUTE_NAME)).thenReturn(TIMEZONE_DEFAULT); LocaleContext context = resolver.resolveLocaleContext(request); assertThat(context).isNotNull(); assertThat(context).isInstanceOf(TimeZoneAwareLocaleContext.class); Locale locale = ((TimeZoneAwareLocaleContext) context).getLocale(); TimeZone zone = ((TimeZoneAwareLocaleContext) context).getTimeZone(); assertThat(locale).isNotNull(); assertThat(locale).isEqualTo(LOCALE_DEFAULT); assertThat(zone).isEqualTo(TIMEZONE_DEFAULT); List<Event> events = recorder.play(); assertThat(events).isEmpty(); }
@Test public void testTimeZone() { String value = "- " + TIMEZONE_CUSTOM.getID(); Cookie cookie = new Cookie(DEFAULT_COOKIE_NAME, value); when(request.getCookies()).thenReturn(new Cookie[] { cookie }); LocaleContext context = resolver.resolveLocaleContext(request); assertThat(context).isNotNull(); assertThat(context).isInstanceOf(TimeZoneAwareLocaleContext.class); Locale locale = ((TimeZoneAwareLocaleContext) context).getLocale(); TimeZone zone = ((TimeZoneAwareLocaleContext) context).getTimeZone(); assertThat(locale).isEqualTo(LOCALE_DEFAULT); assertThat(zone).isEqualTo(TIMEZONE_CUSTOM); List<Event> events = recorder.play(); assertThat(events).isEmpty(); }
@Test public void testTimeZoneWithQuotes() { String value = resolver.quote("- " + TIMEZONE_CUSTOM.getID()); Cookie cookie = new Cookie(DEFAULT_COOKIE_NAME, value); when(request.getCookies()).thenReturn(new Cookie[] { cookie }); LocaleContext context = resolver.resolveLocaleContext(request); assertThat(context).isNotNull(); assertThat(context).isInstanceOf(TimeZoneAwareLocaleContext.class); Locale locale = ((TimeZoneAwareLocaleContext) context).getLocale(); TimeZone zone = ((TimeZoneAwareLocaleContext) context).getTimeZone(); assertThat(locale).isEqualTo(LOCALE_DEFAULT); assertThat(zone).isEqualTo(TIMEZONE_CUSTOM); List<Event> events = recorder.play(); assertThat(events).isEmpty(); }
@Test public void testLocaleAndTimeZone() { String value = LOCALE_CUSTOM + " " + TIMEZONE_CUSTOM.getID(); Cookie cookie = new Cookie(DEFAULT_COOKIE_NAME, value); when(request.getCookies()).thenReturn(new Cookie[] { cookie }); LocaleContext context = resolver.resolveLocaleContext(request); assertThat(context).isNotNull(); assertThat(context).isInstanceOf(TimeZoneAwareLocaleContext.class); Locale locale = ((TimeZoneAwareLocaleContext) context).getLocale(); TimeZone zone = ((TimeZoneAwareLocaleContext) context).getTimeZone(); assertThat(locale).isEqualTo(LOCALE_CUSTOM); assertThat(zone).isEqualTo(TIMEZONE_CUSTOM); List<Event> events = recorder.play(); assertThat(events).isEmpty(); }
@Test public void testLocaleAndTimeZoneWithQuotes() { String value = resolver.quote(LOCALE_CUSTOM.toString() + " " + TIMEZONE_CUSTOM.getID()); Cookie cookie = new Cookie(DEFAULT_COOKIE_NAME, value); when(request.getCookies()).thenReturn(new Cookie[] { cookie }); LocaleContext context = resolver.resolveLocaleContext(request); assertThat(context).isNotNull(); assertThat(context).isInstanceOf(TimeZoneAwareLocaleContext.class); Locale locale = ((TimeZoneAwareLocaleContext) context).getLocale(); TimeZone zone = ((TimeZoneAwareLocaleContext) context).getTimeZone(); assertThat(locale).isEqualTo(LOCALE_CUSTOM); assertThat(zone).isEqualTo(TIMEZONE_CUSTOM); List<Event> events = recorder.play(); assertThat(events).isEmpty(); }
@Test public void testTraceLogLocaleAndTimeZone() { recorder.release(); recorder.capture("TRACE"); String value = LOCALE_CUSTOM + " " + TIMEZONE_CUSTOM.getID(); Cookie cookie = new Cookie(DEFAULT_COOKIE_NAME, value); when(request.getCookies()).thenReturn(new Cookie[] { cookie }); LocaleContext context = resolver.resolveLocaleContext(request); assertThat(context).isInstanceOf(TimeZoneAwareLocaleContext.class); Locale locale = ((TimeZoneAwareLocaleContext) context).getLocale(); TimeZone zone = ((TimeZoneAwareLocaleContext) context).getTimeZone(); List<Event> events = recorder.play(); assertThat(events).hasSize(1); Event event = events.get(0); assertThat(event.getLevel()).isEqualTo("TRACE"); assertThat(event.getMessage()).isEqualTo("Parsed cookie value [" + value + "] into locale '" + locale + "' " + "and time zone '" + zone.getID() + "'"); assertThat(event.getThrown()).isNull(); }
/** * Prepare the given HTTP connection. * <p> * The default implementation specifies POST as method, * "application/x-java-serialized-object" as "Content-Type" header, * and the given content length as "Content-Length" header. * * @param connection the HTTP connection to prepare * @param contentLength the length of the content to send * @throws IOException if thrown by HttpURLConnection methods * @see java.net.HttpURLConnection#setRequestMethod * @see java.net.HttpURLConnection#setRequestProperty */ protected void prepareConnection(HttpURLConnection connection, int contentLength) throws IOException { if (this.connectTimeout >= 0) connection.setConnectTimeout(this.connectTimeout); if (this.readTimeout >= 0) connection.setReadTimeout(this.readTimeout); connection.setDoOutput(true); connection.setRequestMethod(HTTP_METHOD_POST); connection.setRequestProperty(HTTP_HEADER_CONTENT_TYPE, getContentType()); connection.setRequestProperty(HTTP_HEADER_CONTENT_LENGTH, Integer.toString(contentLength)); LocaleContext locale = LocaleContextHolder.getLocaleContext(); if (locale != null) connection.setRequestProperty(HTTP_HEADER_ACCEPT_LANGUAGE, StringUtils.toLanguageTag(locale.getLocale())); if (isAcceptGzipEncoding()) connection.setRequestProperty(HTTP_HEADER_ACCEPT_ENCODING, ENCODING_GZIP); }
public void testValidActionRequestWithExistingThreadLocalRequestContext() throws IOException, PortletException { MockActionRequest request = new MockActionRequest(); MockActionResponse response = new MockActionResponse(); request.addPreferredLocale(Locale.GERMAN); request.setParameter("action", "form"); request.setParameter("age", "29"); // see RequestContextListener.requestInitialized() try { LocaleContextHolder.setLocale(request.getLocale()); RequestContextHolder.setRequestAttributes(new PortletRequestAttributes(request)); LocaleContext servletLocaleContext = LocaleContextHolder.getLocaleContext(); RequestAttributes servletRequestAttrs = RequestContextHolder.getRequestAttributes(); simpleDispatcherPortlet.processAction(request, response); assertSame(servletLocaleContext, LocaleContextHolder.getLocaleContext()); assertSame(servletRequestAttrs, RequestContextHolder.getRequestAttributes()); } finally { RequestContextHolder.resetRequestAttributes(); LocaleContextHolder.resetLocaleContext(); } }
public void testValidRenderRequestWithExistingThreadLocalRequestContext() throws IOException, PortletException { MockRenderRequest request = new MockRenderRequest(); MockRenderResponse response = new MockRenderResponse(); request.addPreferredLocale(Locale.GERMAN); // see RequestContextListener.requestInitialized() try { LocaleContextHolder.setLocale(request.getLocale()); RequestContextHolder.setRequestAttributes(new PortletRequestAttributes(request)); LocaleContext servletLocaleContext = LocaleContextHolder.getLocaleContext(); RequestAttributes servletRequestAttrs = RequestContextHolder.getRequestAttributes(); request.setParameter("action", "form"); request.setParameter("age", "29"); simpleDispatcherPortlet.doDispatch(request, response); assertSame(servletLocaleContext, LocaleContextHolder.getLocaleContext()); assertSame(servletRequestAttrs, RequestContextHolder.getRequestAttributes()); } finally { RequestContextHolder.resetRequestAttributes(); LocaleContextHolder.resetLocaleContext(); } }
public void testInvalidActionRequestWithExistingThreadLocalRequestContext() throws IOException, PortletException { MockActionRequest request = new MockActionRequest(); MockActionResponse response = new MockActionResponse(); request.addPreferredLocale(Locale.GERMAN); // see RequestContextListener.requestInitialized() try { LocaleContextHolder.setLocale(request.getLocale()); RequestContextHolder.setRequestAttributes(new PortletRequestAttributes(request)); LocaleContext servletLocaleContext = LocaleContextHolder.getLocaleContext(); RequestAttributes servletRequestAttrs = RequestContextHolder.getRequestAttributes(); request.setParameter("action", "invalid"); simpleDispatcherPortlet.processAction(request, response); String exceptionParam = response.getRenderParameter(DispatcherPortlet.ACTION_EXCEPTION_RENDER_PARAMETER); assertNotNull(exceptionParam); // ensure that an exceptional condition occured assertSame(servletLocaleContext, LocaleContextHolder.getLocaleContext()); assertSame(servletRequestAttrs, RequestContextHolder.getRequestAttributes()); } finally { RequestContextHolder.resetRequestAttributes(); LocaleContextHolder.resetLocaleContext(); } }
/** * Prepare the given HTTP connection. * <p>The default implementation specifies POST as method, * "application/x-java-serialized-object" as "Content-Type" header, * and the given content length as "Content-Length" header. * @param connection the HTTP connection to prepare * @param contentLength the length of the content to send * @throws IOException if thrown by HttpURLConnection methods * @see java.net.HttpURLConnection#setRequestMethod * @see java.net.HttpURLConnection#setRequestProperty */ protected void prepareConnection(HttpURLConnection connection, int contentLength) throws IOException { if (this.connectTimeout >= 0) { connection.setConnectTimeout(this.connectTimeout); } if (this.readTimeout >= 0) { connection.setReadTimeout(this.readTimeout); } connection.setDoOutput(true); connection.setRequestMethod(HTTP_METHOD_POST); connection.setRequestProperty(HTTP_HEADER_CONTENT_TYPE, getContentType()); connection.setRequestProperty(HTTP_HEADER_CONTENT_LENGTH, Integer.toString(contentLength)); LocaleContext locale = LocaleContextHolder.getLocaleContext(); if (locale != null) { connection.setRequestProperty(HTTP_HEADER_ACCEPT_LANGUAGE, StringUtils.toLanguageTag(locale.getLocale())); } if (isAcceptGzipEncoding()) { connection.setRequestProperty(HTTP_HEADER_ACCEPT_ENCODING, ENCODING_GZIP); } }
@Override public LocaleContext resolveLocaleContext(final HttpServletRequest request) { parseLocaleCookieIfNecessary(request); return new TimeZoneAwareLocaleContext() { @Override public Locale getLocale() { return (Locale) request.getAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME); } @Override public TimeZone getTimeZone() { return (TimeZone) request.getAttribute(TIME_ZONE_REQUEST_ATTRIBUTE_NAME); } }; }
/** * Create a HttpPost for the given configuration. * <p>The default implementation creates a standard HttpPost with * "application/x-java-serialized-object" as "Content-Type" header. * @param config the HTTP invoker configuration that specifies the * target service * @return the HttpPost instance * @throws java.io.IOException if thrown by I/O methods */ protected HttpPost createHttpPost(HttpInvokerClientConfiguration config) throws IOException { HttpPost httpPost = new HttpPost(config.getServiceUrl()); LocaleContext localeContext = LocaleContextHolder.getLocaleContext(); if (localeContext != null) { Locale locale = localeContext.getLocale(); if (locale != null) { httpPost.addHeader(HTTP_HEADER_ACCEPT_LANGUAGE, StringUtils.toLanguageTag(locale)); } } if (isAcceptGzipEncoding()) { httpPost.addHeader(HTTP_HEADER_ACCEPT_ENCODING, ENCODING_GZIP); } return httpPost; }
private void initContextHolders( HttpServletRequest request, LocaleContext localeContext, RequestAttributes requestAttributes) { if (localeContext != null) { LocaleContextHolder.setLocaleContext(localeContext, this.threadContextInheritable); } if (requestAttributes != null) { RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable); } if (logger.isTraceEnabled()) { logger.trace("Bound request context to thread: " + request); } }
private void resetContextHolders(HttpServletRequest request, LocaleContext prevLocaleContext, RequestAttributes previousAttributes) { LocaleContextHolder.setLocaleContext(prevLocaleContext, this.threadContextInheritable); RequestContextHolder.setRequestAttributes(previousAttributes, this.threadContextInheritable); if (logger.isTraceEnabled()) { logger.trace("Cleared thread-bound request context: " + request); } }
/** * Build a LocaleContext for the given request, exposing the request's primary locale as current locale. * <p>The default implementation uses the dispatcher's LocaleResolver to obtain the current locale, * which might change during a request. * @param request current HTTP request * @return the corresponding LocaleContext */ @Override protected LocaleContext buildLocaleContext(final HttpServletRequest request) { if (this.localeResolver instanceof LocaleContextResolver) { return ((LocaleContextResolver) this.localeResolver).resolveLocaleContext(request); } else { return new LocaleContext() { @Override public Locale getLocale() { return localeResolver.resolveLocale(request); } }; } }
@Override public void setLocaleContext(HttpServletRequest request, HttpServletResponse response, LocaleContext localeContext) { Locale locale = null; TimeZone timeZone = null; if (localeContext != null) { locale = localeContext.getLocale(); if (localeContext instanceof TimeZoneAwareLocaleContext) { timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); } } WebUtils.setSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME, locale); WebUtils.setSessionAttribute(request, TIME_ZONE_SESSION_ATTRIBUTE_NAME, timeZone); }
@Override public LocaleContext resolveLocaleContext(HttpServletRequest request) { return new TimeZoneAwareLocaleContext() { @Override public Locale getLocale() { return getDefaultLocale(); } @Override public TimeZone getTimeZone() { return getDefaultTimeZone(); } }; }
@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 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 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 testResolveLocaleContextWithCookieWithoutLocale() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addPreferredLocale(Locale.TAIWAN); 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()); }