package com.enonic.cms.web.main;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.enonic.cms.web.error.ErrorDetails;
import com.enonic.cms.web.error.ErrorPageRenderer;
@Controller
public final class ErrorController
{
@Autowired
protected ErrorPageRenderer errorPageRenderer;
@RequestMapping(value = "/error", method = {RequestMethod.GET,RequestMethod.HEAD}, produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView error( final HttpServletRequest req, final HttpServletResponse res )
throws IOException
{
this.errorPageRenderer.render( res, createDetails( req ) );
return null;
}
private int getStatusCode( final HttpServletRequest req )
{
final Object statusCode = req.getAttribute( "javax.servlet.error.status_code" );
if ( statusCode instanceof Integer )
{
return (Integer) statusCode;
}
return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
private Throwable getCauseException( final HttpServletRequest req, final int statusCode )
{
final Object cause = req.getAttribute( "javax.servlet.error.exception" );
if ( cause instanceof Throwable )
{
return (Throwable) cause;
}
return new Exception( getStandardMessage( statusCode ) );
}
private String getStandardMessage( final int statusCode )
{
if ( statusCode == HttpServletResponse.SC_NOT_FOUND )
{
return "Resource not found";
}
return "An Error Occured (" + statusCode + ")";
}
private ErrorDetails createDetails( final HttpServletRequest req )
{
final int statusCode = getStatusCode( req );
final Throwable cause = getCauseException( req, statusCode );
return new ErrorDetails( req, cause, statusCode );
}
}