/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.core.web;
import java.io.IOException;
import java.util.Locale;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
/** Filter to change the locale.
*
* This filter expects a lang request parameter and sets the locale accordingly
* in the locale resolver and in the LocaleContextHolder.
*
* It expects a locale resolver that supports setLocale (ej:
* CookieLocaleResolver), AcceptHeaderLocaleResolver won't work.
*/
public final class ChangeLocaleFilter implements Filter {
/** The class logger.
*/
private static Logger log = LoggerFactory.getLogger(Utf8EncodingFilter.class);
/** The locale resolver to save the locale if it changed, never null.
*/
LocaleResolver localeResolver;
/** Constructor.
*
* @param theLocaleResolver locale resolver to save the locale obtained by
* this filter. It cannot be null.
*/
public ChangeLocaleFilter(final LocaleResolver theLocaleResolver) {
Validate.notNull(theLocaleResolver, "The locale resolver cannot be null.");
localeResolver = theLocaleResolver;
}
/** {@inheritDoc}
*
* It currently does nothing.
*/
public void init(final FilterConfig filterConfig) throws ServletException {
log.trace("Entering init");
// Do nothing.
log.trace("Leaving init");
}
/** {@inheritDoc}
*/
public void doFilter(final ServletRequest request, final ServletResponse
response, final FilterChain chain) throws IOException,
ServletException {
log.trace("Entering doFilter.");
if (!(request instanceof HttpServletRequest)) {
throw new RuntimeException("Not an http request");
}
if (!(response instanceof HttpServletResponse)) {
throw new RuntimeException("Not an http request");
}
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String newLocale = request.getParameter("lang");
if (newLocale != null) {
Locale locale = StringUtils.parseLocaleString(newLocale.toLowerCase());
LocaleContextHolder.setLocale(locale);
localeResolver.setLocale(httpRequest, httpResponse, locale);
} else {
Locale locale = localeResolver.resolveLocale(httpRequest);
LocaleContextHolder.setLocale(locale);
}
try {
chain.doFilter(request, response);
} finally {
LocaleContextHolder.resetLocaleContext();
}
log.trace("Leaving doFilter.");
}
/** Called by the container when the filter is about to be destroyed.
*
* This implementation is empty.
*/
public void destroy() {
log.trace("Entering destroy");
// Do nothing.
log.trace("Leaving destroy");
}
}