Package org.jboss.portletbridge

Source Code of org.jboss.portletbridge.ExceptionHandlerImpl$ErrorPage

/******************************************************************************
* JBoss, a division of Red Hat                                               *
* Copyright 2006, Red Hat Middleware, LLC, and individual                    *
* contributors as indicated by the @authors tag. See the                     *
* copyright.txt in the distribution for a full listing of                    *
* individual contributors.                                                   *
*                                                                            *
* This is free software; you can redistribute it and/or modify it            *
* under the terms of the GNU Lesser General Public License as                *
* published by the Free Software Foundation; either version 2.1 of           *
* the License, or (at your option) any later version.                        *
*                                                                            *
* This software is distributed in the hope that it will be useful,           *
* but WITHOUT ANY WARRANTY; without even the implied warranty of             *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU           *
* Lesser General Public License for more details.                            *
*                                                                            *
* You should have received a copy of the GNU Lesser General Public           *
* License along with this software; if not, write to the Free                *
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA         *
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.                   *
******************************************************************************/
package org.jboss.portletbridge;

import java.util.Map;

import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.portlet.faces.BridgeException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.portletbridge.application.PortletWindowState;

/**
* @author asmirnov
* @author <a href="mailto:whales@redhat.com">Wesley Hales</a>
*/

public class ExceptionHandlerImpl implements ExceptionHandler {
  protected static final Log log = LogFactory
      .getLog(ExceptionHandlerImpl.class);

  /*
   * (non-Javadoc)
   *
   * @see
   * org.jboss.portletbridge.ExceptionHandler#processActionException(javax
   * .faces.context.FacesContext,
   * org.jboss.portletbridge.application.PortletViewState,
   * java.lang.Exception)
   */
  public void processActionException(FacesContext context,
      PortletWindowState windowState, Exception e) throws BridgeException {
    ErrorPage errorPage = getErrorViewId(windowState, e);
    if (null != errorPage) {
      windowState.reset();
      setupErrorParameters(context,errorPage.getException());
      windowState.setViewId(errorPage.getLocation());
    } else {
      throw new BridgeException("Error processing render lifecycle", e);
    }

  }

  /**
   * Simulate Servlet error page attributes.
   * @param context
   * @param throwable
   */
  private void setupErrorParameters(FacesContext context, Throwable throwable) {
    Map<String, Object> requestMap = context.getExternalContext().getRequestMap();
    requestMap.put("javax.servlet.error.exception", throwable);
    requestMap.put("javax.servlet.error.status_code", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    requestMap.put("javax.servlet.error.message", throwable.getLocalizedMessage());
    requestMap.put("javax.servlet.error.servlet_name", "Faces Servlet");
  }

  /**
   * This method looks for the JSF page defined in the web.xml for exception or its
   * clause class.
   * @param windowState
   * @param e
   * @return viewId of the error page, or <code>null</code> if no page configured for this exception.
   */
  protected ErrorPage getErrorViewId(PortletWindowState windowState, Exception e) {
    Map<Class<? extends Throwable>, String> errorPages = windowState.getBridgeConfig()
        .getErrorPages();
    return getErrorPage(e, errorPages);
  }

  /**
   * Reccursive helper method for the {@link #getErrorViewId(PortletWindowState, Exception)} .
   * This method calls itself for the exception clause ( if that exists ). If no error page was defined for
   * the clause, look it up in the view id's map.
   * @param e
   * @param errorPages
   * @return
   */
  protected ErrorPage getErrorPage(Throwable e, Map<Class<? extends Throwable>, String> errorPages) {
    Throwable cause = getCause(e);
    ErrorPage errorPage = null;
    if (null != cause) {
      errorPage = getErrorPage(cause, errorPages);
      if (null != errorPage) {
        return errorPage;
      }
    }
    for (Class<? extends Throwable> errorClass : errorPages.keySet()) {
      if(errorClass.isInstance(e) && errorPages.containsKey(errorClass)){
        errorPage = new ErrorPage(errorPages.get(errorClass),e);
      }
    }
    return errorPage;
  }

  /**
   * get exception clause or ServletException rootClause.
   * @param exception
   * @return
   */
  protected Throwable getCause(Throwable exception) {
    Throwable cause = null;
    if (exception instanceof ServletException) {
      cause = ((ServletException) exception).getRootCause();
    } else {
      cause = exception.getCause();
    }
    return cause;
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.jboss.portletbridge.ExceptionHandler#processRenderException(javax
   * .faces.context.FacesContext,
   * org.jboss.portletbridge.application.PortletViewState,
   * java.lang.Exception)
   */
  public void processRenderException(FacesContext context,
      PortletWindowState windowState, Exception e) throws BridgeException {
    ErrorPage errorPage = getErrorViewId(windowState, e);
    if (null != errorPage) {
      UIViewRoot root = context.getApplication().getViewHandler().createView(context, errorPage.getLocation());
      setupErrorParameters(context, errorPage.getException());
      context.setViewRoot(root);
      windowState.getBridgeConfig().getFacesLifecycle().render(context);
    } else {
      throw new BridgeException("Error processing render lifecycle", e);
    }
  }
 
  private static class ErrorPage {
    private final String location;
    private final Throwable exception;
    /**
     * @param location
     * @param exception
     */
    public ErrorPage(String location, Throwable exception) {
      this.location = location;
      this.exception = exception;
    }
    /**
     * @return the location
     */
    public String getLocation() {
      return location;
    }
    /**
     * @return the exception
     */
    public Throwable getException() {
      return exception;
    }
   
  }

}
TOP

Related Classes of org.jboss.portletbridge.ExceptionHandlerImpl$ErrorPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.