package fi.otavanopisto.pyramus.util; import java.io.IOException; import java.util.Enumeration; import java.util.Locale; import java.util.Vector; 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.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.jsp.jstl.core.Config; import org.apache.commons.lang.StringUtils; public class LocaleFilter implements Filter { public void init(FilterConfig arg0) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { ServletRequest servletRequest = request; try { if (request instanceof HttpServletRequest) { Cookie[] cookies = ((HttpServletRequest) request).getCookies(); String localeCode = ""; if (cookies != null) { for (Cookie cookie : cookies) { if ("pyramusLocale".equals(cookie.getName())) { localeCode = cookie.getValue(); break; } } } if (StringUtils.isBlank(localeCode)) { localeCode = servletRequest.getLocale().toString(); } if (!localeCode.equals(request.getLocale().toString())) { Locale locale; String[] localeCodeS = localeCode.split("_"); if (localeCodeS.length == 2) locale = new Locale(localeCodeS[0], localeCodeS[1]); else { locale = new Locale(localeCodeS[0]); } Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new fi.otavanopisto.pyramus.I18N.LocalizationContext(locale)); servletRequest = new LocaleRequestWrapper((HttpServletRequest) request, locale); } else { Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new fi.otavanopisto.pyramus.I18N.LocalizationContext(request.getLocale())); } } } finally { filterChain.doFilter(servletRequest, response); } } public void destroy() { } public class LocaleRequestWrapper extends HttpServletRequestWrapper { public LocaleRequestWrapper(HttpServletRequest req, Locale locale) { super(req); this.locale = locale; } public Enumeration<Locale> getLocales() { Vector<Locale> v = new Vector<>(1); v.add(getLocale()); return v.elements(); } public Locale getLocale() { return locale; } private Locale locale; } }