[jboss-cvs] jboss-seam/src/main/org/jboss/seam/interceptors ...

Gavin King gavin.king at jboss.com
Thu Jul 27 20:46:30 EDT 2006


  User: gavin   
  Date: 06/07/27 20:46:30

  Modified:    src/main/org/jboss/seam/interceptors 
                        ExceptionInterceptor.java
  Log:
  added @Render, and javadoc
  
  Revision  Changes    Path
  1.6       +53 -4     jboss-seam/src/main/org/jboss/seam/interceptors/ExceptionInterceptor.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: ExceptionInterceptor.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/interceptors/ExceptionInterceptor.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -b -r1.5 -r1.6
  --- ExceptionInterceptor.java	26 Jul 2006 22:08:09 -0000	1.5
  +++ ExceptionInterceptor.java	28 Jul 2006 00:46:30 -0000	1.6
  @@ -1,9 +1,11 @@
  -//$Id: ExceptionInterceptor.java,v 1.5 2006/07/26 22:08:09 gavin Exp $
  +//$Id: ExceptionInterceptor.java,v 1.6 2006/07/28 00:46:30 gavin Exp $
   package org.jboss.seam.interceptors;
   
   import java.util.Map;
   
  +import javax.faces.component.UIViewRoot;
   import javax.faces.context.FacesContext;
  +import javax.faces.event.PhaseId;
   import javax.interceptor.AroundInvoke;
   import javax.interceptor.InvocationContext;
   
  @@ -12,10 +14,12 @@
   import org.jboss.seam.annotations.HttpError;
   import org.jboss.seam.annotations.Interceptor;
   import org.jboss.seam.annotations.Redirect;
  +import org.jboss.seam.annotations.Render;
   import org.jboss.seam.contexts.Contexts;
   import org.jboss.seam.contexts.Lifecycle;
   import org.jboss.seam.core.FacesMessages;
   import org.jboss.seam.core.Init;
  +import org.jboss.seam.core.Interpolator;
   import org.jboss.seam.core.Manager;
   import org.jboss.seam.jsf.AbstractSeamPhaseListener;
   
  @@ -45,12 +49,30 @@
            {
               if ( e.getClass().isAnnotationPresent(Redirect.class) )
               {
  -               redirect( e.getClass().getAnnotation(Redirect.class).viewId() );
  +               Redirect redirect = e.getClass().getAnnotation(Redirect.class);
  +               addFacesMessage( e, redirect.message() );
  +               redirect( redirect.viewId() );
                  handled(e);
               }
  +            else if ( e.getClass().isAnnotationPresent(Render.class) )
  +            {
  +               if ( Lifecycle.getPhaseId()!=PhaseId.INVOKE_APPLICATION )
  +               {
  +                  //unfortunately, @Render can only really work during an action invocation
  +                  throw e;
  +               }
  +               else
  +               {
  +                  Render render = e.getClass().getAnnotation(Render.class);
  +                  addFacesMessage( e, render.message() );
  +                  render( render.viewId() );
  +                  return null;
  +               }
  +            }
               else if ( e.getClass().isAnnotationPresent(HttpError.class) )
               {
  -               error( e.getClass().getAnnotation(HttpError.class).errorCode(), e.getMessage() );
  +               HttpError httpError = e.getClass().getAnnotation(HttpError.class);
  +               error( httpError.errorCode(), renderExceptionMessage( e, httpError.message() ) );
                  handled(e);
               }
               else if ( Init.instance().isDebug() && 
  @@ -64,6 +86,17 @@
         }
      }
   
  +   private void addFacesMessage(Exception e, String message)
  +   {
  +      FacesMessages.instance().add( renderExceptionMessage(e, message) );
  +   }
  +   
  +   private String renderExceptionMessage(Exception e, String message)
  +   {
  +      return Interpolator.instance()
  +            .interpolate( "".equals(message) ? e.getMessage() : message );
  +   }
  +
      private void error(int code, String message)
      {
         if ( log.isDebugEnabled() ) log.debug("sending error: " + code);
  @@ -76,8 +109,12 @@
   
      private void redirect(String viewId)
      {
  -      if ( log.isDebugEnabled() ) log.debug("redirecting to: " + viewId);
         FacesContext facesContext = FacesContext.getCurrentInstance();
  +      if ( "".equals(viewId) )
  +      {
  +         viewId = facesContext.getViewRoot().getViewId();
  +      }
  +      if ( log.isDebugEnabled() ) log.debug("redirecting to: " + viewId);
         org.jboss.seam.core.Redirect redirect = org.jboss.seam.core.Redirect.instance();
         redirect.setViewId(viewId);
         redirect.execute();
  @@ -85,6 +122,18 @@
         AbstractSeamPhaseListener.storeAnyConversationContext(facesContext);
      }
   
  +   private void render(String viewId)
  +   {
  +      FacesContext context = FacesContext.getCurrentInstance();
  +      if ( !"".equals(viewId) )
  +      {
  +         if ( log.isDebugEnabled() ) log.debug("rendering: " + viewId);
  +         UIViewRoot viewRoot = context.getApplication().getViewHandler().createView(context, viewId);
  +         context.setViewRoot(viewRoot);
  +      }
  +      context.renderResponse();
  +   }
  +
      private void redirectToDebugPage(Exception e)
      {
         log.error("redirecting to debug page", e);
  
  
  



More information about the jboss-cvs-commits mailing list