/*
* 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.exception;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import com.ejie.x38.json.JSONObject;
import com.ejie.x38.util.IframeXHREmulationUtils;
import com.ejie.x38.validation.ValidationManager;
/**
* Handler utilizado para gestionar la excepción producida por superar el tamaño
* máximo de envío de un fichero.
*
* @author UDA
*
*/
public class FileExceedsFileSizeLimitHandler implements HandlerExceptionResolver{
private static final Logger logger = LoggerFactory.getLogger(FileExceedsFileSizeLimitHandler.class);
@Resource
private ReloadableResourceBundleMessageSource messageSource;
@Autowired
private ValidationManager validationManager;
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
if ( ex instanceof MaxUploadSizeExceededException ) {
try {
Locale locale = LocaleContextHolder.getLocale();
String messageError = messageSource.getMessage(MaxUploadSizeExceededException.class.getSimpleName(), null, locale);
Map<String, Object> rupFeedbackMsg = validationManager.getRupFeedbackMsg(messageError, "error");
JSONObject messageJSON = validationManager.getMessageJSON(null, rupFeedbackMsg, "error");
// Se comprueba si es necesario tratar el error de acuerdo a lo requerido por la emulación de iframe.
if (IframeXHREmulationUtils.isIframeEmulationRequired(request)){
IframeXHREmulationUtils.writeIframeHttpStatus(response, messageError.getBytes(), HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
}else{
String content = messageJSON.toString();
response.setStatus(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
response.setContentLength(content.getBytes(Charset.forName(response.getCharacterEncoding())).length);
response.getWriter().print(content);
response.flushBuffer();
}
} catch (IOException e) {
logger.error(e.getMessage());
throw new RuntimeException(e);
}
return null;
}
return null;
}
}