/*
* Copyright 2012 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
package com.ejie.x38.control;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.support.RequestContextUtils;
/**
*
* Interceptor de UDA que se encarga de lo siguiente:
* 1- Gestiona las variables relativas a idioma por defecto, idiomas de la aplicación y layout. En caso de no
* definir alguna de las variables se producirá un error en despliegue indicando la causa del error.
* 2- En la invocación a un controller gestiona las cookie y el parámetro para la gestión del lenguage de la
* aplicación
* 3- En el retorno de un controller se gestiona la variable del modelo para el layout
*
* @author UDA
*
*/
public class MvcInterceptor extends HandlerInterceptorAdapter{
@Autowired
private WebApplicationContext webApplicationContext;
/**
* Comprobar que se han definido correctamente las variables necesarias para la aplicación:
* - defaultLanguage : Idioma por defecto
* - defaulLayout : Layout por defecto
* - availableLangs: Idiomas permitidos en la aplicación
*/
@PostConstruct
public void postConstruct(){
List<String> properties = new ArrayList<String>();
if (this.defaultLanguage==null){
properties.add("defaultLanguage");
}
if (this.defaultLayout==null){
properties.add("defaultLayout");
}
if (this.availableLangs==null){
properties.add("availableLangs");
}
if (!properties.isEmpty()){
String war = webApplicationContext.getServletContext().getContextPath().substring(1);
throw new IllegalStateException("No se ha definido correctamente el bean 'MvcInterceptor' en el fichero mvc-config.xml del proyecto <"+war+">. Revisar propiedad(es):"+properties.toString());
}
}
/**
* Método que se ejecuta antes del método del Controller
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Locale locale = null;
if (portalCookie==null){
//Parametro cambio idioma
String languageParam = request.getParameter(paramName);
if (languageParam!=null && availableLangs.contains(languageParam)){
locale = new Locale(languageParam);
} else {
//Cookies
String cookieName = ((CookieLocaleResolver)RequestContextUtils.getLocaleResolver(request)).getCookieName();
Cookie cookie = getLanguageCookie(request.getCookies(), cookieName, Arrays.asList(availableLangs.trim().split("\\s*,\\s*")));
if (cookie!=null){
locale = new Locale(cookie.getValue());
} else {
locale = new Locale(defaultLanguage);
}
}
} else {
//Idioma controlado por el portal
Cookie[] cookies = request.getCookies();
String cookieValue = "";
for (Cookie cookie : cookies) {
if (cookie.getName().equals(portalCookie)){
cookieValue = cookie.getValue();
break;
}
}
locale = new Locale(cookieValue.substring((cookieValue.indexOf("_")+1)));
}
//Modificación de la Locale y Cookie
LocaleContextHolder.setLocale(locale);
((CookieLocaleResolver)RequestContextUtils.getLocaleResolver(request)).setLocale(request, response, locale); //Sobreescribir cookie
return true;
}
/**
* Función que busca la cookie de idioma y determina si es idioma válido (devuelve la cookie)
* @param cookies Conjunto de cookies de la request
* @param cookieName Nombre de la cookie de idioma (default 'language')
* @param availableLangs Lista con los idiomas posibles (es, eu, en, fr)
* @return Si es un idioma válido devuelve la cookie, si no devuelve null
*/
private Cookie getLanguageCookie(Cookie cookies[], String cookieName, List<String> availableLangs){
if (cookies != null){
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName) && availableLangs.contains(cookie.getValue())){
return cookie;
}
}
}
return null;
}
//** SETTERs & GETTERs **//
private String paramName = LocaleChangeInterceptor.DEFAULT_PARAM_NAME;
public void setParamName(String paramName) {
this.paramName = paramName;
}
public String getParamName(){
return this.paramName;
}
private String defaultLanguage;
public String getDefaultLanguage() {
return defaultLanguage;
}
public void setDefaultLanguage(String defaultLanguage) {
this.defaultLanguage = defaultLanguage;
}
private String defaultLayout;
public String getDefaultLayout() {
return defaultLayout;
}
public void setDefaultLayout(String defaultLayout) {
this.defaultLayout = defaultLayout;
}
private String availableLangs;
public String getAvailableLangs() {
return availableLangs;
}
public void setAvailableLangs(String availableLangs) {
this.availableLangs = availableLangs;
}
private String portalCookie;
public String getPortalCookie() {
return portalCookie;
}
public void setPortalCookie(String portalCookie) {
this.portalCookie = portalCookie;
}
}