package org.jboss.seam.exception;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.faces.RedirectException;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.navigation.Pages;
/**
* Base implementation of redirection exception handlers.
*
* @author Gavin King
*
*/
public abstract class RedirectHandler extends ExceptionHandler
{
private static final LogProvider log = Logging.getLogProvider(RedirectHandler.class);
protected abstract String getViewId(Exception e);
protected abstract String getMessage(Exception e);
protected abstract boolean isEnd(Exception e);
protected abstract Severity getMessageSeverity(Exception e);
@Override
public void handle(Exception e) throws Exception
{
String viewId = getViewId(e);
if (viewId==null)
{
//we want to perform a redirect straight back to the current page
//there is no ViewRoot available, so lets do it the hard way
String servletPath = ( (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest() ).getServletPath();
viewId = servletPath.substring(0, servletPath.lastIndexOf('.')) + Pages.getSuffix();
}
addFacesMessage( getDisplayMessage(e, getMessage(e)), getMessageSeverity(e), null, e );
if ( Contexts.isConversationContextActive() && isEnd(e) )
{
Conversation.instance().end();
}
try
{
redirect(viewId, null);
}
catch (RedirectException re)
{
//do nothing
log.debug("could not redirect", re);
}
}
@Override
public String toString()
{
return "RedirectHandler";
}
}